From 43c72a640158da9c68c2c2e74c71aeac36542830 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:48:58 +0800 Subject: [PATCH 001/298] BUG: custom models on the web ui (#1259) --- .../web/ui/src/scenes/launch_model/launchCustom.js | 8 +++++++- .../web/ui/src/scenes/launch_model/modelCard.js | 14 ++------------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/launchCustom.js b/xinference/web/ui/src/scenes/launch_model/launchCustom.js index 9d3a46f504..1bede718f1 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchCustom.js +++ b/xinference/web/ui/src/scenes/launch_model/launchCustom.js @@ -139,7 +139,7 @@ const LaunchCustom = ({ gpuAvailable }) => { display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', paddingLeft: '2rem', - paddingTop: '2rem', + paddingBottom: '2rem', gridGap: '2rem 0rem', } @@ -188,10 +188,12 @@ const LaunchCustom = ({ gpuAvailable }) => { ) { return ( ) } @@ -227,9 +229,11 @@ const LaunchCustom = ({ gpuAvailable }) => { ) { return ( ) } @@ -265,9 +269,11 @@ const LaunchCustom = ({ gpuAvailable }) => { ) { return ( ) } diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 44246b714f..f7cb3c465f 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -336,12 +336,7 @@ const ModelCard = ({ {modelType === 'LLM' ? ( {is_custom && ( - +
{is_custom && ( - + Date: Tue, 9 Apr 2024 11:30:25 +0800 Subject: [PATCH 002/298] FEAT: Support Qwen MoE model for huggingface and modelscope (#1263) Co-authored-by: JunJun-Liu <4424137@qq.com> Co-authored-by: qinxuye --- doc/source/models/builtin/llm/index.rst | 7 +++ .../models/builtin/llm/qwen1.5-moe-chat.rst | 45 ++++++++++++++++ xinference/model/llm/llm_family.json | 52 ++++++++++++++++++ .../model/llm/llm_family_modelscope.json | 54 +++++++++++++++++++ xinference/model/llm/vllm/core.py | 3 ++ 5 files changed, 161 insertions(+) create mode 100644 doc/source/models/builtin/llm/qwen1.5-moe-chat.rst diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 63cd05bdf8..8d3835a6bb 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -301,6 +301,11 @@ The following is a list of built-in LLM in Xinference: - 32768 - Qwen1.5 is the beta version of Qwen2, a transformer-based decoder-only language model pretrained on a large amount of data. + * - :ref:`qwen1.5-moe-chat ` + - chat + - 32768 + - Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data. + * - :ref:`skywork ` - generate - 4096 @@ -520,6 +525,8 @@ The following is a list of built-in LLM in Xinference: qwen1.5-chat + qwen1.5-moe-chat + skywork skywork-math diff --git a/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst b/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst new file mode 100644 index 0000000000..24c3e8e9b9 --- /dev/null +++ b/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst @@ -0,0 +1,45 @@ +.. _models_llm_qwen1.5-moe-chat: + +======================================== +qwen1.5-moe-chat +======================================== + +- **Context Length:** 32768 +- **Model Name:** qwen1.5-moe-chat +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 2_7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 2_7 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** Qwen/Qwen1.5-MoE-A2.7B-Chat +- **Model Hubs**: `Hugging Face `__, `ModelScope `__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name qwen1.5-moe-chat --size-in-billions 2_7 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (gptq, 2_7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 2_7 +- **Quantizations:** Int4 +- **Model ID:** Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4 +- **Model Hubs**: `Hugging Face `__, `ModelScope `__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name qwen1.5-moe-chat --size-in-billions 2_7 --model-format gptq --quantization ${quantization} + diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 0cb2023612..c94739531b 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1878,6 +1878,58 @@ ] } }, + { + "version": 1, + "context_length": 32768, + "model_name": "qwen1.5-moe-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "2_7", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/Qwen1.5-MoE-A2.7B-Chat" + }, + { + "model_format": "gptq", + "model_size_in_billions": "2_7", + "quantizations": [ + "Int4" + ], + "model_id": "Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4" + } + ], + "prompt_style": { + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] + } + }, { "version": 1, "context_length": 8192, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index ecc919bf9e..aa60f0ef14 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2121,6 +2121,60 @@ ] } }, + { + "version": 1, + "context_length": 32768, + "model_name": "qwen1.5-moe-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "2_7", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "qwen/Qwen1.5-MoE-A2.7B-Chat", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": "2_7", + "quantizations": [ + "Int4" + ], + "model_id": "qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] + } + }, { "version": 1, "context_length": 4096, diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index d26e6a72f0..609e433514 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -120,6 +120,9 @@ class VLLMGenerateConfig(TypedDict, total=False): VLLM_SUPPORTED_CHAT_MODELS.append("orion-chat") VLLM_SUPPORTED_CHAT_MODELS.append("orion-chat-rag") +if VLLM_INSTALLED and vllm.__version__ >= "0.4.0": + VLLM_SUPPORTED_CHAT_MODELS.append("qwen1.5-moe-chat") + class VLLMModel(LLM): def __init__( From 70a94cd8e6a2dd84986b292a1f7ff4b7e8343666 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Tue, 9 Apr 2024 11:31:17 +0800 Subject: [PATCH 003/298] ENH: support llamacpp multiple gpu (#1229) --- xinference/types.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xinference/types.py b/xinference/types.py index f129daa223..29e7e4ce35 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -232,6 +232,8 @@ class LlamaCppModelConfig(TypedDict, total=False): n_ctx: int n_parts: int n_gpu_layers: int + split_mode: int + main_gpu: int seed: int f16_kv: bool logits_all: bool From b2891fc91c2c671b3c8ba1d7543394036e54c5cc Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" Date: Tue, 9 Apr 2024 16:26:18 +0800 Subject: [PATCH 004/298] DOC: update readme (#1268) --- README.md | 2 +- README_zh_CN.md | 2 +- doc/source/models/model_abilities/chat.rst | 6 +++--- setup.cfg | 1 + xinference/deploy/docker/cpu.Dockerfile | 1 + 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4006f9a168..5fa5e9d398 100644 --- a/README.md +++ b/README.md @@ -34,12 +34,12 @@ potential of cutting-edge AI models. - Docker image: [#855](https://github.com/xorbitsai/inference/pull/855) - Support multimodal: [#829](https://github.com/xorbitsai/inference/pull/829) ### New Models +- Built-in support for [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) - Built-in support for [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) - Built-in support for [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) - Built-in support for [Gemma](https://github.com/google-deepmind/gemma): [#1024](https://github.com/xorbitsai/inference/pull/1024) - Built-in support for [Qwen1.5](https://github.com/QwenLM/Qwen1.5): [#994](https://github.com/xorbitsai/inference/pull/994) - Built-in support for [Yi-VL](https://github.com/01-ai/Yi): [#946](https://github.com/xorbitsai/inference/pull/946) -- Built-in support for [Whisper](https://github.com/openai/whisper): [#929](https://github.com/xorbitsai/inference/pull/929) ### Integrations - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [Chatbox](https://chatboxai.app/): a desktop client for multiple cutting-edge LLM models, available on Windows, Mac and Linux. diff --git a/README_zh_CN.md b/README_zh_CN.md index e0f8ebb057..c0e0a80694 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -31,12 +31,12 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - Docker 镜像支持: [#855](https://github.com/xorbitsai/inference/pull/855) - 支持多模态模型:[#829](https://github.com/xorbitsai/inference/pull/829) ### 新模型 +- 内置 [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) - 内置 [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) - 内置 [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) - 内置 [Gemma](https://github.com/google-deepmind/gemma): [#1024](https://github.com/xorbitsai/inference/pull/1024) - 内置 [Qwen1.5](https://github.com/QwenLM/Qwen1.5): [#994](https://github.com/xorbitsai/inference/pull/994) - 内置 [Yi-VL](https://github.com/01-ai/Yi): [#946](https://github.com/xorbitsai/inference/pull/946) -- 内置 [Whisper](https://github.com/openai/whisper): [#929](https://github.com/xorbitsai/inference/pull/929) ### 集成 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 - [Chatbox](https://chatboxai.app/): 一个支持前沿大语言模型的桌面客户端,支持 Windows,Mac,以及 Linux。 diff --git a/doc/source/models/model_abilities/chat.rst b/doc/source/models/model_abilities/chat.rst index c2d4246ff1..35db451348 100644 --- a/doc/source/models/model_abilities/chat.rst +++ b/doc/source/models/model_abilities/chat.rst @@ -91,15 +91,15 @@ We can try Chat API out either via cURL, OpenAI Client, or Xinference's python c base_url="http://:/v1" ) client.chat.completions.create( - model=("", + model="", messages=[ { "content": "What is the largest animal?", "role": "user", } ], - max_tokens: 512, - temperature: 0.7 + max_tokens=512, + temperature=0.7 ) .. code-tab:: python Xinference Python Client diff --git a/setup.cfg b/setup.cfg index 7ae626a3d6..9ff29a539d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -27,6 +27,7 @@ install_requires = xoscar>=0.3.0 torch gradio>=3.39.0 + typer[all]<0.12.0 # fix typer required by gradio pillow click tqdm>=4.27 diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index 1d18d84f68..d0076476b0 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -23,6 +23,7 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ pip install -i "$PIP_INDEX" \ "xoscar>=0.3.0" \ "gradio>=3.39.0" \ + "typer[all]<0.12.0" \ pillow \ click \ "tqdm>=4.27" \ From c1d4ae27fe8773276a7252539d3cc5b072afa218 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" Date: Thu, 11 Apr 2024 10:21:36 +0800 Subject: [PATCH 005/298] BUG: fix system prompts for chatglm3 and internlm2 pytorch (#1271) --- doc/source/getting_started/installation.rst | 3 ++- doc/source/user_guide/backends.rst | 3 ++- xinference/model/llm/pytorch/chatglm.py | 2 ++ xinference/model/llm/pytorch/internlm2.py | 2 ++ xinference/model/llm/vllm/core.py | 1 + 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 2f0600d9f6..0e647e1306 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -43,11 +43,12 @@ Currently, supported models include: - ``Yi``, ``Yi-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``vicuna-v1.3``, ``vicuna-v1.5`` +- ``internlm2-chat`` - ``qwen-chat`` - ``mixtral-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``deepseek-chat``, ``deepseek-coder-instruct`` -- ``qwen1.5-chat`` +- ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` .. vllm_end diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 969b3a88fd..d9359c3603 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -60,11 +60,12 @@ Currently, supported model includes: - ``Yi``, ``Yi-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``vicuna-v1.3``, ``vicuna-v1.5`` +- ``internlm2-chat`` - ``qwen-chat`` - ``mixtral-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``deepseek-chat``, ``deepseek-coder-instruct`` -- ``qwen1.5-chat`` +- ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` .. vllm_end diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index 9675be149a..e917b19deb 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -135,6 +135,8 @@ def chat( chat_history = [h for h in chat_history if not h.get("tool_calls")] if not chat_history: chat_history = [] + if system_prompt: + chat_history.append({"role": "system", "content": system_prompt}) if tools: msg = self._model.chat( self._tokenizer, prompt, [tools] + chat_history, **kwargs diff --git a/xinference/model/llm/pytorch/internlm2.py b/xinference/model/llm/pytorch/internlm2.py index 1eb8aec683..2e8a9e69c6 100644 --- a/xinference/model/llm/pytorch/internlm2.py +++ b/xinference/model/llm/pytorch/internlm2.py @@ -114,6 +114,8 @@ def chat( ] else: input_history = [] + if system_prompt: + kwargs["meta_instruction"] = system_prompt if stream: def _stream_generator(): diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 609e433514..40bb3c7132 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -98,6 +98,7 @@ class VLLMGenerateConfig(TypedDict, total=False): "internlm-chat-7b", "internlm-chat-8k", "internlm-chat-20b", + "internlm2-chat", "qwen-chat", "Yi-chat", "code-llama-instruct", From ac61184dfd158770eb1f2bb9a1f40278a9b519bb Mon Sep 17 00:00:00 2001 From: mujin2 <132123199+mujin2@users.noreply.github.com> Date: Thu, 11 Apr 2024 10:51:29 +0800 Subject: [PATCH 006/298] REF: Remove ctransformers supports (#1267) --- .github/workflows/python.yaml | 1 - doc/source/getting_started/installation.rst | 1 - .../ja_JP/LC_MESSAGES/user_guide/backends.po | 18 -- .../zh_CN/LC_MESSAGES/user_guide/backends.po | 23 -- doc/source/user_guide/backends.rst | 8 - setup.cfg | 1 - xinference/core/tests/test_types.py | 15 +- xinference/model/llm/__init__.py | 6 - xinference/model/llm/ggml/ctransformers.py | 281 ------------------ .../model/llm/ggml/ctransformers_util.py | 161 ---------- xinference/model/llm/ggml/llamacpp.py | 12 +- .../llm/ggml/tests/test_ctransformers.py | 162 ---------- xinference/model/llm/llm_family.json | 8 +- xinference/types.py | 19 -- 14 files changed, 8 insertions(+), 708 deletions(-) delete mode 100644 xinference/model/llm/ggml/ctransformers.py delete mode 100644 xinference/model/llm/ggml/ctransformers_util.py delete mode 100644 xinference/model/llm/ggml/tests/test_ctransformers.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 885fff36a3..648b6044ad 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -119,7 +119,6 @@ jobs: pip install sentencepiece pip install transformers_stream_generator pip install bitsandbytes - pip install ctransformers pip install "sentence-transformers>=2.3.1" pip install s3fs pip install modelscope diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 0e647e1306..c42f21a829 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -66,7 +66,6 @@ It's advised to install the GGML dependencies manually based on your hardware sp Initial setup:: pip install xinference - pip install ctransformers Hardware-Specific installations: diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/backends.po b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/backends.po index a6d96528d8..79b4716f32 100644 --- a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/backends.po +++ b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/backends.po @@ -51,24 +51,6 @@ msgid "" "#installation-with-openblas--cublas--clblast--metal>`_." msgstr "" -#: ../../source/user_guide/backends.rst:21 -msgid "ctransformers" -msgstr "" - -#: ../../source/user_guide/backends.rst:22 -msgid "" -"CTransformers provide python bindings for the Transformer models " -"implemented in C/C++ using GGML library." -msgstr "" - -#: ../../source/user_guide/backends.rst:24 -msgid "" -"We recommend that users install `ctransformers` on the worker themselves " -"and adjust the parameters according to the hardware to achieve the best " -"inference efficiency. Please refer to the `ctransformers installation " -"guide `_." -msgstr "" - #: ../../source/user_guide/backends.rst:30 msgid "transformers" msgstr "" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po index d34b601d33..c5c8dd87c3 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po @@ -60,29 +60,6 @@ msgstr "" "github.com/abetlen/llama-cpp-python#installation-with-openblas--cublas--" "clblast--metal>`_ 。" -#: ../../source/user_guide/backends.rst:21 -msgid "ctransformers" -msgstr "ctransformers" - -#: ../../source/user_guide/backends.rst:22 -msgid "" -"CTransformers provide python bindings for the Transformer models " -"implemented in C/C++ using GGML library." -msgstr "" -"CTransformers 基于 GGML 使用 C++ 实现了 transformer 模型的推理,并提供了 " -"Python 接口。" - -#: ../../source/user_guide/backends.rst:24 -msgid "" -"We recommend that users install `ctransformers` on the worker themselves " -"and adjust the parameters according to the hardware to achieve the best " -"inference efficiency. Please refer to the `ctransformers installation " -"guide `_." -msgstr "" -"推荐用户手动安装 `ctransformers`,根据当前使用的硬件,指定对应的编译选项" -"以获得最好的推理性能。可以参考 `ctransformers 安装指南 `_. 。" - #: ../../source/user_guide/backends.rst:30 msgid "transformers" msgstr "transformers" diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index d9359c3603..f9ba68bd98 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -17,14 +17,6 @@ We recommend that users install `llama-cpp-python` on the worker themselves and parameters according to the hardware to achieve the best inference efficiency. Please refer to the `llama-cpp-python installation guide `_. -ctransformers -~~~~~~~~~~~~~ -CTransformers provide python bindings for the Transformer models implemented in C/C++ using GGML library. - -We recommend that users install `ctransformers` on the worker themselves and adjust the parameters -according to the hardware to achieve the best inference efficiency. Please refer to the -`ctransformers installation guide `_. - transformers ~~~~~~~~~~~~ diff --git a/setup.cfg b/setup.cfg index 9ff29a539d..46053cf910 100644 --- a/setup.cfg +++ b/setup.cfg @@ -110,7 +110,6 @@ intel = intel_extension_for_pytorch==2.1.10+xpu ggml = llama-cpp-python>=0.2.25,!=0.2.58 - ctransformers chatglm-cpp>=0.3.0 transformers = transformers>=4.34.1 diff --git a/xinference/core/tests/test_types.py b/xinference/core/tests/test_types.py index 280add37cc..8dd3fdbd63 100644 --- a/xinference/core/tests/test_types.py +++ b/xinference/core/tests/test_types.py @@ -16,11 +16,9 @@ from ..._compat import ValidationError, create_model_from_typeddict from ...types import ( CreateChatCompletion, - CreateChatCompletionCTransformers, CreateChatCompletionLlamaCpp, CreateChatCompletionTorch, CreateCompletion, - CreateCompletionCTransformers, CreateCompletionLlamaCpp, CreateCompletionTorch, _CreateCompletionOpenAIFallback, @@ -67,11 +65,7 @@ def test_create_completion_types(): CreateCompletion(model="abc", prompt="def") - types = [ - CreateCompletionTorch, - CreateCompletionLlamaCpp, - CreateCompletionCTransformers, - ] + types = [CreateCompletionTorch, CreateCompletionLlamaCpp] for t in types: t() assert "model" not in t.__fields__ @@ -93,11 +87,7 @@ def test_create_chat_completion_types(): CreateChatCompletion(model="abc", messages=[{"role": "tool"}], max_tokens=None) - types = [ - CreateChatCompletionTorch, - CreateChatCompletionLlamaCpp, - CreateChatCompletionCTransformers, - ] + types = [CreateChatCompletionTorch, CreateChatCompletionLlamaCpp] for t in types: t() assert "model" not in t.__fields__ @@ -108,6 +98,5 @@ def test_create_chat_completion_types(): check_fields(types[i], types[j]) # These chat and generate share the same type. - assert CreateChatCompletionCTransformers is CreateCompletionCTransformers assert CreateChatCompletionLlamaCpp is CreateCompletionLlamaCpp assert CreateChatCompletionTorch is CreateCompletionTorch diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 2f2ff6cca8..ec25095c3d 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -49,7 +49,6 @@ def _install(): from .ggml.chatglm import ChatglmCppChatModel - from .ggml.ctransformers import CtransformersModel from .ggml.llamacpp import LlamaCppChatModel, LlamaCppModel from .pytorch.baichuan import BaichuanPytorchChatModel from .pytorch.chatglm import ChatglmPytorchChatModel @@ -77,11 +76,6 @@ def _install(): ChatglmCppChatModel, ] ) - LLM_CLASSES.extend( - [ - CtransformersModel, - ] - ) LLM_CLASSES.extend([SGLANGModel, SGLANGChatModel]) LLM_CLASSES.extend([VLLMModel, VLLMChatModel]) LLM_CLASSES.extend( diff --git a/xinference/model/llm/ggml/ctransformers.py b/xinference/model/llm/ggml/ctransformers.py deleted file mode 100644 index 52184767a9..0000000000 --- a/xinference/model/llm/ggml/ctransformers.py +++ /dev/null @@ -1,281 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import os -from typing import TYPE_CHECKING, Iterator, Optional, Sequence, TypedDict, Union - -if TYPE_CHECKING: - from ctransformers import AutoConfig - -from ....types import Completion, CompletionChunk, CreateCompletionCTransformers -from ..core import LLM -from ..llm_family import LLMFamilyV1, LLMSpecV1 -from .ctransformers_util import generate_stream - -logger = logging.getLogger(__name__) - -# all supported models for Ctransformers with their model type. -# Please Strictly follows this name format when inputting new model to model_family. -MODEL_TYPE_FOR_CTRANSFORMERS = { - "gpt-2": "gpt2", - "gpt-j": "gptj", - "gpt4all-j": "gptj", - "gpt-neox": "gpt_neox", - "stablelm": "gpt_neox", - "llama": "llama", - "llama-2": "llama", - "mpt": "mpt", - "dolly-v2": "dolly-v2", - "replit": "replit", - "starcoder": "starcoder", - "starchat": "starcoder", - "falcon": "falcon", -} - -# these two constants subjects to change for future development and ctransformers updates. -CTRANSFORMERS_SUPPORTED_MODEL = ["starcoder", "gpt-2"] - -CTRANSFORMERS_GPU_SUPPORT = ["llama", "llama-2", "mpt", "falcon"] - -SIZE_TO_GPU_LAYERS = { - 3: 26, - 7: 32, - 13: 40, - 30: 60, - 65: 80, -} - - -class CtransformersModelConfig(TypedDict, total=False): - n_ctx: int - n_gpu_layers: int - - -class CtransformersGenerateConfig(TypedDict, total=False): - max_tokens: Optional[int] - top_k: Optional[int] - top_p: Optional[float] - temperature: Optional[float] - repetition_penalty: Optional[float] - last_n_tokens: Optional[int] - seed: Optional[int] - batch_size: Optional[int] - threads: Optional[int] - stop: Optional[Sequence[str]] - stream: Optional[bool] - reset: Optional[bool] - - -class CtransformersModel(LLM): - def __init__( - self, - model_uid: str, - model_family: "LLMFamilyV1", - model_spec: "LLMSpecV1", - quantization: str, - model_path: str, - ctransformers_model_config: Optional[CtransformersModelConfig], - ): - super().__init__(model_uid, model_family, model_spec, quantization, model_path) - - self._model_type = None - closest_size = min( - SIZE_TO_GPU_LAYERS.keys(), - key=lambda x: abs( - x - self.handle_model_size(model_spec.model_size_in_billions) - ), - ) - - self._model_family = model_family - self._model_uid = model_uid - self._llm = None - - self._gpu_layers = SIZE_TO_GPU_LAYERS[closest_size] - self._ctransformer_model_config = self._sanitize_model_config( - model_path, ctransformers_model_config - ) - - def _sanitize_model_config( - self, model_path, ctransformers_model_config: Optional[CtransformersModelConfig] - ) -> "AutoConfig": - try: - from ctransformers import AutoConfig, Config - except ImportError: - error_message = ( - "Failed to import module 'ctransformers - AutoConfig and Config'" - ) - - installation_guide = [ - f"Please make sure 'ctransformers' is installed.", - f"You can install it by checking out the repository for command:" - f"https://github.com/marella/ctransformers", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - # if the model have customized config, we update it. - model_config_ret = Config() - potential_gpu_layers = None - if ctransformers_model_config: - potential_context_length = ctransformers_model_config.pop("n_ctx", None) - potential_gpu_layers = ctransformers_model_config.pop("n_gpu_layers", None) - - model_config_ret.context_length = potential_context_length - model_config_ret.gpu_layers = potential_gpu_layers - - # if user does not define gpu layers, we have to set it with our system if applicable. - if potential_gpu_layers is None: - if self._model_family.model_name not in CTRANSFORMERS_GPU_SUPPORT: - model_config_ret.gpu_layers = -1 - elif self._is_darwin_and_apple_silicon(): - model_config_ret.gpu_layers = 1 - elif self._has_cuda_device(): - model_config_ret.gpu_layers = self._gpu_layers - - return AutoConfig(model_config_ret) - - def _sanitize_generate_config( - self, - generate_config: Optional[CtransformersGenerateConfig], - ) -> CtransformersGenerateConfig: - # if the input config is not None, we try to copy the selected attributes to the ctransformersGenerateConfig. - if generate_config is None: - generate_config = CtransformersGenerateConfig( - **CreateCompletionCTransformers().dict() - ) - else: - # Validate generate_config and fill default values to the generate config. - generate_config = CtransformersGenerateConfig( - **CreateCompletionCTransformers(**generate_config).dict() - ) - - # for our system, the threads will have to be set to 4 - # all other parameters, if not specified, will be set to default when generate. - generate_config.setdefault("threads", 4) - - return generate_config - - def load(self): - try: - from ctransformers import AutoModelForCausalLM - except ImportError: - error_message = "Failed to import module 'ctransformers'" - - installation_guide = [ - f"Please make sure 'ctransformers' is installed.", - f"You can install it by checking out the repository for command." - f"https://github.com/marella/ctransformers", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - model_path = os.path.join( - self.model_path, - self.model_spec.model_file_name_template.format( - quantization=self.quantization - ), - ) - - self._model_type = self._determine_model_type() - self._llm = AutoModelForCausalLM.from_pretrained( - model_path_or_repo_id=model_path, - model_type=self._model_type, - config=self._ctransformer_model_config, - ) - - @classmethod - def match( - cls, llm_family: LLMFamilyV1, llm_spec: LLMSpecV1, quantization: str - ) -> bool: - if llm_spec.model_format != "ggmlv3" and llm_spec.model_format != "ggufv2": - return False - if llm_family.model_name not in CTRANSFORMERS_SUPPORTED_MODEL: - return False - if "generate" not in llm_family.model_ability: - return False - return True - - def _determine_model_type(self): - if self._model_family.model_name not in MODEL_TYPE_FOR_CTRANSFORMERS: - raise ValueError( - f"The current model {self._model_family.model_name} is not supported, check your model name. " - ) - return MODEL_TYPE_FOR_CTRANSFORMERS[self._model_family.model_name] - - def generate( - self, prompt: str, generate_config_raw: CtransformersGenerateConfig - ) -> Union[Completion, Iterator[CompletionChunk]]: - def generator_wrapper( - _prompt: str, - _max_new_tokens: Union[int, None], - _generate_config: CtransformersGenerateConfig, - ) -> Iterator[CompletionChunk]: - assert self._model_uid is not None - for _completion_chunk, _ in generate_stream( - model=self._model_uid, - model_ref=self._llm, - prompt=_prompt, - max_new_tokens=_max_new_tokens, - **_generate_config, - ): - yield _completion_chunk - - generate_config = self._sanitize_generate_config(generate_config_raw) - - logger.debug( - "Enter generate, prompt: %s, generate config: %s", prompt, generate_config - ) - - max_new_tokens = generate_config.pop("max_tokens", None) - - stream_or_not = generate_config.get("stream", False) - if stream_or_not: - return generator_wrapper( - _prompt=prompt, - _max_new_tokens=max_new_tokens, - _generate_config=generate_config, - ) - else: - assert self.model_uid is not None - completion_chunk = None - completion_usage = None - for completion_chunk, completion_usage in generate_stream( - model=self.model_uid, - model_ref=self._llm, - prompt=prompt, - max_new_tokens=max_new_tokens, - **generate_config, - ): - pass - - assert completion_chunk is not None - assert completion_usage is not None - - completion = Completion( - id=completion_chunk["id"], - object=completion_chunk["object"], - created=completion_chunk["created"], - model=completion_chunk["model"], - choices=completion_chunk["choices"], - usage=completion_usage, - ) - - logger.debug( - "Generated, completion: %s, generate config: %s", - completion, - generate_config, - ) - - return completion diff --git a/xinference/model/llm/ggml/ctransformers_util.py b/xinference/model/llm/ggml/ctransformers_util.py deleted file mode 100644 index e263a56a70..0000000000 --- a/xinference/model/llm/ggml/ctransformers_util.py +++ /dev/null @@ -1,161 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import logging -import re -import time -import uuid -from typing import Iterator, Optional, Sequence, Tuple - -from ....types import CompletionChoice, CompletionChunk, CompletionUsage - -logger = logging.getLogger(__name__) - - -def generate_stream( - model, - model_ref, - prompt: str, - *, - max_new_tokens: Optional[int] = None, - top_k: Optional[int] = None, - top_p: Optional[float] = None, - temperature: Optional[float] = None, - repetition_penalty: Optional[float] = None, - last_n_tokens: Optional[int] = None, - seed: Optional[int] = None, - batch_size: Optional[int] = None, - stream: Optional[bool] = False, - threads: Optional[int] = None, - stop: Optional[Sequence[str]] = None, - reset: Optional[bool] = None, - **kwargs, -) -> Iterator[Tuple[CompletionChunk, CompletionUsage]]: - stop = stop or [] - if isinstance(stop, str): - stop = [stop] - - tokens = model_ref.tokenize(prompt) - - stop_regex = re.compile("|".join(map(re.escape, stop))) - count = 0 - text = "" - total_text = "" - incomplete = b"" - - # parameters needed for Xinference. - finish_reason = None - - try: - from ctransformers.utils import utf8_split_incomplete - except ImportError: - error_message = ( - "Failed to import module 'ctransformers - utf8_split_incomplete'" - ) - - installation_guide = [ - "Please make sure 'ctransformers' is installed. You can install it by checking out the repository: " - "https://github.com/marella/ctransformers", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - for token in model_ref.generate( - tokens, - top_k=top_k, - top_p=top_p, - temperature=temperature, - repetition_penalty=repetition_penalty, - last_n_tokens=last_n_tokens, - seed=seed, - batch_size=batch_size, - threads=threads, - reset=reset, - ): - # Handle incomplete UTF-8 multi-byte characters. - incomplete += model_ref.detokenize([token], decode=False) - complete, incomplete = utf8_split_incomplete(incomplete) - output = complete.decode(errors="ignore") - text += output - total_text += output - - # https://github.com/abetlen/llama-cpp-python/blob/1a13d76c487df1c8560132d10bda62d6e2f4fa93/llama_cpp/llama.py#L686-L706 - # Check if one of the stop sequences is part of the text. - # Note that the stop sequence may not always be at the end of text. - if stop: - match = stop_regex.search(text) - if match: - text = text[: match.start()] - finish_reason = "stop" - break - - # Avoid sending the longest suffix of text which is also a prefix - # of a stop sequence, as it can form a stop sequence with the text - # generated later. - longest = 0 - for s in stop: - for i in range(len(s), 0, -1): - if text.endswith(s[:i]): - longest = max(i, longest) - break - - end = len(text) - longest - if end > 0: - output = text[:end] - completion_choice = CompletionChoice( - text=output, index=0, logprobs=None, finish_reason=None - ) - completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), - object="text_completion", - created=int(time.time()), - model=model, - choices=[completion_choice], - ) - completion_usage = CompletionUsage( - prompt_tokens=len(tokens), - completion_tokens=count + 1, - total_tokens=count + 1 + len(tokens), - ) - - yield completion_chunk, completion_usage - text = text[end:] - - count += 1 - if max_new_tokens is not None and count >= max_new_tokens: - finish_reason = "length" - break - - if stream is False: - completion_choice = CompletionChoice( - text=total_text, index=0, logprobs=None, finish_reason=finish_reason - ) - else: - completion_choice = CompletionChoice( - text=text, index=0, logprobs=None, finish_reason=finish_reason - ) - - completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), - object="text_completion", - created=int(time.time()), - model=model, - choices=[completion_choice], - ) - completion_usage = CompletionUsage( - prompt_tokens=len(tokens), - completion_tokens=count, - total_tokens=count + len(tokens), - ) - - yield completion_chunk, completion_usage diff --git a/xinference/model/llm/ggml/llamacpp.py b/xinference/model/llm/ggml/llamacpp.py index 3ef3d70806..3725c7fdbd 100644 --- a/xinference/model/llm/ggml/llamacpp.py +++ b/xinference/model/llm/ggml/llamacpp.py @@ -30,7 +30,6 @@ from ..core import LLM from ..llm_family import LLMFamilyV1, LLMSpecV1 from ..utils import ChatModelMixin -from .ctransformers import CTRANSFORMERS_SUPPORTED_MODEL logger = logging.getLogger(__name__) @@ -182,11 +181,7 @@ def match( ) -> bool: if llm_spec.model_format not in ["ggmlv3", "ggufv2"]: return False - if ( - "chatglm" in llm_family.model_name - or "qwen" in llm_family.model_name - or llm_family.model_name in CTRANSFORMERS_SUPPORTED_MODEL - ): + if "chatglm" in llm_family.model_name or "qwen" in llm_family.model_name: return False if "generate" not in llm_family.model_ability: return False @@ -250,10 +245,7 @@ def match( ) -> bool: if llm_spec.model_format not in ["ggmlv3", "ggufv2"]: return False - if ( - "chatglm" in llm_family.model_name - or llm_family.model_name in CTRANSFORMERS_SUPPORTED_MODEL - ): + if "chatglm" in llm_family.model_name: return False if "chat" not in llm_family.model_ability: return False diff --git a/xinference/model/llm/ggml/tests/test_ctransformers.py b/xinference/model/llm/ggml/tests/test_ctransformers.py deleted file mode 100644 index 9bbcecb70f..0000000000 --- a/xinference/model/llm/ggml/tests/test_ctransformers.py +++ /dev/null @@ -1,162 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import random -import string - -import pytest - -from .....client import Client -from .....client.restful.restful_client import RESTfulGenerateModelHandle -from ....llm import GgmlLLMSpecV1, LLMFamilyV1 -from ..ctransformers import CtransformersModel - -mock_model_spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=6, - quantizations=["q2_k", "q4_0"], - model_id="test_id", - model_file_name_template="TestModel.{quantization}.ggmlv3.bin", -) - -test_model_spec = """{ - "version":1, - "context_length":2048, - "model_name":"TestModel", - "model_lang":[ - "en" - ], - "model_ability":[ - "embed", "generate" - ], - "model_specs":[ - { - "model_format":"ggmlv3", - "model_size_in_billions":6, - "quantizations": ["q2_k", "q4_0"], - "model_id":"test_id", - "model_file_name_template":"TestModel.{quantization}.ggmlv3.bin" - }, - { - "model_format":"pytorch", - "model_size_in_billions":3, - "quantizations": ["int8", "int4", "none"], - "model_id":"example/TestModel" - } - ], - "prompt_style": null -}""" - -mock_model_family = LLMFamilyV1.parse_raw(test_model_spec) - - -@pytest.mark.parametrize( - "model_spec, model_family", [(mock_model_spec, mock_model_family)] -) -def test_ctransformer_init(model_spec, model_family): - from ctransformers import AutoConfig - - quantization = "q4_0" - uid = "".join(random.choice(string.digits) for i in range(15)) - path = "".join( - random.choice(string.ascii_letters + string.punctuation) for i in range(100) - ) - model = CtransformersModel( - model_uid=uid, - model_family=model_family, - model_spec=model_spec, - quantization=quantization, - model_path=path, - ctransformers_model_config=None, - ) - - assert model.model_uid == uid - assert model.quantization == quantization - assert model.model_path == path - assert model._ctransformer_model_config is not None - assert isinstance(model._ctransformer_model_config, AutoConfig) - - assert isinstance(model.model_spec, GgmlLLMSpecV1) - assert isinstance(model.model_family, LLMFamilyV1) - assert isinstance(model.model_family.model_specs[0], GgmlLLMSpecV1) - - assert ( - model.model_family.model_specs[0].model_format == model.model_spec.model_format - ) - assert model.model_family.model_specs[0].model_format == model_spec.model_format - assert ( - model.model_family.model_specs[0].model_size_in_billions - == model.model_spec.model_size_in_billions - ) - assert ( - model.model_family.model_specs[0].model_size_in_billions - == model_spec.model_size_in_billions - ) - assert ( - model.model_family.model_specs[0].quantizations - == model.model_spec.quantizations - ) - assert model.model_family.model_specs[0].quantizations == model_spec.quantizations - assert model.model_family.model_specs[0].model_id == model.model_spec.model_id - assert model.model_family.model_specs[0].model_id == model_spec.model_id - assert ( - model.model_family.model_specs[0].model_file_name_template - == model.model_spec.model_file_name_template - ) - assert ( - model.model_family.model_specs[0].model_file_name_template - == model_spec.model_file_name_template - ) - assert model._llm is None - - -@pytest.mark.asyncio -async def test_ctransformers_generate(setup): - endpoint, _ = setup - client = Client(endpoint) - assert len(client.list_models()) == 0 - - model_uid = client.launch_model( - model_name="gpt-2", - model_size_in_billions=1, - model_format="ggmlv3", - quantization="none", - ) - - assert len(client.list_models()) == 1 - - model = client.get_model(model_uid=model_uid) - assert isinstance(model, RESTfulGenerateModelHandle) - - completion = model.generate("AI is going to", generate_config={"max_tokens": 5}) - print(completion) - assert "id" in completion - assert "text" in completion["choices"][0] - assert len(completion["choices"][0]["text"]) > 0 - - assert completion["model"] == model_uid - - assert "finish_reason" in completion["choices"][0] - assert completion["choices"][0]["finish_reason"] == "length" - - assert "prompt_tokens" in completion["usage"] - assert completion["usage"]["prompt_tokens"] == 4 - - assert "completion_tokens" in completion["usage"] - assert completion["usage"]["completion_tokens"] == 5 - - assert "total_tokens" in completion["usage"] - assert completion["usage"]["total_tokens"] == 9 - - client.terminate_model(model_uid=model_uid) - assert len(client.list_models()) == 0 diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index c94739531b..7ed1b4509c 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1970,13 +1970,13 @@ "model_description": "GPT-2 is a Transformer-based LLM that is trained on WebTest, a 40 GB dataset of Reddit posts with 3+ upvotes.", "model_specs": [ { - "model_format": "ggmlv3", - "model_size_in_billions": 1, + "model_format": "pytorch", + "model_size_in_billions": "1_5", "quantizations": [ "none" ], - "model_id": "marella/gpt-2-ggml", - "model_file_name_template": "ggml-model.bin" + "model_id": "openai-community/gpt2", + "model_revision": "607a30d783dfa663caf39e06633721c8d4cfcd7e" } ] }, diff --git a/xinference/types.py b/xinference/types.py index 29e7e4ce35..6496edbecc 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -357,21 +357,6 @@ class CreateCompletionTorch(BaseModel): except ImportError: CreateCompletionLlamaCpp = create_model("CreateCompletionLlamaCpp") -CreateCompletionCTransformers: BaseModel -try: - from ctransformers.llm import LLM - - CreateCompletionCTransformers = get_pydantic_model_from_method( - LLM.generate, - exclude_fields=["tokens"], - include_fields={ - "max_tokens": (Optional[int], max_tokens_field), - "stream": (Optional[bool], stream_field), - }, - ) -except ImportError: - CreateCompletionCTransformers = create_model("CreateCompletionCTransformers") - # This type is for openai API compatibility CreateCompletionOpenAI: BaseModel @@ -417,7 +402,6 @@ class CreateCompletion( ModelAndPrompt, CreateCompletionTorch, CreateCompletionLlamaCpp, - CreateCompletionCTransformers, CreateCompletionOpenAI, ): pass @@ -430,8 +414,6 @@ class CreateChatModel(BaseModel): # Currently, chat calls generates, so the params share the same one. CreateChatCompletionTorch = CreateCompletionTorch CreateChatCompletionLlamaCpp: BaseModel = CreateCompletionLlamaCpp -CreateChatCompletionCTransformers: BaseModel = CreateCompletionCTransformers - # This type is for openai API compatibility CreateChatCompletionOpenAI: BaseModel @@ -452,7 +434,6 @@ class CreateChatCompletion( CreateChatModel, CreateChatCompletionTorch, CreateChatCompletionLlamaCpp, - CreateChatCompletionCTransformers, CreateChatCompletionOpenAI, ): pass From ad2f49948a61b7164b42149acb4bdbb64e869ad8 Mon Sep 17 00:00:00 2001 From: Hexiao Zhang <731931282qq@gmail.com> Date: Thu, 11 Apr 2024 11:09:01 +0800 Subject: [PATCH 007/298] FEAT: Enable streaming in tool calls for Qwen when using vllm (#1215) Co-authored-by: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> --- xinference/api/restful_api.py | 9 ++++-- xinference/model/llm/utils.py | 46 ++++++++++++++++++++++++++++--- xinference/model/llm/vllm/core.py | 38 +++++++++++++++++++++++-- xinference/types.py | 13 +++++++++ 4 files changed, 97 insertions(+), 9 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index c9d222f220..3fcf068c45 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1361,9 +1361,12 @@ async def create_chat_completion(self, request: Request) -> Response: detail=f"Only {function_call_models} support tool messages", ) if body.tools and body.stream: - raise HTTPException( - status_code=400, detail="Tool calls does not support stream" - ) + is_vllm = await model.is_vllm_backend() + if not is_vllm or model_family not in ["qwen-chat", "qwen1.5-chat"]: + raise HTTPException( + status_code=400, + detail="Streaming support for tool calls is available only when using vLLM backend and Qwen models.", + ) if body.stream: diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index f404aba5e5..80db9c23b3 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -163,7 +163,7 @@ def get_role(role_name: str): for i, message in enumerate(chat_history): role = get_role(message["role"]) - content = message["content"] + content = message.get("content") tool_calls = message.get("tool_calls") if tool_calls: content = tool_calls[0]["function"] @@ -248,7 +248,7 @@ def get_role(role_name: str): ret = f"<|im_start|>system\n{prompt_style.system_prompt}<|im_end|>" for message in chat_history: role = get_role(message["role"]) - content = message["content"] + content = message.get("content") ret += prompt_style.intra_message_sep if tools: @@ -446,6 +446,11 @@ def _to_chat_completion_chunk(cls, chunk: CompletionChunk) -> ChatCompletionChun "index": i, "delta": { "content": choice["text"], + **( + {"tool_calls": choice["tool_calls"]} + if "tool_calls" in choice + else {} + ), }, "finish_reason": choice["finish_reason"], } @@ -592,8 +597,7 @@ def _eval_qwen_chat_arguments(c, tools): return text, None, None @classmethod - def _tool_calls_completion(cls, model_family, model_uid, c, tools): - _id = str(uuid.uuid4()) + def _eval_tool_arguments(cls, model_family, c, tools): family = model_family.model_family or model_family.model_name if family in ["gorilla-openfunctions-v1", "gorilla-openfunctions-v2"]: content, func, args = cls._eval_gorilla_openfunctions_arguments(c, tools) @@ -606,7 +610,41 @@ def _tool_calls_completion(cls, model_family, model_uid, c, tools): f"Model {model_family.model_name} is not support tool calls." ) logger.debug("Tool call content: %s, func: %s, args: %s", content, func, args) + return content, func, args + + @classmethod + def _tools_token_filter(cls, model_family): + """ + Generates a filter function for Qwen series models to retain outputs after "\nFinal Answer:". + Returns: + A function that takes tokens (string output by the model so far) as input + returns True if current token is after "\nFinal Answer:", else False. + """ + family = model_family.model_family or model_family.model_name + if family in ["qwen-chat", "qwen1.5-chat"]: + # Encapsulating function to reset 'found' after each call + found = False + + def process_token(tokens: str): + nonlocal found + # Once "Final Answer:" is found, future tokens are allowed. + if found: + return True + # Check if the token ends with "\nFinal Answer:" and update `found`. + if tokens.endswith("\nFinal Answer:"): + found = True + return False + + return process_token + else: + # For other families, allow all tokens. + return lambda tokens: True + + @classmethod + def _tool_calls_completion(cls, model_family, model_uid, c, tools): + _id = str(uuid.uuid4()) + content, func, args = cls._eval_tool_arguments(model_family, c, tools) if func: m = { "role": "assistant", diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 40bb3c7132..021a7c2bea 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json import logging import multiprocessing import time @@ -36,6 +37,8 @@ CompletionChoice, CompletionChunk, CompletionUsage, + ToolCallFunction, + ToolCalls, ) from .. import LLM, LLMFamilyV1, LLMSpecV1 from ..llm_family import CustomLLMFamilyV1 @@ -304,6 +307,7 @@ async def async_generate( self, prompt: str, generate_config: Optional[Dict] = None, + tools: object = False, ) -> Union[Completion, AsyncGenerator[CompletionChunk, None]]: try: from vllm.sampling_params import SamplingParams @@ -330,16 +334,46 @@ async def async_generate( async def stream_results() -> AsyncGenerator[CompletionChunk, None]: previous_texts = [""] * sanitized_generate_config["n"] + tools_token_filter = ChatModelMixin._tools_token_filter(self.model_family) async for _request_output in results_generator: chunk = self._convert_request_output_to_completion_chunk( request_id=request_id, model=self.model_uid, request_output=_request_output, ) + for i, choice in enumerate(chunk["choices"]): delta = choice["text"][len(previous_texts[i]) :] previous_texts[i] = choice["text"] choice["text"] = delta + + if tools: + # only handle the first choice + choice = chunk["choices"][0] + if choice["finish_reason"] is not None: + # use previous text for evaluation temporarily + choice_delta = choice["text"] + choice["text"] = previous_texts[0] + _content, func, args = ChatModelMixin._eval_tool_arguments( + self.model_family, chunk, tools + ) + choice["text"] = choice_delta + if func is not None: + choice["text"] = None + choice["finish_reason"] = "tool_calls" + choice["tool_calls"] = [ + ToolCalls( + id=str(uuid.uuid4()), + type="function", + function=ToolCallFunction( + name=func, + arguments=json.dumps(args, ensure_ascii=False), + ), + ) + ] + # use a filter function to skip Qwen's react thought process + elif not tools_token_filter(previous_texts[0]): + continue prompt_tokens = len(_request_output.prompt_token_ids) completion_tokens = sum( len(output.token_ids) for output in _request_output.outputs @@ -427,7 +461,7 @@ async def async_chat( generate_config = self._sanitize_chat_config(generate_config) # TODO(codingl2k1): qwen hacky to set stop for function call. model_family = self.model_family.model_family or self.model_family.model_name - if tools and "qwen-chat" == model_family: + if tools and model_family in ["qwen-chat", "qwen1.5-chat"]: stop = generate_config.get("stop") if isinstance(stop, str): generate_config["stop"] = [stop, "Observation:"] @@ -440,7 +474,7 @@ async def async_chat( stream = generate_config.get("stream", None) if stream: - agen = await self.async_generate(full_prompt, generate_config) + agen = await self.async_generate(full_prompt, generate_config, tools) assert isinstance(agen, AsyncGenerator) return self._async_to_chat_completion_chunks(agen) else: diff --git a/xinference/types.py b/xinference/types.py index 6496edbecc..964a865ac7 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -91,11 +91,23 @@ class CompletionLogprobs(TypedDict): top_logprobs: List[Optional[Dict[str, float]]] +class ToolCallFunction(TypedDict): + name: str + arguments: str + + +class ToolCalls(TypedDict): + id: str + type: Literal["function"] + function: ToolCallFunction + + class CompletionChoice(TypedDict): text: str index: int logprobs: Optional[CompletionLogprobs] finish_reason: Optional[str] + tool_calls: NotRequired[List[ToolCalls]] class CompletionUsage(TypedDict): @@ -147,6 +159,7 @@ class ChatCompletion(TypedDict): class ChatCompletionChunkDelta(TypedDict): role: NotRequired[str] content: NotRequired[str] + tool_calls: NotRequired[List[ToolCalls]] class ChatCompletionChunkChoice(TypedDict): From ace54288293ab5a3361540ad6874a94c82c5b034 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Thu, 11 Apr 2024 12:01:52 +0800 Subject: [PATCH 008/298] BUG: Fix authority and jump issue (#1276) --- xinference/web/ui/src/App.js | 46 +++-------------- xinference/web/ui/src/components/MenuSide.js | 13 +++-- xinference/web/ui/src/components/Title.js | 1 + .../web/ui/src/components/authAlertDialog.js | 14 ++--- xinference/web/ui/src/components/fetcher.js | 23 ++++----- xinference/web/ui/src/router/index.js | 51 +++++++++++++++++++ .../web/ui/src/scenes/launch_model/index.js | 38 +++++++++----- .../src/scenes/launch_model/launchCustom.js | 21 +++++--- .../ui/src/scenes/launch_model/launchLLM.js | 4 +- .../ui/src/scenes/launch_model/modelCard.js | 10 +++- xinference/web/ui/src/scenes/login/login.js | 3 +- .../web/ui/src/scenes/register_model/index.js | 5 +- .../register_model/register_embedding.js | 5 ++ .../scenes/register_model/register_rerank.js | 5 ++ .../web/ui/src/scenes/running_models/index.js | 28 +++++----- 15 files changed, 167 insertions(+), 100 deletions(-) create mode 100644 xinference/web/ui/src/router/index.js diff --git a/xinference/web/ui/src/App.js b/xinference/web/ui/src/App.js index e689305f6b..eb587a1c4a 100644 --- a/xinference/web/ui/src/App.js +++ b/xinference/web/ui/src/App.js @@ -2,18 +2,13 @@ import { CssBaseline, ThemeProvider } from '@mui/material' import Snackbar from '@mui/material/Snackbar' import React, { useEffect, useState } from 'react' import { useCookies } from 'react-cookie' -import { HashRouter, Route, Routes } from 'react-router-dom' +import { HashRouter } from 'react-router-dom' import { Alert } from './components/alertComponent' import { ApiContextProvider } from './components/apiContext' import AuthAlertDialog from './components/authAlertDialog' -import { getEndpoint, isValidBearerToken } from './components/utils' -import Layout from './scenes/_layout' -import ClusterInfo from './scenes/cluster_info' -import LaunchModel from './scenes/launch_model' -import Login from './scenes/login/login' -import RegisterModel from './scenes/register_model' -import RunningModels from './scenes/running_models' +import { getEndpoint } from './components/utils' +import WraperRoutes from './router/index' import { useMode } from './theme' function App() { @@ -23,10 +18,6 @@ function App() { const endPoint = getEndpoint() - const removeToken = () => { - removeCookie('token', { path: '/' }) - } - useEffect(() => { // token possible value: no_auth / need_auth / fetch(endPoint + '/v1/cluster/auth', { @@ -45,27 +36,14 @@ function App() { }) } else { res.json().then((data) => { - if (data['auth'] === false) { - if (cookie.token !== 'no_auth') { - setCookie('token', 'no_auth', { path: '/' }) - } - } else { - // TODO: validate bearer token - if ( - cookie.token === undefined || - !isValidBearerToken(cookie.token) - ) { - // not a bearer token, need a bearer token here - setCookie('token', 'need_auth', { path: '/' }) - } + if (!data.auth && cookie.token !== 'no_auth') { + setCookie('token', 'no_auth', { path: '/' }) + } else if (data.auth && !sessionStorage.getItem('token')) { + removeCookie('token', { path: '/' }) } }) } }) - // return a function in useEffect means doing something on component unmount - return () => { - removeToken() - } }, []) const handleClose = (event, reason) => { @@ -92,15 +70,7 @@ function App() { - - } /> - }> - } /> - } /> - } /> - } /> - - + diff --git a/xinference/web/ui/src/components/MenuSide.js b/xinference/web/ui/src/components/MenuSide.js index b904c79401..429f454032 100644 --- a/xinference/web/ui/src/components/MenuSide.js +++ b/xinference/web/ui/src/components/MenuSide.js @@ -138,7 +138,6 @@ const MenuSide = () => { } const link = text.toLowerCase().replace(' ', '_') - console.log(link) return ( @@ -151,11 +150,19 @@ const MenuSide = () => { 'noreferrer' ) } else if (link === 'launch_model') { - navigate(`/`) + sessionStorage.setItem('modelType', '/launch_model/llm') + navigate('/launch_model/llm') setActive(link) console.log(active) } else if (link === 'cluster_information') { - navigate(`/cluster_info`) + navigate('/cluster_info') + setActive(link) + } else if (link === 'running_models') { + navigate('/running_models/LLM') + sessionStorage.setItem( + 'runningModelType', + '/running_models/LLM' + ) setActive(link) console.log(active) } else { diff --git a/xinference/web/ui/src/components/Title.js b/xinference/web/ui/src/components/Title.js index 05e124a281..c622c7e46e 100644 --- a/xinference/web/ui/src/components/Title.js +++ b/xinference/web/ui/src/components/Title.js @@ -12,6 +12,7 @@ const Title = ({ title }) => { const handleLogout = () => { removeCookie('token', { path: '/' }) + sessionStorage.removeItem('token') navigate('/login', { replace: true }) } diff --git a/xinference/web/ui/src/components/authAlertDialog.js b/xinference/web/ui/src/components/authAlertDialog.js index 4150ac54b2..e878f2fc93 100644 --- a/xinference/web/ui/src/components/authAlertDialog.js +++ b/xinference/web/ui/src/components/authAlertDialog.js @@ -1,9 +1,11 @@ -import Button from '@mui/material/Button' -import Dialog from '@mui/material/Dialog' -import DialogActions from '@mui/material/DialogActions' -import DialogContent from '@mui/material/DialogContent' -import DialogContentText from '@mui/material/DialogContentText' -import DialogTitle from '@mui/material/DialogTitle' +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, +} from '@mui/material' import * as React from 'react' import { useEffect, useState } from 'react' import { useCookies } from 'react-cookie' diff --git a/xinference/web/ui/src/components/fetcher.js b/xinference/web/ui/src/components/fetcher.js index 6d1544ebe0..08d0dade98 100644 --- a/xinference/web/ui/src/components/fetcher.js +++ b/xinference/web/ui/src/components/fetcher.js @@ -1,7 +1,5 @@ import { Cookies } from 'react-cookie' -import { isValidBearerToken } from './utils' - const cookies = new Cookies() const updateOptions = (url, options) => { @@ -9,7 +7,7 @@ const updateOptions = (url, options) => { if (cookies.get('token') !== 'no_auth') { update.headers = { ...update.headers, - Authorization: 'Bearer ' + cookies.get('token'), + Authorization: 'Bearer ' + sessionStorage.getItem('token'), } } return update @@ -19,16 +17,15 @@ export default function fetcher(url, options) { return fetch(url, updateOptions(url, options)).then((res) => { // For the situation that server has already been restarted, the current token may become invalid, // which leads to UI hangs. - if (res.status === 401 && isValidBearerToken(cookies.get('token'))) { - if (localStorage.getItem('authStatus') !== '401') { - localStorage.setItem('authStatus', '401') - window.dispatchEvent(new Event('auth-status')) - } - } else if (res.status === 403 && isValidBearerToken(cookies.get('token'))) { - if (localStorage.getItem('authStatus') !== '403') { - localStorage.setItem('authStatus', '403') - window.dispatchEvent(new Event('auth-status')) - } + if (res.status == 401 && localStorage.getItem('authStatus') !== '401') { + localStorage.setItem('authStatus', '401') + window.dispatchEvent(new Event('auth-status')) + } else if ( + res.status == 403 && + localStorage.getItem('authStatus') !== '403' + ) { + localStorage.setItem('authStatus', '403') + window.dispatchEvent(new Event('auth-status')) } else { return res } diff --git a/xinference/web/ui/src/router/index.js b/xinference/web/ui/src/router/index.js new file mode 100644 index 0000000000..b51299d72d --- /dev/null +++ b/xinference/web/ui/src/router/index.js @@ -0,0 +1,51 @@ +import { Navigate, useRoutes } from 'react-router-dom' + +import Layout from '../scenes/_layout' +import ClusterInfo from '../scenes/cluster_info' +import LaunchModel from '../scenes/launch_model' +import Login from '../scenes/login/login' +import RegisterModel from '../scenes/register_model' +import RunningModels from '../scenes/running_models' + +const routes = [ + { + path: '/', + element: , + children: [ + { + path: '/', + element: , + }, + { + path: 'launch_model/:Modeltype/:subType?', + element: , + }, + { + path: 'running_models/:runningModelType', + element: , + }, + { + path: 'register_model', + element: , + }, + { + path: 'cluster_info', + element: , + }, + ], + }, + { + path: '/login', + element: , + }, + { + path: '*', + element: , + }, +] +const WraperRoutes = () => { + let element = useRoutes(routes) + return element +} + +export default WraperRoutes diff --git a/xinference/web/ui/src/scenes/launch_model/index.js b/xinference/web/ui/src/scenes/launch_model/index.js index 29c0adee04..ab6c8fbb55 100644 --- a/xinference/web/ui/src/scenes/launch_model/index.js +++ b/xinference/web/ui/src/scenes/launch_model/index.js @@ -13,7 +13,11 @@ import LaunchModelComponent from './LaunchModelComponent' const LaunchModel = () => { let endPoint = useContext(ApiContext).endPoint - const [value, setValue] = React.useState('1') + const [value, setValue] = React.useState( + sessionStorage.getItem('modelType') + ? sessionStorage.getItem('modelType') + : '/launch_model/llm' + ) const [gpuAvailable, setGPUAvailable] = useState(-1) const { setErrorMsg } = useContext(ApiContext) @@ -22,13 +26,18 @@ const LaunchModel = () => { const handleTabChange = (event, newValue) => { setValue(newValue) + navigate(newValue) + sessionStorage.setItem('modelType', newValue) + newValue === '/launch_model/custom/llm' + ? sessionStorage.setItem('subType', newValue) + : '' } useEffect(() => { if (cookie.token === '' || cookie.token === undefined) { return } - if (cookie.token === 'need_auth') { + if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { navigate('/login', { replace: true }) return } @@ -58,6 +67,7 @@ const LaunchModel = () => { } }, [cookie.token]) + useEffect(() => {}) return ( @@ -65,30 +75,30 @@ const LaunchModel = () => { <TabContext value={value}> <Box sx={{ borderBottom: 1, borderColor: 'divider' }}> <TabList value={value} onChange={handleTabChange} aria-label="tabs"> - <Tab label="Language Models" value="1" /> - <Tab label="Embedding Models" value="2" /> - <Tab label="Rerank Models" value="3" /> - <Tab label="Image Models" value="4" /> - <Tab label="Audio Models" value="5" /> - <Tab label="Custom Models" value="6" /> + <Tab label="Language Models" value="/launch_model/llm" /> + <Tab label="Embedding Models" value="/launch_model/embedding" /> + <Tab label="Rerank Models" value="/launch_model/rerank" /> + <Tab label="Image Models" value="/launch_model/image" /> + <Tab label="Audio Models" value="/launch_model/audio" /> + <Tab label="Custom Models" value="/launch_model/custom/llm" /> </TabList> </Box> - <TabPanel value="1" sx={{ padding: 0 }}> + <TabPanel value="/launch_model/llm" sx={{ padding: 0 }}> <LaunchLLM gpuAvailable={gpuAvailable} /> </TabPanel> - <TabPanel value="2" sx={{ padding: 0 }}> + <TabPanel value="/launch_model/embedding" sx={{ padding: 0 }}> <LaunchModelComponent modelType={'embedding'} /> </TabPanel> - <TabPanel value="3" sx={{ padding: 0 }}> + <TabPanel value="/launch_model/rerank" sx={{ padding: 0 }}> <LaunchModelComponent modelType={'rerank'} /> </TabPanel> - <TabPanel value="4" sx={{ padding: 0 }}> + <TabPanel value="/launch_model/image" sx={{ padding: 0 }}> <LaunchModelComponent modelType={'image'} /> </TabPanel> - <TabPanel value="5" sx={{ padding: 0 }}> + <TabPanel value="/launch_model/audio" sx={{ padding: 0 }}> <LaunchModelComponent modelType={'audio'} /> </TabPanel> - <TabPanel value="6" sx={{ padding: 0 }}> + <TabPanel value="/launch_model/custom/llm" sx={{ padding: 0 }}> <LaunchCustom gpuAvailable={gpuAvailable} /> </TabPanel> </TabContext> diff --git a/xinference/web/ui/src/scenes/launch_model/launchCustom.js b/xinference/web/ui/src/scenes/launch_model/launchCustom.js index 1bede718f1..7ae13ce943 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchCustom.js +++ b/xinference/web/ui/src/scenes/launch_model/launchCustom.js @@ -1,6 +1,7 @@ import { TabContext, TabList, TabPanel } from '@mui/lab' import { Box, FormControl, Tab, TextField } from '@mui/material' import React, { useContext, useEffect, useState } from 'react' +import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import fetcher from '../../components/fetcher' @@ -14,11 +15,14 @@ const LaunchCustom = ({ gpuAvailable }) => { // States used for filtering const [searchTerm, setSearchTerm] = useState('') - const [value, setValue] = useState('1') + const [value, setValue] = useState(sessionStorage.getItem('subType')) + const navigate = useNavigate() const handleTabChange = (event, newValue) => { setValue(newValue) update() + navigate(newValue) + sessionStorage.setItem('subType', newValue) } const handleChange = (event) => { @@ -148,12 +152,15 @@ const LaunchCustom = ({ gpuAvailable }) => { <TabContext value={value}> <Box sx={{ borderBottom: 1, borderColor: 'divider' }}> <TabList value={value} onChange={handleTabChange} aria-label="tabs"> - <Tab label="Language Models" value="1" /> - <Tab label="Embedding Models" value="2" /> - <Tab label="Rerank Models" value="3" /> + <Tab label="Language Models" value="/launch_model/custom/llm" /> + <Tab + label="Embedding Models" + value="/launch_model/custom/embedding" + /> + <Tab label="Rerank Models" value="/launch_model/custom/rerank" /> </TabList> </Box> - <TabPanel value="1" sx={{ padding: 0 }}> + <TabPanel value="/launch_model/custom/llm" sx={{ padding: 0 }}> <div style={{ display: 'grid', @@ -200,7 +207,7 @@ const LaunchCustom = ({ gpuAvailable }) => { })} </div> </TabPanel> - <TabPanel value="2" sx={{ padding: 0 }}> + <TabPanel value="/launch_model/custom/embedding" sx={{ padding: 0 }}> <div style={{ display: 'grid', @@ -240,7 +247,7 @@ const LaunchCustom = ({ gpuAvailable }) => { })} </div> </TabPanel> - <TabPanel value="3" sx={{ padding: 0 }}> + <TabPanel value="/launch_model/custom/rerank" sx={{ padding: 0 }}> <div style={{ display: 'grid', diff --git a/xinference/web/ui/src/scenes/launch_model/launchLLM.js b/xinference/web/ui/src/scenes/launch_model/launchLLM.js index a511670b11..381f97abaf 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchLLM.js +++ b/xinference/web/ui/src/scenes/launch_model/launchLLM.js @@ -60,9 +60,7 @@ const LaunchLLM = ({ gpuAvailable }) => { if ( isCallingApi || isUpdatingModel || - cookie.token === '' || - cookie.token === undefined || - cookie.token === 'need_auth' + (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) ) return diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index f7cb3c465f..2ebfdee701 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -231,7 +231,11 @@ const ModelCard = ({ ) }) } else { - navigate('/running_models') + navigate(`/running_models/${modelType}`) + sessionStorage.setItem( + 'runningModelType', + `/running_models/${modelType}` + ) } setIsCallingApi(false) }) @@ -357,7 +361,9 @@ const ModelCard = ({ > {(() => { return modelData.model_lang.map((v) => { - return <Chip label={v} variant="outlined" size="small" /> + return ( + <Chip key={v} label={v} variant="outlined" size="small" /> + ) }) })()} {(() => { diff --git a/xinference/web/ui/src/scenes/login/login.js b/xinference/web/ui/src/scenes/login/login.js index 05a26b1b93..0dfe8b3966 100644 --- a/xinference/web/ui/src/scenes/login/login.js +++ b/xinference/web/ui/src/scenes/login/login.js @@ -43,7 +43,8 @@ function Login() { } else { res.json().then((data) => { setCookie('token', data['access_token'], { path: '/' }) - navigate('/') + sessionStorage.setItem('token', data['access_token']) + navigate('/launch_model/llm') }) } }) diff --git a/xinference/web/ui/src/scenes/register_model/index.js b/xinference/web/ui/src/scenes/register_model/index.js index de3c04dc43..2b4302aaff 100644 --- a/xinference/web/ui/src/scenes/register_model/index.js +++ b/xinference/web/ui/src/scenes/register_model/index.js @@ -90,7 +90,7 @@ const RegisterModel = () => { if (cookie.token === '' || cookie.token === undefined) { return } - if (cookie.token === 'need_auth') { + if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { navigate('/login', { replace: true }) return } @@ -281,6 +281,9 @@ const RegisterModel = () => { setSuccessMsg( 'Model has been registered successfully! Navigate to launch model page to proceed.' ) + navigate('/launch_model/custom/llm') + sessionStorage.setItem('modelType', '/launch_model/custom/llm') + sessionStorage.setItem('subType', '/launch_model/custom/llm') } } catch (error) { console.error('There was a problem with the fetch operation:', error) diff --git a/xinference/web/ui/src/scenes/register_model/register_embedding.js b/xinference/web/ui/src/scenes/register_model/register_embedding.js index ac7ab8d4ae..b8cde4a017 100644 --- a/xinference/web/ui/src/scenes/register_model/register_embedding.js +++ b/xinference/web/ui/src/scenes/register_model/register_embedding.js @@ -4,6 +4,7 @@ import AlertTitle from '@mui/material/AlertTitle' import Button from '@mui/material/Button' import TextField from '@mui/material/TextField' import React, { useContext, useState } from 'react' +import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import fetcher from '../../components/fetcher' @@ -18,6 +19,7 @@ const RegisterEmbeddingModel = () => { const endPoint = useContext(ApiContext).endPoint const { setErrorMsg } = useContext(ApiContext) const [successMsg, setSuccessMsg] = useState('') + const navigate = useNavigate() const [formData, setFormData] = useState({ model_name: 'custom-embedding', dimensions: 768, @@ -66,6 +68,9 @@ const RegisterEmbeddingModel = () => { setSuccessMsg( 'Model has been registered successfully! Navigate to launch model page to proceed.' ) + navigate('/launch_model/custom/embedding') + sessionStorage.setItem('modelType', '/launch_model/custom/llm') + sessionStorage.setItem('subType', '/launch_model/custom/embedding') } } catch (error) { console.error('There was a problem with the fetch operation:', error) diff --git a/xinference/web/ui/src/scenes/register_model/register_rerank.js b/xinference/web/ui/src/scenes/register_model/register_rerank.js index 075b35ff9d..90f4bff2f7 100644 --- a/xinference/web/ui/src/scenes/register_model/register_rerank.js +++ b/xinference/web/ui/src/scenes/register_model/register_rerank.js @@ -4,6 +4,7 @@ import AlertTitle from '@mui/material/AlertTitle' import Button from '@mui/material/Button' import TextField from '@mui/material/TextField' import React, { useContext, useState } from 'react' +import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import fetcher from '../../components/fetcher' @@ -18,6 +19,7 @@ const RegisterRerankModel = () => { const endPoint = useContext(ApiContext).endPoint const { setErrorMsg } = useContext(ApiContext) const [successMsg, setSuccessMsg] = useState('') + const navigate = useNavigate() const [formData, setFormData] = useState({ model_name: 'custom-rerank', language: ['en'], @@ -61,6 +63,9 @@ const RegisterRerankModel = () => { setSuccessMsg( 'Model has been registered successfully! Navigate to launch model page to proceed.' ) + navigate('/launch_model/custom/rerank') + sessionStorage.setItem('modelType', '/launch_model/custom/llm') + sessionStorage.setItem('subType', '/launch_model/custom/rerank') } } catch (error) { console.error('There was a problem with the fetch operation:', error) diff --git a/xinference/web/ui/src/scenes/running_models/index.js b/xinference/web/ui/src/scenes/running_models/index.js index ccf3fe312e..1e0da75bb3 100644 --- a/xinference/web/ui/src/scenes/running_models/index.js +++ b/xinference/web/ui/src/scenes/running_models/index.js @@ -13,7 +13,9 @@ import fetcher from '../../components/fetcher' import Title from '../../components/Title' const RunningModels = () => { - const [tabValue, setTabValue] = React.useState('1') + const [tabValue, setTabValue] = React.useState( + sessionStorage.getItem('runningModelType') + ) const [llmData, setLlmData] = useState([]) const [embeddingModelData, setEmbeddingModelData] = useState([]) const [imageModelData, setImageModelData] = useState([]) @@ -28,13 +30,15 @@ const RunningModels = () => { const handleTabChange = (event, newValue) => { setTabValue(newValue) + navigate(newValue) + sessionStorage.setItem('runningModelType', newValue) } const update = (isCallingApi) => { if (cookie.token === '' || cookie.token === undefined) { return } - if (cookie.token === 'need_auth') { + if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { navigate('/login', { replace: true }) return } @@ -641,14 +645,14 @@ const RunningModels = () => { onChange={handleTabChange} aria-label="tabs" > - <Tab label="Language Models" value="1" /> - <Tab label="Embedding Models" value="2" /> - <Tab label="Rerank models" value="3" /> - <Tab label="Image models" value="4" /> - <Tab label="Audio models" value="5" /> + <Tab label="Language Models" value="/running_models/LLM" /> + <Tab label="Embedding Models" value="/running_models/embedding" /> + <Tab label="Rerank models" value="/running_models/rerank" /> + <Tab label="Image models" value="/running_models/image" /> + <Tab label="Audio models" value="/running_models/audio" /> </TabList> </Box> - <TabPanel value="1" sx={{ padding: 0 }}> + <TabPanel value="/running_models/LLM" sx={{ padding: 0 }}> <Box sx={{ height: '100%', width: '100%' }}> <DataGrid rows={llmData} @@ -662,7 +666,7 @@ const RunningModels = () => { /> </Box> </TabPanel> - <TabPanel value="2" sx={{ padding: 0 }}> + <TabPanel value="/running_models/embedding" sx={{ padding: 0 }}> <Box sx={{ height: '100%', width: '100%' }}> <DataGrid rows={embeddingModelData} @@ -676,7 +680,7 @@ const RunningModels = () => { /> </Box> </TabPanel> - <TabPanel value="3" sx={{ padding: 0 }}> + <TabPanel value="/running_models/rerank" sx={{ padding: 0 }}> <Box sx={{ height: '100%', width: '100%' }}> <DataGrid rows={rerankModelData} @@ -690,7 +694,7 @@ const RunningModels = () => { /> </Box> </TabPanel> - <TabPanel value="4" sx={{ padding: 0 }}> + <TabPanel value="/running_models/image" sx={{ padding: 0 }}> <Box sx={{ height: '100%', width: '100%' }}> <DataGrid rows={imageModelData} @@ -704,7 +708,7 @@ const RunningModels = () => { /> </Box> </TabPanel> - <TabPanel value="5" sx={{ padding: 0 }}> + <TabPanel value="/running_models/audio" sx={{ padding: 0 }}> <Box sx={{ height: '100%', width: '100%' }}> <DataGrid rows={audioModelData} From a7f0c3b7663b3eeef520b8b07dc81d91165eb646 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Thu, 11 Apr 2024 12:03:15 +0800 Subject: [PATCH 009/298] ENH: UI: paper material for cards (#1261) --- xinference/web/ui/src/scenes/launch_model/modelCard.js | 6 ++++-- .../web/ui/src/scenes/launch_model/styles/modelCardStyle.js | 4 ---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 2ebfdee701..3998a1c665 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -28,6 +28,7 @@ import { Stack, TextField, } from '@mui/material' +import Paper from '@mui/material/Paper' import React, { useContext, useEffect, useRef, useState } from 'react' import { useNavigate } from 'react-router-dom' @@ -327,7 +328,7 @@ const ModelCard = ({ // Set two different states based on mouse hover return ( - <Box + <Paper style={hover ? styles.containerSelected : styles.container} onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)} @@ -336,6 +337,7 @@ const ModelCard = ({ setSelected(true) } }} + elevation={hover ? 24 : 4} > {modelType === 'LLM' ? ( <Box style={styles.descriptionCard}> @@ -951,7 +953,7 @@ const ModelCard = ({ message="Please fill in the added custom parameters completely!" key={'top' + 'center'} /> - </Box> + </Paper> ) } diff --git a/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.js b/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.js index c5c8195a08..d5f86867a1 100644 --- a/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.js +++ b/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.js @@ -4,7 +4,6 @@ const styles = { position: 'relative', width: '300px', height: '300px', - border: '1px solid #ddd', borderRadius: '20px', }, containerSelected: { @@ -13,9 +12,7 @@ const styles = { position: 'relative', width: '300px', height: '300px', - border: '1px solid #ddd', borderRadius: '20px', - boxShadow: '0 0 10px #ccc', }, descriptionCard: { position: 'relative', @@ -23,7 +20,6 @@ const styles = { left: '-1px', width: '300px', height: '300px', - border: '1px solid #ddd', padding: '20px', borderRadius: '20px', }, From e3a947ebddfc53b5e8ec723c1f632c2b895edef1 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 11 Apr 2024 15:35:46 +0800 Subject: [PATCH 010/298] BUG: fix custom vision model (#1280) --- xinference/model/llm/llm_family.py | 15 ++++++ xinference/model/llm/pytorch/core.py | 50 ++++++++----------- xinference/model/llm/tests/test_llm_family.py | 14 ++++++ 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 15ff0db84c..a131a25169 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -199,6 +199,21 @@ def parse_raw( ) llm_spec.prompt_style = BUILTIN_LLM_PROMPT_STYLE[prompt_style_name] + # check model ability, registering LLM only provides generate and chat + # but for vision models, we add back the abilities so that + # gradio chat interface can be generated properly + if ( + llm_spec.model_family != "other" + and llm_spec.model_family + in { + family.model_name + for family in BUILTIN_LLM_FAMILIES + if "vision" in family.model_ability + } + and "vision" not in llm_spec.model_ability + ): + llm_spec.model_ability.append("vision") + return llm_spec diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 88ca44ee7b..8cac269289 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -42,6 +42,25 @@ logger = logging.getLogger(__name__) +NON_DEFAULT_MODEL_LIST: List[str] = [ + "baichuan-chat", + "baichuan-2-chat", + "vicuna-v1.3", + "falcon", + "falcon-instruct", + "chatglm", + "chatglm2", + "chatglm2-32k", + "chatglm2-128k", + "llama-2", + "llama-2-chat", + "internlm2-chat", + "qwen-vl-chat", + "OmniLMM", + "yi-vl-chat", + "deepseek-vl-chat", +] + class PytorchModel(LLM): def __init__( @@ -233,17 +252,7 @@ def match( if llm_spec.model_format not in ["pytorch", "gptq", "awq"]: return False model_family = llm_family.model_family or llm_family.model_name - if model_family in [ - "baichuan-chat", - "vicuna-v1.3", - "falcon", - "falcon-instruct", - "chatglm", - "chatglm2", - "chatglm2-32k", - "llama-2", - "llama-2-chat", - ]: + if model_family in NON_DEFAULT_MODEL_LIST: return False if "generate" not in llm_family.model_ability: return False @@ -452,23 +461,8 @@ def match( ) -> bool: if llm_spec.model_format not in ["pytorch", "gptq", "awq"]: return False - if llm_family.model_name in [ - "baichuan-chat", - "baichuan-2-chat", - "vicuna-v1.3", - "falcon", - "falcon-instruct", - "chatglm", - "chatglm2", - "chatglm2-32k", - "llama-2", - "llama-2-chat", - "internlm2-chat", - "qwen-vl-chat", - "OmniLMM", - "yi-vl-chat", - "deepseek-vl-chat", - ]: + model_family = llm_family.model_family or llm_family.model_name + if model_family in NON_DEFAULT_MODEL_LIST: return False if "chat" not in llm_family.model_ability: return False diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index fe093822a2..b1b6662dc1 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -992,6 +992,20 @@ def test_parse_prompt_style(): model_spec = CustomLLMFamilyV1.parse_raw(bytes(llm_family.json(), "utf8")) assert model_spec.model_name == llm_family.model_name + # test vision + llm_family = CustomLLMFamilyV1( + version=1, + model_type="LLM", + model_name="test_LLM", + model_lang=["en"], + model_ability=["chat", "generate"], + model_specs=[hf_spec, ms_spec], + model_family="qwen-vl-chat", + prompt_style="qwen-vl-chat", + ) + model_spec = CustomLLMFamilyV1.parse_raw(bytes(llm_family.json(), "utf-8")) + assert "vision" in model_spec.model_ability + # error: missing model_family llm_family = CustomLLMFamilyV1( version=1, From 6d6f4011b8e68c91b6be9b14f40fd6d0b64613ec Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Mon, 15 Apr 2024 11:49:19 +0800 Subject: [PATCH 011/298] ENH: Support custom audio model (#1279) --- xinference/core/supervisor.py | 28 +++- xinference/core/worker.py | 8 + xinference/model/audio/__init__.py | 41 ++++- xinference/model/audio/core.py | 70 ++++----- xinference/model/audio/custom.py | 148 +++++++++++++++++++ xinference/model/audio/tests/test_whisper.py | 71 +++++++++ 6 files changed, 319 insertions(+), 47 deletions(-) create mode 100644 xinference/model/audio/custom.py diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index c8837f7a84..a18add947c 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -135,6 +135,13 @@ async def __post_create__(self): EventCollectorActor, address=self.address, uid=EventCollectorActor.uid() ) + from ..model.audio import ( + CustomAudioModelFamilyV1, + generate_audio_description, + get_audio_model_descriptions, + register_audio, + unregister_audio, + ) from ..model.embedding import ( CustomEmbeddingModelSpec, generate_embedding_description, @@ -177,6 +184,12 @@ async def __post_create__(self): unregister_rerank, generate_rerank_description, ), + "audio": ( + CustomAudioModelFamilyV1, + register_audio, + unregister_audio, + generate_audio_description, + ), } # record model version @@ -185,6 +198,7 @@ async def __post_create__(self): model_version_infos.update(get_embedding_model_descriptions()) model_version_infos.update(get_rerank_model_descriptions()) model_version_infos.update(get_image_model_descriptions()) + model_version_infos.update(get_audio_model_descriptions()) await self._cache_tracker_ref.record_model_version( model_version_infos, self.address ) @@ -483,6 +497,7 @@ def sort_helper(item): return ret elif model_type == "audio": from ..model.audio import BUILTIN_AUDIO_MODELS + from ..model.audio.custom import get_user_defined_audios ret = [] for model_name, family in BUILTIN_AUDIO_MODELS.items(): @@ -491,6 +506,16 @@ def sort_helper(item): else: ret.append({"model_name": model_name, "is_builtin": True}) + for model_spec in get_user_defined_audios(): + if detailed: + ret.append( + await self._to_audio_model_reg(model_spec, is_builtin=False) + ) + else: + ret.append( + {"model_name": model_spec.model_name, "is_builtin": False} + ) + ret.sort(key=sort_helper) return ret elif model_type == "rerank": @@ -548,8 +573,9 @@ def get_model_registration(self, model_type: str, model_name: str) -> Any: raise ValueError(f"Model {model_name} not found") elif model_type == "audio": from ..model.audio import BUILTIN_AUDIO_MODELS + from ..model.audio.custom import get_user_defined_audios - for f in BUILTIN_AUDIO_MODELS.values(): + for f in list(BUILTIN_AUDIO_MODELS.values()) + get_user_defined_audios(): if f.model_name == model_name: return f raise ValueError(f"Model {model_name} not found") diff --git a/xinference/core/worker.py b/xinference/core/worker.py index fde991614d..5c8f3eef10 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -195,6 +195,12 @@ async def __post_create__(self): logger.info("Purge cache directory: %s", XINFERENCE_CACHE_DIR) purge_dir(XINFERENCE_CACHE_DIR) + from ..model.audio import ( + CustomAudioModelFamilyV1, + get_audio_model_descriptions, + register_audio, + unregister_audio, + ) from ..model.embedding import ( CustomEmbeddingModelSpec, get_embedding_model_descriptions, @@ -223,6 +229,7 @@ async def __post_create__(self): unregister_embedding, ), "rerank": (CustomRerankModelSpec, register_rerank, unregister_rerank), + "audio": (CustomAudioModelFamilyV1, register_audio, unregister_audio), } # record model version @@ -231,6 +238,7 @@ async def __post_create__(self): model_version_infos.update(get_embedding_model_descriptions()) model_version_infos.update(get_rerank_model_descriptions()) model_version_infos.update(get_image_model_descriptions()) + model_version_infos.update(get_audio_model_descriptions()) await self._cache_tracker_ref.record_model_version( model_version_infos, self.address ) diff --git a/xinference/model/audio/__init__.py b/xinference/model/audio/__init__.py index 8bc2e03ade..de6367f9df 100644 --- a/xinference/model/audio/__init__.py +++ b/xinference/model/audio/__init__.py @@ -16,12 +16,51 @@ import json import os -from .core import AudioModelFamilyV1, generate_audio_description, get_cache_status +from .core import ( + AUDIO_MODEL_DESCRIPTIONS, + MODEL_NAME_TO_REVISION, + AudioModelFamilyV1, + generate_audio_description, + get_audio_model_descriptions, + get_cache_status, +) +from .custom import ( + CustomAudioModelFamilyV1, + get_user_defined_audios, + register_audio, + unregister_audio, +) _model_spec_json = os.path.join(os.path.dirname(__file__), "model_spec.json") BUILTIN_AUDIO_MODELS = dict( (spec["model_name"], AudioModelFamilyV1(**spec)) for spec in json.load(codecs.open(_model_spec_json, "r", encoding="utf-8")) ) +for model_name, model_spec in BUILTIN_AUDIO_MODELS.items(): + MODEL_NAME_TO_REVISION[model_name].append(model_spec.model_revision) + +# register model description after recording model revision +for model_spec_info in [BUILTIN_AUDIO_MODELS]: + for model_name, model_spec in model_spec_info.items(): + if model_spec.model_name not in AUDIO_MODEL_DESCRIPTIONS: + AUDIO_MODEL_DESCRIPTIONS.update(generate_audio_description(model_spec)) + +from ...constants import XINFERENCE_MODEL_DIR + +# if persist=True, load them when init +user_defined_audio_dir = os.path.join(XINFERENCE_MODEL_DIR, "audio") +if os.path.isdir(user_defined_audio_dir): + for f in os.listdir(user_defined_audio_dir): + with codecs.open( + os.path.join(user_defined_audio_dir, f), encoding="utf-8" + ) as fd: + user_defined_audio_family = CustomAudioModelFamilyV1.parse_obj( + json.load(fd) + ) + register_audio(user_defined_audio_family, persist=False) + +# register model description +for ud_audio in get_user_defined_audios(): + AUDIO_MODEL_DESCRIPTIONS.update(generate_audio_description(ud_audio)) del _model_spec_json diff --git a/xinference/model/audio/core.py b/xinference/model/audio/core.py index c73004e4ea..20b3ff7d36 100644 --- a/xinference/model/audio/core.py +++ b/xinference/model/audio/core.py @@ -16,9 +16,8 @@ from collections import defaultdict from typing import Dict, List, Optional, Tuple -from ..._compat import BaseModel from ...constants import XINFERENCE_CACHE_DIR -from ..core import ModelDescription +from ..core import CacheableModelSpec, ModelDescription from ..utils import valid_model_revision from .whisper import WhisperModel @@ -26,8 +25,19 @@ logger = logging.getLogger(__name__) +# Used for check whether the model is cached. +# Init when registering all the builtin models. +MODEL_NAME_TO_REVISION: Dict[str, List[str]] = defaultdict(list) +AUDIO_MODEL_DESCRIPTIONS: Dict[str, List[Dict]] = defaultdict(list) -class AudioModelFamilyV1(BaseModel): + +def get_audio_model_descriptions(): + import copy + + return copy.deepcopy(AUDIO_MODEL_DESCRIPTIONS) + + +class AudioModelFamilyV1(CacheableModelSpec): model_family: str model_name: str model_id: str @@ -77,63 +87,33 @@ def generate_audio_description( image_model: AudioModelFamilyV1, ) -> Dict[str, List[Dict]]: res = defaultdict(list) - res[image_model.model_name].extend( - AudioModelDescription(None, None, image_model).to_dict() + res[image_model.model_name].append( + AudioModelDescription(None, None, image_model).to_version_info() ) return res -def match_model(model_name: str) -> AudioModelFamilyV1: +def match_audio(model_name: str) -> AudioModelFamilyV1: from . import BUILTIN_AUDIO_MODELS + from .custom import get_user_defined_audios + + for model_spec in get_user_defined_audios(): + if model_spec.model_name == model_name: + return model_spec if model_name in BUILTIN_AUDIO_MODELS: return BUILTIN_AUDIO_MODELS[model_name] else: raise ValueError( - f"Image model {model_name} not found, available" + f"Audio model {model_name} not found, available" f"model list: {BUILTIN_AUDIO_MODELS.keys()}" ) def cache(model_spec: AudioModelFamilyV1): - # TODO: cache from uri - import huggingface_hub - - cache_dir = get_cache_dir(model_spec) - if not os.path.exists(cache_dir): - os.makedirs(cache_dir, exist_ok=True) - - meta_path = os.path.join(cache_dir, "__valid_download") - if valid_model_revision(meta_path, model_spec.model_revision): - return cache_dir - - for current_attempt in range(1, MAX_ATTEMPTS + 1): - try: - huggingface_hub.snapshot_download( - model_spec.model_id, - revision=model_spec.model_revision, - local_dir=cache_dir, - local_dir_use_symlinks=True, - resume_download=True, - ) - break - except huggingface_hub.utils.LocalEntryNotFoundError: - remaining_attempts = MAX_ATTEMPTS - current_attempt - logger.warning( - f"Attempt {current_attempt} failed. Remaining attempts: {remaining_attempts}" - ) - else: - raise RuntimeError( - f"Failed to download model '{model_spec.model_name}' after {MAX_ATTEMPTS} attempts" - ) - - with open(meta_path, "w") as f: - import json - - desc = AudioModelDescription(None, None, model_spec) - json.dump(desc.to_dict(), f) + from ..utils import cache - return cache_dir + return cache(model_spec, AudioModelDescription) def get_cache_dir(model_spec: AudioModelFamilyV1): @@ -151,7 +131,7 @@ def get_cache_status( def create_audio_model_instance( subpool_addr: str, devices: List[str], model_uid: str, model_name: str, **kwargs ) -> Tuple[WhisperModel, AudioModelDescription]: - model_spec = match_model(model_name) + model_spec = match_audio(model_name) model_path = cache(model_spec) model = WhisperModel(model_uid, model_path, model_spec, **kwargs) model_description = AudioModelDescription( diff --git a/xinference/model/audio/custom.py b/xinference/model/audio/custom.py new file mode 100644 index 0000000000..12599f89e6 --- /dev/null +++ b/xinference/model/audio/custom.py @@ -0,0 +1,148 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import os +from threading import Lock +from typing import Any, List, Optional + +from ..._compat import ( + ROOT_KEY, + ErrorWrapper, + Protocol, + StrBytes, + ValidationError, + load_str_bytes, +) +from ...constants import XINFERENCE_CACHE_DIR, XINFERENCE_MODEL_DIR +from .core import AudioModelFamilyV1 + +logger = logging.getLogger(__name__) + +UD_AUDIO_LOCK = Lock() + + +class CustomAudioModelFamilyV1(AudioModelFamilyV1): + model_id: Optional[str] # type: ignore + model_revision: Optional[str] # type: ignore + model_uri: Optional[str] + + @classmethod + def parse_raw( + cls: Any, + b: StrBytes, + *, + content_type: Optional[str] = None, + encoding: str = "utf8", + proto: Protocol = None, + allow_pickle: bool = False, + ) -> AudioModelFamilyV1: + # See source code of BaseModel.parse_raw + try: + obj = load_str_bytes( + b, + proto=proto, + content_type=content_type, + encoding=encoding, + allow_pickle=allow_pickle, + json_loads=cls.__config__.json_loads, + ) + except (ValueError, TypeError, UnicodeDecodeError) as e: + raise ValidationError([ErrorWrapper(e, loc=ROOT_KEY)], cls) + + audio_spec: AudioModelFamilyV1 = cls.parse_obj(obj) + + # check model_family + if audio_spec.model_family is None: + raise ValueError( + f"You must specify `model_family` when registering custom Audio models." + ) + assert isinstance(audio_spec.model_family, str) + return audio_spec + + +UD_AUDIOS: List[CustomAudioModelFamilyV1] = [] + + +def get_user_defined_audios() -> List[CustomAudioModelFamilyV1]: + with UD_AUDIO_LOCK: + return UD_AUDIOS.copy() + + +def register_audio(model_spec: CustomAudioModelFamilyV1, persist: bool): + from ...constants import XINFERENCE_MODEL_DIR + from ..utils import is_valid_model_name, is_valid_model_uri + from . import BUILTIN_AUDIO_MODELS + + if not is_valid_model_name(model_spec.model_name): + raise ValueError(f"Invalid model name {model_spec.model_name}.") + + with UD_AUDIO_LOCK: + for model_name in list(BUILTIN_AUDIO_MODELS.keys()) + [ + spec.model_name for spec in UD_AUDIOS + ]: + if model_spec.model_name == model_name: + raise ValueError( + f"Model name conflicts with existing model {model_spec.model_name}" + ) + + UD_AUDIOS.append(model_spec) + + if persist: + # We only validate model URL when persist is True. + model_uri = model_spec.model_uri + if model_uri and not is_valid_model_uri(model_uri): + raise ValueError(f"Invalid model URI {model_uri}.") + + persist_path = os.path.join( + XINFERENCE_MODEL_DIR, "audio", f"{model_spec.model_name}.json" + ) + os.makedirs(os.path.dirname(persist_path), exist_ok=True) + with open(persist_path, mode="w") as fd: + fd.write(model_spec.json()) + + +def unregister_audio(model_name: str, raise_error: bool = True): + with UD_AUDIO_LOCK: + model_spec = None + for i, f in enumerate(UD_AUDIOS): + if f.model_name == model_name: + model_spec = f + break + if model_spec: + UD_AUDIOS.remove(model_spec) + + persist_path = os.path.join( + XINFERENCE_MODEL_DIR, "audio", f"{model_spec.model_name}.json" + ) + if os.path.exists(persist_path): + os.remove(persist_path) + + cache_dir = os.path.join(XINFERENCE_CACHE_DIR, model_spec.model_name) + if os.path.exists(cache_dir): + logger.warning( + f"Remove the cache of user-defined model {model_spec.model_name}. " + f"Cache directory: {cache_dir}" + ) + if os.path.isdir(cache_dir): + os.rmdir(cache_dir) + else: + logger.warning( + f"Cache directory is not a soft link, please remove it manually." + ) + else: + if raise_error: + raise ValueError(f"Model {model_name} not found") + else: + logger.warning(f"Custom audio model {model_name} not found") diff --git a/xinference/model/audio/tests/test_whisper.py b/xinference/model/audio/tests/test_whisper.py index a200f63f7e..c39b3c15ba 100644 --- a/xinference/model/audio/tests/test_whisper.py +++ b/xinference/model/audio/tests/test_whisper.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import os.path +import tempfile import pytest import requests @@ -76,3 +77,73 @@ def test_restful_api_for_whisper(setup): assert "list" in translation assert "airlines" in translation assert "hong kong" in translation + + +def test_register_custom_audio(): + from ..custom import ( + CustomAudioModelFamilyV1, + get_user_defined_audios, + register_audio, + unregister_audio, + ) + + # correct + family_a = CustomAudioModelFamilyV1( + model_family="my-whisper", + model_name="custom_test_a", + model_id="test/custom_test_a", + multilingual=True, + ) + + register_audio(family_a, False) + assert family_a in get_user_defined_audios() + + # name conflict + family_b = CustomAudioModelFamilyV1( + model_family="my-whisper", + model_name="custom_test_b", + model_id="test/custom_test_b", + multilingual=True, + ) + register_audio(family_b, False) + assert family_b in get_user_defined_audios() + with pytest.raises(ValueError): + register_audio(family_b, False) + + # unregister + unregister_audio(family_a.model_name) + assert family_a not in get_user_defined_audios() + unregister_audio(family_b.model_name) + assert family_b not in get_user_defined_audios() + + +def test_persistent_custom_audio(): + from ....constants import XINFERENCE_MODEL_DIR + from ..custom import ( + CustomAudioModelFamilyV1, + get_user_defined_audios, + register_audio, + unregister_audio, + ) + + temp_dir = tempfile.mkdtemp() + + # correct + family = CustomAudioModelFamilyV1( + model_family="my-whisper", + model_name="custom_test_a", + model_id="test/custom_test_a", + multilingual=True, + model_uri=os.path.abspath(temp_dir), + ) + + register_audio(family, True) + assert family in get_user_defined_audios() + assert f"{family.model_name}.json" in os.listdir( + os.path.join(XINFERENCE_MODEL_DIR, "audio") + ) + + unregister_audio(family.model_name) + assert f"{family.model_name}.json" not in os.listdir( + os.path.join(XINFERENCE_MODEL_DIR, "audio") + ) From d93353ef3864a9e10d42165bc77df3b2a2ddeea3 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:27:15 +0800 Subject: [PATCH 012/298] FEAT: [UI] Add replica configuration when launching `embedding` and `rerank` models (#1306) --- .../ui/src/scenes/launch_model/modelCard.js | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 3998a1c665..08cd2061a9 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -167,7 +167,7 @@ const ModelCard = ({ setIsCallingApi(true) - const modelDataWithID1 = { + const modelDataWithID_LLM = { // If user does not fill model_uid, pass null (None) to server and server generates it. model_uid: modelUID.trim() === '' ? null : modelUID.trim(), model_name: modelData.model_name, @@ -194,24 +194,28 @@ const ModelCard = ({ gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), } - const modelDataWithID2 = { + const modelDataWithID_other = { model_uid: modelUID.trim() === '' ? null : modelUID.trim(), model_name: modelData.model_name, model_type: modelType, } if (nGPULayers >= 0) { - modelDataWithID1.n_gpu_layers = nGPULayers + modelDataWithID_LLM.n_gpu_layers = nGPULayers } if (customParametersArr.length) { customParametersArr.forEach((item) => { - modelDataWithID1[item.key] = handleValueType(item.value) + modelDataWithID_LLM[item.key] = handleValueType(item.value) }) } const modelDataWithID = - modelType === 'LLM' ? modelDataWithID1 : modelDataWithID2 + modelType === 'LLM' + ? modelDataWithID_LLM + : modelType === 'embedding' || modelType === 'rerank' + ? { ...modelDataWithID_other, replica } + : modelDataWithID_other // First fetcher request to initiate the model fetcher(url + '/v1/models', { @@ -865,6 +869,20 @@ const ModelCard = ({ label="(Optional) Model UID, model name by default" onChange={(e) => setModelUID(e.target.value)} /> + {(modelType === 'embedding' || modelType === 'rerank') && ( + <TextField + style={{ marginTop: '25px' }} + type="number" + InputProps={{ + inputProps: { + min: 1, + }, + }} + label="Replica" + value={replica} + onChange={(e) => setReplica(parseInt(e.target.value, 10))} + /> + )} </FormControl> )} <Box style={styles.buttonsContainer}> From fdef389cf6056077f95ed10f0927dd7920368215 Mon Sep 17 00:00:00 2001 From: Mike Shi <mikeshi80@gmail.com> Date: Tue, 16 Apr 2024 14:28:53 +0800 Subject: [PATCH 013/298] ENH: support int and str compare for model size (#1277) --- xinference/client/restful/restful_client.py | 15 ++++++++--- xinference/core/supervisor.py | 4 +-- xinference/core/worker.py | 2 +- xinference/deploy/cmdline.py | 4 ++- xinference/model/core.py | 4 +-- xinference/model/llm/core.py | 4 +-- xinference/model/llm/llm_family.py | 25 +++++++++++++++++-- xinference/model/llm/tests/test_llm_family.py | 18 +++++++++++++ xinference/model/utils.py | 13 +++++++++- 9 files changed, 75 insertions(+), 14 deletions(-) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 29fb00c68e..50dcb2114e 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -18,6 +18,7 @@ import requests +from ...model.utils import convert_float_to_int_or_str from ..common import streaming_response_iterator if TYPE_CHECKING: @@ -746,7 +747,7 @@ def list_models(self) -> Dict[str, Dict[str, Any]]: def launch_speculative_llm( self, model_name: str, - model_size_in_billions: Optional[int], + model_size_in_billions: Optional[Union[int, str, float]], quantization: Optional[str], draft_model_name: str, draft_model_size_in_billions: Optional[int], @@ -767,6 +768,10 @@ def launch_speculative_llm( "`launch_speculative_llm` is an experimental feature and the API may change in the future." ) + # convert float to int or string since the RESTful API does not accept float. + if isinstance(model_size_in_billions, float): + model_size_in_billions = convert_float_to_int_or_str(model_size_in_billions) + payload = { "model_uid": None, "model_name": model_name, @@ -794,7 +799,7 @@ def launch_model( model_name: str, model_type: str = "LLM", model_uid: Optional[str] = None, - model_size_in_billions: Optional[Union[int, str]] = None, + model_size_in_billions: Optional[Union[int, str, float]] = None, model_format: Optional[str] = None, quantization: Optional[str] = None, replica: int = 1, @@ -818,7 +823,7 @@ def launch_model( type of model. model_uid: str UID of model, auto generate a UUID if is None. - model_size_in_billions: Optional[int] + model_size_in_billions: Optional[Union[int, str, float]] The size (in billions) of the model. model_format: Optional[str] The format of the model. @@ -854,6 +859,10 @@ def launch_model( url = f"{self.base_url}/v1/models" + # convert float to int or string since the RESTful API does not accept float. + if isinstance(model_size_in_billions, float): + model_size_in_billions = convert_float_to_int_or_str(model_size_in_billions) + payload = { "model_uid": model_uid, "model_name": model_name, diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index a18add947c..dae8c3c6c8 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -680,7 +680,7 @@ async def launch_speculative_llm( self, model_uid: Optional[str], model_name: str, - model_size_in_billions: Optional[int], + model_size_in_billions: Optional[Union[int, str]], quantization: Optional[str], draft_model_name: str, draft_model_size_in_billions: Optional[int], @@ -740,7 +740,7 @@ async def launch_builtin_model( self, model_uid: Optional[str], model_name: str, - model_size_in_billions: Optional[int], + model_size_in_billions: Optional[Union[int, str]], model_format: Optional[str], quantization: Optional[str], model_type: Optional[str], diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 5c8f3eef10..465fae7b84 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -601,7 +601,7 @@ async def launch_builtin_model( self, model_uid: str, model_name: str, - model_size_in_billions: Optional[int], + model_size_in_billions: Optional[Union[int, str]], model_format: Optional[str], quantization: Optional[str], model_type: str = "LLM", diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 4873838ea2..baae417c6e 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -736,7 +736,9 @@ def model_launch( endpoint = get_endpoint(endpoint) model_size: Optional[Union[str, int]] = ( size_in_billions - if size_in_billions is None or "_" in size_in_billions + if size_in_billions is None + or "_" in size_in_billions + or "." in size_in_billions else int(size_in_billions) ) client = RESTfulClient(base_url=endpoint, api_key=api_key) diff --git a/xinference/model/core.py b/xinference/model/core.py index 717124271f..842eca6387 100644 --- a/xinference/model/core.py +++ b/xinference/model/core.py @@ -13,7 +13,7 @@ # limitations under the License. from abc import ABC, abstractmethod -from typing import Any, Dict, List, Optional, Tuple +from typing import Any, Dict, List, Optional, Tuple, Union from .._compat import BaseModel @@ -50,7 +50,7 @@ def create_model_instance( model_type: str, model_name: str, model_format: Optional[str] = None, - model_size_in_billions: Optional[int] = None, + model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, peft_model_path: Optional[str] = None, image_lora_load_kwargs: Optional[Dict] = None, diff --git a/xinference/model/llm/core.py b/xinference/model/llm/core.py index ec31d9144b..77ba6b2d61 100644 --- a/xinference/model/llm/core.py +++ b/xinference/model/llm/core.py @@ -178,7 +178,7 @@ def create_llm_model_instance( model_uid: str, model_name: str, model_format: Optional[str] = None, - model_size_in_billions: Optional[int] = None, + model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, peft_model_path: Optional[str] = None, is_local_deployment: bool = False, @@ -238,7 +238,7 @@ def create_speculative_llm_model_instance( devices: List[str], model_uid: str, model_name: str, - model_size_in_billions: Optional[int], + model_size_in_billions: Optional[Union[int, str]], quantization: Optional[str], draft_model_name: str, draft_model_size_in_billions: Optional[int], diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index a131a25169..4252c3a16f 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -797,10 +797,29 @@ def get_user_defined_llm_families(): return UD_LLM_FAMILIES.copy() +def match_model_size( + model_size: Union[int, str], spec_model_size: Union[int, str] +) -> bool: + if isinstance(model_size, str): + model_size = model_size.replace("_", ".") + if isinstance(spec_model_size, str): + spec_model_size = spec_model_size.replace("_", ".") + + if model_size == spec_model_size: + return True + + try: + ms = int(model_size) + ss = int(spec_model_size) + return ms == ss + except ValueError: + return False + + def match_llm( model_name: str, model_format: Optional[str] = None, - model_size_in_billions: Optional[int] = None, + model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, is_local_deployment: bool = False, ) -> Optional[Tuple[LLMFamilyV1, LLMSpecV1, str]]: @@ -844,7 +863,9 @@ def _apply_format_to_model_id(spec: LLMSpecV1, q: str) -> LLMSpecV1: model_format and model_format != spec.model_format or model_size_in_billions - and model_size_in_billions != spec.model_size_in_billions + and not match_model_size( + model_size_in_billions, spec.model_size_in_billions + ) or quantization and matched_quantization is None ): diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index b1b6662dc1..ec119b43ce 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -36,6 +36,7 @@ is_self_hosted, is_valid_model_uri, match_llm, + match_model_size, parse_uri, ) @@ -1046,3 +1047,20 @@ def test_parse_prompt_style(): ) with pytest.raises(ValueError): CustomLLMFamilyV1.parse_raw(bytes(llm_family.json(), "utf8")) + + +def test_match_model_size(): + assert match_model_size("1", "1") + assert match_model_size("1", 1) + assert match_model_size(1, 1) + assert not match_model_size("1", "b") + assert not match_model_size("1", "1b") + assert match_model_size("1.8", "1_8") + assert match_model_size("1_8", "1.8") + assert not match_model_size("1", "1_8") + assert not match_model_size("1__8", "1_8") + assert not match_model_size("1_8", 18) + assert not match_model_size("1_8", "18") + assert not match_model_size("1.8", 18) + assert not match_model_size("1.8", 1) + assert match_model_size("001", 1) diff --git a/xinference/model/utils.py b/xinference/model/utils.py index 8e15a31365..e1c71290c3 100644 --- a/xinference/model/utils.py +++ b/xinference/model/utils.py @@ -17,7 +17,7 @@ import shutil from json import JSONDecodeError from pathlib import Path -from typing import Any, Callable, Dict, Optional, Tuple +from typing import Any, Callable, Dict, Optional, Tuple, Union from fsspec import AbstractFileSystem @@ -415,3 +415,14 @@ def select_device(device): raise ValueError(f"{device} is unavailable in your environment") return device + + +def convert_float_to_int_or_str(model_size: float) -> Union[int, str]: + """convert float to int or string + + if float can be presented as int, convert it to int, otherwise convert it to string + """ + if int(model_size) == model_size: + return int(model_size) + else: + return str(model_size) From 92458312dcda3a2ddd2c70adf92672089f5ddbc9 Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:47:14 +0800 Subject: [PATCH 014/298] FEAT: Lora multi support (#1273) --- doc/source/models/lora.rst | 21 +++++-- xinference/api/restful_api.py | 18 +++--- xinference/client/restful/restful_client.py | 33 ++++++----- xinference/core/supervisor.py | 9 +-- xinference/core/worker.py | 11 ++-- xinference/deploy/cmdline.py | 27 ++++++--- xinference/model/core.py | 13 ++--- xinference/model/image/core.py | 16 ++++-- .../model/image/stable_diffusion/core.py | 15 ++--- xinference/model/llm/core.py | 19 +++---- xinference/model/llm/llm_family.py | 5 +- xinference/model/llm/pytorch/baichuan.py | 7 ++- xinference/model/llm/pytorch/chatglm.py | 5 +- xinference/model/llm/pytorch/core.py | 28 +++++----- xinference/model/llm/pytorch/falcon.py | 11 ++-- xinference/model/llm/pytorch/internlm2.py | 5 +- xinference/model/llm/pytorch/llama_2.py | 11 ++-- xinference/model/llm/pytorch/vicuna.py | 7 ++- xinference/types.py | 55 +++++++++++++++++++ xinference/utils.py | 1 + 20 files changed, 204 insertions(+), 113 deletions(-) diff --git a/doc/source/models/lora.rst b/doc/source/models/lora.rst index 5cf73fb4a0..ad9e428074 100644 --- a/doc/source/models/lora.rst +++ b/doc/source/models/lora.rst @@ -15,7 +15,9 @@ Users need to first download the LoRA model themselves and then provide the stor .. code-tab:: bash shell - xinference launch <options> --peft-model-path <lora_model_path> + xinference launch <options> + --lora-modules <lora_name1> <lora_model_path1> + --lora-modules <lora_name2> <lora_model_path2> --image-lora-load-kwargs <load_params1> <load_value1> --image-lora-load-kwargs <load_params2> <load_value2> --image-lora-fuse-kwargs <fuse_params1> <fuse_value1> @@ -26,11 +28,22 @@ Users need to first download the LoRA model themselves and then provide the stor from xinference.client import Client client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") + + lora_model1={'lora_name': <lora_name1>, 'local_path': <lora_model_path1>} + lora_model2={'lora_name': <lora_name2>, 'local_path': <lora_model_path2>} + lora_models=[lora_model1, lora_model2] + image_lora_load_kwargs={'<load_params1>': <load_value1>, '<load_params2>': <load_value2>}, + image_lora_fuse_kwargs={'<fuse_params1>': <fuse_value1>, '<fuse_params2>': <fuse_value2>} + + peft_model_config = { + "image_lora_load_kwargs": image_lora_load_params, + "image_lora_fuse_kwargs": image_lora_fuse_params, + "lora_list": lora_models + } + client.launch_model( <other_options>, - peft_model_path='<lora_model_path>', - image_lora_load_kwargs={'<load_params1>': <load_value1>, '<load_params2>': <load_value2>}, - image_lora_fuse_kwargs={'<fuse_params1>': <fuse_value1>, '<fuse_params2>': <fuse_value2>} + peft_model_config=peft_model_config ) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 3fcf068c45..ec58594cc3 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -64,6 +64,7 @@ CreateChatCompletion, CreateCompletion, ImageList, + PeftModelConfig, max_tokens_field, ) from .oauth2.auth_service import AuthService @@ -692,9 +693,7 @@ async def launch_model( replica = payload.get("replica", 1) n_gpu = payload.get("n_gpu", "auto") request_limits = payload.get("request_limits", None) - peft_model_path = payload.get("peft_model_path", None) - image_lora_load_kwargs = payload.get("image_lora_load_kwargs", None) - image_lora_fuse_kwargs = payload.get("image_lora_fuse_kwargs", None) + peft_model_config = payload.get("peft_model_config", None) worker_ip = payload.get("worker_ip", None) gpu_idx = payload.get("gpu_idx", None) @@ -708,9 +707,7 @@ async def launch_model( "replica", "n_gpu", "request_limits", - "peft_model_path", - "image_lora_load_kwargs", - "image_lora_fuse_kwargs", + "peft_model_config", "worker_ip", "gpu_idx", } @@ -725,6 +722,11 @@ async def launch_model( detail="Invalid input. Please specify the model name", ) + if peft_model_config is not None: + peft_model_config = PeftModelConfig.from_dict(peft_model_config) + else: + peft_model_config = None + try: model_uid = await (await self._get_supervisor_ref()).launch_builtin_model( model_uid=model_uid, @@ -737,9 +739,7 @@ async def launch_model( n_gpu=n_gpu, request_limits=request_limits, wait_ready=wait_ready, - peft_model_path=peft_model_path, - image_lora_load_kwargs=image_lora_load_kwargs, - image_lora_fuse_kwargs=image_lora_fuse_kwargs, + peft_model_config=peft_model_config, worker_ip=worker_ip, gpu_idx=gpu_idx, **kwargs, diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 50dcb2114e..48785547a3 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -19,6 +19,7 @@ import requests from ...model.utils import convert_float_to_int_or_str +from ...types import LoRA, PeftModelConfig from ..common import streaming_response_iterator if TYPE_CHECKING: @@ -804,10 +805,8 @@ def launch_model( quantization: Optional[str] = None, replica: int = 1, n_gpu: Optional[Union[int, str]] = "auto", + peft_model_config: Optional[Dict] = None, request_limits: Optional[int] = None, - peft_model_path: Optional[str] = None, - image_lora_load_kwargs: Optional[Dict] = None, - image_lora_fuse_kwargs: Optional[Dict] = None, worker_ip: Optional[str] = None, gpu_idx: Optional[Union[int, List[int]]] = None, **kwargs, @@ -834,15 +833,13 @@ def launch_model( n_gpu: Optional[Union[int, str]], The number of GPUs used by the model, default is "auto". ``n_gpu=None`` means cpu only, ``n_gpu=auto`` lets the system automatically determine the best number of GPUs to use. + peft_model_config: Optional[Dict] + - "lora_list": A List of PEFT (Parameter-Efficient Fine-Tuning) model and path. + - "image_lora_load_kwargs": A Dict of lora load parameters for image model + - "image_lora_fuse_kwargs": A Dict of lora fuse parameters for image model request_limits: Optional[int] - The number of request limits for this model, default is None. + The number of request limits for this model, default is None. ``request_limits=None`` means no limits for this model. - peft_model_path: Optional[str] - PEFT (Parameter-Efficient Fine-Tuning) model path. - image_lora_load_kwargs: Optional[Dict] - lora load parameters for image model - image_lora_fuse_kwargs: Optional[Dict] - lora fuse parameters for image model worker_ip: Optional[str] Specify the worker ip where the model is located in a distributed scenario. gpu_idx: Optional[Union[int, List[int]]] @@ -859,6 +856,18 @@ def launch_model( url = f"{self.base_url}/v1/models" + if peft_model_config is not None: + lora_list = [ + LoRA.from_dict(model) for model in peft_model_config["lora_list"] + ] + peft_model = PeftModelConfig( + lora_list, + peft_model_config["image_lora_load_kwargs"], + peft_model_config["image_lora_fuse_kwargs"], + ) + else: + peft_model = None + # convert float to int or string since the RESTful API does not accept float. if isinstance(model_size_in_billions, float): model_size_in_billions = convert_float_to_int_or_str(model_size_in_billions) @@ -866,6 +875,7 @@ def launch_model( payload = { "model_uid": model_uid, "model_name": model_name, + "peft_model_config": peft_model.to_dict() if peft_model else None, "model_type": model_type, "model_size_in_billions": model_size_in_billions, "model_format": model_format, @@ -873,9 +883,6 @@ def launch_model( "replica": replica, "n_gpu": n_gpu, "request_limits": request_limits, - "peft_model_path": peft_model_path, - "image_lora_load_kwargs": image_lora_load_kwargs, - "image_lora_fuse_kwargs": image_lora_fuse_kwargs, "worker_ip": worker_ip, "gpu_idx": gpu_idx, } diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index dae8c3c6c8..115baf1e73 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -30,6 +30,7 @@ ) from ..core import ModelActor from ..core.status_guard import InstanceInfo, LaunchStatus +from ..types import PeftModelConfig from .metrics import record_metrics from .resource import GPUStatus, ResourceStatus from .utils import ( @@ -749,9 +750,7 @@ async def launch_builtin_model( request_limits: Optional[int] = None, wait_ready: bool = True, model_version: Optional[str] = None, - peft_model_path: Optional[str] = None, - image_lora_load_kwargs: Optional[Dict] = None, - image_lora_fuse_kwargs: Optional[Dict] = None, + peft_model_config: Optional[PeftModelConfig] = None, worker_ip: Optional[str] = None, gpu_idx: Optional[Union[int, List[int]]] = None, **kwargs, @@ -803,9 +802,7 @@ async def _launch_one_model(_replica_model_uid): model_type=model_type, n_gpu=n_gpu, request_limits=request_limits, - peft_model_path=peft_model_path, - image_lora_load_kwargs=image_lora_load_kwargs, - image_lora_fuse_kwargs=image_lora_fuse_kwargs, + peft_model_config=peft_model_config, gpu_idx=gpu_idx, **kwargs, ) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 465fae7b84..26cd664c51 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -36,6 +36,7 @@ from ..core.status_guard import LaunchStatus from ..device_utils import gpu_count from ..model.core import ModelDescription, create_model_instance +from ..types import PeftModelConfig from .event import Event, EventCollectorActor, EventType from .metrics import launch_metrics_export_server, record_metrics from .resource import gather_node_info @@ -606,9 +607,7 @@ async def launch_builtin_model( quantization: Optional[str], model_type: str = "LLM", n_gpu: Optional[Union[int, str]] = "auto", - peft_model_path: Optional[str] = None, - image_lora_load_kwargs: Optional[Dict] = None, - image_lora_fuse_kwargs: Optional[Dict] = None, + peft_model_config: Optional[PeftModelConfig] = None, request_limits: Optional[int] = None, gpu_idx: Optional[Union[int, List[int]]] = None, **kwargs, @@ -646,7 +645,7 @@ async def launch_builtin_model( if isinstance(n_gpu, str) and n_gpu != "auto": raise ValueError("Currently `n_gpu` only supports `auto`.") - if peft_model_path is not None: + if peft_model_config is not None: if model_type in ("embedding", "rerank"): raise ValueError( f"PEFT adaptors cannot be applied to embedding or rerank models." @@ -677,9 +676,7 @@ async def launch_builtin_model( model_format, model_size_in_billions, quantization, - peft_model_path, - image_lora_load_kwargs, - image_lora_fuse_kwargs, + peft_model_config, is_local_deployment, **kwargs, ) diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index baae417c6e..89ae648f07 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -640,10 +640,11 @@ def list_model_registrations( help='The number of GPUs used by the model, default is "auto".', ) @click.option( - "--peft-model-path", - default=None, - type=str, - help="PEFT model path.", + "--lora-modules", + "-lm", + multiple=True, + type=(str, str), + help="LoRA module configurations in the format name=path. Multiple modules can be specified.", ) @click.option( "--image-lora-load-kwargs", @@ -696,7 +697,7 @@ def model_launch( quantization: str, replica: int, n_gpu: str, - peft_model_path: Optional[str], + lora_modules: Optional[Tuple], image_lora_load_kwargs: Optional[Tuple], image_lora_fuse_kwargs: Optional[Tuple], worker_ip: Optional[str], @@ -729,6 +730,18 @@ def model_launch( else None ) + lora_list = ( + [{"lora_name": k, "local_path": v} for k, v in dict(lora_modules).items()] + if lora_modules + else [] + ) + + peft_model_config = { + "image_lora_load_kwargs": image_lora_load_params, + "image_lora_fuse_kwargs": image_lora_fuse_params, + "lora_list": lora_list, + } + _gpu_idx: Optional[List[int]] = ( None if gpu_idx is None else [int(idx) for idx in gpu_idx.split(",")] ) @@ -754,9 +767,7 @@ def model_launch( quantization=quantization, replica=replica, n_gpu=_n_gpu, - peft_model_path=peft_model_path, - image_lora_load_kwargs=image_lora_load_params, - image_lora_fuse_kwargs=image_lora_fuse_params, + peft_model_config=peft_model_config, worker_ip=worker_ip, gpu_idx=_gpu_idx, trust_remote_code=trust_remote_code, diff --git a/xinference/model/core.py b/xinference/model/core.py index 842eca6387..e17f644e46 100644 --- a/xinference/model/core.py +++ b/xinference/model/core.py @@ -13,9 +13,10 @@ # limitations under the License. from abc import ABC, abstractmethod -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Any, List, Optional, Tuple, Union from .._compat import BaseModel +from ..types import PeftModelConfig class ModelDescription(ABC): @@ -52,9 +53,7 @@ def create_model_instance( model_format: Optional[str] = None, model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, - peft_model_path: Optional[str] = None, - image_lora_load_kwargs: Optional[Dict] = None, - image_lora_fuse_kwargs: Optional[Dict] = None, + peft_model_config: Optional[PeftModelConfig] = None, is_local_deployment: bool = False, **kwargs, ) -> Tuple[Any, ModelDescription]: @@ -73,7 +72,7 @@ def create_model_instance( model_format, model_size_in_billions, quantization, - peft_model_path, + peft_model_config, is_local_deployment, **kwargs, ) @@ -90,9 +89,7 @@ def create_model_instance( devices, model_uid, model_name, - lora_model_path=peft_model_path, - lora_load_kwargs=image_lora_load_kwargs, - lora_fuse_kwargs=image_lora_fuse_kwargs, + peft_model_config, **kwargs, ) elif model_type == "rerank": diff --git a/xinference/model/image/core.py b/xinference/model/image/core.py index e19a2b839c..028f5cdc4d 100644 --- a/xinference/model/image/core.py +++ b/xinference/model/image/core.py @@ -18,6 +18,7 @@ from typing import Dict, List, Optional, Tuple from ...constants import XINFERENCE_CACHE_DIR +from ...types import PeftModelConfig from ..core import CacheableModelSpec, ModelDescription from ..utils import valid_model_revision from .stable_diffusion.core import DiffusionModel @@ -175,9 +176,7 @@ def create_image_model_instance( devices: List[str], model_uid: str, model_name: str, - lora_model_path: Optional[str] = None, - lora_load_kwargs: Optional[Dict] = None, - lora_fuse_kwargs: Optional[Dict] = None, + peft_model_config: Optional[PeftModelConfig] = None, **kwargs, ) -> Tuple[DiffusionModel, ImageModelDescription]: model_spec = match_diffusion(model_name) @@ -210,10 +209,19 @@ def create_image_model_instance( else: kwargs["controlnet"] = controlnet_model_paths model_path = cache(model_spec) + if peft_model_config is not None: + lora_model = peft_model_config.peft_model + lora_load_kwargs = peft_model_config.image_lora_load_kwargs + lora_fuse_kwargs = peft_model_config.image_lora_fuse_kwargs + else: + lora_model = None + lora_load_kwargs = None + lora_fuse_kwargs = None + model = DiffusionModel( model_uid, model_path, - lora_model_path=lora_model_path, + lora_model_paths=lora_model, lora_load_kwargs=lora_load_kwargs, lora_fuse_kwargs=lora_fuse_kwargs, **kwargs, diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index 11d5e50802..6d9be6ee2a 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -25,7 +25,7 @@ from ....constants import XINFERENCE_IMAGE_DIR from ....device_utils import move_model_to_available_device -from ....types import Image, ImageList +from ....types import Image, ImageList, LoRA logger = logging.getLogger(__name__) @@ -36,7 +36,7 @@ def __init__( model_uid: str, model_path: str, device: Optional[str] = None, - lora_model_path: Optional[str] = None, + lora_model: Optional[List[LoRA]] = None, lora_load_kwargs: Optional[Dict] = None, lora_fuse_kwargs: Optional[Dict] = None, **kwargs, @@ -45,20 +45,21 @@ def __init__( self._model_path = model_path self._device = device self._model = None - self._lora_model_path = lora_model_path + self._lora_model = lora_model self._lora_load_kwargs = lora_load_kwargs or {} self._lora_fuse_kwargs = lora_fuse_kwargs or {} self._kwargs = kwargs def _apply_lora(self): - if self._lora_model_path is not None: + if self._lora_model is not None: logger.info( f"Loading the LoRA with load kwargs: {self._lora_load_kwargs}, fuse kwargs: {self._lora_fuse_kwargs}." ) assert self._model is not None - self._model.load_lora_weights( - self._lora_model_path, **self._lora_load_kwargs - ) + for lora_model in self._lora_model: + self._model.load_lora_weights( + lora_model.local_path, **self._lora_load_kwargs + ) self._model.fuse_lora(**self._lora_fuse_kwargs) logger.info(f"Successfully loaded the LoRA for model {self._model_uid}.") diff --git a/xinference/model/llm/core.py b/xinference/model/llm/core.py index 77ba6b2d61..54bbe5f32f 100644 --- a/xinference/model/llm/core.py +++ b/xinference/model/llm/core.py @@ -21,6 +21,7 @@ from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union from ...core.utils import parse_replica_model_uid +from ...types import PeftModelConfig from ..core import ModelDescription if TYPE_CHECKING: @@ -180,7 +181,7 @@ def create_llm_model_instance( model_format: Optional[str] = None, model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, - peft_model_path: Optional[str] = None, + peft_model_config: Optional[PeftModelConfig] = None, is_local_deployment: bool = False, **kwargs, ) -> Tuple[LLM, LLMDescription]: @@ -204,9 +205,9 @@ def create_llm_model_instance( assert quantization is not None save_path = cache(llm_family, llm_spec, quantization) - llm_cls = match_llm_cls( - llm_family, llm_spec, quantization, peft_model_path=peft_model_path - ) + peft_model = peft_model_config.peft_model if peft_model_config else None + + llm_cls = match_llm_cls(llm_family, llm_spec, quantization, peft_model=peft_model) if not llm_cls: raise ValueError( f"Model not supported, name: {model_name}, format: {model_format}," @@ -214,15 +215,9 @@ def create_llm_model_instance( ) logger.debug(f"Launching {model_uid} with {llm_cls.__name__}") - if peft_model_path is not None: + if peft_model is not None: model = llm_cls( - model_uid, - llm_family, - llm_spec, - quantization, - save_path, - kwargs, - peft_model_path, + model_uid, llm_family, llm_spec, quantization, save_path, kwargs, peft_model ) else: model = llm_cls( diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 4252c3a16f..6f5a01d6e7 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -33,6 +33,7 @@ validator, ) from ...constants import XINFERENCE_CACHE_DIR, XINFERENCE_MODEL_DIR +from ...types import LoRA from ..utils import ( download_from_modelscope, is_valid_model_uri, @@ -975,12 +976,12 @@ def match_llm_cls( family: LLMFamilyV1, llm_spec: "LLMSpecV1", quantization: str, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ) -> Optional[Type[LLM]]: """ Find an LLM implementation for given LLM family and spec. """ - if peft_model_path is not None: + if peft_model is not None: for cls in PEFT_SUPPORTED_CLASSES: if cls.match(family, llm_spec, quantization): return cls diff --git a/xinference/model/llm/pytorch/baichuan.py b/xinference/model/llm/pytorch/baichuan.py index 8b3adb2c88..ac45c53f6e 100644 --- a/xinference/model/llm/pytorch/baichuan.py +++ b/xinference/model/llm/pytorch/baichuan.py @@ -12,8 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Optional +from typing import List, Optional +from ....types import LoRA from ..llm_family import LLMFamilyV1, LLMSpecV1 from .core import PytorchChatModel, PytorchModelConfig @@ -27,7 +28,7 @@ def __init__( quantization: str, model_path: str, pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__( model_uid, @@ -36,7 +37,7 @@ def __init__( quantization, model_path, pytorch_model_config=pytorch_model_config, - peft_model_path=peft_model_path, + peft_model=peft_model, ) self._use_fast_tokenizer = False diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index e917b19deb..e8d7c7de4a 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -24,6 +24,7 @@ CompletionChoice, CompletionChunk, CompletionUsage, + LoRA, PytorchGenerateConfig, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 @@ -39,7 +40,7 @@ def __init__( quantization: str, model_path: str, pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__( model_uid, @@ -48,7 +49,7 @@ def __init__( quantization, model_path, pytorch_model_config=pytorch_model_config, - peft_model_path=peft_model_path, + peft_model=peft_model, ) def _load_model(self, **kwargs): diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 8cac269289..3703b36704 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -32,6 +32,7 @@ Embedding, EmbeddingData, EmbeddingUsage, + LoRA, PytorchGenerateConfig, PytorchModelConfig, ) @@ -71,14 +72,14 @@ def __init__( quantization: str, model_path: str, pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__(model_uid, model_family, model_spec, quantization, model_path) self._use_fast_tokenizer = True self._pytorch_model_config: PytorchModelConfig = self._sanitize_model_config( pytorch_model_config ) - self._peft_model_path = peft_model_path + self._peft_model = peft_model def _sanitize_model_config( self, pytorch_model_config: Optional[PytorchModelConfig] @@ -134,7 +135,7 @@ def _load_model(self, **kwargs): return model, tokenizer def _apply_lora(self): - if self._peft_model_path is not None: + if self._peft_model is not None: try: from peft import PeftModel except ImportError: @@ -142,14 +143,15 @@ def _apply_lora(self): f"Failed to import 'PeftModel' from 'peft'. Please make sure 'peft' is installed.\n\n" ) - # Apply LoRA - self._model = PeftModel.from_pretrained( - self._model, - self._peft_model_path, - ) - logger.info( - f"Successfully loaded the PEFT adaptor for model {self.model_uid}." - ) + for peft_model in self._peft_model: + # Apply LoRA + self._model = PeftModel.from_pretrained( + self._model, + peft_model.local_path, + ) + logger.info( + f"PEFT adaptor '{peft_model.lora_name}' successfully loaded for model '{self.model_uid}'." + ) def load(self): try: @@ -421,7 +423,7 @@ def __init__( quantization: str, model_path: str, pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__( model_uid, @@ -430,7 +432,7 @@ def __init__( quantization, model_path, pytorch_model_config, - peft_model_path, + peft_model, ) def _sanitize_generate_config( diff --git a/xinference/model/llm/pytorch/falcon.py b/xinference/model/llm/pytorch/falcon.py index 782f29e750..7f66bdd01f 100644 --- a/xinference/model/llm/pytorch/falcon.py +++ b/xinference/model/llm/pytorch/falcon.py @@ -12,8 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Optional +from typing import List, Optional +from ....types import LoRA from ..llm_family import LLMFamilyV1, LLMSpecV1 from .core import PytorchChatModel, PytorchModel, PytorchModelConfig @@ -27,7 +28,7 @@ def __init__( quantization: str, model_path: str, pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__( model_uid, @@ -36,7 +37,7 @@ def __init__( quantization, model_path, pytorch_model_config=pytorch_model_config, - peft_model_path=peft_model_path, + peft_model=peft_model, ) def _load_model(self, **kwargs): @@ -86,7 +87,7 @@ def __init__( quantization: str, model_path: str, pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__( model_uid, @@ -95,7 +96,7 @@ def __init__( quantization, model_path, pytorch_model_config=pytorch_model_config, - peft_model_path=peft_model_path, + peft_model=peft_model, ) def _load_model(self, **kwargs): diff --git a/xinference/model/llm/pytorch/internlm2.py b/xinference/model/llm/pytorch/internlm2.py index 2e8a9e69c6..c970f17816 100644 --- a/xinference/model/llm/pytorch/internlm2.py +++ b/xinference/model/llm/pytorch/internlm2.py @@ -23,6 +23,7 @@ CompletionChoice, CompletionChunk, CompletionUsage, + LoRA, PytorchGenerateConfig, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 @@ -38,7 +39,7 @@ def __init__( quantization: str, model_path: str, pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__( model_uid, @@ -47,7 +48,7 @@ def __init__( quantization, model_path, pytorch_model_config=pytorch_model_config, - peft_model_path=peft_model_path, + peft_model=peft_model, ) def _load_model(self, **kwargs): diff --git a/xinference/model/llm/pytorch/llama_2.py b/xinference/model/llm/pytorch/llama_2.py index 27f3235a9b..a7c3e7bba6 100644 --- a/xinference/model/llm/pytorch/llama_2.py +++ b/xinference/model/llm/pytorch/llama_2.py @@ -12,8 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Optional +from typing import List, Optional +from ....types import LoRA from ..llm_family import LLMFamilyV1, LLMSpecV1 from .core import PytorchChatModel, PytorchModel, PytorchModelConfig @@ -27,7 +28,7 @@ def __init__( quantization: str, model_path: str, pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__( model_uid, @@ -36,7 +37,7 @@ def __init__( quantization, model_path, pytorch_model_config=pytorch_model_config, - peft_model_path=peft_model_path, + peft_model=peft_model, ) def _load_model(self, **kwargs): @@ -69,8 +70,8 @@ def __init__( model_spec: "LLMSpecV1", quantization: str, model_path: str, - peft_model_path: Optional[str] = None, pytorch_model_config: Optional["PytorchModelConfig"] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__( model_uid, @@ -78,7 +79,7 @@ def __init__( model_spec, quantization, model_path, - peft_model_path=peft_model_path, + peft_model=peft_model, pytorch_model_config=pytorch_model_config, ) self._use_fast_tokenizer = False diff --git a/xinference/model/llm/pytorch/vicuna.py b/xinference/model/llm/pytorch/vicuna.py index 89231a0702..8e9eb16233 100644 --- a/xinference/model/llm/pytorch/vicuna.py +++ b/xinference/model/llm/pytorch/vicuna.py @@ -26,8 +26,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Optional +from typing import List, Optional +from ....types import LoRA from .. import LLMFamilyV1, LLMSpecV1 from .core import PytorchChatModel, PytorchModelConfig @@ -41,7 +42,7 @@ def __init__( quantization: str, model_path: str, pytorch_model_config: Optional["PytorchModelConfig"] = None, - peft_model_path: Optional[str] = None, + peft_model: Optional[List[LoRA]] = None, ): super().__init__( model_uid, @@ -50,7 +51,7 @@ def __init__( quantization, model_path, pytorch_model_config=pytorch_model_config, - peft_model_path=peft_model_path, + peft_model=peft_model, ) self._use_fast_tokenizer = False diff --git a/xinference/types.py b/xinference/types.py index 964a865ac7..b300237f66 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -450,3 +450,58 @@ class CreateChatCompletion( CreateChatCompletionOpenAI, ): pass + + +class LoRA: + def __init__(self, lora_name: str, local_path: str): + self.lora_name = lora_name + self.local_path = local_path + + def to_dict(self): + return { + "lora_name": self.lora_name, + "local_path": self.local_path, + } + + @classmethod + def from_dict(cls, data: Dict): + return cls( + lora_name=data["lora_name"], + local_path=data["local_path"], + ) + + +class PeftModelConfig: + def __init__( + self, + peft_model: Optional[List[LoRA]] = None, + image_lora_load_kwargs: Optional[Dict] = None, + image_lora_fuse_kwargs: Optional[Dict] = None, + ): + self.peft_model = peft_model + self.image_lora_load_kwargs = image_lora_load_kwargs + self.image_lora_fuse_kwargs = image_lora_fuse_kwargs + + def to_dict(self): + return { + "peft_model": [lora.to_dict() for lora in self.peft_model] + if self.peft_model + else None, + "image_lora_load_kwargs": self.image_lora_load_kwargs, + "image_lora_fuse_kwargs": self.image_lora_fuse_kwargs, + } + + @classmethod + def from_dict(cls, data: Dict): + peft_model_data = data.get("peft_model") + peft_model = ( + [LoRA.from_dict(lora_dict) for lora_dict in peft_model_data] + if peft_model_data + else None + ) + + return cls( + peft_model=peft_model, + image_lora_load_kwargs=data.get("image_lora_load_kwargs"), + image_lora_fuse_kwargs=data.get("image_lora_fuse_kwargs"), + ) diff --git a/xinference/utils.py b/xinference/utils.py index 5b3741c222..79a46fde6d 100644 --- a/xinference/utils.py +++ b/xinference/utils.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. + import torch From fa640ee8d936630a187bf2f14637f38a08c8c060 Mon Sep 17 00:00:00 2001 From: mujin2 <132123199+mujin2@users.noreply.github.com> Date: Wed, 17 Apr 2024 14:00:48 +0800 Subject: [PATCH 015/298] FEAT: Support SeaLLM-7B and c4ai-command-r-v01 (#1310) Co-authored-by: ChengjieLi <chengjieli23@outlook.com> --- xinference/model/llm/llm_family.json | 195 +++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 7ed1b4509c..a2a2332b6c 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -4752,5 +4752,200 @@ "</s>" ] } + }, + { + "version": 1, + "context_length": 8192, + "model_name": "seallm_v2", + "model_lang": [ + "en", + "zh", + "vi", + "id", + "th", + "ms", + "km", + "lo", + "my", + "tl" + ], + "model_ability": [ + "generate" + ], + "model_description": "We introduce SeaLLM-7B-v2, the state-of-the-art multilingual LLM for Southeast Asian (SEA) languages", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "none" + ], + "model_id": "SeaLLMs/SeaLLM-7B-v2", + "model_revision": "f1bd48e0d75365c24a3c5ad006b2d0a0c9dca30f" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "Q4_0", + "Q8_0" + ], + "model_id": "SeaLLMs/SeaLLM-7B-v2-gguf", + "model_file_name_template": "SeaLLM-7B-v2.{quantization}.gguf" + } + ] + }, + { + "version": 1, + "context_length": 8192, + "model_name": "seallm_v2.5", + "model_lang": [ + "en", + "zh", + "vi", + "id", + "th", + "ms", + "km", + "lo", + "my", + "tl" + ], + "model_ability": [ + "generate" + ], + "model_description": "We introduce SeaLLM-7B-v2.5, the state-of-the-art multilingual LLM for Southeast Asian (SEA) languages", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "none" + ], + "model_id": "SeaLLMs/SeaLLM-7B-v2.5", + "model_revision": "c54a8eb8e2d58c5a680bfbbe3a7ae71753bb644b" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "Q4_K_M", + "Q8_0" + ], + "model_id": "SeaLLMs/SeaLLM-7B-v2.5-GGUF", + "model_file_name_template": "SeaLLM-7B-v2.5.{quantization}.gguf" + } + ] + }, + { + "version": 1, + "context_length": 131072, + "model_name": "c4ai-command-r-v01", + "model_lang": [ + "en", + "fr", + "de", + "es", + "it", + "pt", + "ja", + "ko", + "zh", + "ar" + ], + "model_ability": [ + "generate" + ], + "model_description": "C4AI Command-R is a research release of a 35 billion parameter highly performant generative model.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 35, + "quantizations": [ + "none" + ], + "model_id": "CohereForAI/c4ai-command-r-v01", + "model_revision": "16881ccde1c68bbc7041280e6a66637bc46bfe88" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 35, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "andrewcanis/c4ai-command-r-v01-GGUF", + "model_file_name_template": "c4ai-command-r-v01.{quantization}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 104, + "quantizations": [ + "none" + ], + "model_id": "CohereForAI/c4ai-command-r-plus", + "model_revision": "ba7f1d954c9d1609013677d87e4142ab95c34e62" + }, + { + "model_format": "gptq", + "model_size_in_billions": 104, + "quantizations": [ + "Int4" + ], + "model_id": "alpindale/c4ai-command-r-plus-GPTQ", + "model_revision": "35febfc08f723ac0df32480eb4af349a7d08656e" + } + ] + }, + { + "version": 1, + "context_length": 131072, + "model_name": "c4ai-command-r-v01-4bit", + "model_lang": [ + "en", + "fr", + "de", + "es", + "it", + "pt", + "ja", + "ko", + "zh", + "ar" + ], + "model_ability": [ + "generate" + ], + "model_description": "This model is 4bit quantized version of C4AI Command-R using bitsandbytes.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 35, + "quantizations": [ + "none" + ], + "model_id": "CohereForAI/c4ai-command-r-v01-4bit", + "model_revision": "f2e87936a146643c9dd143422dcafb9cb1552611" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 104, + "quantizations": [ + "none" + ], + "model_id": "CohereForAI/c4ai-command-r-plus-4bit", + "model_revision": "bb63b5b7005ecedb30b0cfd0d5953b02a5817f7b" + } + ] } ] From d3e245e8326cb472087ec7bae886f1ae73cb1801 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:00:42 +0200 Subject: [PATCH 016/298] FEAT: Support BAAI/bge-reranker-v2-* rerank model (#1305) Co-authored-by: qinxuye <qinxuye@gmail.com> --- .github/workflows/python.yaml | 1 + setup.cfg | 3 ++ xinference/model/rerank/core.py | 35 ++++++++++++------- xinference/model/rerank/model_spec.json | 24 +++++++++++++ .../model/rerank/model_spec_modelscope.json | 26 +++++++++++++- xinference/model/rerank/tests/test_rerank.py | 5 +-- 6 files changed, 79 insertions(+), 15 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 648b6044ad..acbbb0b544 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -124,6 +124,7 @@ jobs: pip install modelscope pip install diffusers pip install protobuf + pip install FlagEmbedding pip install -e ".[dev]" pip install "jinja2==3.1.2" working-directory: . diff --git a/setup.cfg b/setup.cfg index 46053cf910..4e6fca6715 100644 --- a/setup.cfg +++ b/setup.cfg @@ -105,6 +105,7 @@ all = attrdict # For deepseek VL timm>=0.9.16 # For deepseek VL torchvision # For deepseek VL + FlagEmbedding # For rerank intel = torch==2.1.0a0 intel_extension_for_pytorch==2.1.10+xpu @@ -134,6 +135,8 @@ sglang = sglang[all] embedding = sentence-transformers>=2.3.1 +rerank = + FlagEmbedding image = diffusers controlnet_aux diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index 6af2224186..9a715eb115 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -42,8 +42,9 @@ def get_rerank_model_descriptions(): class RerankModelSpec(CacheableModelSpec): model_name: str language: List[str] + type: Optional[str] = "normal" model_id: str - model_revision: str + model_revision: Optional[str] model_hub: str = "huggingface" @@ -63,6 +64,7 @@ def to_dict(self): "model_type": "rerank", "address": self.address, "accelerators": self.devices, + "type": self._model_spec.type, "model_name": self._model_spec.model_name, "language": self._model_spec.language, "model_revision": self._model_spec.model_revision, @@ -97,12 +99,14 @@ def generate_rerank_description(model_spec: RerankModelSpec) -> Dict[str, List[D class RerankModel: def __init__( self, + model_spec: RerankModelSpec, model_uid: str, model_path: str, device: Optional[str] = None, use_fp16: bool = False, model_config: Optional[Dict] = None, ): + self._model_spec = model_spec self._model_uid = model_uid self._model_path = model_path self._device = device @@ -112,20 +116,25 @@ def __init__( def load(self): try: - from sentence_transformers.cross_encoder import CrossEncoder + if self._model_spec.type == "normal": + from FlagEmbedding import FlagReranker + elif self._model_spec.type == "LLM-based": + from FlagEmbedding import FlagLLMReranker as FlagReranker + elif self._model_spec.type == "LLM-based layerwise": + from FlagEmbedding import LayerWiseFlagLLMReranker as FlagReranker + else: + raise RuntimeError( + f"Unsupported Rank model type: {self._model_spec.type}" + ) except ImportError: - error_message = "Failed to import module 'SentenceTransformer'" + error_message = "Failed to import module 'FlagEmbedding'" installation_guide = [ - "Please make sure 'sentence-transformers' is installed. ", - "You can install it by `pip install sentence-transformers`\n", + "Please make sure 'FlagEmbedding' is installed. ", + "You can install it by `pip install FlagEmbedding`\n", ] raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - self._model = CrossEncoder( - self._model_path, device=self._device, **self._model_config - ) - if self._use_fp16: - self._model.model.half() + self._model = FlagReranker(self._model_path, use_fp16=True) def rerank( self, @@ -142,7 +151,7 @@ def rerank( if max_chunks_per_doc is not None: raise ValueError("rerank hasn't support `max_chunks_per_doc` parameter.") sentence_combinations = [[query, doc] for doc in documents] - similarity_scores = self._model.predict(sentence_combinations) + similarity_scores = self._model.compute_score(sentence_combinations) sim_scores_argsort = list(reversed(np.argsort(similarity_scores))) if top_n is not None: sim_scores_argsort = sim_scores_argsort[:top_n] @@ -224,7 +233,9 @@ def create_rerank_model_instance( model_path = cache(model_spec) use_fp16 = kwargs.pop("use_fp16", False) - model = RerankModel(model_uid, model_path, use_fp16=use_fp16, model_config=kwargs) + model = RerankModel( + model_spec, model_uid, model_path, use_fp16=use_fp16, model_config=kwargs + ) model_description = RerankModelDescription( subpool_addr, devices, model_spec, model_path=model_path ) diff --git a/xinference/model/rerank/model_spec.json b/xinference/model/rerank/model_spec.json index 34f62dfba4..4ae7e3b1d4 100644 --- a/xinference/model/rerank/model_spec.json +++ b/xinference/model/rerank/model_spec.json @@ -1,20 +1,44 @@ [ { "model_name": "bge-reranker-large", + "type": "normal", "language": ["en", "zh"], "model_id": "BAAI/bge-reranker-large", "model_revision": "27c9168d479987529781de8474dff94d69beca11" }, { "model_name": "bge-reranker-base", + "type": "normal", "language": ["en", "zh"], "model_id": "BAAI/bge-reranker-base", "model_revision": "465b4b7ddf2be0a020c8ad6e525b9bb1dbb708ae" }, { "model_name": "bce-reranker-base_v1", + "type": "normal", "language": ["en", "zh"], "model_id": "maidalun1020/bce-reranker-base_v1", "model_revision": "eaa31a577a0574e87a08959bd229ca14ce1b5496" + }, + { + "model_name": "bge-reranker-v2-m3", + "type": "normal", + "language": ["en", "zh", "multilingual"], + "model_id": "BAAI/bge-reranker-v2-m3", + "model_revision": "12e974610ba9083ed95f3edf08d7e899581f4de4" + }, + { + "model_name": "bge-reranker-v2-gemma", + "type": "LLM-based", + "language": ["en", "zh", "multilingual"], + "model_id": "BAAI/bge-reranker-v2-gemma", + "model_revision": "1787044f8b6fb740a9de4557c3a12377f84d9e17" + }, + { + "model_name": "bge-reranker-v2-minicpm-layerwise", + "type": "LLM-based layerwise", + "language": ["en", "zh", "multilingual"], + "model_id": "BAAI/bge-reranker-v2-minicpm-layerwise", + "model_revision": "47b5332b296c4d8cb6ee2c60502cc62a0d708881" } ] diff --git a/xinference/model/rerank/model_spec_modelscope.json b/xinference/model/rerank/model_spec_modelscope.json index 29b39bed5d..68b2b1aea7 100644 --- a/xinference/model/rerank/model_spec_modelscope.json +++ b/xinference/model/rerank/model_spec_modelscope.json @@ -1,6 +1,7 @@ [ { "model_name": "bge-reranker-base", + "type": "normal", "language": ["en", "zh"], "model_id": "Xorbits/bge-reranker-base", "model_revision": "v0.0.1", @@ -8,16 +9,39 @@ }, { "model_name": "bge-reranker-large", + "type": "normal", "language": ["en", "zh"], "model_id": "Xorbits/bge-reranker-large", "model_revision": "v0.0.1", "model_hub": "modelscope" }, - { + { "model_name": "bce-reranker-base_v1", + "type": "normal", "language": ["en", "zh"], "model_id": "maidalun/bce-reranker-base_v1", "model_revision": "v0.0.1", "model_hub": "modelscope" + }, + { + "model_name": "bge-reranker-v2-m3", + "type": "normal", + "language": ["en", "zh", "multilingual"], + "model_id": "AI-ModelScope/bge-reranker-v2-m3", + "model_hub": "modelscope" + }, + { + "model_name": "bge-reranker-v2-gemma", + "type": "LLM-based", + "language": ["en", "zh", "multilingual"], + "model_id": "AI-ModelScope/bge-reranker-v2-gemma", + "model_hub": "modelscope" + }, + { + "model_name": "bge-reranker-v2-minicpm-layerwise", + "type": "LLM-based layerwise", + "language": ["en", "zh", "multilingual"], + "model_id": "zfffff/bge-reranker-v2-minicpm-layerwise", + "model_hub": "modelscope" } ] diff --git a/xinference/model/rerank/tests/test_rerank.py b/xinference/model/rerank/tests/test_rerank.py index 94f7e0d9fc..dc06624421 100644 --- a/xinference/model/rerank/tests/test_rerank.py +++ b/xinference/model/rerank/tests/test_rerank.py @@ -20,11 +20,12 @@ from ....client import Client -def test_restful_api(setup): +@pytest.mark.parametrize("model_name", ["bge-reranker-base", "bge-reranker-v2-m3"]) +def test_restful_api(model_name, setup): endpoint, _ = setup client = Client(endpoint) - model_uid = client.launch_model(model_name="bge-reranker-base", model_type="rerank") + model_uid = client.launch_model(model_name=model_name, model_type="rerank") assert len(client.list_models()) == 1 model = client.get_model(model_uid) # We want to compute the similarity between the query sentence From 2aca13d17a60243bbc5a6f6a2bf584696005a80a Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 17 Apr 2024 19:31:42 +0800 Subject: [PATCH 017/298] BLD: Add `FlagEmbedding` in cpu docker (#1318) --- xinference/deploy/docker/cpu.Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index d0076476b0..25f1cffb71 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -53,6 +53,7 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ einops \ tiktoken \ "sentence-transformers>=2.3.1" \ + FlagEmbedding \ diffusers \ controlnet_aux \ orjson \ From a5025a6e052a03c08df0092a29851d12e770423f Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:44:08 +0800 Subject: [PATCH 018/298] FEAT: UI supports multi lora (#1320) Co-authored-by: ChengjieLi <chengjieli23@outlook.com> --- xinference/types.py | 8 +- .../scenes/launch_model/components/addPair.js | 132 +++++++++ .../ui/src/scenes/launch_model/modelCard.js | 271 +++++++----------- 3 files changed, 246 insertions(+), 165 deletions(-) create mode 100644 xinference/web/ui/src/scenes/launch_model/components/addPair.js diff --git a/xinference/types.py b/xinference/types.py index b300237f66..bbe6188616 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -484,7 +484,7 @@ def __init__( def to_dict(self): return { - "peft_model": [lora.to_dict() for lora in self.peft_model] + "lora_list": [lora.to_dict() for lora in self.peft_model] if self.peft_model else None, "image_lora_load_kwargs": self.image_lora_load_kwargs, @@ -493,10 +493,10 @@ def to_dict(self): @classmethod def from_dict(cls, data: Dict): - peft_model_data = data.get("peft_model") + peft_model_list = data.get("lora_list", None) peft_model = ( - [LoRA.from_dict(lora_dict) for lora_dict in peft_model_data] - if peft_model_data + [LoRA.from_dict(lora_dict) for lora_dict in peft_model_list] + if peft_model_list is not None else None ) diff --git a/xinference/web/ui/src/scenes/launch_model/components/addPair.js b/xinference/web/ui/src/scenes/launch_model/components/addPair.js new file mode 100644 index 0000000000..7f11ad4d20 --- /dev/null +++ b/xinference/web/ui/src/scenes/launch_model/components/addPair.js @@ -0,0 +1,132 @@ +import { AddCircle } from '@mui/icons-material' +import DeleteIcon from '@mui/icons-material/Delete' +import { Alert, Box, IconButton, Snackbar, TextField } from '@mui/material' +import React, { useEffect, useState } from 'react' + +const AddPair = ({ customData, onGetArr, onJudgeArr }) => { + const [openSnackbar, setOpenSnackbar] = useState(false) + const [arr, setArr] = useState([]) + const [arrId, setArrId] = useState(0) + const [defaultIndex, setDefaultIndex] = useState(-1) + const [isNotUniqueKey, setIsNotUniqueKey] = useState(false) + + useEffect(() => { + onGetArr(arr) + }, [arr]) + + const updateArr = (index, type, newValue) => { + setArr( + arr.map((pair, subIndex) => { + if (subIndex === index) { + return { ...pair, [type]: newValue } + } + return pair + }) + ) + if (type === customData.key) { + setDefaultIndex(-1) + setIsNotUniqueKey(false) + arr.forEach((pair) => { + if (pair[customData.key] === newValue) { + setDefaultIndex(index) + setIsNotUniqueKey(true) + } + }) + } + } + + const handleDeleteArr = (index) => { + setDefaultIndex(-1) + setArr( + arr.filter((_, subIndex) => { + return index !== subIndex + }) + ) + onGetArr(arr) + } + + return ( + <div> + <Box> + <div + style={{ + display: 'flex', + alignItems: 'center', + margin: '20px 0 0 15px', + }} + > + <div>{customData.title}</div> + <IconButton + color="primary" + onClick={() => { + setArrId(arrId + 1) + let obj = { id: arrId } + obj[customData.key] = '' + obj[customData.value] = '' + onJudgeArr(arr, [customData.key, customData.value]) + ? setArr([...arr, obj]) + : setOpenSnackbar(true) + }} + > + <AddCircle /> + </IconButton> + </div> + <Box> + {arr.map((item, index) => { + return ( + <Box key={item.id}> + <div + style={{ + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + marginTop: '10px', + marginLeft: '10px', + }} + > + <TextField + label={customData.key} + value={item[customData.key]} + onChange={(e) => { + updateArr(index, customData.key, e.target.value) + }} + style={{ width: '44%' }} + /> + <TextField + label={customData.value} + value={item[customData.value]} + onChange={(e) => { + updateArr(index, customData.value, e.target.value) + }} + style={{ width: '44%' }} + /> + <IconButton + aria-label="delete" + onClick={() => handleDeleteArr(index)} + style={{ marginLeft: '10px' }} + > + <DeleteIcon /> + </IconButton> + </div> + {isNotUniqueKey && defaultIndex === index && ( + <Alert severity="error"> + {customData.key} must be unique + </Alert> + )} + </Box> + ) + })} + </Box> + </Box> + <Snackbar + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + open={openSnackbar} + onClose={() => setOpenSnackbar(false)} + message="Please fill in the complete parameters before adding!!" + key={'top' + 'center'} + /> + </div> + ) +} + +export default AddPair diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 08cd2061a9..6220bad16b 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -1,5 +1,4 @@ import { - AddCircle, ChatOutlined, EditNoteOutlined, ExpandLess, @@ -35,6 +34,7 @@ import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import fetcher from '../../components/fetcher' import TitleTypography from '../../components/titleTypography' +import AddPair from './components/addPair' import styles from './styles/modelCardStyle' const ModelCard = ({ @@ -49,8 +49,7 @@ const ModelCard = ({ const [requestLimitsAlert, setRequestLimitsAlert] = useState(false) const [GPUIdxAlert, setGPUIdxAlert] = useState(false) const [isOther, setIsOther] = useState(false) - const [isNotUnique, setisNotUnique] = useState(false) - const [defaultIndex, setDefaultIndex] = useState(-1) + const [isPeftModelConfig, setIsPeftModelConfig] = useState(false) const [openSnackbar, setOpenSnackbar] = useState(false) const { isCallingApi, setIsCallingApi } = useContext(ApiContext) const { isUpdatingModel } = useContext(ApiContext) @@ -66,9 +65,6 @@ const ModelCard = ({ const [nGPULayers, setNGPULayers] = useState(-1) const [replica, setReplica] = useState(1) const [requestLimits, setRequestLimits] = useState('') - const [peftModelPath, setPeftModelPath] = useState('') - const [imageLoraLoadKwargs, setImageLoraLoadKwargs] = useState('') - const [imageLoraFuseKwargs, setImageLoraFuseKwargs] = useState('') const [workerIp, setWorkerIp] = useState('') const [GPUIdx, setGPUIdx] = useState('') @@ -77,7 +73,9 @@ const ModelCard = ({ const [quantizationOptions, setQuantizationOptions] = useState([]) const [customDeleted, setCustomDeleted] = useState(false) const [customParametersArr, setCustomParametersArr] = useState([]) - const [arrId, setArrId] = useState(0) + const [loraListArr, setLoraListArr] = useState([]) + const [imageLoraLoadKwargsArr, setImageLoraLoadKwargsArr] = useState([]) + const [imageLoraFuseKwargsArr, setImageLoraFuseKwargsArr] = useState([]) const parentRef = useRef(null) @@ -184,12 +182,6 @@ const ModelCard = ({ replica: replica, request_limits: requestLimits.trim() === '' ? null : Number(requestLimits.trim()), - peft_model_path: - peftModelPath.trim() === '' ? null : peftModelPath.trim(), - image_lora_load_kwargs: - imageLoraLoadKwargs.trim() === '' ? null : imageLoraLoadKwargs.trim(), - image_lora_fuse_kwargs: - imageLoraFuseKwargs.trim() === '' ? null : imageLoraFuseKwargs.trim(), worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), } @@ -204,6 +196,36 @@ const ModelCard = ({ modelDataWithID_LLM.n_gpu_layers = nGPULayers } + if ( + loraListArr.length || + imageLoraLoadKwargsArr.length || + imageLoraFuseKwargsArr.length + ) { + const peft_model_config = {} + if (imageLoraLoadKwargsArr.length) { + const image_lora_load_kwargs = {} + imageLoraLoadKwargsArr.forEach((item) => { + image_lora_load_kwargs[item.key] = handleValueType(item.value) + }) + peft_model_config['image_lora_load_kwargs'] = image_lora_load_kwargs + } + if (imageLoraFuseKwargsArr.length) { + const image_lora_fuse_kwargs = {} + imageLoraFuseKwargsArr.forEach((item) => { + image_lora_fuse_kwargs[item.key] = handleValueType(item.value) + }) + peft_model_config['image_lora_fuse_kwargs'] = image_lora_fuse_kwargs + } + if (loraListArr.length) { + const lora_list = loraListArr + lora_list.map((item) => { + delete item.id + }) + peft_model_config['lora_list'] = lora_list + } + modelDataWithID_LLM['peft_model_config'] = peft_model_config + } + if (customParametersArr.length) { customParametersArr.forEach((item) => { modelDataWithID_LLM[item.key] = handleValueType(item.value) @@ -272,50 +294,20 @@ const ModelCard = ({ .catch(console.error) } - const updateCustomParametersArr = (index, type, newValue) => { - setCustomParametersArr( - customParametersArr.map((pair, subIndex) => { - if (subIndex === index) { - return { ...pair, [type]: newValue } - } - return pair - }) - ) - if (type === 'key') { - setDefaultIndex(-1) - setisNotUnique(false) - customParametersArr.forEach((pair) => { - if (pair.key === newValue) { - setDefaultIndex(index) - setisNotUnique(true) - } - }) - } - } - - const judgeCustomParameters = () => { + const judgeArr = (arr, keysArr) => { if ( - customParametersArr.length && - customParametersArr[customParametersArr.length - 1].key !== '' && - customParametersArr[customParametersArr.length - 1].value !== '' + arr.length && + arr[arr.length - 1][keysArr[0]] !== '' && + arr[arr.length - 1][keysArr[1]] !== '' ) { return true - } else if (customParametersArr.length === 0) { + } else if (arr.length === 0) { return true } else { return false } } - const handleDeleteCustomParameters = (index) => { - setDefaultIndex(-1) - setCustomParametersArr( - customParametersArr.filter((pair, subIndex) => { - return index !== subIndex - }) - ) - } - const handleValueType = (str) => { if (str.toLowerCase() === 'none') { return null @@ -330,6 +322,22 @@ const ModelCard = ({ } } + const getLoraListArr = (arr) => { + setLoraListArr(arr) + } + + const getImageLoraLoadKwargsArr = (arr) => { + setImageLoraLoadKwargsArr(arr) + } + + const getImageLoraFuseKwargsArr = (arr) => { + setImageLoraFuseKwargsArr(arr) + } + + const getCustomParametersArr = (arr) => { + setCustomParametersArr(arr) + } + // Set two different states based on mouse hover return ( <Paper @@ -712,36 +720,6 @@ const ModelCard = ({ )} </FormControl> </Grid> - <Grid item xs={12}> - <FormControl variant="outlined" margin="normal" fullWidth> - <TextField - variant="outlined" - value={peftModelPath} - label="(Optional) Peft Model Path, PEFT (Parameter-Efficient Fine-Tuning) model path" - onChange={(e) => setPeftModelPath(e.target.value)} - /> - </FormControl> - </Grid> - <Grid item xs={12}> - <FormControl variant="outlined" margin="normal" fullWidth> - <TextField - variant="outlined" - value={imageLoraLoadKwargs} - label="(Optional) Image Lora Load Kwargs, lora load parameters for image model" - onChange={(e) => setImageLoraLoadKwargs(e.target.value)} - /> - </FormControl> - </Grid> - <Grid item xs={12}> - <FormControl variant="outlined" margin="normal" fullWidth> - <TextField - variant="outlined" - value={imageLoraFuseKwargs} - label="(Optional) Image Lora Fuse Kwargs, lora fuse parameters for image model" - onChange={(e) => setImageLoraFuseKwargs(e.target.value)} - /> - </FormControl> - </Grid> <Grid item xs={12}> <FormControl variant="outlined" margin="normal" fullWidth> <TextField @@ -777,88 +755,57 @@ const ModelCard = ({ )} </FormControl> </Grid> - </Collapse> - <Box> - <div - style={{ - display: 'flex', - alignItems: 'center', - margin: '10px 0 0 15px', - }} + <ListItemButton + onClick={() => setIsPeftModelConfig(!isPeftModelConfig)} + > + <ListItemText primary="Lora Config" /> + {isPeftModelConfig ? <ExpandLess /> : <ExpandMore />} + </ListItemButton> + <Collapse + in={isPeftModelConfig} + timeout="auto" + unmountOnExit + style={{ marginLeft: '30px' }} > - <div> - Additional parameters passed to the inference engine - </div> - <IconButton - color="primary" - onClick={() => { - setArrId(arrId + 1) - judgeCustomParameters() - ? setCustomParametersArr([ - ...customParametersArr, - { id: arrId, key: '', value: '' }, - ]) - : setOpenSnackbar(true) + <AddPair + customData={{ + title: 'Lora Model Config', + key: 'lora_name', + value: 'local_path', }} - > - <AddCircle /> - </IconButton> - </div> - <Box> - {customParametersArr.map((item, index) => { - return ( - <Box> - <div - key={item.id} - style={{ - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - marginTop: '10px', - }} - > - <TextField - label="key" - value={item.key} - onChange={(e) => { - updateCustomParametersArr( - index, - 'key', - e.target.value - ) - }} - style={{ width: '44%' }} - /> - <TextField - label="value" - value={item.value} - onChange={(e) => { - updateCustomParametersArr( - index, - 'value', - e.target.value - ) - }} - style={{ width: '44%' }} - /> - <IconButton - aria-label="delete" - onClick={() => - handleDeleteCustomParameters(index) - } - style={{ marginLeft: '10px' }} - > - <DeleteIcon /> - </IconButton> - </div> - {isNotUnique && defaultIndex === index && ( - <Alert severity="error">key must be unique</Alert> - )} - </Box> - ) - })} - </Box> - </Box> + onGetArr={getLoraListArr} + onJudgeArr={judgeArr} + /> + <AddPair + customData={{ + title: 'Lora Load Kwargs for Image Model', + key: 'key', + value: 'value', + }} + onGetArr={getImageLoraLoadKwargsArr} + onJudgeArr={judgeArr} + /> + <AddPair + customData={{ + title: 'Lora Fuse Kwargs for Image Model', + key: 'key', + value: 'value', + }} + onGetArr={getImageLoraFuseKwargsArr} + onJudgeArr={judgeArr} + /> + </Collapse> + </Collapse> + <AddPair + customData={{ + title: + 'Additional parameters passed to the inference engine', + key: 'key', + value: 'value', + }} + onGetArr={getCustomParametersArr} + onJudgeArr={judgeArr} + /> </Grid> </Box> ) : ( @@ -901,8 +848,10 @@ const ModelCard = ({ (quantization || (!modelData.is_builtin && modelFormat !== 'pytorch')) ) || - !judgeCustomParameters() || - defaultIndex !== -1 || + !judgeArr(customParametersArr, ['key', 'value']) || + !judgeArr(loraListArr, ['lora_name', 'local_path']) || + !judgeArr(imageLoraLoadKwargsArr, ['key', 'value']) || + !judgeArr(imageLoraFuseKwargsArr, ['key', 'value']) || requestLimitsAlert || GPUIdxAlert) } @@ -968,7 +917,7 @@ const ModelCard = ({ anchorOrigin={{ vertical: 'top', horizontal: 'center' }} open={openSnackbar} onClose={() => setOpenSnackbar(false)} - message="Please fill in the added custom parameters completely!" + message="Please fill in the complete parameters before adding!!" key={'top' + 'center'} /> </Paper> From be7cbcfe6a561623724a0fdf09f030bb6bbd48be Mon Sep 17 00:00:00 2001 From: mujin2 <132123199+mujin2@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:50:28 +0800 Subject: [PATCH 019/298] FEAT: Add_cia4command_modelscope (#1321) --- .../builtin/llm/c4ai-command-r-v01-4bit.rst | 45 ++++++++++ .../models/builtin/llm/c4ai-command-r-v01.rst | 75 ++++++++++++++++ doc/source/models/builtin/llm/gpt-2.rst | 12 +-- doc/source/models/builtin/llm/index.rst | 28 ++++++ doc/source/models/builtin/llm/seallm_v2.5.rst | 45 ++++++++++ doc/source/models/builtin/llm/seallm_v2.rst | 45 ++++++++++ .../builtin/rerank/bge-reranker-v2-gemma.rst | 18 ++++ .../builtin/rerank/bge-reranker-v2-m3.rst | 18 ++++ .../bge-reranker-v2-minicpm-layerwise.rst | 18 ++++ doc/source/models/builtin/rerank/index.rst | 6 ++ .../model/llm/llm_family_modelscope.json | 89 +++++++++++++++++++ xinference/model/llm/vllm/core.py | 2 + 12 files changed, 395 insertions(+), 6 deletions(-) create mode 100644 doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst create mode 100644 doc/source/models/builtin/llm/c4ai-command-r-v01.rst create mode 100644 doc/source/models/builtin/llm/seallm_v2.5.rst create mode 100644 doc/source/models/builtin/llm/seallm_v2.rst create mode 100644 doc/source/models/builtin/rerank/bge-reranker-v2-gemma.rst create mode 100644 doc/source/models/builtin/rerank/bge-reranker-v2-m3.rst create mode 100644 doc/source/models/builtin/rerank/bge-reranker-v2-minicpm-layerwise.rst diff --git a/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst b/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst new file mode 100644 index 0000000000..94f103e024 --- /dev/null +++ b/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst @@ -0,0 +1,45 @@ +.. _models_llm_c4ai-command-r-v01-4bit: + +======================================== +c4ai-command-r-v01-4bit +======================================== + +- **Context Length:** 131072 +- **Model Name:** c4ai-command-r-v01-4bit +- **Languages:** en, fr, de, es, it, pt, ja, ko, zh, ar +- **Abilities:** generate +- **Description:** This model is 4bit quantized version of C4AI Command-R using bitsandbytes. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 35 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 35 +- **Quantizations:** none +- **Model ID:** CohereForAI/c4ai-command-r-v01-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-v01-4bit>`__, `ModelScope <https://modelscope.cn/models/mirror013/c4ai-command-r-v01-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name c4ai-command-r-v01-4bit --size-in-billions 35 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 104 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 104 +- **Quantizations:** none +- **Model ID:** CohereForAI/c4ai-command-r-plus-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-plus-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name c4ai-command-r-v01-4bit --size-in-billions 104 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/c4ai-command-r-v01.rst b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst new file mode 100644 index 0000000000..6855cce193 --- /dev/null +++ b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst @@ -0,0 +1,75 @@ +.. _models_llm_c4ai-command-r-v01: + +======================================== +c4ai-command-r-v01 +======================================== + +- **Context Length:** 131072 +- **Model Name:** c4ai-command-r-v01 +- **Languages:** en, fr, de, es, it, pt, ja, ko, zh, ar +- **Abilities:** generate +- **Description:** C4AI Command-R is a research release of a 35 billion parameter highly performant generative model. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 35 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 35 +- **Quantizations:** none +- **Model ID:** CohereForAI/c4ai-command-r-v01 +- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-v01>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-v01>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name c4ai-command-r-v01 --size-in-billions 35 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (ggufv2, 35 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 35 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Model ID:** andrewcanis/c4ai-command-r-v01-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/andrewcanis/c4ai-command-r-v01-GGUF>`__, `ModelScope <https://modelscope.cn/models/mirror013/C4AI-Command-R-v01-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name c4ai-command-r-v01 --size-in-billions 35 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 3 (pytorch, 104 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 104 +- **Quantizations:** none +- **Model ID:** CohereForAI/c4ai-command-r-plus +- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-plus>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-plus>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name c4ai-command-r-v01 --size-in-billions 104 --model-format pytorch --quantization ${quantization} + + +Model Spec 4 (gptq, 104 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 104 +- **Quantizations:** Int4 +- **Model ID:** alpindale/c4ai-command-r-plus-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/alpindale/c4ai-command-r-plus-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name c4ai-command-r-v01 --size-in-billions 104 --model-format gptq --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/gpt-2.rst b/doc/source/models/builtin/llm/gpt-2.rst index bfc94146ea..56c4663178 100644 --- a/doc/source/models/builtin/llm/gpt-2.rst +++ b/doc/source/models/builtin/llm/gpt-2.rst @@ -14,17 +14,17 @@ Specifications ^^^^^^^^^^^^^^ -Model Spec 1 (ggmlv3, 1 Billion) +Model Spec 1 (pytorch, 1_5 Billion) ++++++++++++++++++++++++++++++++++++++++ -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 1 +- **Model Format:** pytorch +- **Model Size (in billions):** 1_5 - **Quantizations:** none -- **Model ID:** marella/gpt-2-ggml -- **Model Hubs**: `Hugging Face <https://huggingface.co/marella/gpt-2-ggml>`__ +- **Model ID:** openai-community/gpt2 +- **Model Hubs**: `Hugging Face <https://huggingface.co/openai-community/gpt2>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name gpt-2 --size-in-billions 1 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-name gpt-2 --size-in-billions 1_5 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 8d3835a6bb..a9d9ec031c 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -51,6 +51,16 @@ The following is a list of built-in LLM in Xinference: - 4096 - Baichuan-chat is a fine-tuned version of the Baichuan LLM, specializing in chatting. + * - :ref:`c4ai-command-r-v01 <models_llm_c4ai-command-r-v01>` + - generate + - 131072 + - C4AI Command-R is a research release of a 35 billion parameter highly performant generative model. + + * - :ref:`c4ai-command-r-v01-4bit <models_llm_c4ai-command-r-v01-4bit>` + - generate + - 131072 + - This model is 4bit quantized version of C4AI Command-R using bitsandbytes. + * - :ref:`chatglm <models_llm_chatglm>` - chat - 2048 @@ -306,6 +316,16 @@ The following is a list of built-in LLM in Xinference: - 32768 - Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data. + * - :ref:`seallm_v2 <models_llm_seallm_v2>` + - generate + - 8192 + - We introduce SeaLLM-7B-v2, the state-of-the-art multilingual LLM for Southeast Asian (SEA) languages + + * - :ref:`seallm_v2.5 <models_llm_seallm_v2.5>` + - generate + - 8192 + - We introduce SeaLLM-7B-v2.5, the state-of-the-art multilingual LLM for Southeast Asian (SEA) languages + * - :ref:`skywork <models_llm_skywork>` - generate - 4096 @@ -425,6 +445,10 @@ The following is a list of built-in LLM in Xinference: baichuan-chat + c4ai-command-r-v01 + + c4ai-command-r-v01-4bit + chatglm chatglm2 @@ -527,6 +551,10 @@ The following is a list of built-in LLM in Xinference: qwen1.5-moe-chat + seallm_v2 + + seallm_v2.5 + skywork skywork-math diff --git a/doc/source/models/builtin/llm/seallm_v2.5.rst b/doc/source/models/builtin/llm/seallm_v2.5.rst new file mode 100644 index 0000000000..50d055de45 --- /dev/null +++ b/doc/source/models/builtin/llm/seallm_v2.5.rst @@ -0,0 +1,45 @@ +.. _models_llm_seallm_v2.5: + +======================================== +seallm_v2.5 +======================================== + +- **Context Length:** 8192 +- **Model Name:** seallm_v2.5 +- **Languages:** en, zh, vi, id, th, ms, km, lo, my, tl +- **Abilities:** generate +- **Description:** We introduce SeaLLM-7B-v2.5, the state-of-the-art multilingual LLM for Southeast Asian (SEA) languages + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** none +- **Model ID:** SeaLLMs/SeaLLM-7B-v2.5 +- **Model Hubs**: `Hugging Face <https://huggingface.co/SeaLLMs/SeaLLM-7B-v2.5>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name seallm_v2.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** Q4_K_M, Q8_0 +- **Model ID:** SeaLLMs/SeaLLM-7B-v2.5-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/SeaLLMs/SeaLLM-7B-v2.5-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name seallm_v2.5 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/seallm_v2.rst b/doc/source/models/builtin/llm/seallm_v2.rst new file mode 100644 index 0000000000..5de2a0990c --- /dev/null +++ b/doc/source/models/builtin/llm/seallm_v2.rst @@ -0,0 +1,45 @@ +.. _models_llm_seallm_v2: + +======================================== +seallm_v2 +======================================== + +- **Context Length:** 8192 +- **Model Name:** seallm_v2 +- **Languages:** en, zh, vi, id, th, ms, km, lo, my, tl +- **Abilities:** generate +- **Description:** We introduce SeaLLM-7B-v2, the state-of-the-art multilingual LLM for Southeast Asian (SEA) languages + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** none +- **Model ID:** SeaLLMs/SeaLLM-7B-v2 +- **Model Hubs**: `Hugging Face <https://huggingface.co/SeaLLMs/SeaLLM-7B-v2>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name seallm_v2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** Q4_0, Q8_0 +- **Model ID:** SeaLLMs/SeaLLM-7B-v2-gguf +- **Model Hubs**: `Hugging Face <https://huggingface.co/SeaLLMs/SeaLLM-7B-v2-gguf>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name seallm_v2 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/rerank/bge-reranker-v2-gemma.rst b/doc/source/models/builtin/rerank/bge-reranker-v2-gemma.rst new file mode 100644 index 0000000000..a200d1f255 --- /dev/null +++ b/doc/source/models/builtin/rerank/bge-reranker-v2-gemma.rst @@ -0,0 +1,18 @@ +.. _models_builtin_bge-reranker-v2-gemma: + +===================== +bge-reranker-v2-gemma +===================== + +- **Model Name:** bge-reranker-v2-gemma +- **Languages:** en, zh, multilingual +- **Abilities:** rerank + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** BAAI/bge-reranker-v2-gemma + +Execute the following command to launch the model:: + + xinference launch --model-name bge-reranker-v2-gemma --model-type rerank \ No newline at end of file diff --git a/doc/source/models/builtin/rerank/bge-reranker-v2-m3.rst b/doc/source/models/builtin/rerank/bge-reranker-v2-m3.rst new file mode 100644 index 0000000000..e64246b210 --- /dev/null +++ b/doc/source/models/builtin/rerank/bge-reranker-v2-m3.rst @@ -0,0 +1,18 @@ +.. _models_builtin_bge-reranker-v2-m3: + +================== +bge-reranker-v2-m3 +================== + +- **Model Name:** bge-reranker-v2-m3 +- **Languages:** en, zh, multilingual +- **Abilities:** rerank + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** BAAI/bge-reranker-v2-m3 + +Execute the following command to launch the model:: + + xinference launch --model-name bge-reranker-v2-m3 --model-type rerank \ No newline at end of file diff --git a/doc/source/models/builtin/rerank/bge-reranker-v2-minicpm-layerwise.rst b/doc/source/models/builtin/rerank/bge-reranker-v2-minicpm-layerwise.rst new file mode 100644 index 0000000000..41d8553163 --- /dev/null +++ b/doc/source/models/builtin/rerank/bge-reranker-v2-minicpm-layerwise.rst @@ -0,0 +1,18 @@ +.. _models_builtin_bge-reranker-v2-minicpm-layerwise: + +================================= +bge-reranker-v2-minicpm-layerwise +================================= + +- **Model Name:** bge-reranker-v2-minicpm-layerwise +- **Languages:** en, zh, multilingual +- **Abilities:** rerank + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** BAAI/bge-reranker-v2-minicpm-layerwise + +Execute the following command to launch the model:: + + xinference launch --model-name bge-reranker-v2-minicpm-layerwise --model-type rerank \ No newline at end of file diff --git a/doc/source/models/builtin/rerank/index.rst b/doc/source/models/builtin/rerank/index.rst index f62fb76dc4..cd1e8613e7 100644 --- a/doc/source/models/builtin/rerank/index.rst +++ b/doc/source/models/builtin/rerank/index.rst @@ -16,4 +16,10 @@ The following is a list of built-in rerank models in Xinference: bge-reranker-base bge-reranker-large + + bge-reranker-v2-gemma + + bge-reranker-v2-m3 + + bge-reranker-v2-minicpm-layerwise \ No newline at end of file diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index aa60f0ef14..4ef9dc5220 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3045,5 +3045,94 @@ "</s>" ] } + }, + { + "version": 1, + "context_length": 131072, + "model_name": "c4ai-command-r-v01", + "model_lang": [ + "en", + "fr", + "de", + "es", + "it", + "pt", + "ja", + "ko", + "zh", + "ar" + ], + "model_ability": [ + "generate" + ], + "model_description": "C4AI Command-R is a research release of a 35 billion parameter highly performant generative model.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 35, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + "model_id": "AI-ModelScope/c4ai-command-r-v01", + "model_revision": "master" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 35, + "quantizations": [ + "Q2_K", + "Q4_K_M", + "Q5_K_M" + ], + "model_id": "mirror013/C4AI-Command-R-v01-GGUF", + "model_file_name_template": "c4ai-command-r-v01.{quantization}.gguf", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 104, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + "model_id": "AI-ModelScope/c4ai-command-r-plus", + "model_revision": "master" + } + ] + }, + { + "version": 1, + "context_length": 131072, + "model_name": "c4ai-command-r-v01-4bit", + "model_lang": [ + "en", + "fr", + "de", + "es", + "it", + "pt", + "ja", + "ko", + "zh", + "ar" + ], + "model_ability": [ + "generate" + ], + "model_description": "This model is 4bit quantized version of C4AI Command-R using bitsandbytes.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 35, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + "model_id": "mirror013/c4ai-command-r-v01-4bit", + "model_revision": "master" + } + ] } ] diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 021a7c2bea..502e7f9c3f 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -126,6 +126,8 @@ class VLLMGenerateConfig(TypedDict, total=False): if VLLM_INSTALLED and vllm.__version__ >= "0.4.0": VLLM_SUPPORTED_CHAT_MODELS.append("qwen1.5-moe-chat") + VLLM_SUPPORTED_MODELS.append("c4ai-command-r-v01") + VLLM_SUPPORTED_MODELS.append("c4ai-command-r-v01-4bit") class VLLMModel(LLM): From c534028e52f714e499e035116d39638a5e8936e3 Mon Sep 17 00:00:00 2001 From: Wang Xuejin <92132848+Ago327@users.noreply.github.com> Date: Thu, 18 Apr 2024 16:23:58 +0800 Subject: [PATCH 020/298] REF: support query for engine feature (#1294) --- xinference/api/restful_api.py | 23 ++ xinference/core/supervisor.py | 18 ++ xinference/model/llm/__init__.py | 88 ++++++ xinference/model/llm/llm_family.py | 40 +++ xinference/model/llm/tests/test_llm_family.py | 258 +++++++++++++++++- 5 files changed, 426 insertions(+), 1 deletion(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index ec58594cc3..bb739c1e41 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -275,6 +275,16 @@ def serve(self, logging_conf: Optional[dict] = None): self._router.add_api_route( "/v1/cluster/auth", self.is_cluster_authenticated, methods=["GET"] ) + self._router.add_api_route( + "/v1/engines/{model_name}", + self.query_engines_by_model_name, + methods=["GET"], + dependencies=( + [Security(self._auth_service, scopes=["models:list"])] + if self.is_authenticated() + else None + ), + ) # running instances self._router.add_api_route( "/v1/models/instances", @@ -1418,6 +1428,19 @@ async def stream_results(): self.handle_request_limit_error(e) raise HTTPException(status_code=500, detail=str(e)) + async def query_engines_by_model_name(self, model_name: str) -> JSONResponse: + try: + content = await ( + await self._get_supervisor_ref() + ).query_engines_by_model_name(model_name) + return JSONResponse(content=content) + except ValueError as re: + logger.error(re, exc_info=True) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + async def register_model(self, model_type: str, request: Request) -> JSONResponse: body = RegisterModelRequest.parse_obj(await request.json()) model = body.model diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 115baf1e73..8da7d1947f 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -591,6 +591,24 @@ def get_model_registration(self, model_type: str, model_name: str) -> Any: else: raise ValueError(f"Unsupported model type: {model_type}") + @log_async(logger=logger) + async def query_engines_by_model_name(self, model_name: str): + from copy import deepcopy + + from ..model.llm.llm_family import LLM_ENGINES + + if model_name not in LLM_ENGINES: + raise ValueError(f"Model {model_name} not found") + + # filter llm_class + engine_params = deepcopy(LLM_ENGINES[model_name]) + for engine in engine_params: + params = engine_params[engine] + for param in params: + del param["llm_class"] + + return engine_params + @log_async(logger=logger) async def register_model(self, model_type: str, model: str, persist: bool): if model_type in self._custom_register_type_to_cls: diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index ec25095c3d..c6af541362 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -30,8 +30,14 @@ BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES, BUILTIN_LLM_PROMPT_STYLE, BUILTIN_MODELSCOPE_LLM_FAMILIES, + LLAMA_CLASSES, LLM_CLASSES, + LLM_ENGINES, PEFT_SUPPORTED_CLASSES, + PYTORCH_CLASSES, + SGLANG_CLASSES, + SUPPORTED_ENGINES, + VLLM_CLASSES, CustomLLMFamilyV1, GgmlLLMSpecV1, LLMFamilyV1, @@ -47,6 +53,50 @@ ) +def generate_engine_config_by_model_family(model_family): + model_name = model_family.model_name + specs = model_family.model_specs + engines = {} # structure for engine query + for spec in specs: + model_format = spec.model_format + model_size_in_billions = spec.model_size_in_billions + quantizations = spec.quantizations + for quantization in quantizations: + # traverse all supported engines to match the name, format, size in billions and quatization of model + for engine in SUPPORTED_ENGINES: + CLASSES = SUPPORTED_ENGINES[engine] + for cls in CLASSES: + if cls.match(model_family, spec, quantization): + engine_params = engines.get(engine, []) + already_exists = False + # if the name, format and size in billions of model already exists in the structure, add the new quantization + for param in engine_params: + if ( + model_name == param["model_name"] + and model_format == param["model_format"] + and model_size_in_billions + == param["model_size_in_billions"] + and quantization not in param["quantizations"] + ): + param["quantizations"].append(quantization) + already_exists = True + break + # successfully match the params for the first time, add to the structure + if not already_exists: + engine_params.append( + { + "model_name": model_name, + "model_format": model_format, + "model_size_in_billions": model_size_in_billions, + "quantizations": [quantization], + "llm_class": cls, + } + ) + engines[engine] = engine_params + break + LLM_ENGINES[model_name] = engines + + def _install(): from .ggml.chatglm import ChatglmCppChatModel from .ggml.llamacpp import LlamaCppChatModel, LlamaCppModel @@ -76,8 +126,17 @@ def _install(): ChatglmCppChatModel, ] ) + LLAMA_CLASSES.extend( + [ + ChatglmCppChatModel, + LlamaCppChatModel, + LlamaCppModel, + ] + ) LLM_CLASSES.extend([SGLANGModel, SGLANGChatModel]) + SGLANG_CLASSES.extend([SGLANGModel, SGLANGChatModel]) LLM_CLASSES.extend([VLLMModel, VLLMChatModel]) + VLLM_CLASSES.extend([VLLMModel, VLLMChatModel]) LLM_CLASSES.extend( [ BaichuanPytorchChatModel, @@ -96,6 +155,24 @@ def _install(): PytorchModel, ] ) + PYTORCH_CLASSES.extend( + [ + BaichuanPytorchChatModel, + VicunaPytorchChatModel, + FalconPytorchChatModel, + ChatglmPytorchChatModel, + LlamaPytorchModel, + LlamaPytorchChatModel, + PytorchChatModel, + FalconPytorchModel, + Internlm2PytorchChatModel, + QwenVLChatModel, + OmniLMMModel, + YiVLChatModel, + DeepSeekVLChatModel, + PytorchModel, + ] + ) PEFT_SUPPORTED_CLASSES.extend( [ BaichuanPytorchChatModel, @@ -113,6 +190,12 @@ def _install(): ] ) + # support 4 engines for now + SUPPORTED_ENGINES["vLLM"] = VLLM_CLASSES + SUPPORTED_ENGINES["SGLang"] = SGLANG_CLASSES + SUPPORTED_ENGINES["PyTorch"] = PYTORCH_CLASSES + SUPPORTED_ENGINES["llama-cpp-python"] = LLAMA_CLASSES + json_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "llm_family.json" ) @@ -163,6 +246,11 @@ def _install(): if llm_spec.model_name not in LLM_MODEL_DESCRIPTIONS: LLM_MODEL_DESCRIPTIONS.update(generate_llm_description(llm_spec)) + # traverse all families and add engine parameters corresponding to the model name + for families in [BUILTIN_LLM_FAMILIES, BUILTIN_MODELSCOPE_LLM_FAMILIES]: + for family in families: + generate_engine_config_by_model_family(family) + from ...constants import XINFERENCE_MODEL_DIR user_defined_llm_dir = os.path.join(XINFERENCE_MODEL_DIR, "llm") diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 6f5a01d6e7..ecf2e3071e 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -227,16 +227,25 @@ def parse_raw( CustomLLMFamilyV1.update_forward_refs() +LLAMA_CLASSES: List[Type[LLM]] = [] LLM_CLASSES: List[Type[LLM]] = [] PEFT_SUPPORTED_CLASSES: List[Type[LLM]] = [] BUILTIN_LLM_FAMILIES: List["LLMFamilyV1"] = [] BUILTIN_MODELSCOPE_LLM_FAMILIES: List["LLMFamilyV1"] = [] +SGLANG_CLASSES: List[Type[LLM]] = [] +PYTORCH_CLASSES: List[Type[LLM]] = [] + UD_LLM_FAMILIES: List["LLMFamilyV1"] = [] UD_LLM_FAMILIES_LOCK = Lock() +VLLM_CLASSES: List[Type[LLM]] = [] + +LLM_ENGINES: Dict[str, Dict[str, List[Dict[str, Any]]]] = {} +SUPPORTED_ENGINES: Dict[str, List[Type[LLM]]] = {} + LLM_LAUNCH_VERSIONS: Dict[str, List[str]] = {} @@ -904,6 +913,7 @@ def _apply_format_to_model_id(spec: LLMSpecV1, q: str) -> LLMSpecV1: def register_llm(llm_family: LLMFamilyV1, persist: bool): from ..utils import is_valid_model_name + from . import generate_engine_config_by_model_family if not is_valid_model_name(llm_family.model_name): raise ValueError(f"Invalid model name {llm_family.model_name}.") @@ -916,6 +926,7 @@ def register_llm(llm_family: LLMFamilyV1, persist: bool): ) UD_LLM_FAMILIES.append(llm_family) + generate_engine_config_by_model_family(llm_family) if persist: # We only validate model URL when persist is True. @@ -941,6 +952,7 @@ def unregister_llm(model_name: str, raise_error: bool = True): break if llm_family: UD_LLM_FAMILIES.remove(llm_family) + del LLM_ENGINES[model_name] persist_path = os.path.join( XINFERENCE_MODEL_DIR, "llm", f"{llm_family.model_name}.json" @@ -990,3 +1002,31 @@ def match_llm_cls( if cls.match(family, llm_spec, quantization): return cls return None + + +def check_engine_by_spec_parameters( + model_engine: str, + model_name: str, + model_format: str, + model_size_in_billions: Union[str, int], + quantization: str, +) -> Optional[Type[LLM]]: + if model_name not in LLM_ENGINES: + logger.debug(f"Cannot find model {model_name}.") + return None + if model_engine not in LLM_ENGINES[model_name]: + logger.debug(f"Model {model_name} cannot be run on engine {model_engine}.") + return None + match_params = LLM_ENGINES[model_name][model_engine] + for param in match_params: + if ( + model_name == param["model_name"] + and model_format == param["model_format"] + and model_size_in_billions == param["model_size_in_billions"] + and quantization in param["quantizations"] + ): + return param["llm_class"] + logger.debug( + f"Model {model_name} with format {model_format}, size {model_size_in_billions} and quantization {quantization} cannot be run on engine {model_engine}." + ) + return None diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index ec119b43ce..81dc586e38 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -14,13 +14,19 @@ import codecs import json import os +import platform import shutil import tempfile from unittest.mock import MagicMock, Mock, patch import pytest -from ....constants import XINFERENCE_ENV_MODEL_SRC +from ....constants import ( + XINFERENCE_DISABLE_VLLM, + XINFERENCE_ENABLE_SGLANG, + XINFERENCE_ENV_MODEL_SRC, +) +from ....utils import cuda_count from ...utils import is_locale_chinese_simplified, valid_model_revision from ..llm_family import ( AWSRegion, @@ -39,6 +45,8 @@ match_model_size, parse_uri, ) +from ..sglang.core import SGLANG_INSTALLED +from ..vllm.core import VLLM_INSTALLED def test_deserialize_llm_family_v1(): @@ -1064,3 +1072,251 @@ def test_match_model_size(): assert not match_model_size("1.8", 18) assert not match_model_size("1.8", 1) assert match_model_size("001", 1) + + +@pytest.mark.skipif( + XINFERENCE_DISABLE_VLLM + or platform.system() != "Linux" + or cuda_count() <= 0 + or not VLLM_INSTALLED, + reason="Current system does not support vLLM", +) +def test_quert_engine_vLLM(): + from ..llm_family import LLM_ENGINES, check_engine_by_spec_parameters + + model_name = "qwen1.5-chat" + assert model_name in LLM_ENGINES + + assert ( + "vLLM" in LLM_ENGINES[model_name] and len(LLM_ENGINES[model_name]["vLLM"]) == 21 + ) + + assert check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int4", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int8", + ) + is None + ) + assert check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="none", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="4-bit", + ) + is None + ) + assert ( + check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="ggmlv3", + model_size_in_billions="1_8", + quantization="q2_k", + ) + is None + ) + + +@pytest.mark.skipif( + not XINFERENCE_ENABLE_SGLANG + or platform.system() != "Linux" + or cuda_count() <= 0 + or not SGLANG_INSTALLED, + reason="Current system does not support SGLang", +) +def test_quert_engine_SGLang(): + from ..llm_family import LLM_ENGINES, check_engine_by_spec_parameters + + model_name = "qwen1.5-chat" + assert model_name in LLM_ENGINES + + assert ( + "SGLang" in LLM_ENGINES[model_name] + and len(LLM_ENGINES[model_name]["SGLang"]) == 21 + ) + + assert check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int4", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int8", + ) + is None + ) + assert check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="none", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="4-bit", + ) + is None + ) + assert ( + check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="ggmlv3", + model_size_in_billions="1_8", + quantization="q2_k", + ) + is None + ) + + +def test_query_engine_general(): + from ..ggml.chatglm import ChatglmCppChatModel + from ..ggml.llamacpp import LlamaCppChatModel + from ..llm_family import ( + LLM_ENGINES, + check_engine_by_spec_parameters, + get_user_defined_llm_families, + register_llm, + unregister_llm, + ) + + model_name = "qwen1.5-chat" + assert model_name in LLM_ENGINES + + assert ( + "PyTorch" in LLM_ENGINES[model_name] + and len(LLM_ENGINES[model_name]["PyTorch"]) == 28 + ) + assert ( + "llama-cpp-python" in LLM_ENGINES[model_name] + and len(LLM_ENGINES[model_name]["llama-cpp-python"]) == 7 + ) + + assert check_engine_by_spec_parameters( + model_engine="PyTorch", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int4", + ) + assert check_engine_by_spec_parameters( + model_engine="PyTorch", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int8", + ) + assert check_engine_by_spec_parameters( + model_engine="PyTorch", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="none", + ) + assert check_engine_by_spec_parameters( + model_engine="PyTorch", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="4-bit", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="llama-cpp-python", + model_name=model_name, + model_format="ggufv2", + model_size_in_billions="1_8", + quantization="q2_k", + ) + is LlamaCppChatModel + ) + assert ( + check_engine_by_spec_parameters( + model_engine="llama-cpp-python", + model_name=model_name, + model_format="ggmlv3", + model_size_in_billions="1_8", + quantization="q2_k", + ) + is None + ) + + assert ( + check_engine_by_spec_parameters( + model_engine="llama-cpp-python", + model_name="chatglm", + model_format="ggmlv3", + model_size_in_billions=6, + quantization="q4_0", + ) + is ChatglmCppChatModel + ) + + spec = GgmlLLMSpecV1( + model_format="ggmlv3", + model_size_in_billions=3, + model_id="TheBloke/orca_mini_3B-GGML", + quantizations=[""], + model_file_name_template="README.md", + ) + family = LLMFamilyV1( + version=1, + context_length=2048, + model_type="LLM", + model_name="custom_model", + model_lang=["en"], + model_ability=["embed", "chat"], + model_specs=[spec], + prompt_style=None, + ) + + register_llm(family, False) + + assert family in get_user_defined_llm_families() + assert ( + "custom_model" in LLM_ENGINES + and "llama-cpp-python" in LLM_ENGINES["custom_model"] + ) + assert check_engine_by_spec_parameters( + model_engine="llama-cpp-python", + model_name="custom_model", + model_format="ggmlv3", + model_size_in_billions=3, + quantization="", + ) + + unregister_llm(family.model_name) + assert family not in get_user_defined_llm_families() + assert "custom_model" not in LLM_ENGINES From b8a12f8b4e15b492a9dec87117ee376325843e37 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 18 Apr 2024 18:13:37 +0800 Subject: [PATCH 021/298] FEAT: support m3e embedding models (#1298) --- xinference/model/embedding/model_spec.json | 24 +++++++++++++++++++ .../embedding/model_spec_modelscope.json | 24 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/xinference/model/embedding/model_spec.json b/xinference/model/embedding/model_spec.json index 12bd44c983..42d89929dc 100644 --- a/xinference/model/embedding/model_spec.json +++ b/xinference/model/embedding/model_spec.json @@ -206,5 +206,29 @@ "language": ["zh", "en"], "model_id": "maidalun1020/bce-embedding-base_v1", "model_revision": "236d9024fc1b4046f03848723f934521a66a9323" + }, + { + "model_name": "m3e-small", + "dimensions": 512, + "max_tokens": 512, + "language": ["zh", "en"], + "model_id": "moka-ai/m3e-small", + "model_revision": "44c696631b2a8c200220aaaad5f987f096e986df" + }, + { + "model_name": "m3e-base", + "dimensions": 768, + "max_tokens": 512, + "language": ["zh", "en"], + "model_id": "moka-ai/m3e-base", + "model_revision": "764b537a0e50e5c7d64db883f2d2e051cbe3c64c" + }, + { + "model_name": "m3e-large", + "dimensions": 1024, + "max_tokens": 512, + "language": ["zh", "en"], + "model_id": "moka-ai/m3e-large", + "model_revision": "12900375086c37ba5d83d1e417b21dc7d1d1f388" } ] diff --git a/xinference/model/embedding/model_spec_modelscope.json b/xinference/model/embedding/model_spec_modelscope.json index 901bdb3c98..dfd16f19cd 100644 --- a/xinference/model/embedding/model_spec_modelscope.json +++ b/xinference/model/embedding/model_spec_modelscope.json @@ -208,5 +208,29 @@ "language": ["zh", "en"], "model_id": "maidalun/bce-embedding-base_v1", "model_hub": "modelscope" + }, + { + "model_name": "m3e-small", + "dimensions": 512, + "max_tokens": 512, + "language": ["zh", "en"], + "model_id": "AI-ModelScope/m3e-small", + "model_hub": "modelscope" + }, + { + "model_name": "m3e-base", + "dimensions": 768, + "max_tokens": 512, + "language": ["zh", "en"], + "model_id": "AI-ModelScope/m3e-base", + "model_hub": "modelscope" + }, + { + "model_name": "m3e-large", + "dimensions": 1024, + "max_tokens": 512, + "language": ["zh", "en"], + "model_id": "AI-ModelScope/m3e-large", + "model_hub": "modelscope" } ] From b0b828db8b7ad6ed6643977f54021d400b1e4110 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Fri, 19 Apr 2024 11:07:02 +0800 Subject: [PATCH 022/298] FEAT: hotkey to active search (#1287) --- .../ui/src/components/hotkeyFocusTextField.js | 58 +++++++++++++++++++ .../launch_model/LaunchModelComponent.js | 6 +- .../src/scenes/launch_model/launchCustom.js | 12 ++-- .../ui/src/scenes/launch_model/launchLLM.js | 13 ++--- 4 files changed, 74 insertions(+), 15 deletions(-) create mode 100644 xinference/web/ui/src/components/hotkeyFocusTextField.js diff --git a/xinference/web/ui/src/components/hotkeyFocusTextField.js b/xinference/web/ui/src/components/hotkeyFocusTextField.js new file mode 100644 index 0000000000..4a9c00bfe6 --- /dev/null +++ b/xinference/web/ui/src/components/hotkeyFocusTextField.js @@ -0,0 +1,58 @@ +import { TextField } from '@mui/material' +import InputAdornment from '@mui/material/InputAdornment' +import Typography from '@mui/material/Typography' +import React, { useEffect, useRef, useState } from 'react' + +const HotkeyFocusTextField = ({ + label, + value, + onChange, + hotkey = '/', + ...props +}) => { + const [isFocused, setIsFocused] = useState(false) + const textFieldRef = useRef(null) + const handleKeyDown = (event) => { + if ( + event.key === hotkey && + document.activeElement !== textFieldRef.current + ) { + event.preventDefault() + setIsFocused(true) + textFieldRef.current?.focus() + } + } + + useEffect(() => { + document.addEventListener('keydown', handleKeyDown) + + return () => { + document.removeEventListener('keydown', handleKeyDown) + } + }, [hotkey]) + + return ( + <TextField + {...props} + label={label} + value={value} + onChange={onChange} + inputRef={textFieldRef} + autoFocus={isFocused} + onBlur={() => setIsFocused(false)} + onFocus={() => setIsFocused(true)} + InputProps={{ + endAdornment: + !isFocused && !value ? ( + <InputAdornment position="end"> + <Typography color="textSecondary" style={{ fontSize: 'inherit' }}> + Type {hotkey} to search + </Typography> + </InputAdornment> + ) : null, + }} + /> + ) +} + +export default HotkeyFocusTextField diff --git a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js index 7603a394d8..082b9f3067 100644 --- a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js +++ b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js @@ -1,8 +1,9 @@ -import { Box, FormControl, TextField } from '@mui/material' +import { Box, FormControl } from '@mui/material' import React, { useContext, useEffect, useState } from 'react' import { ApiContext } from '../../components/apiContext' import fetcher from '../../components/fetcher' +import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' import style from './styles/launchModelStyle' @@ -66,13 +67,14 @@ const LaunchModelComponent = ({ modelType }) => { }} > <FormControl variant="outlined" margin="normal"> - <TextField + <HotkeyFocusTextField id="search" type="search" label={`Search for ${modelType} model name`} value={searchTerm} onChange={handleChange} size="small" + hotkey="/" /> </FormControl> </div> diff --git a/xinference/web/ui/src/scenes/launch_model/launchCustom.js b/xinference/web/ui/src/scenes/launch_model/launchCustom.js index 7ae13ce943..d591c77aa4 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchCustom.js +++ b/xinference/web/ui/src/scenes/launch_model/launchCustom.js @@ -1,10 +1,11 @@ import { TabContext, TabList, TabPanel } from '@mui/lab' -import { Box, FormControl, Tab, TextField } from '@mui/material' +import { Box, FormControl, Tab } from '@mui/material' import React, { useContext, useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import fetcher from '../../components/fetcher' +import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' const LaunchCustom = ({ gpuAvailable }) => { @@ -169,13 +170,14 @@ const LaunchCustom = ({ gpuAvailable }) => { }} > <FormControl variant="outlined" margin="normal"> - <TextField + <HotkeyFocusTextField id="search" type="search" label="Search for custom model name" value={searchTerm} onChange={handleChange} size="small" + hotkey="/" /> </FormControl> </div> @@ -216,13 +218,14 @@ const LaunchCustom = ({ gpuAvailable }) => { }} > <FormControl variant="outlined" margin="normal"> - <TextField + <HotkeyFocusTextField id="search" type="search" label="Search for custom model name" value={searchTerm} onChange={handleChange} size="small" + hotkey="/" /> </FormControl> </div> @@ -256,13 +259,14 @@ const LaunchCustom = ({ gpuAvailable }) => { }} > <FormControl variant="outlined" margin="normal"> - <TextField + <HotkeyFocusTextField id="search" type="search" label="Search for custom model name" value={searchTerm} onChange={handleChange} size="small" + hotkey="/" /> </FormControl> </div> diff --git a/xinference/web/ui/src/scenes/launch_model/launchLLM.js b/xinference/web/ui/src/scenes/launch_model/launchLLM.js index 381f97abaf..3971b7071a 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchLLM.js +++ b/xinference/web/ui/src/scenes/launch_model/launchLLM.js @@ -1,16 +1,10 @@ -import { - Box, - FormControl, - InputLabel, - MenuItem, - Select, - TextField, -} from '@mui/material' +import { Box, FormControl, InputLabel, MenuItem, Select } from '@mui/material' import React, { useContext, useEffect, useState } from 'react' import { useCookies } from 'react-cookie' import { ApiContext } from '../../components/apiContext' import fetcher from '../../components/fetcher' +import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' const LaunchLLM = ({ gpuAvailable }) => { @@ -133,13 +127,14 @@ const LaunchLLM = ({ gpuAvailable }) => { </Select> </FormControl> <FormControl variant="outlined" margin="normal"> - <TextField + <HotkeyFocusTextField id="search" type="search" label="Search for model name and description" value={searchTerm} onChange={handleChange} size="small" + hotkey="/" /> </FormControl> </div> From 3ce85ae35a34906c4b7b706513dfe5bd0ed1d36a Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 19 Apr 2024 11:36:01 +0800 Subject: [PATCH 023/298] Revert "REF: support query for engine feature" (#1329) --- xinference/api/restful_api.py | 23 -- xinference/core/supervisor.py | 18 -- xinference/model/llm/__init__.py | 88 ------ xinference/model/llm/llm_family.py | 40 --- xinference/model/llm/tests/test_llm_family.py | 258 +----------------- 5 files changed, 1 insertion(+), 426 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index bb739c1e41..ec58594cc3 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -275,16 +275,6 @@ def serve(self, logging_conf: Optional[dict] = None): self._router.add_api_route( "/v1/cluster/auth", self.is_cluster_authenticated, methods=["GET"] ) - self._router.add_api_route( - "/v1/engines/{model_name}", - self.query_engines_by_model_name, - methods=["GET"], - dependencies=( - [Security(self._auth_service, scopes=["models:list"])] - if self.is_authenticated() - else None - ), - ) # running instances self._router.add_api_route( "/v1/models/instances", @@ -1428,19 +1418,6 @@ async def stream_results(): self.handle_request_limit_error(e) raise HTTPException(status_code=500, detail=str(e)) - async def query_engines_by_model_name(self, model_name: str) -> JSONResponse: - try: - content = await ( - await self._get_supervisor_ref() - ).query_engines_by_model_name(model_name) - return JSONResponse(content=content) - except ValueError as re: - logger.error(re, exc_info=True) - raise HTTPException(status_code=400, detail=str(re)) - except Exception as e: - logger.error(e, exc_info=True) - raise HTTPException(status_code=500, detail=str(e)) - async def register_model(self, model_type: str, request: Request) -> JSONResponse: body = RegisterModelRequest.parse_obj(await request.json()) model = body.model diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 8da7d1947f..115baf1e73 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -591,24 +591,6 @@ def get_model_registration(self, model_type: str, model_name: str) -> Any: else: raise ValueError(f"Unsupported model type: {model_type}") - @log_async(logger=logger) - async def query_engines_by_model_name(self, model_name: str): - from copy import deepcopy - - from ..model.llm.llm_family import LLM_ENGINES - - if model_name not in LLM_ENGINES: - raise ValueError(f"Model {model_name} not found") - - # filter llm_class - engine_params = deepcopy(LLM_ENGINES[model_name]) - for engine in engine_params: - params = engine_params[engine] - for param in params: - del param["llm_class"] - - return engine_params - @log_async(logger=logger) async def register_model(self, model_type: str, model: str, persist: bool): if model_type in self._custom_register_type_to_cls: diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index c6af541362..ec25095c3d 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -30,14 +30,8 @@ BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES, BUILTIN_LLM_PROMPT_STYLE, BUILTIN_MODELSCOPE_LLM_FAMILIES, - LLAMA_CLASSES, LLM_CLASSES, - LLM_ENGINES, PEFT_SUPPORTED_CLASSES, - PYTORCH_CLASSES, - SGLANG_CLASSES, - SUPPORTED_ENGINES, - VLLM_CLASSES, CustomLLMFamilyV1, GgmlLLMSpecV1, LLMFamilyV1, @@ -53,50 +47,6 @@ ) -def generate_engine_config_by_model_family(model_family): - model_name = model_family.model_name - specs = model_family.model_specs - engines = {} # structure for engine query - for spec in specs: - model_format = spec.model_format - model_size_in_billions = spec.model_size_in_billions - quantizations = spec.quantizations - for quantization in quantizations: - # traverse all supported engines to match the name, format, size in billions and quatization of model - for engine in SUPPORTED_ENGINES: - CLASSES = SUPPORTED_ENGINES[engine] - for cls in CLASSES: - if cls.match(model_family, spec, quantization): - engine_params = engines.get(engine, []) - already_exists = False - # if the name, format and size in billions of model already exists in the structure, add the new quantization - for param in engine_params: - if ( - model_name == param["model_name"] - and model_format == param["model_format"] - and model_size_in_billions - == param["model_size_in_billions"] - and quantization not in param["quantizations"] - ): - param["quantizations"].append(quantization) - already_exists = True - break - # successfully match the params for the first time, add to the structure - if not already_exists: - engine_params.append( - { - "model_name": model_name, - "model_format": model_format, - "model_size_in_billions": model_size_in_billions, - "quantizations": [quantization], - "llm_class": cls, - } - ) - engines[engine] = engine_params - break - LLM_ENGINES[model_name] = engines - - def _install(): from .ggml.chatglm import ChatglmCppChatModel from .ggml.llamacpp import LlamaCppChatModel, LlamaCppModel @@ -126,17 +76,8 @@ def _install(): ChatglmCppChatModel, ] ) - LLAMA_CLASSES.extend( - [ - ChatglmCppChatModel, - LlamaCppChatModel, - LlamaCppModel, - ] - ) LLM_CLASSES.extend([SGLANGModel, SGLANGChatModel]) - SGLANG_CLASSES.extend([SGLANGModel, SGLANGChatModel]) LLM_CLASSES.extend([VLLMModel, VLLMChatModel]) - VLLM_CLASSES.extend([VLLMModel, VLLMChatModel]) LLM_CLASSES.extend( [ BaichuanPytorchChatModel, @@ -155,24 +96,6 @@ def _install(): PytorchModel, ] ) - PYTORCH_CLASSES.extend( - [ - BaichuanPytorchChatModel, - VicunaPytorchChatModel, - FalconPytorchChatModel, - ChatglmPytorchChatModel, - LlamaPytorchModel, - LlamaPytorchChatModel, - PytorchChatModel, - FalconPytorchModel, - Internlm2PytorchChatModel, - QwenVLChatModel, - OmniLMMModel, - YiVLChatModel, - DeepSeekVLChatModel, - PytorchModel, - ] - ) PEFT_SUPPORTED_CLASSES.extend( [ BaichuanPytorchChatModel, @@ -190,12 +113,6 @@ def _install(): ] ) - # support 4 engines for now - SUPPORTED_ENGINES["vLLM"] = VLLM_CLASSES - SUPPORTED_ENGINES["SGLang"] = SGLANG_CLASSES - SUPPORTED_ENGINES["PyTorch"] = PYTORCH_CLASSES - SUPPORTED_ENGINES["llama-cpp-python"] = LLAMA_CLASSES - json_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "llm_family.json" ) @@ -246,11 +163,6 @@ def _install(): if llm_spec.model_name not in LLM_MODEL_DESCRIPTIONS: LLM_MODEL_DESCRIPTIONS.update(generate_llm_description(llm_spec)) - # traverse all families and add engine parameters corresponding to the model name - for families in [BUILTIN_LLM_FAMILIES, BUILTIN_MODELSCOPE_LLM_FAMILIES]: - for family in families: - generate_engine_config_by_model_family(family) - from ...constants import XINFERENCE_MODEL_DIR user_defined_llm_dir = os.path.join(XINFERENCE_MODEL_DIR, "llm") diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index ecf2e3071e..6f5a01d6e7 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -227,25 +227,16 @@ def parse_raw( CustomLLMFamilyV1.update_forward_refs() -LLAMA_CLASSES: List[Type[LLM]] = [] LLM_CLASSES: List[Type[LLM]] = [] PEFT_SUPPORTED_CLASSES: List[Type[LLM]] = [] BUILTIN_LLM_FAMILIES: List["LLMFamilyV1"] = [] BUILTIN_MODELSCOPE_LLM_FAMILIES: List["LLMFamilyV1"] = [] -SGLANG_CLASSES: List[Type[LLM]] = [] -PYTORCH_CLASSES: List[Type[LLM]] = [] - UD_LLM_FAMILIES: List["LLMFamilyV1"] = [] UD_LLM_FAMILIES_LOCK = Lock() -VLLM_CLASSES: List[Type[LLM]] = [] - -LLM_ENGINES: Dict[str, Dict[str, List[Dict[str, Any]]]] = {} -SUPPORTED_ENGINES: Dict[str, List[Type[LLM]]] = {} - LLM_LAUNCH_VERSIONS: Dict[str, List[str]] = {} @@ -913,7 +904,6 @@ def _apply_format_to_model_id(spec: LLMSpecV1, q: str) -> LLMSpecV1: def register_llm(llm_family: LLMFamilyV1, persist: bool): from ..utils import is_valid_model_name - from . import generate_engine_config_by_model_family if not is_valid_model_name(llm_family.model_name): raise ValueError(f"Invalid model name {llm_family.model_name}.") @@ -926,7 +916,6 @@ def register_llm(llm_family: LLMFamilyV1, persist: bool): ) UD_LLM_FAMILIES.append(llm_family) - generate_engine_config_by_model_family(llm_family) if persist: # We only validate model URL when persist is True. @@ -952,7 +941,6 @@ def unregister_llm(model_name: str, raise_error: bool = True): break if llm_family: UD_LLM_FAMILIES.remove(llm_family) - del LLM_ENGINES[model_name] persist_path = os.path.join( XINFERENCE_MODEL_DIR, "llm", f"{llm_family.model_name}.json" @@ -1002,31 +990,3 @@ def match_llm_cls( if cls.match(family, llm_spec, quantization): return cls return None - - -def check_engine_by_spec_parameters( - model_engine: str, - model_name: str, - model_format: str, - model_size_in_billions: Union[str, int], - quantization: str, -) -> Optional[Type[LLM]]: - if model_name not in LLM_ENGINES: - logger.debug(f"Cannot find model {model_name}.") - return None - if model_engine not in LLM_ENGINES[model_name]: - logger.debug(f"Model {model_name} cannot be run on engine {model_engine}.") - return None - match_params = LLM_ENGINES[model_name][model_engine] - for param in match_params: - if ( - model_name == param["model_name"] - and model_format == param["model_format"] - and model_size_in_billions == param["model_size_in_billions"] - and quantization in param["quantizations"] - ): - return param["llm_class"] - logger.debug( - f"Model {model_name} with format {model_format}, size {model_size_in_billions} and quantization {quantization} cannot be run on engine {model_engine}." - ) - return None diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index 81dc586e38..ec119b43ce 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -14,19 +14,13 @@ import codecs import json import os -import platform import shutil import tempfile from unittest.mock import MagicMock, Mock, patch import pytest -from ....constants import ( - XINFERENCE_DISABLE_VLLM, - XINFERENCE_ENABLE_SGLANG, - XINFERENCE_ENV_MODEL_SRC, -) -from ....utils import cuda_count +from ....constants import XINFERENCE_ENV_MODEL_SRC from ...utils import is_locale_chinese_simplified, valid_model_revision from ..llm_family import ( AWSRegion, @@ -45,8 +39,6 @@ match_model_size, parse_uri, ) -from ..sglang.core import SGLANG_INSTALLED -from ..vllm.core import VLLM_INSTALLED def test_deserialize_llm_family_v1(): @@ -1072,251 +1064,3 @@ def test_match_model_size(): assert not match_model_size("1.8", 18) assert not match_model_size("1.8", 1) assert match_model_size("001", 1) - - -@pytest.mark.skipif( - XINFERENCE_DISABLE_VLLM - or platform.system() != "Linux" - or cuda_count() <= 0 - or not VLLM_INSTALLED, - reason="Current system does not support vLLM", -) -def test_quert_engine_vLLM(): - from ..llm_family import LLM_ENGINES, check_engine_by_spec_parameters - - model_name = "qwen1.5-chat" - assert model_name in LLM_ENGINES - - assert ( - "vLLM" in LLM_ENGINES[model_name] and len(LLM_ENGINES[model_name]["vLLM"]) == 21 - ) - - assert check_engine_by_spec_parameters( - model_engine="vLLM", - model_name=model_name, - model_format="gptq", - model_size_in_billions="1_8", - quantization="Int4", - ) - assert ( - check_engine_by_spec_parameters( - model_engine="vLLM", - model_name=model_name, - model_format="gptq", - model_size_in_billions="1_8", - quantization="Int8", - ) - is None - ) - assert check_engine_by_spec_parameters( - model_engine="vLLM", - model_name=model_name, - model_format="pytorch", - model_size_in_billions="1_8", - quantization="none", - ) - assert ( - check_engine_by_spec_parameters( - model_engine="vLLM", - model_name=model_name, - model_format="pytorch", - model_size_in_billions="1_8", - quantization="4-bit", - ) - is None - ) - assert ( - check_engine_by_spec_parameters( - model_engine="vLLM", - model_name=model_name, - model_format="ggmlv3", - model_size_in_billions="1_8", - quantization="q2_k", - ) - is None - ) - - -@pytest.mark.skipif( - not XINFERENCE_ENABLE_SGLANG - or platform.system() != "Linux" - or cuda_count() <= 0 - or not SGLANG_INSTALLED, - reason="Current system does not support SGLang", -) -def test_quert_engine_SGLang(): - from ..llm_family import LLM_ENGINES, check_engine_by_spec_parameters - - model_name = "qwen1.5-chat" - assert model_name in LLM_ENGINES - - assert ( - "SGLang" in LLM_ENGINES[model_name] - and len(LLM_ENGINES[model_name]["SGLang"]) == 21 - ) - - assert check_engine_by_spec_parameters( - model_engine="SGLang", - model_name=model_name, - model_format="gptq", - model_size_in_billions="1_8", - quantization="Int4", - ) - assert ( - check_engine_by_spec_parameters( - model_engine="SGLang", - model_name=model_name, - model_format="gptq", - model_size_in_billions="1_8", - quantization="Int8", - ) - is None - ) - assert check_engine_by_spec_parameters( - model_engine="SGLang", - model_name=model_name, - model_format="pytorch", - model_size_in_billions="1_8", - quantization="none", - ) - assert ( - check_engine_by_spec_parameters( - model_engine="SGLang", - model_name=model_name, - model_format="pytorch", - model_size_in_billions="1_8", - quantization="4-bit", - ) - is None - ) - assert ( - check_engine_by_spec_parameters( - model_engine="SGLang", - model_name=model_name, - model_format="ggmlv3", - model_size_in_billions="1_8", - quantization="q2_k", - ) - is None - ) - - -def test_query_engine_general(): - from ..ggml.chatglm import ChatglmCppChatModel - from ..ggml.llamacpp import LlamaCppChatModel - from ..llm_family import ( - LLM_ENGINES, - check_engine_by_spec_parameters, - get_user_defined_llm_families, - register_llm, - unregister_llm, - ) - - model_name = "qwen1.5-chat" - assert model_name in LLM_ENGINES - - assert ( - "PyTorch" in LLM_ENGINES[model_name] - and len(LLM_ENGINES[model_name]["PyTorch"]) == 28 - ) - assert ( - "llama-cpp-python" in LLM_ENGINES[model_name] - and len(LLM_ENGINES[model_name]["llama-cpp-python"]) == 7 - ) - - assert check_engine_by_spec_parameters( - model_engine="PyTorch", - model_name=model_name, - model_format="gptq", - model_size_in_billions="1_8", - quantization="Int4", - ) - assert check_engine_by_spec_parameters( - model_engine="PyTorch", - model_name=model_name, - model_format="gptq", - model_size_in_billions="1_8", - quantization="Int8", - ) - assert check_engine_by_spec_parameters( - model_engine="PyTorch", - model_name=model_name, - model_format="pytorch", - model_size_in_billions="1_8", - quantization="none", - ) - assert check_engine_by_spec_parameters( - model_engine="PyTorch", - model_name=model_name, - model_format="pytorch", - model_size_in_billions="1_8", - quantization="4-bit", - ) - assert ( - check_engine_by_spec_parameters( - model_engine="llama-cpp-python", - model_name=model_name, - model_format="ggufv2", - model_size_in_billions="1_8", - quantization="q2_k", - ) - is LlamaCppChatModel - ) - assert ( - check_engine_by_spec_parameters( - model_engine="llama-cpp-python", - model_name=model_name, - model_format="ggmlv3", - model_size_in_billions="1_8", - quantization="q2_k", - ) - is None - ) - - assert ( - check_engine_by_spec_parameters( - model_engine="llama-cpp-python", - model_name="chatglm", - model_format="ggmlv3", - model_size_in_billions=6, - quantization="q4_0", - ) - is ChatglmCppChatModel - ) - - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TheBloke/orca_mini_3B-GGML", - quantizations=[""], - model_file_name_template="README.md", - ) - family = LLMFamilyV1( - version=1, - context_length=2048, - model_type="LLM", - model_name="custom_model", - model_lang=["en"], - model_ability=["embed", "chat"], - model_specs=[spec], - prompt_style=None, - ) - - register_llm(family, False) - - assert family in get_user_defined_llm_families() - assert ( - "custom_model" in LLM_ENGINES - and "llama-cpp-python" in LLM_ENGINES["custom_model"] - ) - assert check_engine_by_spec_parameters( - model_engine="llama-cpp-python", - model_name="custom_model", - model_format="ggmlv3", - model_size_in_billions=3, - quantization="", - ) - - unregister_llm(family.model_name) - assert family not in get_user_defined_llm_families() - assert "custom_model" not in LLM_ENGINES From f19e85be09bce966e0c0b3e01bc5690eb6016398 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 19 Apr 2024 11:39:12 +0800 Subject: [PATCH 024/298] FEAT: support codeqwen1.5-chat (#1322) --- doc/source/getting_started/installation.rst | 2 + doc/source/models/builtin/embedding/index.rst | 6 ++ .../models/builtin/embedding/m3e-base.rst | 21 ++++++ .../models/builtin/embedding/m3e-large.rst | 21 ++++++ .../models/builtin/embedding/m3e-small.rst | 21 ++++++ .../models/builtin/llm/codeqwen1.5-chat.rst | 60 ++++++++++++++++ doc/source/models/builtin/llm/index.rst | 7 ++ doc/source/user_guide/backends.rst | 2 + xinference/model/llm/llm_family.json | 68 ++++++++++++++++++ .../model/llm/llm_family_modelscope.json | 71 +++++++++++++++++++ xinference/model/llm/vllm/core.py | 1 + 11 files changed, 280 insertions(+) create mode 100644 doc/source/models/builtin/embedding/m3e-base.rst create mode 100644 doc/source/models/builtin/embedding/m3e-large.rst create mode 100644 doc/source/models/builtin/embedding/m3e-small.rst create mode 100644 doc/source/models/builtin/llm/codeqwen1.5-chat.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index c42f21a829..f1f8546d1e 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -42,6 +42,7 @@ Currently, supported models include: - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` - ``Yi``, ``Yi-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` +- ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` - ``qwen-chat`` @@ -49,6 +50,7 @@ Currently, supported models include: - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``deepseek-chat``, ``deepseek-coder-instruct`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` +- ``codeqwen1.5-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` .. vllm_end diff --git a/doc/source/models/builtin/embedding/index.rst b/doc/source/models/builtin/embedding/index.rst index e816de4b46..11b16d117f 100644 --- a/doc/source/models/builtin/embedding/index.rst +++ b/doc/source/models/builtin/embedding/index.rst @@ -51,6 +51,12 @@ The following is a list of built-in embedding models in Xinference: jina-embeddings-v2-small-en + m3e-base + + m3e-large + + m3e-small + multilingual-e5-large text2vec-base-chinese diff --git a/doc/source/models/builtin/embedding/m3e-base.rst b/doc/source/models/builtin/embedding/m3e-base.rst new file mode 100644 index 0000000000..b2bc2ad342 --- /dev/null +++ b/doc/source/models/builtin/embedding/m3e-base.rst @@ -0,0 +1,21 @@ +.. _models_builtin_m3e-base: + +======== +m3e-base +======== + +- **Model Name:** m3e-base +- **Languages:** zh, en +- **Abilities:** embed + +Specifications +^^^^^^^^^^^^^^ + +- **Dimensions:** 768 +- **Max Tokens:** 512 +- **Model ID:** moka-ai/m3e-base +- **Model Hubs**: `Hugging Face <https://huggingface.co/moka-ai/m3e-base>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/m3e-base>`__ + +Execute the following command to launch the model:: + + xinference launch --model-name m3e-base --model-type embedding \ No newline at end of file diff --git a/doc/source/models/builtin/embedding/m3e-large.rst b/doc/source/models/builtin/embedding/m3e-large.rst new file mode 100644 index 0000000000..25524feaaf --- /dev/null +++ b/doc/source/models/builtin/embedding/m3e-large.rst @@ -0,0 +1,21 @@ +.. _models_builtin_m3e-large: + +========= +m3e-large +========= + +- **Model Name:** m3e-large +- **Languages:** zh, en +- **Abilities:** embed + +Specifications +^^^^^^^^^^^^^^ + +- **Dimensions:** 1024 +- **Max Tokens:** 512 +- **Model ID:** moka-ai/m3e-large +- **Model Hubs**: `Hugging Face <https://huggingface.co/moka-ai/m3e-large>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/m3e-large>`__ + +Execute the following command to launch the model:: + + xinference launch --model-name m3e-large --model-type embedding \ No newline at end of file diff --git a/doc/source/models/builtin/embedding/m3e-small.rst b/doc/source/models/builtin/embedding/m3e-small.rst new file mode 100644 index 0000000000..2e001edccf --- /dev/null +++ b/doc/source/models/builtin/embedding/m3e-small.rst @@ -0,0 +1,21 @@ +.. _models_builtin_m3e-small: + +========= +m3e-small +========= + +- **Model Name:** m3e-small +- **Languages:** zh, en +- **Abilities:** embed + +Specifications +^^^^^^^^^^^^^^ + +- **Dimensions:** 512 +- **Max Tokens:** 512 +- **Model ID:** moka-ai/m3e-small +- **Model Hubs**: `Hugging Face <https://huggingface.co/moka-ai/m3e-small>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/m3e-small>`__ + +Execute the following command to launch the model:: + + xinference launch --model-name m3e-small --model-type embedding \ No newline at end of file diff --git a/doc/source/models/builtin/llm/codeqwen1.5-chat.rst b/doc/source/models/builtin/llm/codeqwen1.5-chat.rst new file mode 100644 index 0000000000..2a5ef3cf32 --- /dev/null +++ b/doc/source/models/builtin/llm/codeqwen1.5-chat.rst @@ -0,0 +1,60 @@ +.. _models_llm_codeqwen1.5-chat: + +======================================== +codeqwen1.5-chat +======================================== + +- **Context Length:** 65536 +- **Model Name:** codeqwen1.5-chat +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0 +- **Model ID:** Qwen/CodeQwen1.5-7B-Chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name codeqwen1.5-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 2 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** Qwen/CodeQwen1.5-7B-Chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name codeqwen1.5-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (awq, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 7 +- **Quantizations:** Int4 +- **Model ID:** Qwen/CodeQwen1.5-7B-Chat-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name codeqwen1.5-chat --size-in-billions 7 --model-format awq --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index a9d9ec031c..f0393e3734 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -106,6 +106,11 @@ The following is a list of built-in LLM in Xinference: - 100000 - Code-Llama-Python is a fine-tuned version of the Code-Llama LLM, specializing in Python. + * - :ref:`codeqwen1.5-chat <models_llm_codeqwen1.5-chat>` + - chat + - 65536 + - CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes. + * - :ref:`codeshell <models_llm_codeshell>` - generate - 8194 @@ -467,6 +472,8 @@ The following is a list of built-in LLM in Xinference: code-llama-python + codeqwen1.5-chat + codeshell codeshell-chat diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index f9ba68bd98..87ca774672 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -51,6 +51,7 @@ Currently, supported model includes: - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` - ``Yi``, ``Yi-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` +- ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` - ``qwen-chat`` @@ -58,6 +59,7 @@ Currently, supported model includes: - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``deepseek-chat``, ``deepseek-coder-instruct`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` +- ``codeqwen1.5-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` .. vllm_end diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index a2a2332b6c..152ccf4d40 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1930,6 +1930,74 @@ ] } }, + { + "version": 1, + "context_length": 65536, + "model_name": "codeqwen1.5-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes.", + "model_specs": [ + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0" + ], + "model_id": "Qwen/CodeQwen1.5-7B-Chat-GGUF", + "model_file_name_template": "codeqwen-1_5-7b-chat-{quantization}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/CodeQwen1.5-7B-Chat" + }, + { + "model_format": "awq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4" + ], + "model_id": "Qwen/CodeQwen1.5-7B-Chat-AWQ" + } + ], + "prompt_style": { + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] + } + }, { "version": 1, "context_length": 8192, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 4ef9dc5220..d2ecc028cf 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2175,6 +2175,77 @@ ] } }, + { + "version": 1, + "context_length": 65536, + "model_name": "codeqwen1.5-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes.", + "model_specs": [ + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0" + ], + "model_id": "qwen/CodeQwen1.5-7B-Chat-GGUF", + "model_hub": "modelscope", + "model_file_name_template": "codeqwen-1_5-7b-chat-{quantization}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "qwen/CodeQwen1.5-7B-Chat", + "model_hub": "modelscope" + }, + { + "model_format": "awq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4" + ], + "model_id": "qwen/CodeQwen1.5-7B-Chat-AWQ", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] + } + }, { "version": 1, "context_length": 4096, diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 502e7f9c3f..6dd593c7c8 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -116,6 +116,7 @@ class VLLMGenerateConfig(TypedDict, total=False): ] if VLLM_INSTALLED and vllm.__version__ >= "0.3.0": VLLM_SUPPORTED_CHAT_MODELS.append("qwen1.5-chat") + VLLM_SUPPORTED_CHAT_MODELS.append("codeqwen1.5-chat") if VLLM_INSTALLED and vllm.__version__ >= "0.3.2": VLLM_SUPPORTED_CHAT_MODELS.append("gemma-it") From 5893d93fbe8073e542cb5cc3e3d735fc3a8ddea2 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 19 Apr 2024 14:28:51 +0800 Subject: [PATCH 025/298] BUG: Fix `xinference-client` package depends on internal code (#1330) --- xinference/client/restful/restful_client.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 48785547a3..a51dc72561 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -18,7 +18,6 @@ import requests -from ...model.utils import convert_float_to_int_or_str from ...types import LoRA, PeftModelConfig from ..common import streaming_response_iterator @@ -37,6 +36,17 @@ ) +def convert_float_to_int_or_str(model_size: float) -> Union[int, str]: + """convert float to int or string + + if float can be presented as int, convert it to int, otherwise convert it to string + """ + if int(model_size) == model_size: + return int(model_size) + else: + return str(model_size) + + def _get_error_string(response: requests.Response) -> str: try: if response.content: From 500171569de25d49f6ddb3c167d9fc0e55cd66c7 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 19 Apr 2024 14:40:59 +0800 Subject: [PATCH 026/298] BUG: Fix restful client depends on specific type (#1331) --- xinference/client/restful/restful_client.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index a51dc72561..f9a546e11c 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -18,7 +18,6 @@ import requests -from ...types import LoRA, PeftModelConfig from ..common import streaming_response_iterator if TYPE_CHECKING: @@ -866,18 +865,6 @@ def launch_model( url = f"{self.base_url}/v1/models" - if peft_model_config is not None: - lora_list = [ - LoRA.from_dict(model) for model in peft_model_config["lora_list"] - ] - peft_model = PeftModelConfig( - lora_list, - peft_model_config["image_lora_load_kwargs"], - peft_model_config["image_lora_fuse_kwargs"], - ) - else: - peft_model = None - # convert float to int or string since the RESTful API does not accept float. if isinstance(model_size_in_billions, float): model_size_in_billions = convert_float_to_int_or_str(model_size_in_billions) @@ -885,7 +872,7 @@ def launch_model( payload = { "model_uid": model_uid, "model_name": model_name, - "peft_model_config": peft_model.to_dict() if peft_model else None, + "peft_model_config": peft_model_config, "model_type": model_type, "model_size_in_billions": model_size_in_billions, "model_format": model_format, From 2dc74da45ba135b1151d1b592bdce03d2e3e9590 Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:43:30 +0800 Subject: [PATCH 027/298] BUG: Fix Launching embedding or reranking models from commandline fails due to PEFT (#1343) --- xinference/deploy/cmdline.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 89ae648f07..34ccad9566 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -736,11 +736,15 @@ def model_launch( else [] ) - peft_model_config = { - "image_lora_load_kwargs": image_lora_load_params, - "image_lora_fuse_kwargs": image_lora_fuse_params, - "lora_list": lora_list, - } + peft_model_config = ( + { + "image_lora_load_kwargs": image_lora_load_params, + "image_lora_fuse_kwargs": image_lora_fuse_params, + "lora_list": lora_list, + } + if lora_list or image_lora_load_params or image_lora_fuse_params + else None + ) _gpu_idx: Optional[List[int]] = ( None if gpu_idx is None else [int(idx) for idx in gpu_idx.split(",")] From 9602061e03249df5155f94fdfda17b0a89e538c5 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Mon, 22 Apr 2024 14:25:11 +0800 Subject: [PATCH 028/298] FEAT: support llama-3 family (#1332) --- doc/source/getting_started/installation.rst | 2 +- doc/source/models/builtin/llm/index.rst | 14 ++ .../models/builtin/llm/llama-3-instruct.rst | 75 +++++++++ doc/source/models/builtin/llm/llama-3.rst | 75 +++++++++ doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 142 ++++++++++++++++++ .../model/llm/llm_family_modelscope.json | 90 +++++++++++ xinference/model/llm/tests/test_utils.py | 42 ++++++ xinference/model/llm/utils.py | 16 ++ xinference/model/llm/vllm/core.py | 2 + 10 files changed, 458 insertions(+), 2 deletions(-) create mode 100644 doc/source/models/builtin/llm/llama-3-instruct.rst create mode 100644 doc/source/models/builtin/llm/llama-3.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index f1f8546d1e..4a84a1853f 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -36,7 +36,7 @@ Currently, supported models include: .. vllm_start -- ``llama-2``, ``llama-2-chat`` +- ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index f0393e3734..7c8de6f54e 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -206,6 +206,16 @@ The following is a list of built-in LLM in Xinference: - 4096 - Llama-2-Chat is a fine-tuned version of the Llama-2 LLM, specializing in chatting. + * - :ref:`llama-3 <models_llm_llama-3>` + - generate + - 8192 + - Llama 3 is an auto-regressive language model that uses an optimized transformer architecture + + * - :ref:`llama-3-instruct <models_llm_llama-3-instruct>` + - chat + - 8192 + - The Llama 3 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks.. + * - :ref:`minicpm-2b-dpo-bf16 <models_llm_minicpm-2b-dpo-bf16>` - chat - 4096 @@ -512,6 +522,10 @@ The following is a list of built-in LLM in Xinference: llama-2-chat + llama-3 + + llama-3-instruct + minicpm-2b-dpo-bf16 minicpm-2b-dpo-fp16 diff --git a/doc/source/models/builtin/llm/llama-3-instruct.rst b/doc/source/models/builtin/llm/llama-3-instruct.rst new file mode 100644 index 0000000000..7a8bffb7fe --- /dev/null +++ b/doc/source/models/builtin/llm/llama-3-instruct.rst @@ -0,0 +1,75 @@ +.. _models_llm_llama-3-instruct: + +======================================== +llama-3-instruct +======================================== + +- **Context Length:** 8192 +- **Model Name:** llama-3-instruct +- **Languages:** en +- **Abilities:** chat +- **Description:** The Llama 3 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks.. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (ggufv2, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 8 +- **Quantizations:** IQ3_M, Q4_K_M, Q5_K_M, Q6_K, Q8_0 +- **Model ID:** lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name llama-3-instruct --size-in-billions 8 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 2 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** meta-llama/Meta-Llama-3-8B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name llama-3-instruct --size-in-billions 8 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (ggufv2, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 70 +- **Quantizations:** IQ1_M, IQ2_XS, Q4_K_M +- **Model ID:** lmstudio-community/Meta-Llama-3-70B-Instruct-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/lmstudio-community/Meta-Llama-3-70B-Instruct-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name llama-3-instruct --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 4 (pytorch, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 70 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** meta-llama/Meta-Llama-3-70B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name llama-3-instruct --size-in-billions 70 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/llama-3.rst b/doc/source/models/builtin/llm/llama-3.rst new file mode 100644 index 0000000000..c5e70cca93 --- /dev/null +++ b/doc/source/models/builtin/llm/llama-3.rst @@ -0,0 +1,75 @@ +.. _models_llm_llama-3: + +======================================== +llama-3 +======================================== + +- **Context Length:** 8192 +- **Model Name:** llama-3 +- **Languages:** en +- **Abilities:** generate +- **Description:** Llama 3 is an auto-regressive language model that uses an optimized transformer architecture + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** meta-llama/Meta-Llama-3-8B +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-8B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name llama-3 --size-in-billions 8 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (ggufv2, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 8 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_1, Q4_K_M, Q4_K_S, Q5_0, Q5_1, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Model ID:** QuantFactory/Meta-Llama-3-8B-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/QuantFactory/Meta-Llama-3-8B-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name llama-3 --size-in-billions 8 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 3 (pytorch, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 70 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** meta-llama/Meta-Llama-3-70B +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-70B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name llama-3 --size-in-billions 70 --model-format pytorch --quantization ${quantization} + + +Model Spec 4 (ggufv2, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 70 +- **Quantizations:** Q4_K_M, Q5_K_M +- **Model ID:** NousResearch/Meta-Llama-3-70B-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/NousResearch/Meta-Llama-3-70B-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name llama-3 --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 87ca774672..18a7deac45 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -45,7 +45,7 @@ Currently, supported model includes: .. vllm_start -- ``llama-2``, ``llama-2-chat`` +- ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 152ccf4d40..38f181d748 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1220,6 +1220,148 @@ } ] }, + { + "version": 1, + "context_length": 8192, + "model_name": "llama-3", + "model_lang": [ + "en" + ], + "model_ability": [ + "generate" + ], + "model_description": "Llama 3 is an auto-regressive language model that uses an optimized transformer architecture", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "meta-llama/Meta-Llama-3-8B" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 8, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_1", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_1", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "QuantFactory/Meta-Llama-3-8B-GGUF", + "model_file_name_template": "Meta-Llama-3-8B.{quantization}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "meta-llama/Meta-Llama-3-70B" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 70, + "quantizations": [ + "Q4_K_M", + "Q5_K_M" + ], + "model_id": "NousResearch/Meta-Llama-3-70B-GGUF", + "model_file_name_template": "Meta-Llama-3-70B-{quantization}.gguf" + } + ] + }, + { + "version": 1, + "context_length": 8192, + "model_name": "llama-3-instruct", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Llama 3 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks..", + "model_specs": [ + { + "model_format": "ggufv2", + "model_size_in_billions": 8, + "quantizations": [ + "IQ3_M", + "Q4_K_M", + "Q5_K_M", + "Q6_K", + "Q8_0" + ], + "model_id": "lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF", + "model_file_name_template": "Meta-Llama-3-8B-Instruct-{quantization}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "meta-llama/Meta-Llama-3-8B-Instruct" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 70, + "quantizations": [ + "IQ1_M", + "IQ2_XS", + "Q4_K_M" + ], + "model_id": "lmstudio-community/Meta-Llama-3-70B-Instruct-GGUF", + "model_file_name_template": "Meta-Llama-3-8B-Instruct-{quantization}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "meta-llama/Meta-Llama-3-70B-Instruct" + } + ], + "prompt_style": { + "style_name": "LLAMA3", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n\n", + "inter_message_sep": "<|eot_id|>", + "stop_token_ids": [ + 128001, + 128009 + ], + "stop": [ + "<|end_of_text|>", + "<|eot_id|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index d2ecc028cf..f07217c284 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -84,6 +84,96 @@ ] } }, + { + "version": 1, + "context_length": 8192, + "model_name": "llama-3", + "model_lang": [ + "en" + ], + "model_ability": [ + "generate" + ], + "model_description": "Llama 3 is an auto-regressive language model that uses an optimized transformer architecture", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3-8B", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3-70B", + "model_hub": "modelscope" + } + ] + }, + { + "version": 1, + "context_length": 8192, + "model_name": "llama-3-instruct", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Llama 3 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks..", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3-8B-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3-70B-Instruct", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "LLAMA3", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n\n", + "inter_message_sep": "<|eot_id|>", + "stop_token_ids": [ + 128001, + 128009 + ], + "stop": [ + "<|end_of_text|>", + "<|eot_id|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/tests/test_utils.py b/xinference/model/llm/tests/test_utils.py index d5e40d7561..add8552716 100644 --- a/xinference/model/llm/tests/test_utils.py +++ b/xinference/model/llm/tests/test_utils.py @@ -140,6 +140,48 @@ def test_prompt_style_llama2(): ) +def test_prompt_style_llama3(): + prompt_style = PromptStyleV1( + style_name="LLAMA3", + system_prompt=( + "You are a helpful, respectful and honest assistant. Always answer" + " as helpfully as possible, while being safe. Your answers should not include any" + " harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please" + " ensure that your responses are socially unbiased and positive in nature.\n\nIf a" + " question does not make any sense, or is not factually coherent, explain why instead" + " of answering something not correct. If you don't know the answer to a question," + " please don't share false information" + ), + roles=["user", "assistant"], + intra_message_sep="\n\n", + inter_message_sep="<|eot_id|>", + stop_token_ids=[128001, 128009], + ) + chat_history = [ + ChatCompletionMessage(role=prompt_style.roles[0], content="Hi there."), + ChatCompletionMessage( + role=prompt_style.roles[1], content="Hello, how may I help you?" + ), + ] + expected = ( + "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n" + "You are a helpful, respectful and honest assistant. Always answer" + " as helpfully as possible, while being safe. Your answers should not include any" + " harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please" + " ensure that your responses are socially unbiased and positive in nature.\n\nIf a" + " question does not make any sense, or is not factually coherent, explain why instead" + " of answering something not correct. If you don't know the answer to a question," + " please don't share false information<|eot_id|>" + "<|start_header_id|>user<|end_header_id|>\n\nHi there.<|eot_id|>" + "<|start_header_id|>assistant<|end_header_id|>\n\nHello, how may I help you?<|eot_id|>" + "<|start_header_id|>user<|end_header_id|>\n\nWrite a poem.<|eot_id|>" + "<|start_header_id|>assistant<|end_header_id|>\n\n" + ) + assert expected == ChatModelMixin.get_prompt( + "Write a poem.", chat_history, prompt_style + ) + + def test_prompt_style_falcon(): prompt_style = PromptStyleV1( style_name="FALCON", diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 80db9c23b3..4df6297ebd 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -114,6 +114,22 @@ def get_role(role_name: str): else: ret += role return ret + elif prompt_style.style_name == "LLAMA3": + ret = ( + f"<|begin_of_text|><|start_header_id|>system<|end_header_id|>" + f"{prompt_style.intra_message_sep}{prompt_style.system_prompt}{prompt_style.inter_message_sep}" + ) + for i, message in enumerate(chat_history): + role = get_role(message["role"]) + content = message["content"] + if content: + ret += ( + f"<|start_header_id|>{role}<|end_header_id|>" + f"{prompt_style.intra_message_sep}{content}{prompt_style.inter_message_sep}" + ) + else: + ret += f"<|start_header_id|>{role}<|end_header_id|>{prompt_style.intra_message_sep}" + return ret elif prompt_style.style_name == "FALCON": ret = prompt_style.system_prompt for message in chat_history: diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 6dd593c7c8..130b3ff8a7 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -85,6 +85,7 @@ class VLLMGenerateConfig(TypedDict, total=False): VLLM_SUPPORTED_MODELS = [ "llama-2", + "llama-3", "baichuan", "internlm-16k", "mistral-v0.1", @@ -94,6 +95,7 @@ class VLLMGenerateConfig(TypedDict, total=False): ] VLLM_SUPPORTED_CHAT_MODELS = [ "llama-2-chat", + "llama-3-instruct", "vicuna-v1.3", "vicuna-v1.5", "baichuan-chat", From 6e8413f46115c5fc06c8de9e239bcd76bdf4b275 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Mon, 22 Apr 2024 18:11:47 +0800 Subject: [PATCH 029/298] DOC: Add new models to README (#1346) --- README.md | 4 ++-- README_zh_CN.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5fa5e9d398..39f8320fc6 100644 --- a/README.md +++ b/README.md @@ -34,12 +34,12 @@ potential of cutting-edge AI models. - Docker image: [#855](https://github.com/xorbitsai/inference/pull/855) - Support multimodal: [#829](https://github.com/xorbitsai/inference/pull/829) ### New Models +- Built-in support for [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) +- Built-in support for [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) - Built-in support for [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) - Built-in support for [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) - Built-in support for [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) - Built-in support for [Gemma](https://github.com/google-deepmind/gemma): [#1024](https://github.com/xorbitsai/inference/pull/1024) -- Built-in support for [Qwen1.5](https://github.com/QwenLM/Qwen1.5): [#994](https://github.com/xorbitsai/inference/pull/994) -- Built-in support for [Yi-VL](https://github.com/01-ai/Yi): [#946](https://github.com/xorbitsai/inference/pull/946) ### Integrations - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [Chatbox](https://chatboxai.app/): a desktop client for multiple cutting-edge LLM models, available on Windows, Mac and Linux. diff --git a/README_zh_CN.md b/README_zh_CN.md index c0e0a80694..987f7554e0 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -31,12 +31,12 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - Docker 镜像支持: [#855](https://github.com/xorbitsai/inference/pull/855) - 支持多模态模型:[#829](https://github.com/xorbitsai/inference/pull/829) ### 新模型 +- 内置 [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) +- 内置 [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) - 内置 [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) - 内置 [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) - 内置 [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) - 内置 [Gemma](https://github.com/google-deepmind/gemma): [#1024](https://github.com/xorbitsai/inference/pull/1024) -- 内置 [Qwen1.5](https://github.com/QwenLM/Qwen1.5): [#994](https://github.com/xorbitsai/inference/pull/994) -- 内置 [Yi-VL](https://github.com/01-ai/Yi): [#946](https://github.com/xorbitsai/inference/pull/946) ### 集成 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 - [Chatbox](https://chatboxai.app/): 一个支持前沿大语言模型的桌面客户端,支持 Windows,Mac,以及 Linux。 From 30420f5ec0141917c92ecbdc100acb224c964b7f Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Mon, 22 Apr 2024 12:37:56 +0200 Subject: [PATCH 030/298] FEAT: Add Belle-whisper-large-v3-zh (#1351) --- xinference/model/audio/model_spec.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xinference/model/audio/model_spec.json b/xinference/model/audio/model_spec.json index 6fcde3c6af..49da294f92 100644 --- a/xinference/model/audio/model_spec.json +++ b/xinference/model/audio/model_spec.json @@ -75,5 +75,12 @@ "model_id": "BELLE-2/Belle-whisper-large-v2-zh", "model_revision": "ec5bd5d78598545b7585814edde86dac2002b5b9", "multilingual": false + }, + { + "model_name": "Belle-whisper-large-v3-zh", + "model_family": "whisper", + "model_id": "BELLE-2/Belle-whisper-large-v3-zh", + "model_revision": "3bebc7247696b39f5ab9ed22db426943ac33f600", + "multilingual": false } -] \ No newline at end of file +] From 78897c51ca7c0a4751a870dd0b8b6813a7eafd58 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Tue, 23 Apr 2024 09:52:18 +0800 Subject: [PATCH 031/298] BUG: Fix extra parameters issue when auto-recovering models (#1348) --- xinference/core/worker.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 26cd664c51..c541e99c19 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -612,6 +612,14 @@ async def launch_builtin_model( gpu_idx: Optional[Union[int, List[int]]] = None, **kwargs, ): + # !!! Note that The following code must be placed at the very beginning of this function, + # or there will be problems with auto-recovery. + # Because `locals()` will collect all the local parameters of this function and pass to this function again. + launch_args = locals() + launch_args.pop("self") + launch_args.pop("kwargs") + launch_args.update(kwargs) + event_model_uid, _, __ = parse_replica_model_uid(model_uid) await self._event_collector_ref.report_event( event_model_uid, @@ -621,10 +629,6 @@ async def launch_builtin_model( event_content="Launch model", ), ) - launch_args = locals() - launch_args.pop("self") - launch_args.pop("kwargs") - launch_args.update(kwargs) if gpu_idx is not None: logger.info( From 6fb9dc59cb96d87daf80028fe4183e135ab3df75 Mon Sep 17 00:00:00 2001 From: Carson Yang <yangchuansheng33@gmail.com> Date: Tue, 23 Apr 2024 11:08:26 +0800 Subject: [PATCH 032/298] DOC: Update README, add FastGPT to integrations (#1355) Signed-off-by: Carson Yang <yangchuansheng33@gmail.com> --- README.md | 1 + README_zh_CN.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 39f8320fc6..f087ade8cc 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ potential of cutting-edge AI models. - Built-in support for [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) - Built-in support for [Gemma](https://github.com/google-deepmind/gemma): [#1024](https://github.com/xorbitsai/inference/pull/1024) ### Integrations +- [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [Chatbox](https://chatboxai.app/): a desktop client for multiple cutting-edge LLM models, available on Windows, Mac and Linux. diff --git a/README_zh_CN.md b/README_zh_CN.md index 987f7554e0..109131b323 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -38,6 +38,7 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - 内置 [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) - 内置 [Gemma](https://github.com/google-deepmind/gemma): [#1024](https://github.com/xorbitsai/inference/pull/1024) ### 集成 +- [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 - [Chatbox](https://chatboxai.app/): 一个支持前沿大语言模型的桌面客户端,支持 Windows,Mac,以及 Linux。 From c6e4e918b1609edcb84a82ed567d8c2c18c64246 Mon Sep 17 00:00:00 2001 From: Mike Shi <shihui@hyron.com> Date: Tue, 23 Apr 2024 11:30:20 +0800 Subject: [PATCH 033/298] ENH: fix the max length of codeqwen-7B-chat (#1354) --- xinference/model/llm/llm_family.json | 2 +- xinference/model/llm/llm_family_modelscope.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 38f181d748..d14c2ccc94 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -2074,7 +2074,7 @@ }, { "version": 1, - "context_length": 65536, + "context_length": 32768, "model_name": "codeqwen1.5-chat", "model_lang": [ "en", diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index f07217c284..7920c8d1ce 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2267,7 +2267,7 @@ }, { "version": 1, - "context_length": 65536, + "context_length": 32768, "model_name": "codeqwen1.5-chat", "model_lang": [ "en", From 9ddff329b277be6941bca22481d05197d6cae450 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:10:05 +0200 Subject: [PATCH 034/298] BUG: Fix old rerank models use flag rerank issue (#1350) --- xinference/model/rerank/core.py | 58 +++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index 9a715eb115..4b0a3a9fd2 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -115,26 +115,41 @@ def __init__( self._model = None def load(self): - try: - if self._model_spec.type == "normal": - from FlagEmbedding import FlagReranker - elif self._model_spec.type == "LLM-based": - from FlagEmbedding import FlagLLMReranker as FlagReranker - elif self._model_spec.type == "LLM-based layerwise": - from FlagEmbedding import LayerWiseFlagLLMReranker as FlagReranker - else: - raise RuntimeError( - f"Unsupported Rank model type: {self._model_spec.type}" - ) - except ImportError: - error_message = "Failed to import module 'FlagEmbedding'" - installation_guide = [ - "Please make sure 'FlagEmbedding' is installed. ", - "You can install it by `pip install FlagEmbedding`\n", - ] + if self._model_spec.type == "normal": + try: + from sentence_transformers.cross_encoder import CrossEncoder + except ImportError: + error_message = "Failed to import module 'sentence-transformers'" + installation_guide = [ + "Please make sure 'sentence-transformers' is installed. ", + "You can install it by `pip install sentence-transformers`\n", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + self._model = CrossEncoder( + self._model_path, device=self._device, **self._model_config + ) + if self._use_fp16: + self._model.model.half() + else: + try: + if self._model_spec.type == "LLM-based": + from FlagEmbedding import FlagLLMReranker as FlagReranker + elif self._model_spec.type == "LLM-based layerwise": + from FlagEmbedding import LayerWiseFlagLLMReranker as FlagReranker + else: + raise RuntimeError( + f"Unsupported Rank model type: {self._model_spec.type}" + ) + except ImportError: + error_message = "Failed to import module 'FlagEmbedding'" + installation_guide = [ + "Please make sure 'FlagEmbedding' is installed. ", + "You can install it by `pip install FlagEmbedding`\n", + ] - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - self._model = FlagReranker(self._model_path, use_fp16=True) + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + self._model = FlagReranker(self._model_path, use_fp16=self._use_fp16) def rerank( self, @@ -151,7 +166,10 @@ def rerank( if max_chunks_per_doc is not None: raise ValueError("rerank hasn't support `max_chunks_per_doc` parameter.") sentence_combinations = [[query, doc] for doc in documents] - similarity_scores = self._model.compute_score(sentence_combinations) + if self._model_spec.type == "normal": + similarity_scores = self._model.predict(sentence_combinations) + else: + similarity_scores = self._model.compute_score(sentence_combinations) sim_scores_argsort = list(reversed(np.argsort(similarity_scores))) if top_n is not None: sim_scores_argsort = sim_scores_argsort[:top_n] From 2ba72b0ed55c2dbff12491485ffacee7996d3490 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Wed, 24 Apr 2024 04:45:37 +0200 Subject: [PATCH 035/298] ENH: Clear cache for embedding and rerank (#1360) --- xinference/model/embedding/core.py | 13 +++++++++++++ xinference/model/rerank/core.py | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/xinference/model/embedding/core.py b/xinference/model/embedding/core.py index 35af7d2cd6..331c4a8b9b 100644 --- a/xinference/model/embedding/core.py +++ b/xinference/model/embedding/core.py @@ -12,12 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. +import gc import logging +import os from collections import defaultdict from typing import Dict, List, Optional, Tuple, Union, no_type_check import numpy as np +from ...device_utils import empty_cache from ...types import Embedding, EmbeddingData, EmbeddingUsage from ..core import CacheableModelSpec, ModelDescription from ..utils import get_cache_dir, is_model_cached @@ -28,6 +31,10 @@ # Init when registering all the builtin models. MODEL_NAME_TO_REVISION: Dict[str, List[str]] = defaultdict(list) EMBEDDING_MODEL_DESCRIPTIONS: Dict[str, List[Dict]] = defaultdict(list) +EMBEDDING_EMPTY_CACHE_COUNT = int( + os.getenv("XINFERENCE_EMBEDDING_EMPTY_CACHE_COUNT", "10") +) +assert EMBEDDING_EMPTY_CACHE_COUNT > 0 def get_embedding_model_descriptions(): @@ -116,6 +123,7 @@ def __init__(self, model_uid: str, model_path: str, device: Optional[str] = None self._model_path = model_path self._device = device self._model = None + self._counter = 0 def load(self): try: @@ -134,6 +142,11 @@ def load(self): self._model = SentenceTransformer(self._model_path, device=self._device) def create_embedding(self, sentences: Union[str, List[str]], **kwargs): + self._counter += 1 + if self._counter % EMBEDDING_EMPTY_CACHE_COUNT == 0: + logger.debug("Empty embedding cache.") + gc.collect() + empty_cache() from sentence_transformers import SentenceTransformer kwargs.setdefault("normalize_embeddings", True) diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index 4b0a3a9fd2..4069918e51 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import gc import logging import os import uuid @@ -21,6 +22,7 @@ import numpy as np from ...constants import XINFERENCE_CACHE_DIR +from ...device_utils import empty_cache from ...types import Document, DocumentObj, Rerank from ..core import CacheableModelSpec, ModelDescription from ..utils import is_model_cached @@ -31,6 +33,8 @@ # Init when registering all the builtin models. MODEL_NAME_TO_REVISION: Dict[str, List[str]] = defaultdict(list) RERANK_MODEL_DESCRIPTIONS: Dict[str, List[Dict]] = defaultdict(list) +RERANK_EMPTY_CACHE_COUNT = int(os.getenv("XINFERENCE_RERANK_EMPTY_CACHE_COUNT", "10")) +assert RERANK_EMPTY_CACHE_COUNT > 0 def get_rerank_model_descriptions(): @@ -113,6 +117,7 @@ def __init__( self._model_config = model_config or dict() self._use_fp16 = use_fp16 self._model = None + self._counter = 0 def load(self): if self._model_spec.type == "normal": @@ -160,6 +165,11 @@ def rerank( return_documents: Optional[bool], **kwargs, ) -> Rerank: + self._counter += 1 + if self._counter % RERANK_EMPTY_CACHE_COUNT == 0: + logger.debug("Empty rerank cache.") + gc.collect() + empty_cache() assert self._model is not None if kwargs: raise ValueError("rerank hasn't support extra parameter.") From e81c9438a33a4bd4c584ec6e0a72e2acffdd3cc0 Mon Sep 17 00:00:00 2001 From: Wang Xuejin <92132848+Ago327@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:58:49 +0800 Subject: [PATCH 036/298] REF: Query for engine (#1342) Co-authored-by: ChengjieLi <chengjieli23@outlook.com> --- xinference/api/restful_api.py | 23 ++ xinference/core/supervisor.py | 18 ++ xinference/model/llm/__init__.py | 97 +++++++ xinference/model/llm/llm_family.py | 40 +++ xinference/model/llm/tests/test_llm_family.py | 242 ++++++++++++++++++ 5 files changed, 420 insertions(+) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index ec58594cc3..bb739c1e41 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -275,6 +275,16 @@ def serve(self, logging_conf: Optional[dict] = None): self._router.add_api_route( "/v1/cluster/auth", self.is_cluster_authenticated, methods=["GET"] ) + self._router.add_api_route( + "/v1/engines/{model_name}", + self.query_engines_by_model_name, + methods=["GET"], + dependencies=( + [Security(self._auth_service, scopes=["models:list"])] + if self.is_authenticated() + else None + ), + ) # running instances self._router.add_api_route( "/v1/models/instances", @@ -1418,6 +1428,19 @@ async def stream_results(): self.handle_request_limit_error(e) raise HTTPException(status_code=500, detail=str(e)) + async def query_engines_by_model_name(self, model_name: str) -> JSONResponse: + try: + content = await ( + await self._get_supervisor_ref() + ).query_engines_by_model_name(model_name) + return JSONResponse(content=content) + except ValueError as re: + logger.error(re, exc_info=True) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + async def register_model(self, model_type: str, request: Request) -> JSONResponse: body = RegisterModelRequest.parse_obj(await request.json()) model = body.model diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 115baf1e73..8da7d1947f 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -591,6 +591,24 @@ def get_model_registration(self, model_type: str, model_name: str) -> Any: else: raise ValueError(f"Unsupported model type: {model_type}") + @log_async(logger=logger) + async def query_engines_by_model_name(self, model_name: str): + from copy import deepcopy + + from ..model.llm.llm_family import LLM_ENGINES + + if model_name not in LLM_ENGINES: + raise ValueError(f"Model {model_name} not found") + + # filter llm_class + engine_params = deepcopy(LLM_ENGINES[model_name]) + for engine in engine_params: + params = engine_params[engine] + for param in params: + del param["llm_class"] + + return engine_params + @log_async(logger=logger) async def register_model(self, model_type: str, model: str, persist: bool): if model_type in self._custom_register_type_to_cls: diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index ec25095c3d..0cdabd010a 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -13,6 +13,7 @@ # limitations under the License. import codecs +import gc import json import os @@ -30,8 +31,14 @@ BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES, BUILTIN_LLM_PROMPT_STYLE, BUILTIN_MODELSCOPE_LLM_FAMILIES, + LLAMA_CLASSES, LLM_CLASSES, + LLM_ENGINES, PEFT_SUPPORTED_CLASSES, + PYTORCH_CLASSES, + SGLANG_CLASSES, + SUPPORTED_ENGINES, + VLLM_CLASSES, CustomLLMFamilyV1, GgmlLLMSpecV1, LLMFamilyV1, @@ -47,6 +54,50 @@ ) +def generate_engine_config_by_model_family(model_family): + model_name = model_family.model_name + specs = model_family.model_specs + engines = {} # structure for engine query + for spec in specs: + model_format = spec.model_format + model_size_in_billions = spec.model_size_in_billions + quantizations = spec.quantizations + for quantization in quantizations: + # traverse all supported engines to match the name, format, size in billions and quatization of model + for engine in SUPPORTED_ENGINES: + CLASSES = SUPPORTED_ENGINES[engine] + for cls in CLASSES: + if cls.match(model_family, spec, quantization): + engine_params = engines.get(engine, []) + already_exists = False + # if the name, format and size in billions of model already exists in the structure, add the new quantization + for param in engine_params: + if ( + model_name == param["model_name"] + and model_format == param["model_format"] + and model_size_in_billions + == param["model_size_in_billions"] + and quantization not in param["quantizations"] + ): + param["quantizations"].append(quantization) + already_exists = True + break + # successfully match the params for the first time, add to the structure + if not already_exists: + engine_params.append( + { + "model_name": model_name, + "model_format": model_format, + "model_size_in_billions": model_size_in_billions, + "quantizations": [quantization], + "llm_class": cls, + } + ) + engines[engine] = engine_params + break + LLM_ENGINES[model_name] = engines + + def _install(): from .ggml.chatglm import ChatglmCppChatModel from .ggml.llamacpp import LlamaCppChatModel, LlamaCppModel @@ -76,8 +127,17 @@ def _install(): ChatglmCppChatModel, ] ) + LLAMA_CLASSES.extend( + [ + ChatglmCppChatModel, + LlamaCppChatModel, + LlamaCppModel, + ] + ) LLM_CLASSES.extend([SGLANGModel, SGLANGChatModel]) + SGLANG_CLASSES.extend([SGLANGModel, SGLANGChatModel]) LLM_CLASSES.extend([VLLMModel, VLLMChatModel]) + VLLM_CLASSES.extend([VLLMModel, VLLMChatModel]) LLM_CLASSES.extend( [ BaichuanPytorchChatModel, @@ -96,6 +156,24 @@ def _install(): PytorchModel, ] ) + PYTORCH_CLASSES.extend( + [ + BaichuanPytorchChatModel, + VicunaPytorchChatModel, + FalconPytorchChatModel, + ChatglmPytorchChatModel, + LlamaPytorchModel, + LlamaPytorchChatModel, + PytorchChatModel, + FalconPytorchModel, + Internlm2PytorchChatModel, + QwenVLChatModel, + OmniLMMModel, + YiVLChatModel, + DeepSeekVLChatModel, + PytorchModel, + ] + ) PEFT_SUPPORTED_CLASSES.extend( [ BaichuanPytorchChatModel, @@ -113,6 +191,12 @@ def _install(): ] ) + # support 4 engines for now + SUPPORTED_ENGINES["vLLM"] = VLLM_CLASSES + SUPPORTED_ENGINES["SGLang"] = SGLANG_CLASSES + SUPPORTED_ENGINES["PyTorch"] = PYTORCH_CLASSES + SUPPORTED_ENGINES["llama-cpp-python"] = LLAMA_CLASSES + json_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "llm_family.json" ) @@ -163,6 +247,11 @@ def _install(): if llm_spec.model_name not in LLM_MODEL_DESCRIPTIONS: LLM_MODEL_DESCRIPTIONS.update(generate_llm_description(llm_spec)) + # traverse all families and add engine parameters corresponding to the model name + for families in [BUILTIN_LLM_FAMILIES, BUILTIN_MODELSCOPE_LLM_FAMILIES]: + for family in families: + generate_engine_config_by_model_family(family) + from ...constants import XINFERENCE_MODEL_DIR user_defined_llm_dir = os.path.join(XINFERENCE_MODEL_DIR, "llm") @@ -177,3 +266,11 @@ def _install(): # register model description for ud_llm in get_user_defined_llm_families(): LLM_MODEL_DESCRIPTIONS.update(generate_llm_description(ud_llm)) + + # Have to empty_cache here to reset CUDA status. + # Because `generate_engine_config_by_model_family` above has already initialized CUDA, + # which leads to torch initialization error in subprocess. + from ...device_utils import empty_cache + + gc.collect() + empty_cache() diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 6f5a01d6e7..ecf2e3071e 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -227,16 +227,25 @@ def parse_raw( CustomLLMFamilyV1.update_forward_refs() +LLAMA_CLASSES: List[Type[LLM]] = [] LLM_CLASSES: List[Type[LLM]] = [] PEFT_SUPPORTED_CLASSES: List[Type[LLM]] = [] BUILTIN_LLM_FAMILIES: List["LLMFamilyV1"] = [] BUILTIN_MODELSCOPE_LLM_FAMILIES: List["LLMFamilyV1"] = [] +SGLANG_CLASSES: List[Type[LLM]] = [] +PYTORCH_CLASSES: List[Type[LLM]] = [] + UD_LLM_FAMILIES: List["LLMFamilyV1"] = [] UD_LLM_FAMILIES_LOCK = Lock() +VLLM_CLASSES: List[Type[LLM]] = [] + +LLM_ENGINES: Dict[str, Dict[str, List[Dict[str, Any]]]] = {} +SUPPORTED_ENGINES: Dict[str, List[Type[LLM]]] = {} + LLM_LAUNCH_VERSIONS: Dict[str, List[str]] = {} @@ -904,6 +913,7 @@ def _apply_format_to_model_id(spec: LLMSpecV1, q: str) -> LLMSpecV1: def register_llm(llm_family: LLMFamilyV1, persist: bool): from ..utils import is_valid_model_name + from . import generate_engine_config_by_model_family if not is_valid_model_name(llm_family.model_name): raise ValueError(f"Invalid model name {llm_family.model_name}.") @@ -916,6 +926,7 @@ def register_llm(llm_family: LLMFamilyV1, persist: bool): ) UD_LLM_FAMILIES.append(llm_family) + generate_engine_config_by_model_family(llm_family) if persist: # We only validate model URL when persist is True. @@ -941,6 +952,7 @@ def unregister_llm(model_name: str, raise_error: bool = True): break if llm_family: UD_LLM_FAMILIES.remove(llm_family) + del LLM_ENGINES[model_name] persist_path = os.path.join( XINFERENCE_MODEL_DIR, "llm", f"{llm_family.model_name}.json" @@ -990,3 +1002,31 @@ def match_llm_cls( if cls.match(family, llm_spec, quantization): return cls return None + + +def check_engine_by_spec_parameters( + model_engine: str, + model_name: str, + model_format: str, + model_size_in_billions: Union[str, int], + quantization: str, +) -> Optional[Type[LLM]]: + if model_name not in LLM_ENGINES: + logger.debug(f"Cannot find model {model_name}.") + return None + if model_engine not in LLM_ENGINES[model_name]: + logger.debug(f"Model {model_name} cannot be run on engine {model_engine}.") + return None + match_params = LLM_ENGINES[model_name][model_engine] + for param in match_params: + if ( + model_name == param["model_name"] + and model_format == param["model_format"] + and model_size_in_billions == param["model_size_in_billions"] + and quantization in param["quantizations"] + ): + return param["llm_class"] + logger.debug( + f"Model {model_name} with format {model_format}, size {model_size_in_billions} and quantization {quantization} cannot be run on engine {model_engine}." + ) + return None diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index ec119b43ce..e1030d4e89 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -1064,3 +1064,245 @@ def test_match_model_size(): assert not match_model_size("1.8", 18) assert not match_model_size("1.8", 1) assert match_model_size("001", 1) + + +@pytest.mark.skipif( + True, + reason="Current system does not support vLLM", +) +def test_quert_engine_vLLM(): + from ..llm_family import LLM_ENGINES, check_engine_by_spec_parameters + + model_name = "qwen1.5-chat" + assert model_name in LLM_ENGINES + + assert ( + "vLLM" in LLM_ENGINES[model_name] and len(LLM_ENGINES[model_name]["vLLM"]) == 21 + ) + + assert check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int4", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int8", + ) + is None + ) + assert check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="none", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="4-bit", + ) + is None + ) + assert ( + check_engine_by_spec_parameters( + model_engine="vLLM", + model_name=model_name, + model_format="ggmlv3", + model_size_in_billions="1_8", + quantization="q2_k", + ) + is None + ) + + +@pytest.mark.skipif( + True, + reason="Current system does not support SGLang", +) +def test_quert_engine_SGLang(): + from ..llm_family import LLM_ENGINES, check_engine_by_spec_parameters + + model_name = "qwen1.5-chat" + assert model_name in LLM_ENGINES + + assert ( + "SGLang" in LLM_ENGINES[model_name] + and len(LLM_ENGINES[model_name]["SGLang"]) == 21 + ) + + assert check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int4", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int8", + ) + is None + ) + assert check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="none", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="4-bit", + ) + is None + ) + assert ( + check_engine_by_spec_parameters( + model_engine="SGLang", + model_name=model_name, + model_format="ggmlv3", + model_size_in_billions="1_8", + quantization="q2_k", + ) + is None + ) + + +def test_query_engine_general(): + from ..ggml.chatglm import ChatglmCppChatModel + from ..ggml.llamacpp import LlamaCppChatModel + from ..llm_family import ( + LLM_ENGINES, + check_engine_by_spec_parameters, + get_user_defined_llm_families, + register_llm, + unregister_llm, + ) + + model_name = "qwen1.5-chat" + assert model_name in LLM_ENGINES + + assert ( + "PyTorch" in LLM_ENGINES[model_name] + and len(LLM_ENGINES[model_name]["PyTorch"]) == 28 + ) + assert ( + "llama-cpp-python" in LLM_ENGINES[model_name] + and len(LLM_ENGINES[model_name]["llama-cpp-python"]) == 7 + ) + + assert check_engine_by_spec_parameters( + model_engine="PyTorch", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int4", + ) + assert check_engine_by_spec_parameters( + model_engine="PyTorch", + model_name=model_name, + model_format="gptq", + model_size_in_billions="1_8", + quantization="Int8", + ) + assert check_engine_by_spec_parameters( + model_engine="PyTorch", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="none", + ) + assert check_engine_by_spec_parameters( + model_engine="PyTorch", + model_name=model_name, + model_format="pytorch", + model_size_in_billions="1_8", + quantization="4-bit", + ) + assert ( + check_engine_by_spec_parameters( + model_engine="llama-cpp-python", + model_name=model_name, + model_format="ggufv2", + model_size_in_billions="1_8", + quantization="q2_k", + ) + is LlamaCppChatModel + ) + assert ( + check_engine_by_spec_parameters( + model_engine="llama-cpp-python", + model_name=model_name, + model_format="ggmlv3", + model_size_in_billions="1_8", + quantization="q2_k", + ) + is None + ) + + assert ( + check_engine_by_spec_parameters( + model_engine="llama-cpp-python", + model_name="chatglm", + model_format="ggmlv3", + model_size_in_billions=6, + quantization="q4_0", + ) + is ChatglmCppChatModel + ) + + spec = GgmlLLMSpecV1( + model_format="ggmlv3", + model_size_in_billions=3, + model_id="TheBloke/orca_mini_3B-GGML", + quantizations=[""], + model_file_name_template="README.md", + ) + family = LLMFamilyV1( + version=1, + context_length=2048, + model_type="LLM", + model_name="custom_model", + model_lang=["en"], + model_ability=["embed", "chat"], + model_specs=[spec], + prompt_style=None, + ) + + register_llm(family, False) + + assert family in get_user_defined_llm_families() + assert ( + "custom_model" in LLM_ENGINES + and "llama-cpp-python" in LLM_ENGINES["custom_model"] + ) + assert check_engine_by_spec_parameters( + model_engine="llama-cpp-python", + model_name="custom_model", + model_format="ggmlv3", + model_size_in_billions=3, + quantization="", + ) + + unregister_llm(family.model_name) + assert family not in get_user_defined_llm_families() + assert "custom_model" not in LLM_ENGINES From 92c9d0d3acab28577b7cf506be68be95b88180f9 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:04:24 +0800 Subject: [PATCH 037/298] ENH: add custom image model (#1312) --- .../Custom_StableDiffusion_ControlNet.ipynb | 269 ++++++++++++++++++ examples/draft.png | Bin 0 -> 16696 bytes xinference/core/supervisor.py | 28 +- xinference/core/worker.py | 12 +- xinference/model/image/__init__.py | 29 ++ xinference/model/image/core.py | 6 + xinference/model/image/custom.py | 109 +++++++ .../image/tests/test_stable_diffusion.py | 192 +++++++++++++ 8 files changed, 642 insertions(+), 3 deletions(-) create mode 100644 examples/Custom_StableDiffusion_ControlNet.ipynb create mode 100644 examples/draft.png create mode 100644 xinference/model/image/custom.py diff --git a/examples/Custom_StableDiffusion_ControlNet.ipynb b/examples/Custom_StableDiffusion_ControlNet.ipynb new file mode 100644 index 0000000000..070e15219f --- /dev/null +++ b/examples/Custom_StableDiffusion_ControlNet.ipynb @@ -0,0 +1,269 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Preparation\n", + "\n", + "First, you need to install Xinference with image support and huggingface-cli:\n", + "```shell\n", + "pip install xinference[image]\n", + "```\n", + "\n", + "Then, download the Stable Diffusion model with ControlNet. You can download the model from the following link:\n", + "Stable Diffusion v1.5(_https://huggingface.co/runwayml/stable-diffusion-v1-5_)\n", + "MLSD ControlNet (_https://huggingface.co/lllyasviel/sd-controlnet-mlsd_)\n", + "```shell\n", + "huggingface-cli download --resume-download runwayml/stable-diffusion-v1-5 --local-dir \"$(pwd)/stable-diffusion-v1-5\"\n", + "huggingface-cli download --resume-download lllyasviel/sd-controlnet-mlsd --local-dir \"$(pwd)/sd-controlnet-mlsd\"\n", + "```\n", + "\n", + "Then, start the Xinference server by the following command:\n", + "```shell\n", + "xinference-local\n", + "```\n", + "\n", + "The Xinference server will be started:\n", + "```shell\n", + "2023-11-02 16:04:55,278 xinference 38878 INFO Xinference successfully started. Endpoint: http://127.0.0.1:9997\n", + "2023-11-02 16:04:55,280 xinference.core.supervisor 38878 INFO Worker 127.0.0.1:32187 has been added successfully\n", + "2023-11-02 16:04:55,281 xinference.deploy.worker 38878 INFO Xinference worker successfully started.\n", + "```" + ], + "metadata": { + "collapsed": false + }, + "id": "58f64d59be3a3a67" + }, + { + "cell_type": "markdown", + "source": [ + "# Register the Stable Diffusion model with MLSD ControlNet\n", + "\n", + "Now, we have an inference server running at `http://127.0.0.1:9997` with empty models. Let's register the Stable Diffusion model and ControlNet." + ], + "metadata": { + "collapsed": false + }, + "id": "7fca21941c0f91ca" + }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "import os\n", + "from xinference.core.utils import json_dumps\n", + "from xinference.client import Client\n", + "client = Client(\"http://127.0.0.1:9997\")\n", + "\n", + "dir_path = os.getcwd()\n", + "my_controlnet = {\n", + " \"model_family\": \"controlnet\",\n", + " \"model_uid\": \"my_controlnet\",\n", + " \"model_name\": \"my_controlnet\",\n", + " \"model_uri\": os.path.join(dir_path, \"sd-controlnet-mlsd\"), # your controlnet path\n", + "}\n", + "\n", + "my_model = {\n", + " \"model_family\": \"stable_diffusion\",\n", + " \"model_uid\": \"my_image\",\n", + " \"model_name\": \"my_sd\",\n", + " \"model_uri\": os.path.join(dir_path, \"stable-diffusion-v1-5\"), # your model path\n", + " \"controlnet\": [my_controlnet],\n", + "}\n", + "\n", + "client.register_model(\n", + " model_type=\"image\",\n", + " model=json_dumps(my_model),\n", + " persist=False,\n", + ")" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-19T06:36:11.231232Z", + "start_time": "2024-04-19T06:36:11.222587Z" + } + }, + "id": "b09705b3829eddd2", + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "Let's launch the Stable Diffusion model with ControlNet. " + ], + "metadata": { + "collapsed": false + }, + "id": "390b692c8f21a418" + }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "model_uid = client.launch_model(\n", + " model_uid=\"my_image\",\n", + " model_name=\"my_sd\",\n", + " model_type=\"image\",\n", + " controlnet=\"my_controlnet\",\n", + ")\n", + "model = client.get_model(model_uid)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-19T06:36:25.169778Z", + "start_time": "2024-04-19T06:36:19.203544Z" + } + }, + "id": "9d5c7815ffbe1f7d", + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "Load a straight line image from the local." + ], + "metadata": { + "collapsed": false + }, + "id": "7e257c8cab307833" + }, + { + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": "<PIL.Image.Image image mode=RGB size=512x512>", + "image/png": "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", + "image/jpeg": "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" + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os\n", + "from diffusers.utils import load_image\n", + "\n", + "image_path = os.path.join(os.getcwd(), \"draft.png\")\n", + "image = load_image(image_path)\n", + "image" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-19T04:41:23.785272Z", + "start_time": "2024-04-19T04:41:23.758995Z" + } + }, + "id": "f8adc46724e0e84f", + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "Call the image_to_image API to the Xinference to get the result." + ], + "metadata": { + "collapsed": false + }, + "id": "b7b1026c4f8e3484" + }, + { + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": "{'created': 1713508619,\n 'data': [{'url': '/new_data3/wuzhaoxin/image/f02f5baa71fe434eb112cfbc4ca79d3d.jpg',\n 'b64_json': None}]}" + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import io\n", + "\n", + "prompt = (\n", + " \"a modern house, use glass window, best quality, 8K wallpaper,(realistic:1.3), \"\n", + " \"photorealistic, photo realistic, hyperrealistic, orante, super detailed, \"\n", + " \"intricate, dramatic, morning lighting, shadows, high dynamic range,wooden,blue sky\"\n", + ")\n", + "negative_prompt = (\n", + " \"low quality, bad quality, sketches, signature, soft, blurry, drawing, \"\n", + " \"sketch, poor quality, ugly, text, type, word, logo, pixelated, \"\n", + " \"low resolution, saturated, high contrast, oversharpened\"\n", + ")\n", + "bio = io.BytesIO()\n", + "image.save(bio, format=\"png\")\n", + "result_image = model.image_to_image(\n", + " image=bio.getvalue(),\n", + " prompt=prompt,\n", + " negative_prompt=negative_prompt,\n", + " num_inference_steps=20,\n", + ")\n", + "result_image" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-19T06:36:59.856123Z", + "start_time": "2024-04-19T06:36:28.438127Z" + } + }, + "id": "6d2ad668067e19c4", + "execution_count": 9 + }, + { + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": "<PIL.Image.Image image mode=RGB size=1024x1024>", + "image/png": "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", + "image/jpeg": "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" + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load_image(\"/Users/xprobe/.xinference/image/f02f5baa71fe434eb112cfbc4ca79d3d.jpg\")" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-19T06:37:21.191533Z", + "start_time": "2024-04-19T06:37:21.090008Z" + } + }, + "id": "88bcf0143222d050", + "execution_count": 10 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/draft.png b/examples/draft.png new file mode 100644 index 0000000000000000000000000000000000000000..f35ad21494f3ee3650ef0c2747148a2c4c93d1f7 GIT binary patch literal 16696 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 HHw^qgAB0aW literal 0 HcmV?d00001 diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 8da7d1947f..9c69e4420f 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -150,7 +150,13 @@ async def __post_create__(self): register_embedding, unregister_embedding, ) - from ..model.image import get_image_model_descriptions + from ..model.image import ( + CustomImageModelFamilyV1, + generate_image_description, + get_image_model_descriptions, + register_image, + unregister_image, + ) from ..model.llm import ( CustomLLMFamilyV1, generate_llm_description, @@ -185,6 +191,12 @@ async def __post_create__(self): unregister_rerank, generate_rerank_description, ), + "image": ( + CustomImageModelFamilyV1, + register_image, + unregister_image, + generate_image_description, + ), "audio": ( CustomAudioModelFamilyV1, register_audio, @@ -486,6 +498,7 @@ def sort_helper(item): return ret elif model_type == "image": from ..model.image import BUILTIN_IMAGE_MODELS + from ..model.image.custom import get_user_defined_images ret = [] for model_name, family in BUILTIN_IMAGE_MODELS.items(): @@ -494,6 +507,16 @@ def sort_helper(item): else: ret.append({"model_name": model_name, "is_builtin": True}) + for model_spec in get_user_defined_images(): + if detailed: + ret.append( + await self._to_image_model_reg(model_spec, is_builtin=False) + ) + else: + ret.append( + {"model_name": model_spec.model_name, "is_builtin": False} + ) + ret.sort(key=sort_helper) return ret elif model_type == "audio": @@ -567,8 +590,9 @@ def get_model_registration(self, model_type: str, model_name: str) -> Any: raise ValueError(f"Model {model_name} not found") elif model_type == "image": from ..model.image import BUILTIN_IMAGE_MODELS + from ..model.image.custom import get_user_defined_images - for f in BUILTIN_IMAGE_MODELS.values(): + for f in list(BUILTIN_IMAGE_MODELS.values()) + get_user_defined_images(): if f.model_name == model_name: return f raise ValueError(f"Model {model_name} not found") diff --git a/xinference/core/worker.py b/xinference/core/worker.py index c541e99c19..c3e93deb7e 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -208,7 +208,12 @@ async def __post_create__(self): register_embedding, unregister_embedding, ) - from ..model.image import get_image_model_descriptions + from ..model.image import ( + CustomImageModelFamilyV1, + get_image_model_descriptions, + register_image, + unregister_image, + ) from ..model.llm import ( CustomLLMFamilyV1, get_llm_model_descriptions, @@ -231,6 +236,11 @@ async def __post_create__(self): ), "rerank": (CustomRerankModelSpec, register_rerank, unregister_rerank), "audio": (CustomAudioModelFamilyV1, register_audio, unregister_audio), + "image": ( + CustomImageModelFamilyV1, + register_image, + unregister_image, + ), } # record model version diff --git a/xinference/model/image/__init__.py b/xinference/model/image/__init__.py index 0654f93057..7bcc1094b9 100644 --- a/xinference/model/image/__init__.py +++ b/xinference/model/image/__init__.py @@ -20,12 +20,19 @@ from .core import ( BUILTIN_IMAGE_MODELS, IMAGE_MODEL_DESCRIPTIONS, + MODEL_NAME_TO_REVISION, MODELSCOPE_IMAGE_MODELS, ImageModelFamilyV1, generate_image_description, get_cache_status, get_image_model_descriptions, ) +from .custom import ( + CustomImageModelFamilyV1, + get_user_defined_images, + register_image, + unregister_image, +) _model_spec_json = os.path.join(os.path.dirname(__file__), "model_spec.json") _model_spec_modelscope_json = os.path.join( @@ -37,6 +44,9 @@ for spec in json.load(codecs.open(_model_spec_json, "r", encoding="utf-8")) ) ) +for model_name, model_spec in BUILTIN_IMAGE_MODELS.items(): + MODEL_NAME_TO_REVISION[model_name].append(model_spec.model_revision) + MODELSCOPE_IMAGE_MODELS.update( dict( (spec["model_name"], ImageModelFamilyV1(**spec)) @@ -45,6 +55,8 @@ ) ) ) +for model_name, model_spec in MODELSCOPE_IMAGE_MODELS.items(): + MODEL_NAME_TO_REVISION[model_name].append(model_spec.model_revision) # register model description for model_name, model_spec in chain( @@ -52,4 +64,21 @@ ): IMAGE_MODEL_DESCRIPTIONS.update(generate_image_description(model_spec)) +from ...constants import XINFERENCE_MODEL_DIR + +user_defined_image_dir = os.path.join(XINFERENCE_MODEL_DIR, "image") +if os.path.isdir(user_defined_image_dir): + for f in os.listdir(user_defined_image_dir): + with codecs.open( + os.path.join(user_defined_image_dir, f), encoding="utf-8" + ) as fd: + user_defined_image_family = CustomImageModelFamilyV1.parse_obj( + json.load(fd) + ) + register_image(user_defined_image_family, persist=False) + +for ud_image in get_user_defined_images(): + IMAGE_MODEL_DESCRIPTIONS.update(generate_image_description(ud_image)) + del _model_spec_json +del _model_spec_modelscope_json diff --git a/xinference/model/image/core.py b/xinference/model/image/core.py index 028f5cdc4d..25ea325b23 100644 --- a/xinference/model/image/core.py +++ b/xinference/model/image/core.py @@ -27,6 +27,7 @@ logger = logging.getLogger(__name__) +MODEL_NAME_TO_REVISION: Dict[str, List[str]] = defaultdict(list) IMAGE_MODEL_DESCRIPTIONS: Dict[str, List[Dict]] = defaultdict(list) BUILTIN_IMAGE_MODELS: Dict[str, "ImageModelFamilyV1"] = {} MODELSCOPE_IMAGE_MODELS: Dict[str, "ImageModelFamilyV1"] = {} @@ -119,6 +120,11 @@ def generate_image_description( def match_diffusion(model_name: str) -> ImageModelFamilyV1: from ..utils import download_from_modelscope from . import BUILTIN_IMAGE_MODELS, MODELSCOPE_IMAGE_MODELS + from .custom import get_user_defined_images + + for model_spec in get_user_defined_images(): + if model_spec.model_name == model_name: + return model_spec if download_from_modelscope(): if model_name in MODELSCOPE_IMAGE_MODELS: diff --git a/xinference/model/image/custom.py b/xinference/model/image/custom.py new file mode 100644 index 0000000000..b002f6ded1 --- /dev/null +++ b/xinference/model/image/custom.py @@ -0,0 +1,109 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import os +from threading import Lock +from typing import List, Optional + +from ...constants import XINFERENCE_CACHE_DIR, XINFERENCE_MODEL_DIR +from .core import ImageModelFamilyV1 + +logger = logging.getLogger(__name__) + +UD_IMAGE_LOCK = Lock() + + +class CustomImageModelFamilyV1(ImageModelFamilyV1): + model_id: Optional[str] # type: ignore + model_revision: Optional[str] # type: ignore + model_uri: Optional[str] + controlnet: Optional[List["CustomImageModelFamilyV1"]] + + +UD_IMAGES: List[CustomImageModelFamilyV1] = [] + + +def get_user_defined_images() -> List[ImageModelFamilyV1]: + with UD_IMAGE_LOCK: + return UD_IMAGES.copy() + + +def register_image(model_spec: CustomImageModelFamilyV1, persist: bool): + from ..utils import is_valid_model_name, is_valid_model_uri + from . import BUILTIN_IMAGE_MODELS, MODELSCOPE_IMAGE_MODELS + + if not is_valid_model_name(model_spec.model_name): + raise ValueError(f"Invalid model name {model_spec.model_name}.") + + with UD_IMAGE_LOCK: + for model_name in ( + list(BUILTIN_IMAGE_MODELS.keys()) + + list(MODELSCOPE_IMAGE_MODELS.keys()) + + [spec.model_name for spec in UD_IMAGES] + ): + if model_spec.model_name == model_name: + raise ValueError( + f"Model name conflicts with existing model {model_spec.model_name}" + ) + UD_IMAGES.append(model_spec) + + if persist: + # We only validate model URL when persist is True. + model_uri = model_spec.model_uri + if model_uri and not is_valid_model_uri(model_uri): + raise ValueError(f"Invalid model URI {model_uri}") + + persist_path = os.path.join( + XINFERENCE_MODEL_DIR, "image", f"{model_spec.model_id}.json" + ) + os.makedirs(os.path.dirname(persist_path), exist_ok=True) + with open(persist_path, "w") as f: + f.write(model_spec.json()) + + +def unregister_image(model_name: str, raise_error: bool = True): + with UD_IMAGE_LOCK: + model_spec = None + for i, f in enumerate(UD_IMAGES): + if f.model_name == model_name: + model_spec = f + break + if model_spec: + UD_IMAGES.remove(model_spec) + + persist_path = os.path.join( + XINFERENCE_MODEL_DIR, "image", f"{model_spec.model_id}.json" + ) + + if os.path.exists(persist_path): + os.remove(persist_path) + + cache_dir = os.path.join(XINFERENCE_CACHE_DIR, model_spec.model_name) + if os.path.exists(cache_dir): + logger.warning( + f"Remove the cache of user-defined model {model_spec.model_name}. " + f"Cache directory: {cache_dir}" + ) + if os.path.islink(cache_dir): + os.remove(cache_dir) + else: + logger.warning( + f"Cache directory is not a soft link, please remove it manually." + ) + else: + if raise_error: + raise ValueError(f"Model {model_name} not found.") + else: + logger.warning(f"Custom image model {model_name} not found.") diff --git a/xinference/model/image/tests/test_stable_diffusion.py b/xinference/model/image/tests/test_stable_diffusion.py index 7ff9809b46..010f10e590 100644 --- a/xinference/model/image/tests/test_stable_diffusion.py +++ b/xinference/model/image/tests/test_stable_diffusion.py @@ -16,6 +16,7 @@ import logging import os.path import shutil +import tempfile from io import BytesIO import pytest @@ -198,3 +199,194 @@ def test_get_cache_status(): finally: if model_path is not None: shutil.rmtree(model_path) + + +def test_register_custom_image(): + from ..custom import ( + CustomImageModelFamilyV1, + get_user_defined_images, + register_image, + unregister_image, + ) + + tmp_dir = tempfile.mktemp() + + model_spec = CustomImageModelFamilyV1( + model_family="stable_diffusion", + model_name="my-custom-image", + model_id="my-custom-image", + model_uri=os.path.abspath(tmp_dir), + ) + + register_image(model_spec, persist=False) + assert model_spec in get_user_defined_images() + + unregister_image(model_spec.model_name, raise_error=False) + assert model_spec not in get_user_defined_images() + + +def test_persist_custom_image(): + from ....constants import XINFERENCE_MODEL_DIR + from ..custom import ( + CustomImageModelFamilyV1, + get_user_defined_images, + register_image, + unregister_image, + ) + + tmp_dir = tempfile.mktemp() + + model_spec = CustomImageModelFamilyV1( + model_family="stable_diffusion", + model_name="my-custom-image", + model_id="my-custom-image", + model_uri=os.path.abspath(tmp_dir), + ) + + register_image(model_spec, persist=True) + assert model_spec in get_user_defined_images() + assert f"{model_spec.model_name}.json" in os.listdir( + os.path.join(XINFERENCE_MODEL_DIR, "image") + ) + + unregister_image(model_spec.model_name) + assert model_spec not in get_user_defined_images() + assert f"{model_spec.model_name}.json" not in os.listdir( + os.path.join(XINFERENCE_MODEL_DIR, "image") + ) + + +def test_launch_custom_image(setup): + endpoint, _ = setup + from ....client import Client + from ....constants import XINFERENCE_CACHE_DIR + from ....core.utils import json_dumps + + client = Client(endpoint) + + model_path = os.path.join(XINFERENCE_CACHE_DIR, "sd-turbo") + + my_model = { + "model_family": "stable_diffusion", + "model_uid": "my_sd", + "model_name": "my_sd", + "model_uri": model_path, + } + + client.register_model( + model_type="image", + model=json_dumps(my_model), + persist=False, + ) + + model_uid = client.launch_model( + model_uid="my_image", + model_name="my_sd", + model_type="image", + ) + model = client.get_model(model_uid) + + r = model.text_to_image( + prompt="A cinematic shot of a baby raccoon wearing an intricate italian priest robe.", + size="512*512", + num_inference_steps=10, + ) + logger.info("test result %s", r) + + client.unregister_model(model_type="image", model_name=my_model["model_name"]) + + from PIL import Image + + with open(r["data"][0]["url"], "rb") as f: + img = Image.open(f) + assert img.size == (512, 512) + + import openai + + client = openai.Client(api_key="not empty", base_url=f"{endpoint}/v1") + completion = client.images.generate( + model=model_uid, + prompt="A cinematic shot of a baby raccoon wearing an intricate italian priest robe.", + size="512*512", + response_format="b64_json", + ) + img_bytes = base64.b64decode(completion.data[0].b64_json) + img = Image.open(BytesIO(img_bytes)) + assert img.size == (512, 512) + + +@pytest.mark.skip(reason="Stable diffusion controlnet requires too many GRAM.") +def test_launch_custom_image_with_controlnet(setup): + endpoint, _ = setup + from ....client import Client + from ....constants import XINFERENCE_CACHE_DIR + from ....core.utils import json_dumps + + client = Client(endpoint) + + model_path = os.path.join(XINFERENCE_CACHE_DIR, "stable-diffusion-v1.5") + controlnet_path = os.path.join(XINFERENCE_CACHE_DIR, "mlsd") + + my_controlnet = { + "model_family": "controlnet", + "model_uid": "my_controlnet", + "model_name": "my_controlnet", + "model_uri": controlnet_path, + } + + my_model = { + "model_family": "stable_diffusion", + "model_uid": "my_sd", + "model_name": "my_sd", + "model_uri": model_path, + "controlnet": [ + my_controlnet, + ], + } + + client.register_model( + model_type="image", + model=json_dumps(my_model), + persist=False, + ) + + model_uid = client.launch_model( + model_uid="my_image", + model_name="my_sd", + model_type="image", + controlnet="my_controlnet", + ) + model = client.get_model(model_uid) + + from controlnet_aux import MLSDdetector + from diffusers.utils import load_image + + mlsd = MLSDdetector.from_pretrained("lllyasviel/ControlNet") + + # Replace the image path for your test. + image_path = os.path.expanduser("~/draft.png") + logger.info("Image path: %s", image_path) + image = load_image(image_path) + image = mlsd(image) + prompt = ( + "a modern house, use glass window, best quality, 8K wallpaper,(realistic:1.3), " + "photorealistic, photo realistic, hyperrealistic, orante, super detailed, " + "intricate, dramatic, morning lighting, shadows, high dynamic range,wooden,blue sky" + ) + negative_prompt = ( + "low quality, bad quality, sketches, signature, soft, blurry, drawing, " + "sketch, poor quality, ugly, text, type, word, logo, pixelated, " + "low resolution, saturated, high contrast, oversharpened" + ) + bio = io.BytesIO() + image.save(bio, format="png") + r = model.image_to_image( + image=bio.getvalue(), + prompt=prompt, + negative_prompt=negative_prompt, + num_inference_steps=20, + ) + logger.info("test result %s", r) + + client.unregister_model(model_type="image", model_name=my_model["model_name"]) + client.unregister_model(model_type="image", model_name=my_controlnet["model_name"]) From bc6df5bc09d34b6ad8f28bc79806f95bae633928 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:36:40 +0800 Subject: [PATCH 038/298] BUG: Fix llama3-instruct 70B filename error (#1370) --- xinference/model/llm/llm_family.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index d14c2ccc94..b95bb2f40d 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1330,7 +1330,7 @@ "Q4_K_M" ], "model_id": "lmstudio-community/Meta-Llama-3-70B-Instruct-GGUF", - "model_file_name_template": "Meta-Llama-3-8B-Instruct-{quantization}.gguf" + "model_file_name_template": "Meta-Llama-3-70B-Instruct-{quantization}.gguf" }, { "model_format": "pytorch", From 46627a6f0a9509d988fdd49dc9246a3fab1dd79f Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 25 Apr 2024 17:19:39 +0800 Subject: [PATCH 039/298] FEAT: Support Mixtral-8x22b-instruct-v0.1 (#1340) --- doc/source/getting_started/installation.rst | 2 +- .../audio/belle-whisper-large-v3-zh.rst | 19 +++ doc/source/models/builtin/audio/index.rst | 2 + .../models/builtin/llm/codeqwen1.5-chat.rst | 2 +- doc/source/models/builtin/llm/index.rst | 9 +- .../llm/mixtral-8x22b-instruct-v0.1.rst | 75 ++++++++++ doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 136 ++++++++++++++++++ xinference/model/llm/vllm/core.py | 1 + 9 files changed, 244 insertions(+), 4 deletions(-) create mode 100644 doc/source/models/builtin/audio/belle-whisper-large-v3-zh.rst create mode 100644 doc/source/models/builtin/llm/mixtral-8x22b-instruct-v0.1.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 4a84a1853f..81e36eb7ed 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -46,7 +46,7 @@ Currently, supported models include: - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` - ``qwen-chat`` -- ``mixtral-instruct-v0.1`` +- ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``deepseek-chat``, ``deepseek-coder-instruct`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` diff --git a/doc/source/models/builtin/audio/belle-whisper-large-v3-zh.rst b/doc/source/models/builtin/audio/belle-whisper-large-v3-zh.rst new file mode 100644 index 0000000000..e2e514e97b --- /dev/null +++ b/doc/source/models/builtin/audio/belle-whisper-large-v3-zh.rst @@ -0,0 +1,19 @@ +.. _models_builtin_belle-whisper-large-v3-zh: + +========================= +Belle-whisper-large-v3-zh +========================= + +- **Model Name:** Belle-whisper-large-v3-zh +- **Model Family:** whisper +- **Abilities:** audio-to-text +- **Multilingual:** False + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** BELLE-2/Belle-whisper-large-v3-zh + +Execute the following command to launch the model:: + + xinference launch --model-name Belle-whisper-large-v3-zh --model-type audio \ No newline at end of file diff --git a/doc/source/models/builtin/audio/index.rst b/doc/source/models/builtin/audio/index.rst index 066a79d270..726a634147 100644 --- a/doc/source/models/builtin/audio/index.rst +++ b/doc/source/models/builtin/audio/index.rst @@ -15,6 +15,8 @@ The following is a list of built-in audio models in Xinference: belle-whisper-large-v2-zh + belle-whisper-large-v3-zh + whisper-base whisper-base.en diff --git a/doc/source/models/builtin/llm/codeqwen1.5-chat.rst b/doc/source/models/builtin/llm/codeqwen1.5-chat.rst index 2a5ef3cf32..ff6b7f20b2 100644 --- a/doc/source/models/builtin/llm/codeqwen1.5-chat.rst +++ b/doc/source/models/builtin/llm/codeqwen1.5-chat.rst @@ -4,7 +4,7 @@ codeqwen1.5-chat ======================================== -- **Context Length:** 65536 +- **Context Length:** 32768 - **Model Name:** codeqwen1.5-chat - **Languages:** en, zh - **Abilities:** chat diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 7c8de6f54e..168aa45fb8 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -108,7 +108,7 @@ The following is a list of built-in LLM in Xinference: * - :ref:`codeqwen1.5-chat <models_llm_codeqwen1.5-chat>` - chat - - 65536 + - 32768 - CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes. * - :ref:`codeshell <models_llm_codeshell>` @@ -256,6 +256,11 @@ The following is a list of built-in LLM in Xinference: - 8192 - Mistral-7B is a unmoderated Transformer based LLM claiming to outperform Llama2 on all benchmarks. + * - :ref:`mixtral-8x22b-instruct-v0.1 <models_llm_mixtral-8x22b-instruct-v0.1>` + - chat + - 65536 + - The Mixtral-8x22B-Instruct-v0.1 Large Language Model (LLM) is an instruct fine-tuned version of the Mixtral-8x22B-v0.1, specializing in chatting. + * - :ref:`mixtral-instruct-v0.1 <models_llm_mixtral-instruct-v0.1>` - chat - 32768 @@ -542,6 +547,8 @@ The following is a list of built-in LLM in Xinference: mistral-v0.1 + mixtral-8x22b-instruct-v0.1 + mixtral-instruct-v0.1 mixtral-v0.1 diff --git a/doc/source/models/builtin/llm/mixtral-8x22b-instruct-v0.1.rst b/doc/source/models/builtin/llm/mixtral-8x22b-instruct-v0.1.rst new file mode 100644 index 0000000000..05bb73c76b --- /dev/null +++ b/doc/source/models/builtin/llm/mixtral-8x22b-instruct-v0.1.rst @@ -0,0 +1,75 @@ +.. _models_llm_mixtral-8x22b-instruct-v0.1: + +======================================== +mixtral-8x22B-instruct-v0.1 +======================================== + +- **Context Length:** 65536 +- **Model Name:** mixtral-8x22B-instruct-v0.1 +- **Languages:** en, fr, it, de, es +- **Abilities:** chat +- **Description:** The Mixtral-8x22B-Instruct-v0.1 Large Language Model (LLM) is an instruct fine-tuned version of the Mixtral-8x22B-v0.1, specializing in chatting. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 141 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 141 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** mistralai/Mixtral-8x22B-Instruct-v0.1 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (awq, 141 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 141 +- **Quantizations:** Int4 +- **Model ID:** MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format awq --quantization ${quantization} + + +Model Spec 3 (gptq, 141 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 141 +- **Quantizations:** Int4 +- **Model ID:** jarrelscy/Mixtral-8x22B-Instruct-v0.1-GPTQ-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/jarrelscy/Mixtral-8x22B-Instruct-v0.1-GPTQ-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format gptq --quantization ${quantization} + + +Model Spec 4 (ggufv2, 141 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 141 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_K_M, Q4_K_S, Q5_K_M, Q5_K_S, Q6, Q8_0, fp16 +- **Model ID:** MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 18a7deac45..c457789054 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -55,7 +55,7 @@ Currently, supported model includes: - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` - ``qwen-chat`` -- ``mixtral-instruct-v0.1`` +- ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``deepseek-chat``, ``deepseek-coder-instruct`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index b95bb2f40d..c291b82d18 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -3319,6 +3319,142 @@ "inter_message_sep": "" } }, + { + "version": 1, + "context_length": 65536, + "model_name": "mixtral-8x22B-instruct-v0.1", + "model_lang": [ + "en", + "fr", + "it", + "de", + "es" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Mixtral-8x22B-Instruct-v0.1 Large Language Model (LLM) is an instruct fine-tuned version of the Mixtral-8x22B-v0.1, specializing in chatting.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "141", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "mistralai/Mixtral-8x22B-Instruct-v0.1", + "model_revision": "ebb919ac9e9f7f9a900644621bae7963bc593f4f" + }, + { + "model_format": "awq", + "model_size_in_billions": "141", + "quantizations": [ + "Int4" + ], + "model_id": "MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-AWQ" + }, + { + "model_format": "gptq", + "model_size_in_billions": "141", + "quantizations": [ + "Int4" + ], + "model_id": "jarrelscy/Mixtral-8x22B-Instruct-v0.1-GPTQ-4bit" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": "141", + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_K_M", + "Q4_K_S", + "Q5_K_M", + "Q5_K_S", + "Q6", + "Q8_0", + "fp16" + ], + "model_id": "MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-GGUF", + "model_file_name_template": "Mixtral-8x22B-Instruct-{quantization}.gguf", + "model_file_name_split_template": "Mixtral-8x22B-Instruct-v0.1.{quantization}-{part}.gguf", + "quantization_parts": { + "Q2_K": [ + "00001-of-00003", + "00002-of-00003", + "00003-of-00003" + ], + "Q3_K_L": [ + "00001-of-00002", + "00002-of-00002" + ], + "Q3_K_M": [ + "00001-of-00002", + "00002-of-00002" + ], + "Q3_K_S": [ + "00001-of-00003", + "00002-of-00003", + "00003-of-00003" + ], + "Q4_K_M": [ + "00001-of-00002", + "00002-of-00002" + ], + "Q4_K_S": [ + "00001-of-00002", + "00002-of-00002" + ], + "Q5_K_M": [ + "00001-of-00004", + "00002-of-00004", + "00003-of-00004", + "00004-of-00004" + ], + "Q5_K_S": [ + "00001-of-00004", + "00002-of-00004", + "00003-of-00004", + "00004-of-00004" + ], + "Q6": [ + "00001-of-00004", + "00002-of-00004", + "00003-of-00004", + "00004-of-00004" + ], + "Q8_0": [ + "00001-of-00004", + "00002-of-00004", + "00003-of-00004", + "00004-of-00004" + ], + "fp16": [ + "00001-of-00007", + "00002-of-00007", + "00003-of-00007", + "00004-of-00007", + "00005-of-00007", + "00006-of-00007", + "00007-of-00007" + ] + } + } + ], + "prompt_style": { + "style_name": "MIXTRAL_V01", + "system_prompt": "", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "", + "inter_message_sep": "" + } + }, { "version": 1, "context_length": 4096, diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 130b3ff8a7..6c13875e15 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -110,6 +110,7 @@ class VLLMGenerateConfig(TypedDict, total=False): "mistral-instruct-v0.1", "mistral-instruct-v0.2", "mixtral-instruct-v0.1", + "mixtral-8x22B-instruct-v0.1", "chatglm3", "chatglm3-32k", "chatglm3-128k", From f45420c8987884c5d8c9a73508c62cbb60451a34 Mon Sep 17 00:00:00 2001 From: liuzhenghua <1090179900@qq.com> Date: Fri, 26 Apr 2024 12:41:17 +0800 Subject: [PATCH 040/298] BUG: no role:user msg or content empty got an error. (#1378) Co-authored-by: liuzhenghua-jk <liuzhenghua-jk@360shuke.com> Co-authored-by: codingl2k1 <codingl2k1@outlook.com> --- xinference/api/restful_api.py | 12 ++++-------- xinference/core/tests/test_restful_api.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index bb739c1e41..0bb07439ea 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1284,11 +1284,7 @@ async def create_chat_completion(self, request: Request) -> Response: messages = body.messages and list(body.messages) or None - if ( - not messages - or messages[-1].get("role") not in ["user", "system", "tool"] - or not messages[-1].get("content") - ): + if not messages or messages[-1].get("role") not in ["user", "system", "tool"]: raise HTTPException( status_code=400, detail="Invalid input. Please specify the prompt." ) @@ -1308,15 +1304,15 @@ async def create_chat_completion(self, request: Request) -> Response: {"role": "system", "content": ". ".join(system_messages_contents)} ) - assert non_system_messages - has_tool_message = messages[-1].get("role") == "tool" if has_tool_message: prompt = SPECIAL_TOOL_PROMPT system_prompt = system_messages[0]["content"] if system_messages else None chat_history = non_system_messages # exclude the prompt else: - prompt = non_system_messages[-1]["content"] + prompt = None + if non_system_messages: + prompt = non_system_messages[-1]["content"] system_prompt = system_messages[0]["content"] if system_messages else None chat_history = non_system_messages[:-1] # exclude the prompt diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index 276b38f382..881be28feb 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -104,6 +104,22 @@ async def test_restful_api(setup): response = requests.post(url, json=payload) assert response.status_code == 500 + # chat without user messages + url = f"{endpoint}/v1/chat/completions" + payload = { + "model": model_uid_res, + "messages": [ + { + "role": "system", + "content": "<任务> 识别用户输入的技术术语。请用{XXX} -> {XXX}的格式展示翻译前后的技术术语对应关系。\n<输入文本>\n今天天气\n<示例>\nTransformer -> Transformer\nToken -> Token\nZero Shot -> 零样本\nFew Shot -> 少样本\n<专有名词>", + } + ], + "stop": ["\n"], + } + response = requests.post(url, json=payload) + completion = response.json() + assert "content" in completion["choices"][0]["message"] + # chat url = f"{endpoint}/v1/chat/completions" payload = { From 53baef8c8c061c81e57e547d1b379a885107d4ce Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 26 Apr 2024 16:21:17 +0800 Subject: [PATCH 041/298] ENH: Support more quantization with VLLM (#1372) --- doc/source/getting_started/installation.rst | 3 ++- doc/source/user_guide/backends.rst | 3 ++- xinference/model/llm/vllm/core.py | 22 +++++++++++++++++---- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 81e36eb7ed..1dd115e2f7 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -28,7 +28,8 @@ vLLM is a fast and easy-to-use library for LLM inference and serving. Xinference - The model format is ``pytorch``, ``gptq`` or ``awq``. - When the model format is ``pytorch``, the quantization is ``none``. -- When the model format is ``gptq`` or ``awq``, the quantization is ``Int4``. +- When the model format is ``awq``, the quantization is ``Int4``. +- When the model format is ``gptq``, the quantization is ``Int3``, ``Int4`` or ``Int8``. - The system is Linux and has at least one CUDA device - The model family (for custom models) / model name (for builtin models) is within the list of models supported by vLLM diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index c457789054..a9d57d5da0 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -37,7 +37,8 @@ When the following conditions are met, Xinference will choose vLLM as the infere - The model format is ``pytorch``, ``gptq`` or ``awq``. - When the model format is ``pytorch``, the quantization is ``none``. -- When the model format is ``gptq`` or ``awq``, the quantization is ``Int4``. +- When the model format is ``awq``, the quantization is ``Int4``. +- When the model format is ``gptq``, the quantization is ``Int3``, ``Int4`` or ``Int8``. - The system is Linux and has at least one CUDA device - The model family (for custom models) / model name (for builtin models) is within the list of models supported by vLLM diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 6c13875e15..2ac004cd7a 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -240,10 +240,17 @@ def match( if llm_spec.model_format == "pytorch": if quantization != "none" and not (quantization is None): return False - if llm_spec.model_format in ["gptq", "awq"]: - # Currently, only 4-bit weight quantization is supported for GPTQ, but got 8 bits. + if llm_spec.model_format == "awq": + # Currently, only 4-bit weight quantization is supported for AWQ, but got 8 bits. if "4" not in quantization: return False + if llm_spec.model_format == "gptq": + if VLLM_INSTALLED and vllm.__version__ >= "0.3.3": + if not any(q in quantization for q in ("3", "4", "8")): + return False + else: + if "4" not in quantization: + return False if isinstance(llm_family, CustomLLMFamilyV1): if llm_family.model_family not in VLLM_SUPPORTED_MODELS: return False @@ -417,10 +424,17 @@ def match( if llm_spec.model_format == "pytorch": if quantization != "none" and not (quantization is None): return False - if llm_spec.model_format in ["gptq", "awq"]: - # Currently, only 4-bit weight quantization is supported for GPTQ, but got 8 bits. + if llm_spec.model_format == "awq": + # Currently, only 4-bit weight quantization is supported for AWQ, but got 8 bits. if "4" not in quantization: return False + if llm_spec.model_format == "gptq": + if VLLM_INSTALLED and vllm.__version__ >= "0.3.3": + if not any(q in quantization for q in ("3", "4", "8")): + return False + else: + if "4" not in quantization: + return False if isinstance(llm_family, CustomLLMFamilyV1): if llm_family.model_family not in VLLM_SUPPORTED_CHAT_MODELS: return False From 5a49e63e4508071dca6e4028c24c3b33fe089d08 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Fri, 26 Apr 2024 17:32:48 +0800 Subject: [PATCH 042/298] REF: [UI] Refactor register model (#1368) --- xinference/web/ui/package-lock.json | 34 + xinference/web/ui/package.json | 1 + .../src/scenes/launch_model/launchCustom.js | 268 ++---- .../ui/src/scenes/launch_model/modelCard.js | 70 +- .../components/addControlnet.js | 161 ++++ .../components/addModelSpecs.js | 329 ++++++++ .../scenes/register_model/data/languages.js | 192 +++++ .../web/ui/src/scenes/register_model/index.js | 689 ++------------- .../scenes/register_model/registerModel.js | 793 ++++++++++++++++++ .../register_model/register_embedding.js | 244 ------ .../scenes/register_model/register_rerank.js | 211 ----- .../styles/registerModelStyle.css | 121 +++ 12 files changed, 1815 insertions(+), 1298 deletions(-) create mode 100644 xinference/web/ui/src/scenes/register_model/components/addControlnet.js create mode 100644 xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js create mode 100644 xinference/web/ui/src/scenes/register_model/data/languages.js create mode 100644 xinference/web/ui/src/scenes/register_model/registerModel.js delete mode 100644 xinference/web/ui/src/scenes/register_model/register_embedding.js delete mode 100644 xinference/web/ui/src/scenes/register_model/register_rerank.js create mode 100644 xinference/web/ui/src/scenes/register_model/styles/registerModelStyle.css diff --git a/xinference/web/ui/package-lock.json b/xinference/web/ui/package-lock.json index 4ae5037245..ba47a1b09e 100644 --- a/xinference/web/ui/package-lock.json +++ b/xinference/web/ui/package-lock.json @@ -27,6 +27,7 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "clipboard": "^2.0.11", "formik": "^2.4.2", "prop-types": "^15.8.1", "react": "^18.2.0", @@ -7064,6 +7065,16 @@ "node": ">=0.10.0" } }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -7999,6 +8010,11 @@ "node": ">=0.4.0" } }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -10093,6 +10109,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dependencies": { + "delegate": "^3.1.2" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -17041,6 +17065,11 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -18156,6 +18185,11 @@ "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", diff --git a/xinference/web/ui/package.json b/xinference/web/ui/package.json index 4dced5764d..ed0e6ea1f4 100644 --- a/xinference/web/ui/package.json +++ b/xinference/web/ui/package.json @@ -23,6 +23,7 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "clipboard": "^2.0.11", "formik": "^2.4.2", "prop-types": "^15.8.1", "react": "^18.2.0", diff --git a/xinference/web/ui/src/scenes/launch_model/launchCustom.js b/xinference/web/ui/src/scenes/launch_model/launchCustom.js index d591c77aa4..6d647a11b0 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchCustom.js +++ b/xinference/web/ui/src/scenes/launch_model/launchCustom.js @@ -8,6 +8,8 @@ import fetcher from '../../components/fetcher' import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' +const customType = ['llm', 'embedding', 'rerank', 'image', 'audio'] + const LaunchCustom = ({ gpuAvailable }) => { let endPoint = useContext(ApiContext).endPoint const [registrationData, setRegistrationData] = useState([]) @@ -19,14 +21,16 @@ const LaunchCustom = ({ gpuAvailable }) => { const [value, setValue] = useState(sessionStorage.getItem('subType')) const navigate = useNavigate() - const handleTabChange = (event, newValue) => { + const handleTabChange = (_, newValue) => { + const type = + newValue.split('/')[3] === 'llm' ? 'LLM' : newValue.split('/')[3] + getData(type) setValue(newValue) - update() navigate(newValue) sessionStorage.setItem('subType', newValue) } - const handleChange = (event) => { + const handleSearchChange = (event) => { setSearchTerm(event.target.value) } @@ -38,66 +42,30 @@ const LaunchCustom = ({ gpuAvailable }) => { return modelName.includes(searchTerm.toLowerCase()) } - const update = async () => { - if (isCallingApi || isUpdatingModel) return + useEffect(() => { + const type = sessionStorage.getItem('subType').split('/')[3] + getData(type === 'llm' ? 'LLM' : type) + }, []) + const getData = async (type) => { + if (isCallingApi || isUpdatingModel) return try { setIsCallingApi(true) - - const rerankResponse = await fetcher( - `${endPoint}/v1/model_registrations/rerank`, - { - method: 'GET', - } - ) - const rerankRegistrations = await rerankResponse.json() - const customRerankRegistrations = rerankRegistrations.filter( - (data) => !data.is_builtin - ) - - const embeddingResponse = await fetcher( - `${endPoint}/v1/model_registrations/embedding`, + const response = await fetcher( + `${endPoint}/v1/model_registrations/${type}`, { method: 'GET', } ) - - const embeddingRegistrations = await embeddingResponse.json() - const customEmbeddingRegistrations = embeddingRegistrations.filter( + const registrations = await response.json() + const customRegistrations = registrations.filter( (data) => !data.is_builtin ) - const llmResponse = await fetcher( - `${endPoint}/v1/model_registrations/LLM`, - { - method: 'GET', - } - ) - const llmRegistrations = await llmResponse.json() - const customLLMRegistrations = llmRegistrations.filter( - (data) => !data.is_builtin - ) - - const newEmbeddingData = await Promise.all( - customEmbeddingRegistrations.map(async (registration) => { - const desc = await fetcher( - `${endPoint}/v1/model_registrations/embedding/${registration.model_name}`, - { - method: 'GET', - } - ) - - return { - ...(await desc.json()), - is_builtin: registration.is_builtin, - } - }) - ) - - const newLLMData = await Promise.all( - customLLMRegistrations.map(async (registration) => { + const newData = await Promise.all( + customRegistrations.map(async (registration) => { const desc = await fetcher( - `${endPoint}/v1/model_registrations/LLM/${registration.model_name}`, + `${endPoint}/v1/model_registrations/${type}/${registration.model_name}`, { method: 'GET', } @@ -109,26 +77,7 @@ const LaunchCustom = ({ gpuAvailable }) => { } }) ) - - const newRerankData = await Promise.all( - customRerankRegistrations.map(async (registration) => { - const desc = await fetcher( - `${endPoint}/v1/model_registrations/rerank/${registration.model_name}`, - { - method: 'GET', - } - ) - - return { - ...(await desc.json()), - is_builtin: registration.is_builtin, - } - }) - ) - - setRegistrationData( - newLLMData.concat(newEmbeddingData).concat(newRerankData) - ) + setRegistrationData(newData) } catch (error) { console.error('Error:', error) } finally { @@ -136,10 +85,6 @@ const LaunchCustom = ({ gpuAvailable }) => { } } - useEffect(() => { - update() - }, []) - const style = { display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', @@ -159,138 +104,51 @@ const LaunchCustom = ({ gpuAvailable }) => { value="/launch_model/custom/embedding" /> <Tab label="Rerank Models" value="/launch_model/custom/rerank" /> + <Tab label="Image Models" value="/launch_model/custom/image" /> + <Tab label="Audio Models" value="/launch_model/custom/audio" /> </TabList> </Box> - <TabPanel value="/launch_model/custom/llm" sx={{ padding: 0 }}> - <div - style={{ - display: 'grid', - gridTemplateColumns: '1fr', - margin: '30px 2rem', - }} - > - <FormControl variant="outlined" margin="normal"> - <HotkeyFocusTextField - id="search" - type="search" - label="Search for custom model name" - value={searchTerm} - onChange={handleChange} - size="small" - hotkey="/" - /> - </FormControl> - </div> - <div style={style}> - {registrationData - .filter((registration) => filter(registration)) - .map((filteredRegistration) => { - if ( - !( - filteredRegistration.max_tokens && - filteredRegistration.dimensions - ) && - !( - filteredRegistration.model_type && - filteredRegistration.model_type === 'rerank' - ) - ) { - return ( - <ModelCard - key={filteredRegistration.model_name} - url={endPoint} - modelData={filteredRegistration} - gpuAvailable={gpuAvailable} - is_custom={true} - modelType="LLM" - /> - ) - } - })} - </div> - </TabPanel> - <TabPanel value="/launch_model/custom/embedding" sx={{ padding: 0 }}> - <div - style={{ - display: 'grid', - gridTemplateColumns: '1fr', - margin: '30px 2rem', - }} - > - <FormControl variant="outlined" margin="normal"> - <HotkeyFocusTextField - id="search" - type="search" - label="Search for custom model name" - value={searchTerm} - onChange={handleChange} - size="small" - hotkey="/" - /> - </FormControl> - </div> - <div style={style}> - {registrationData - .filter((registration) => filter(registration)) - .map((filteredRegistration) => { - if ( - filteredRegistration.max_tokens && - filteredRegistration.dimensions - ) { - return ( - <ModelCard - key={filteredRegistration.model_name} - url={endPoint} - modelData={filteredRegistration} - is_custom={true} - modelType="embedding" - /> - ) - } - })} - </div> - </TabPanel> - <TabPanel value="/launch_model/custom/rerank" sx={{ padding: 0 }}> - <div - style={{ - display: 'grid', - gridTemplateColumns: '1fr', - margin: '30px 2rem', - }} + {customType.map((item) => ( + <TabPanel + key={item} + value={`/launch_model/custom/${item}`} + sx={{ padding: 0 }} > - <FormControl variant="outlined" margin="normal"> - <HotkeyFocusTextField - id="search" - type="search" - label="Search for custom model name" - value={searchTerm} - onChange={handleChange} - size="small" - hotkey="/" - /> - </FormControl> - </div> - <div style={style}> - {registrationData - .filter((registration) => filter(registration)) - .map((filteredRegistration) => { - if ( - filteredRegistration.model_type && - filteredRegistration.model_type === 'rerank' - ) { - return ( - <ModelCard - key={filteredRegistration.model_name} - url={endPoint} - modelData={filteredRegistration} - is_custom={true} - modelType="rerank" - /> - ) - } - })} - </div> - </TabPanel> + <div + style={{ + display: 'grid', + gridTemplateColumns: '1fr', + margin: '30px 2rem', + }} + > + <FormControl variant="outlined" margin="normal"> + <HotkeyFocusTextField + id="search" + type="search" + label="Search for custom model name" + value={searchTerm} + onChange={handleSearchChange} + size="small" + hotkey="/" + /> + </FormControl> + </div> + <div style={style}> + {registrationData + .filter((registration) => filter(registration)) + .map((filteredRegistration) => ( + <ModelCard + key={filteredRegistration.model_name} + url={endPoint} + modelData={filteredRegistration} + gpuAvailable={gpuAvailable} + is_custom={true} + modelType={item === 'llm' ? 'LLM' : item} + /> + ))} + </div> + </TabPanel> + ))} </TabContext> </Box> ) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 6220bad16b..9166fae71c 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -282,16 +282,26 @@ const ModelCard = ({ const handeCustomDelete = (e) => { e.stopPropagation() - fetcher(url + `/v1/model_registrations/LLM/${modelData.model_name}`, { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, - }) - .then(() => { - setCustomDeleted(true) - }) - .catch(console.error) + const subType = sessionStorage.getItem('subType').split('/') + if (subType) { + subType[3] + fetcher( + url + + `/v1/model_registrations/${ + subType[3] === 'llm' ? 'LLM' : subType[3] + }/${modelData.model_name}`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + } + ) + .then(() => { + setCustomDeleted(true) + }) + .catch(console.error) + } } const judgeArr = (arr, keysArr) => { @@ -373,15 +383,19 @@ const ModelCard = ({ flexWrap="wrap" sx={{ marginLeft: 1 }} > + {modelData.model_lang && + (() => { + return modelData.model_lang.map((v) => { + return ( + <Chip key={v} label={v} variant="outlined" size="small" /> + ) + }) + })()} {(() => { - return modelData.model_lang.map((v) => { - return ( - <Chip key={v} label={v} variant="outlined" size="small" /> - ) - }) - })()} - {(() => { - if (modelData.model_specs.some((spec) => isCached(spec))) { + if ( + modelData.model_specs && + modelData.model_specs.some((spec) => isCached(spec)) + ) { return <Chip label="Cached" variant="outlined" size="small" /> } })()} @@ -405,14 +419,20 @@ const ModelCard = ({ <small style={styles.smallText}>context length</small> </div> {(() => { - if (modelData.model_ability.includes('chat')) { + if ( + modelData.model_ability && + modelData.model_ability.includes('chat') + ) { return ( <div style={styles.iconItem}> <ChatOutlined style={styles.muiIcon} /> <small style={styles.smallText}>chat model</small> </div> ) - } else if (modelData.model_ability.includes('generate')) { + } else if ( + modelData.model_ability && + modelData.model_ability.includes('generate') + ) { return ( <div style={styles.iconItem}> <EditNoteOutlined style={styles.muiIcon} /> @@ -503,7 +523,10 @@ const ModelCard = ({ )} <Drawer open={selected} - onClose={() => setSelected(false)} + onClose={() => { + setSelected(false) + setHover(false) + }} anchor={'right'} > <div style={styles.drawerCard}> @@ -904,7 +927,10 @@ const ModelCard = ({ <button title="Go Back" style={styles.buttonContainer} - onClick={() => setSelected(false)} + onClick={() => { + setSelected(false) + setHover(false) + }} > <Box style={styles.buttonItem}> <UndoOutlined color="#000000" size="20px" /> diff --git a/xinference/web/ui/src/scenes/register_model/components/addControlnet.js b/xinference/web/ui/src/scenes/register_model/components/addControlnet.js new file mode 100644 index 0000000000..649c3479f6 --- /dev/null +++ b/xinference/web/ui/src/scenes/register_model/components/addControlnet.js @@ -0,0 +1,161 @@ +import AddIcon from '@mui/icons-material/Add' +import DeleteIcon from '@mui/icons-material/Delete' +import { + Box, + Button, + FormControlLabel, + Radio, + RadioGroup, + TextField, + Tooltip, +} from '@mui/material' +import React, { useEffect, useState } from 'react' + +const AddControlnet = ({ onGetControlnetArr, scrollRef }) => { + const [count, setCount] = useState(0) + const [controlnetArr, setControlnetArr] = useState([]) + const [arrLength, setArrLength] = useState(0) + + useEffect(() => { + const arr = controlnetArr.map((item) => { + const { model_name: name, model_uri: uri, model_family } = item + return { + model_name: name, + model_uri: uri, + model_family, + } + }) + onGetControlnetArr(arr) + setArrLength(controlnetArr.length) + arrLength < controlnetArr.length ? handleScrollBottom() : '' + }, [controlnetArr]) + + const handleAddControlnet = () => { + setCount(count + 1) + const item = { + id: count, + model_name: 'custom-controlnet', + model_uri: '/path/to/controlnet-model', + model_family: 'controlnet', + } + setControlnetArr([...controlnetArr, item]) + } + + const handleUpdateSpecsArr = (index, type, newValue) => { + setControlnetArr( + controlnetArr.map((item, subIndex) => { + if (subIndex === index) { + return { ...item, [type]: newValue } + } + return item + }) + ) + } + + const handleDeleteControlnet = (index) => { + setControlnetArr(controlnetArr.filter((_, subIndex) => index !== subIndex)) + } + + const handleScrollBottom = () => { + scrollRef.current.scrollTo({ + top: scrollRef.current.scrollHeight, + behavior: 'smooth', + }) + } + + return ( + <> + <div> + <label style={{ marginBottom: '20px' }}>Controlnet</label> + <Button + variant="contained" + size="small" + endIcon={<AddIcon />} + className="addBtn" + onClick={handleAddControlnet} + > + more + </Button> + </div> + <div className="specs_container"> + {controlnetArr.map((item, index) => ( + <div className="item" key={item.id}> + <TextField + error={item.model_name !== '' ? false : true} + style={{ minWidth: '60%', marginTop: '10px' }} + label="Model Name" + size="small" + value={item.model_name} + onChange={(e) => { + handleUpdateSpecsArr(index, 'model_name', e.target.value) + }} + /> + <Box padding="15px"></Box> + + <TextField + error={item.model_uri !== '' ? false : true} + style={{ minWidth: '60%' }} + label="Model Path" + size="small" + value={item.model_uri} + onChange={(e) => { + handleUpdateSpecsArr(index, 'model_uri', e.target.value) + }} + /> + <Box padding="15px"></Box> + + <label + style={{ + paddingLeft: 5, + }} + > + Model Format + </label> + <RadioGroup + value={item.model_format} + onChange={(e) => { + handleUpdateSpecsArr(index, 'model_format', e.target.value) + }} + > + <Box sx={styles.checkboxWrapper}> + <Box key={item} sx={{ marginLeft: '10px' }}> + <FormControlLabel + value="controlnet" + checked + control={<Radio />} + label="controlnet" + /> + </Box> + </Box> + </RadioGroup> + + <Tooltip title="Delete specs" placement="top"> + <div + className="deleteBtn" + onClick={() => handleDeleteControlnet(index)} + > + <DeleteIcon className="deleteIcon" /> + </div> + </Tooltip> + </div> + ))} + </div> + </> + ) +} + +export default AddControlnet + +const styles = { + baseFormControl: { + width: '100%', + margin: 'normal', + size: 'small', + }, + checkboxWrapper: { + display: 'flex', + flexWrap: 'wrap', + alignItems: 'center', + width: '100%', + }, +} diff --git a/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js b/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js new file mode 100644 index 0000000000..5e898af7fb --- /dev/null +++ b/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js @@ -0,0 +1,329 @@ +import AddIcon from '@mui/icons-material/Add' +import DeleteIcon from '@mui/icons-material/Delete' +import { + Alert, + Box, + Button, + FormControlLabel, + Radio, + RadioGroup, + TextField, + Tooltip, +} from '@mui/material' +import React, { useEffect, useState } from 'react' + +const modelFormatArr = [ + { value: 'pytorch', label: 'PyTorch' }, + { value: 'ggmlv3', label: 'GGML' }, + { value: 'ggufv2', label: 'GGUF' }, + { value: 'gptq', label: 'GPTQ' }, + { value: 'awq', label: 'AWQ' }, +] + +const AddModelSpecs = ({ formData, onGetArr, scrollRef }) => { + const [count, setCount] = useState(1) + const [specsArr, setSpecsArr] = useState([ + { + id: 0, + ...formData, + }, + ]) + const [path, setPath] = useState('/path/to/llama-2') + const [modelSizeAlertId, setModelSizeAlertId] = useState([]) + const [quantizationAlertId, setQuantizationAlertId] = useState([]) + const [isError, setIsError] = useState(false) + const [arrLength, setArrLength] = useState(1) + + useEffect(() => { + const arr = specsArr.map((item) => { + const { + model_uri: uri, + model_size_in_billions: size, + model_format: modelFormat, + quantizations, + model_file_name_template, + } = item + const handleSize = + parseInt(size) === parseFloat(size) + ? Number(size) + : size.split('.').join('_') + + let handleQuantization = quantizations + if (modelFormat === 'pytorch') { + handleQuantization = ['none'] + } else if ( + handleQuantization[0] === '' && + (modelFormat === 'ggmlv3' || modelFormat === 'ggufv2') + ) { + handleQuantization = ['default'] + } + + return { + model_uri: uri, + model_size_in_billions: handleSize, + model_format: modelFormat, + quantizations: handleQuantization, + model_file_name_template, + } + }) + setIsError(true) + if (modelSizeAlertId.length === 0 && quantizationAlertId.length === 0) { + setIsError(false) + } + onGetArr(arr, isError) + setArrLength(specsArr.length) + arrLength < specsArr.length ? handleScrollBottom() : '' + }, [specsArr, isError]) + + const handleAddSpecs = () => { + setCount(count + 1) + const item = { + id: count, + model_uri: '/path/to/llama-2', + model_size_in_billions: 7, + model_format: 'pytorch', + quantizations: [], + } + setSpecsArr([...specsArr, item]) + } + + const handleUpdateSpecsArr = (index, type, newValue) => { + setSpecsArr( + specsArr.map((item, subIndex) => { + if (subIndex === index) { + if (type === 'quantizations') { + return { ...item, [type]: [newValue] } + } else if (type === 'model_format') { + if (newValue === 'ggmlv3' || newValue === 'ggufv2') { + const { baseDir, filename } = getPathComponents(path) + const obj = { + ...item, + model_format: newValue, + quantizations: [''], + model_uri: baseDir, + model_file_name_template: filename, + } + return obj + } else { + const { id, model_size_in_billions, model_format } = item + return { + id, + model_uri: path, + model_size_in_billions, + model_format, + [type]: newValue, + quantizations: [''], + } + } + } else if (type === 'model_uri') { + setPath(newValue) + if ( + item.model_format === 'ggmlv3' || + item.model_format === 'ggufv2' + ) { + const { baseDir, filename } = getPathComponents(newValue) + const obj = { + ...item, + model_uri: baseDir, + model_file_name_template: filename, + } + return obj + } else { + return { ...item, [type]: newValue } + } + } else { + return { ...item, [type]: newValue } + } + } + return item + }) + ) + } + + const handleDeleteSpecs = (index) => { + setSpecsArr(specsArr.filter((_, subIndex) => index !== subIndex)) + } + + const getPathComponents = (path) => { + const normalizedPath = path.replace(/\\/g, '/') + const baseDir = normalizedPath.substring(0, normalizedPath.lastIndexOf('/')) + const filename = normalizedPath.substring( + normalizedPath.lastIndexOf('/') + 1 + ) + return { baseDir, filename } + } + + const handleModelSize = (index, value, id) => { + setModelSizeAlertId(modelSizeAlertId.filter((item) => item !== id)) + handleUpdateSpecsArr(index, 'model_size_in_billions', value) + if (value !== '' && (!Number(value) || Number(value) <= 0)) { + const modelSizeAlertIdArr = Array.from(new Set([...modelSizeAlertId, id])) + setModelSizeAlertId(modelSizeAlertIdArr) + } + } + + const handleQuantization = (model_format, index, value, id) => { + setQuantizationAlertId(quantizationAlertId.filter((item) => item !== id)) + handleUpdateSpecsArr(index, 'quantizations', value) + if ((model_format === 'gptq' || model_format === 'awq') && value === '') { + const quantizationAlertIdArr = Array.from( + new Set([...quantizationAlertId, id]) + ) + setQuantizationAlertId(quantizationAlertIdArr) + } + } + + const handleScrollBottom = () => { + scrollRef.current.scrollTo({ + top: scrollRef.current.scrollHeight, + behavior: 'smooth', + }) + } + + return ( + <> + <div> + <label style={{ marginBottom: '20px' }}>Model Specs</label> + <Button + variant="contained" + size="small" + endIcon={<AddIcon />} + className="addBtn" + onClick={handleAddSpecs} + > + more + </Button> + </div> + <div className="specs_container"> + {specsArr.map((item, index) => ( + <div className="item" key={item.id}> + <label + style={{ + paddingLeft: 5, + }} + > + Model Format + </label> + <RadioGroup + value={item.model_format} + onChange={(e) => { + handleUpdateSpecsArr(index, 'model_format', e.target.value) + if (e.target.value === 'gptq' || e.target.value === 'awq') { + const quantizationAlertIdArr = Array.from( + new Set([...quantizationAlertId, item.id]) + ) + setQuantizationAlertId(quantizationAlertIdArr) + } + }} + > + <Box sx={styles.checkboxWrapper}> + {modelFormatArr.map((item) => ( + <Box key={item.value} sx={{ marginLeft: '10px' }}> + <FormControlLabel + value={item.value} + control={<Radio />} + label={item.label} + /> + </Box> + ))} + </Box> + </RadioGroup> + <Box padding="15px"></Box> + + <TextField + error={item.model_uri !== '' ? false : true} + style={{ minWidth: '60%' }} + label="Model Path" + size="small" + value={path} + onChange={(e) => { + handleUpdateSpecsArr(index, 'model_uri', e.target.value) + }} + helperText="For PyTorch, provide the model directory. For GGML/GGUF, provide the model file path." + /> + <Box padding="15px"></Box> + + <TextField + error={Number(item.model_size_in_billions) > 0 ? false : true} + label="Model Size in Billions" + size="small" + value={item.model_size_in_billions} + onChange={(e) => { + handleModelSize(index, e.target.value, item.id) + }} + /> + {modelSizeAlertId.includes(item.id) && ( + <Alert severity="error"> + Please enter a number greater than 0. + </Alert> + )} + <Box padding="15px"></Box> + + {item.model_format !== 'pytorch' && ( + <> + <TextField + style={{ minWidth: '60%' }} + label={ + item.model_format === 'gptq' || item.model_format === 'awq' + ? 'Quantization' + : 'Quantization (Optional)' + } + size="small" + value={item.quantizations[0]} + onChange={(e) => { + handleQuantization( + item.model_format, + index, + e.target.value, + item.id + ) + }} + helperText={ + item.model_format === 'gptq' || item.model_format === 'awq' + ? 'For GPTQ/AWQ models, please be careful to fill in the quantization corresponding to the model you want to register.' + : '' + } + /> + {item.model_format !== 'ggmlv3' && + item.model_format !== 'ggufv2' && + quantizationAlertId.includes(item.id) && + item.quantizations[0] == '' && ( + <Alert severity="error"> + Quantization cannot be left empty. + </Alert> + )} + </> + )} + + {specsArr.length > 1 && ( + <Tooltip title="Delete specs" placement="top"> + <div + className="deleteBtn" + onClick={() => handleDeleteSpecs(index)} + > + <DeleteIcon className="deleteIcon" /> + </div> + </Tooltip> + )} + </div> + ))} + </div> + </> + ) +} + +export default AddModelSpecs + +const styles = { + baseFormControl: { + width: '100%', + margin: 'normal', + size: 'small', + }, + checkboxWrapper: { + display: 'flex', + flexWrap: 'wrap', + alignItems: 'center', + width: '100%', + }, +} diff --git a/xinference/web/ui/src/scenes/register_model/data/languages.js b/xinference/web/ui/src/scenes/register_model/data/languages.js new file mode 100644 index 0000000000..a765da20c2 --- /dev/null +++ b/xinference/web/ui/src/scenes/register_model/data/languages.js @@ -0,0 +1,192 @@ +const languagesArr = [ + { code: 'ab', language: 'Abkhazian' }, + { code: 'aa', language: 'Afar' }, + { code: 'af', language: 'Afrikaans' }, + { code: 'ak', language: 'Akan' }, + { code: 'sq', language: 'Albanian' }, + { code: 'am', language: 'Amharic' }, + { code: 'ar', language: 'Arabic' }, + { code: 'an', language: 'Aragonese' }, + { code: 'hy', language: 'Armenian' }, + { code: 'as', language: 'Assamese' }, + { code: 'av', language: 'Avaric' }, + { code: 'ae', language: 'Avestan' }, + { code: 'ay', language: 'Aymara' }, + { code: 'az', language: 'Azerbaijani' }, + { code: 'bm', language: 'Bambara' }, + { code: 'ba', language: 'Bashkir' }, + { code: 'eu', language: 'Basque' }, + { code: 'be', language: 'Belarusian' }, + { code: 'bn', language: 'Bengali' }, + { code: 'bh', language: 'Bihari' }, + { code: 'bi', language: 'Bislama' }, + { code: 'bs', language: 'Bosnian' }, + { code: 'br', language: 'Breton' }, + { code: 'bg', language: 'Bulgarian' }, + { code: 'my', language: 'Burmese' }, + { code: 'ca', language: 'Catalan, Valencian' }, + { code: 'ch', language: 'Chamorro' }, + { code: 'ce', language: 'Chechen' }, + { code: 'ny', language: 'Chichewa, Chewa, Nyanja' }, + // { code: 'zh', language: 'Chinese' }, + { code: 'cv', language: 'Chuvash' }, + { code: 'kw', language: 'Cornish' }, + { code: 'co', language: 'Corsican' }, + { code: 'cr', language: 'Cree' }, + { code: 'hr', language: 'Croatian' }, + { code: 'cs', language: 'Czech' }, + { code: 'da', language: 'Danish' }, + { code: 'dv', language: 'Divehi, Dhivehi, Maldivian' }, + { code: 'nl', language: 'Dutch, Flemish' }, + { code: 'dz', language: 'Dzongkha' }, + // { code: 'en', language: 'English' }, + { code: 'eo', language: 'Esperanto' }, + { code: 'et', language: 'Estonian' }, + { code: 'ee', language: 'Ewe' }, + { code: 'fo', language: 'Faroese' }, + { code: 'fj', language: 'Fijian' }, + { code: 'fi', language: 'Finnish' }, + { code: 'fr', language: 'French' }, + { code: 'ff', language: 'Fulah' }, + { code: 'gl', language: 'Galician' }, + { code: 'ka', language: 'Georgian' }, + { code: 'de', language: 'German' }, + { code: 'el', language: 'Greek' }, + { code: 'gn', language: 'Guarani' }, + { code: 'gu', language: 'Gujarati' }, + { code: 'ht', language: 'Haitian, Haitian Creole' }, + { code: 'ha', language: 'Hausa' }, + { code: 'he', language: 'Hebrew' }, + { code: 'hz', language: 'Herero' }, + { code: 'hi', language: 'Hindi' }, + { code: 'ho', language: 'Hiri Motu' }, + { code: 'hu', language: 'Hungarian' }, + { code: 'ia', language: 'Interlingua' }, + { code: 'id', language: 'Indonesian' }, + { code: 'ie', language: 'Interlingue, Occidental' }, + { code: 'ga', language: 'Irish' }, + { code: 'ig', language: 'Igbo' }, + { code: 'ik', language: 'Inupiaq' }, + { code: 'io', language: 'Ido' }, + { code: 'is', language: 'Icelandic' }, + { code: 'it', language: 'Italian' }, + { code: 'iu', language: 'Inuktitut' }, + { code: 'ja', language: 'Japanese' }, + { code: 'jv', language: 'Javanese' }, + { code: 'kl', language: 'Kalaallisut, Greenlandic' }, + { code: 'kn', language: 'Kannada' }, + { code: 'kr', language: 'Kanuri' }, + { code: 'ks', language: 'Kashmiri' }, + { code: 'kk', language: 'Kazakh' }, + { code: 'km', language: 'Central Khmer' }, + { code: 'ki', language: 'Kikuyu, Gikuyu' }, + { code: 'rw', language: 'Kinyarwanda' }, + { code: 'ky', language: 'Kirghiz, Kyrgyz' }, + { code: 'kv', language: 'Komi' }, + { code: 'kg', language: 'Kongo' }, + { code: 'ko', language: 'Korean' }, + { code: 'ku', language: 'Kurdish' }, + { code: 'kj', language: 'Kuanyama, Kwanyama' }, + { code: 'la', language: 'Latin' }, + { code: 'lb', language: 'Luxembourgish, Letzeburgesch' }, + { code: 'lg', language: 'Ganda' }, + { code: 'li', language: 'Limburgan, Limburger, Limburgish' }, + { code: 'ln', language: 'Lingala' }, + { code: 'lo', language: 'Lao' }, + { code: 'lt', language: 'Lithuanian' }, + { code: 'lu', language: 'Luba-Katanga' }, + { code: 'lv', language: 'Latvian' }, + { code: 'gv', language: 'Manx' }, + { code: 'mk', language: 'Macedonian' }, + { code: 'mg', language: 'Malagasy' }, + { code: 'ms', language: 'Malay' }, + { code: 'ml', language: 'Malayalam' }, + { code: 'mt', language: 'Maltese' }, + { code: 'mi', language: 'Maori' }, + { code: 'mr', language: 'Marathi' }, + { code: 'mh', language: 'Marshallese' }, + { code: 'mn', language: 'Mongolian' }, + { code: 'na', language: 'Nauru' }, + { code: 'nv', language: 'Navajo, Navaho' }, + { code: 'nd', language: 'North Ndebele' }, + { code: 'ne', language: 'Nepali' }, + { code: 'ng', language: 'Ndonga' }, + { code: 'nb', language: 'Norwegian Bokmål' }, + { code: 'nn', language: 'Norwegian Nynorsk' }, + { code: 'no', language: 'Norwegian' }, + { code: 'ii', language: 'Sichuan Yi, Nuosu' }, + { code: 'nr', language: 'South Ndebele' }, + { code: 'oc', language: 'Occitan' }, + { code: 'oj', language: 'Ojibwa' }, + { + code: 'cu', + language: + 'Church Slavic, Old Slavonic, Church Slavonic, Old Bulgarian, Old Church Slavonic', + }, + { code: 'om', language: 'Oromo' }, + { code: 'or', language: 'Oriya' }, + { code: 'os', language: 'Ossetian, Ossetic' }, + { code: 'pa', language: 'Punjabi, Panjabi' }, + { code: 'pi', language: 'Pali' }, + { code: 'fa', language: 'Persian' }, + { code: 'pl', language: 'Polish' }, + { code: 'ps', language: 'Pashto, Pushto' }, + { code: 'pt', language: 'Portuguese' }, + { code: 'qu', language: 'Quechua' }, + { code: 'rm', language: 'Romansh' }, + { code: 'rn', language: 'Rundi' }, + { code: 'ro', language: 'Romanian, Moldavian, Moldovan' }, + { code: 'ru', language: 'Russian' }, + { code: 'sa', language: 'Sanskrit' }, + { code: 'sc', language: 'Sardinian' }, + { code: 'sd', language: 'Sindhi' }, + { code: 'se', language: 'Northern Sami' }, + { code: 'sm', language: 'Samoan' }, + { code: 'sg', language: 'Sango' }, + { code: 'sr', language: 'Serbian' }, + { code: 'gd', language: 'Gaelic, Scottish Gaelic' }, + { code: 'sn', language: 'Shona' }, + { code: 'si', language: 'Sinhala, Sinhalese' }, + { code: 'sk', language: 'Slovak' }, + { code: 'sl', language: 'Slovenian' }, + { code: 'so', language: 'Somali' }, + { code: 'st', language: 'Southern Sotho' }, + { code: 'es', language: 'Spanish, Castilian' }, + { code: 'su', language: 'Sundanese' }, + { code: 'sw', language: 'Swahili' }, + { code: 'ss', language: 'Swati' }, + { code: 'sv', language: 'Swedish' }, + { code: 'ta', language: 'Tamil' }, + { code: 'te', language: 'Telugu' }, + { code: 'tg', language: 'Tajik' }, + { code: 'th', language: 'Thai' }, + { code: 'ti', language: 'Tigrinya' }, + { code: 'bo', language: 'Tibetan' }, + { code: 'tk', language: 'Turkmen' }, + { code: 'tl', language: 'Tagalog' }, + { code: 'tn', language: 'Tswana' }, + { code: 'to', language: 'Tonga' }, + { code: 'tr', language: 'Turkish' }, + { code: 'ts', language: 'Tsonga' }, + { code: 'tt', language: 'Tatar' }, + { code: 'tw', language: 'Twi' }, + { code: 'ty', language: 'Tahitian' }, + { code: 'ug', language: 'Uighur, Uyghur' }, + { code: 'uk', language: 'Ukrainian' }, + { code: 'ur', language: 'Urdu' }, + { code: 'uz', language: 'Uzbek' }, + { code: 've', language: 'Venda' }, + { code: 'vi', language: 'Vietnamese' }, + { code: 'vo', language: 'Volapük' }, + { code: 'wa', language: 'Walloon' }, + { code: 'cy', language: 'Welsh' }, + { code: 'wo', language: 'Wolof' }, + { code: 'fy', language: 'West Frisian' }, + { code: 'xh', language: 'Xhosa' }, + { code: 'yi', language: 'Yiddish' }, + { code: 'yo', language: 'Yoruba' }, + { code: 'za', language: 'Zhuang, Chuang' }, + { code: 'zu', language: 'Zulu' }, +] + +export default languagesArr diff --git a/xinference/web/ui/src/scenes/register_model/index.js b/xinference/web/ui/src/scenes/register_model/index.js index 2b4302aaff..1050c80323 100644 --- a/xinference/web/ui/src/scenes/register_model/index.js +++ b/xinference/web/ui/src/scenes/register_model/index.js @@ -1,91 +1,18 @@ import { TabContext, TabList, TabPanel } from '@mui/lab' -import { - Box, - Checkbox, - FormControl, - FormControlLabel, - FormHelperText, - Radio, - RadioGroup, - Tab, -} from '@mui/material' -import Alert from '@mui/material/Alert' -import AlertTitle from '@mui/material/AlertTitle' -import Button from '@mui/material/Button' -import TextField from '@mui/material/TextField' -import React, { useContext, useEffect, useState } from 'react' +import { Box, Tab } from '@mui/material' +import React, { useEffect } from 'react' import { useCookies } from 'react-cookie' import { useNavigate } from 'react-router-dom' -import { ApiContext } from '../../components/apiContext' import ErrorMessageSnackBar from '../../components/errorMessageSnackBar' -import fetcher from '../../components/fetcher' import Title from '../../components/Title' -import { useMode } from '../../theme' -import RegisterEmbeddingModel from './register_embedding' -import RegisterRerankModel from './register_rerank' - -const SUPPORTED_LANGUAGES_DICT = { en: 'English', zh: 'Chinese' } -const SUPPORTED_FEATURES = ['Generate', 'Chat'] - -// Convert dictionary of supported languages into list -const SUPPORTED_LANGUAGES = Object.keys(SUPPORTED_LANGUAGES_DICT) +import RegisterModelComponent from './registerModel' const RegisterModel = () => { - const ERROR_COLOR = useMode() - const endPoint = useContext(ApiContext).endPoint - const { setErrorMsg } = useContext(ApiContext) - const [successMsg, setSuccessMsg] = useState('') - const [modelFormat, setModelFormat] = useState('pytorch') - const [modelSize, setModelSize] = useState(7) - const [modelUri, setModelUri] = useState('/path/to/llama-2') - const [quantization, setQuantization] = useState('') - const [formData, setFormData] = useState({ - version: 1, - context_length: 2048, - model_name: 'custom-llama-2', - model_lang: ['en'], - model_ability: ['generate'], - model_description: 'This is a custom model description.', - model_family: '', - model_specs: [], - prompt_style: undefined, - }) - const [promptStyles, setPromptStyles] = useState([]) - const [family, setFamily] = useState({ - chat: [], - generate: [], - }) - const [familyLabel, setFamilyLabel] = useState('') - const [tabValue, setTabValue] = React.useState('1') + const [tabValue, setTabValue] = React.useState('/register_model/llm') const [cookie] = useCookies(['token']) const navigate = useNavigate() - const errorModelName = formData.model_name.trim().length <= 0 - const errorModelDescription = formData.model_description.length < 0 - const errorContextLength = formData.context_length === 0 - const errorLanguage = - formData.model_lang === undefined || formData.model_lang.length === 0 - const errorAbility = - formData.model_ability === undefined || formData.model_ability.length === 0 - const errorModelSize = - formData.model_specs && - formData.model_specs.some((spec) => { - return ( - spec.model_size_in_billions === undefined || - spec.model_size_in_billions === 0 - ) - }) - const errorFamily = familyLabel === '' - const errorAny = - errorModelName || - errorModelDescription || - errorContextLength || - errorLanguage || - errorAbility || - errorModelSize || - errorFamily - useEffect(() => { if (cookie.token === '' || cookie.token === undefined) { return @@ -94,232 +21,8 @@ const RegisterModel = () => { navigate('/login', { replace: true }) return } - - const getBuiltinFamilies = async () => { - const response = await fetch(endPoint + '/v1/models/families', { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }) - if (!response.ok) { - const errorData = await response.json() // Assuming the server returns error details in JSON format - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - } else { - const data = await response.json() - data.chat.push('other') - data.generate.push('other') - setFamily(data) - } - } - - const getBuiltInPromptStyles = async () => { - const response = await fetch(endPoint + '/v1/models/prompts', { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }) - if (!response.ok) { - const errorData = await response.json() // Assuming the server returns error details in JSON format - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - } else { - const data = await response.json() - let res = [] - for (const key in data) { - let v = data[key] - v['name'] = key - res.push(v) - } - setPromptStyles(res) - } - } - // avoid keep requesting backend to get prompts - if (promptStyles.length === 0) { - getBuiltInPromptStyles().catch((error) => { - setErrorMsg( - error.message || - 'An unexpected error occurred when getting builtin prompt styles.' - ) - console.error('Error: ', error) - }) - } - if (family.chat.length === 0) { - getBuiltinFamilies().catch((error) => { - setErrorMsg( - error.message || - 'An unexpected error occurred when getting builtin prompt styles.' - ) - console.error('Error: ', error) - }) - } }, [cookie.token]) - const getFamilyByAbility = () => { - if (formData.model_ability.includes('chat')) { - return family.chat - } else { - return family.generate - } - } - - const isModelFormatPytorch = () => { - return modelFormat === 'pytorch' - } - - const isModelFormatGPTQ = () => { - return modelFormat === 'gptq' - } - - const isModelFormatAWQ = () => { - return modelFormat === 'awq' - } - - const getPathComponents = (path) => { - const normalizedPath = path.replace(/\\/g, '/') - const baseDir = normalizedPath.substring(0, normalizedPath.lastIndexOf('/')) - const filename = normalizedPath.substring( - normalizedPath.lastIndexOf('/') + 1 - ) - return { baseDir, filename } - } - - const handleClick = async () => { - if (isModelFormatGPTQ()) { - formData.model_specs = [ - { - model_format: modelFormat, - model_size_in_billions: modelSize, - quantizations: [quantization], - model_id: '', - model_uri: modelUri, - }, - ] - } else if (isModelFormatAWQ()) { - formData.model_specs = [ - { - model_format: modelFormat, - model_size_in_billions: modelSize, - quantizations: [quantization], - model_id: '', - model_uri: modelUri, - }, - ] - } else if (!isModelFormatPytorch()) { - const { baseDir, filename } = getPathComponents(modelUri) - formData.model_specs = [ - { - model_format: modelFormat, - model_size_in_billions: modelSize, - quantizations: [quantization], - model_id: '', - model_file_name_template: filename, - model_uri: baseDir, - }, - ] - } else { - formData.model_specs = [ - { - model_format: modelFormat, - model_size_in_billions: modelSize, - quantizations: ['4-bit', '8-bit', 'none'], - model_id: '', - model_uri: modelUri, - }, - ] - } - - formData.model_family = familyLabel - - if (formData.model_ability.includes('chat')) { - const ps = promptStyles.find((item) => item.name === familyLabel) - if (ps) { - formData.prompt_style = { - style_name: ps.style_name, - system_prompt: ps.system_prompt, - roles: ps.roles, - intra_message_sep: ps.intra_message_sep, - inter_message_sep: ps.inter_message_sep, - stop: ps.stop ?? null, - stop_token_ids: ps.stop_token_ids ?? null, - } - } - } - - if (errorAny) { - setErrorMsg('Please fill in valid value for all fields') - return - } - - try { - const response = await fetcher(endPoint + '/v1/model_registrations/LLM', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: JSON.stringify(formData), - persist: true, - }), - }) - if (!response.ok) { - const errorData = await response.json() // Assuming the server returns error details in JSON format - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - } else { - setSuccessMsg( - 'Model has been registered successfully! Navigate to launch model page to proceed.' - ) - navigate('/launch_model/custom/llm') - sessionStorage.setItem('modelType', '/launch_model/custom/llm') - sessionStorage.setItem('subType', '/launch_model/custom/llm') - } - } catch (error) { - console.error('There was a problem with the fetch operation:', error) - setErrorMsg(error.message || 'An unexpected error occurred.') - } - } - - const toggleLanguage = (lang) => { - if (formData.model_lang.includes(lang)) { - setFormData({ - ...formData, - model_lang: formData.model_lang.filter((l) => l !== lang), - }) - } else { - setFormData({ - ...formData, - model_lang: [...formData.model_lang, lang], - }) - } - } - - const toggleAbility = (ability) => { - setFamilyLabel('') - if (formData.model_ability.includes(ability)) { - setFormData({ - ...formData, - model_ability: formData.model_ability.filter((a) => a !== ability), - }) - } else { - setFormData({ - ...formData, - model_ability: [...formData.model_ability, ability], - }) - } - } - return ( <Box m="20px"> <Title title="Register Model" /> @@ -333,296 +36,79 @@ const RegisterModel = () => { }} aria-label="tabs" > - <Tab label="Language Model" value="1" /> - <Tab label="Embedding Model" value="2" /> - <Tab label="Rerank Model" value="3" /> + <Tab label="Language Model" value="/register_model/llm" /> + <Tab label="Embedding Model" value="/register_model/embedding" /> + <Tab label="Rerank Model" value="/register_model/rerank" /> + <Tab label="Image Model" value="/register_model/image" /> + <Tab label="Audio Model" value="/register_model/audio" /> </TabList> </Box> - <TabPanel value="1" sx={{ padding: 0 }}> - <Box padding="20px"></Box> - {/* Base Information */} - <FormControl sx={styles.baseFormControl}> - <TextField - label="Model Name" - error={errorModelName} - defaultValue={formData.model_name} - size="small" - helperText="Alphanumeric characters with properly placed hyphens and underscores. Must not match any built-in model names." - onChange={(event) => - setFormData({ ...formData, model_name: event.target.value }) - } - /> - <Box padding="15px"></Box> - - <label - style={{ - paddingLeft: 5, - }} - > - Model Format - </label> - - <RadioGroup - value={modelFormat} - onChange={(e) => { - setModelFormat(e.target.value) - }} - > - <Box sx={styles.checkboxWrapper}> - <Box sx={{ marginLeft: '10px' }}> - <FormControlLabel - value="pytorch" - control={<Radio />} - label="PyTorch" - /> - </Box> - <Box sx={{ marginLeft: '10px' }}> - <FormControlLabel - value="ggmlv3" - control={<Radio />} - label="GGML" - /> - </Box> - <Box sx={{ marginLeft: '10px' }}> - <FormControlLabel - value="ggufv2" - control={<Radio />} - label="GGUF" - /> - </Box> - <Box sx={{ marginLeft: '10px' }}> - <FormControlLabel - value="gptq" - control={<Radio />} - label="GPTQ" - /> - </Box> - <Box sx={{ marginLeft: '10px' }}> - <FormControlLabel - value="awq" - control={<Radio />} - label="AWQ" - /> - </Box> - </Box> - </RadioGroup> - <Box padding="15px"></Box> - - <TextField - error={errorContextLength} - label="Context Length" - value={formData.context_length} - size="small" - onChange={(event) => { - let value = event.target.value - // Remove leading zeros - if (/^0+/.test(value)) { - value = value.replace(/^0+/, '') || '0' - } - // Ensure it's a positive integer, if not set it to the minimum - if (!/^\d+$/.test(value) || parseInt(value) < 0) { - value = '0' - } - // Update with the processed value - setFormData({ - ...formData, - context_length: Number(value), - }) - }} - /> - <Box padding="15px"></Box> - - <TextField - label="Model Size in Billions" - size="small" - error={errorModelSize} - value={modelSize} - onChange={(e) => { - let value = e.target.value - // Remove leading zeros - if (/^0+/.test(value)) { - value = value.replace(/^0+/, '') || '0' - } - // Ensure it's a positive integer, if not set it to the minimum - if (!/^\d+$/.test(value) || parseInt(value) < 0) { - value = '0' - } - setModelSize(Number(value)) - }} - /> - <Box padding="15px"></Box> - - <TextField - label="Model Path" - size="small" - value={modelUri} - onChange={(e) => { - setModelUri(e.target.value) - }} - helperText="For PyTorch, provide the model directory. For GGML/GGUF, provide the model file path." - /> - <Box padding="15px"></Box> - - <TextField - label="Quantization (Optional)" - size="small" - value={quantization} - onChange={(e) => { - setQuantization(e.target.value) - }} - helperText="For GPTQ/AWQ models, please be careful to fill in the quantization corresponding to the model you want to register." - /> - <Box padding="15px"></Box> - - <TextField - label="Model Description (Optional)" - error={errorModelDescription} - defaultValue={formData.model_description} - size="small" - onChange={(event) => - setFormData({ - ...formData, - model_description: event.target.value, - }) - } - /> - <Box padding="15px"></Box> - - <label - style={{ - paddingLeft: 5, - color: errorLanguage ? ERROR_COLOR : 'inherit', - }} - > - Model Languages - </label> - <Box sx={styles.checkboxWrapper}> - {SUPPORTED_LANGUAGES.map((lang) => ( - <Box key={lang} sx={{ marginRight: '10px' }}> - <FormControlLabel - control={ - <Checkbox - checked={formData.model_lang.includes(lang)} - onChange={() => toggleLanguage(lang)} - name={lang} - sx={ - errorLanguage - ? { - 'color': ERROR_COLOR, - '&.Mui-checked': { - color: ERROR_COLOR, - }, - } - : {} - } - /> - } - label={SUPPORTED_LANGUAGES_DICT[lang]} - style={{ - paddingLeft: 10, - color: errorLanguage ? ERROR_COLOR : 'inherit', - }} - /> - </Box> - ))} - </Box> - <Box padding="15px"></Box> - - <label - style={{ - paddingLeft: 5, - color: errorAbility ? ERROR_COLOR : 'inherit', - }} - > - Model Abilities - </label> - <Box sx={styles.checkboxWrapper}> - {SUPPORTED_FEATURES.map((ability) => ( - <Box key={ability} sx={{ marginRight: '10px' }}> - <FormControlLabel - control={ - <Checkbox - checked={formData.model_ability.includes( - ability.toLowerCase() - )} - onChange={() => toggleAbility(ability.toLowerCase())} - name={ability} - sx={ - errorAbility - ? { - 'color': ERROR_COLOR, - '&.Mui-checked': { - color: ERROR_COLOR, - }, - } - : {} - } - /> - } - label={ability} - style={{ - paddingLeft: 10, - color: errorAbility ? ERROR_COLOR : 'inherit', - }} - /> - </Box> - ))} - </Box> - <Box padding="15px"></Box> - </FormControl> - - <FormControl sx={styles.baseFormControl}> - <label - style={{ - paddingLeft: 5, - color: errorAbility ? ERROR_COLOR : 'inherit', - }} - > - Model Family - </label> - <FormHelperText> - Please be careful to select the family name corresponding to the - model you want to register. If not found, please choose `other`. - </FormHelperText> - <RadioGroup - value={familyLabel} - onChange={(e) => { - setFamilyLabel(e.target.value) - }} - > - <Box sx={styles.checkboxWrapper}> - {getFamilyByAbility().map((v) => ( - <Box sx={{ marginLeft: '10px' }}> - <FormControlLabel value={v} control={<Radio />} label={v} /> - </Box> - ))} - </Box> - </RadioGroup> - <Box padding="15px"></Box> - </FormControl> - - <Box width={'100%'}> - {successMsg !== '' && ( - <Alert severity="success"> - <AlertTitle>Success</AlertTitle> - {successMsg} - </Alert> - )} - <Button - variant="contained" - color="primary" - type="submit" - onClick={handleClick} - > - Register Model - </Button> - </Box> + <TabPanel value="/register_model/llm" sx={{ padding: 0 }}> + <RegisterModelComponent + modelType="LLM" + customData={{ + version: 1, + model_name: 'custom-llm', + model_description: 'This is a custom model description.', + context_length: 2048, + model_lang: ['en'], + model_ability: ['generate'], + model_family: '', + model_specs: [ + { + model_uri: '/path/to/llama-2', + model_size_in_billions: 7, + model_format: 'pytorch', + quantizations: ['none'], + }, + ], + prompt_style: undefined, + }} + /> + </TabPanel> + <TabPanel value="/register_model/embedding" sx={{ padding: 0 }}> + <RegisterModelComponent + modelType="embedding" + customData={{ + model_name: 'custom-embedding', + dimensions: 768, + max_tokens: 512, + model_uri: '/path/to/embedding-model', + language: ['en'], + }} + /> </TabPanel> - <TabPanel value="2" sx={{ padding: 0 }}> - <RegisterEmbeddingModel /> + <TabPanel value="/register_model/rerank" sx={{ padding: 0 }}> + <RegisterModelComponent + modelType="rerank" + customData={{ + model_name: 'custom-rerank', + model_uri: '/path/to/rerank-model', + language: ['en'], + }} + /> + </TabPanel> + <TabPanel value="/register_model/image" sx={{ padding: 0 }}> + <RegisterModelComponent + modelType="image" + customData={{ + model_name: 'custom-image', + model_uri: '/path/to/image-model', + model_family: 'stable_diffusion', + controlnet: [], + }} + /> </TabPanel> - <TabPanel value="3" sx={{ padding: 0 }}> - <RegisterRerankModel /> + <TabPanel value="/register_model/audio" sx={{ padding: 0 }}> + <RegisterModelComponent + modelType="audio" + customData={{ + model_name: 'custom-audio', + model_uri: '/path/to/audio-model', + multilingual: false, + model_family: 'whisper', + }} + /> </TabPanel> </TabContext> </Box> @@ -630,32 +116,3 @@ const RegisterModel = () => { } export default RegisterModel - -const styles = { - baseFormControl: { - width: '100%', - margin: 'normal', - size: 'small', - }, - checkboxWrapper: { - display: 'flex', - flexWrap: 'wrap', - maxWidth: '80%', - }, - labelPaddingLeft: { - paddingLeft: 5, - }, - formControlLabelPaddingLeft: { - paddingLeft: 10, - }, - buttonBox: { - width: '100%', - margin: '20px', - }, - error: { - fontWeight: 'bold', - margin: '5px 0', - padding: '1px', - borderRadius: '5px', - }, -} diff --git a/xinference/web/ui/src/scenes/register_model/registerModel.js b/xinference/web/ui/src/scenes/register_model/registerModel.js new file mode 100644 index 0000000000..bb97d36ef7 --- /dev/null +++ b/xinference/web/ui/src/scenes/register_model/registerModel.js @@ -0,0 +1,793 @@ +import './styles/registerModelStyle.css' + +import CheckIcon from '@mui/icons-material/Check' +import FilterNoneIcon from '@mui/icons-material/FilterNone' +import KeyboardDoubleArrowRightIcon from '@mui/icons-material/KeyboardDoubleArrowRight' +import NotesIcon from '@mui/icons-material/Notes' +import { + Alert, + Box, + Button, + Checkbox, + Chip, + FormControl, + FormControlLabel, + InputLabel, + MenuItem, + Radio, + RadioGroup, + Select, + Snackbar, + Stack, + Switch, + TextField, + Tooltip, +} from '@mui/material' +import ClipboardJS from 'clipboard' +import React, { useContext, useEffect, useRef, useState } from 'react' +import { useCookies } from 'react-cookie' +import { useNavigate } from 'react-router-dom' + +import { ApiContext } from '../../components/apiContext' +import fetcher from '../../components/fetcher' +import AddControlnet from './components/addControlnet' +import AddModelSpecs from './components/addModelSpecs' +import languages from './data/languages' +const SUPPORTED_LANGUAGES_DICT = { en: 'English', zh: 'Chinese' } +const SUPPORTED_FEATURES = ['Generate', 'Chat', 'Vision'] + +// Convert dictionary of supported languages into list +const SUPPORTED_LANGUAGES = Object.keys(SUPPORTED_LANGUAGES_DICT) + +const RegisterModelComponent = ({ modelType, customData }) => { + const endPoint = useContext(ApiContext).endPoint + const { setErrorMsg } = useContext(ApiContext) + const [formData, setFormData] = useState(customData) + const [promptStyles, setPromptStyles] = useState([]) + const [family, setFamily] = useState({ + chat: [], + generate: [], + }) + const [isShow, setIsShow] = useState(false) + const [languagesArr, setLanguagesArr] = useState([]) + const [isContextLengthAlert, setIsContextLengthAlert] = useState(false) + const [isDimensionsAlert, setIsDimensionsAlert] = useState(false) + const [isMaxTokensAlert, setIsMaxTokensAlert] = useState(false) + const [jsonData, setJsonData] = useState('') + const [isCopySuccess, setIsCopySuccess] = useState(false) + const [isSpecsArrError, setIsSpecsArrError] = useState(false) + const scrollRef = useRef(null) + const [cookie] = useCookies(['token']) + const navigate = useNavigate() + + useEffect(() => { + if (cookie.token === '' || cookie.token === undefined) { + return + } + if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { + navigate('/login', { replace: true }) + return + } + + const getBuiltinFamilies = async () => { + const response = await fetch(endPoint + '/v1/models/families', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }) + if (!response.ok) { + const errorData = await response.json() // Assuming the server returns error details in JSON format + setErrorMsg( + `Server error: ${response.status} - ${ + errorData.detail || 'Unknown error' + }` + ) + } else { + const data = await response.json() + data.chat.push('other') + data.generate.push('other') + setFamily(data) + } + } + + const getBuiltInPromptStyles = async () => { + const response = await fetch(endPoint + '/v1/models/prompts', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }) + if (!response.ok) { + const errorData = await response.json() // Assuming the server returns error details in JSON format + setErrorMsg( + `Server error: ${response.status} - ${ + errorData.detail || 'Unknown error' + }` + ) + } else { + const data = await response.json() + let res = [] + for (const key in data) { + let v = data[key] + v['name'] = key + res.push(v) + } + setPromptStyles(res) + } + } + + if ( + Object.prototype.hasOwnProperty.call(customData, 'model_ability') && + Object.prototype.hasOwnProperty.call(customData, 'model_family') + ) { + // avoid keep requesting backend to get prompts + if (promptStyles.length === 0) { + getBuiltInPromptStyles().catch((error) => { + setErrorMsg( + error.message || + 'An unexpected error occurred when getting builtin prompt styles.' + ) + console.error('Error: ', error) + }) + } + if (family.chat.length === 0) { + getBuiltinFamilies().catch((error) => { + setErrorMsg( + error.message || + 'An unexpected error occurred when getting builtin prompt styles.' + ) + console.error('Error: ', error) + }) + } + } + }, [cookie.token]) + + useEffect(() => { + setJsonData(JSON.stringify(formData, null, 4)) + }, [formData]) + + const getFamilyByAbility = () => { + if ( + formData.model_ability.includes('chat') || + formData.model_ability.includes('vision') + ) { + return family.chat + } else { + return family.generate + } + } + + const sortStringsByFirstLetter = (arr) => { + return arr.sort((a, b) => { + const firstCharA = a.charAt(0).toLowerCase() + const firstCharB = b.charAt(0).toLowerCase() + if (firstCharA < firstCharB) { + return -1 + } + if (firstCharA > firstCharB) { + return 1 + } + return 0 + }) + } + + const handleClick = async () => { + console.log('formData', modelType, formData) + + for (let key in formData) { + const type = Object.prototype.toString.call(formData[key]).slice(8, -1) + if ( + key !== 'model_description' && + ((type === 'Array' && + key !== 'controlnet' && + formData[key].length === 0) || + (type === 'String' && formData[key] === '') || + (type === 'Number' && formData[key] <= 0)) + ) { + setErrorMsg('Please fill in valid value for all fields') + return + } + } + + if ( + isSpecsArrError || + isContextLengthAlert || + isDimensionsAlert || + isMaxTokensAlert + ) { + setErrorMsg('Please fill in valid value for all fields') + return + } + + try { + const response = await fetcher( + endPoint + `/v1/model_registrations/${modelType}`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model: JSON.stringify(formData), + persist: true, + }), + } + ) + if (!response.ok) { + const errorData = await response.json() // Assuming the server returns error details in JSON format + setErrorMsg( + `Server error: ${response.status} - ${ + errorData.detail || 'Unknown error' + }` + ) + } else { + navigate(`/launch_model/custom/${modelType.toLowerCase()}`) + sessionStorage.setItem('modelType', '/launch_model/custom/llm') + sessionStorage.setItem( + 'subType', + `/launch_model/custom/${modelType.toLowerCase()}` + ) + } + } catch (error) { + console.error('There was a problem with the fetch operation:', error) + setErrorMsg(error.message || 'An unexpected error occurred.') + } + } + + const handleNumber = (value, parameterName) => { + setIsContextLengthAlert(false) + setIsDimensionsAlert(false) + setIsMaxTokensAlert(false) + setFormData({ ...formData, [parameterName]: value }) + + // if(value !== '' && Number(value) > 0) { + // console.log(111); + // setFormData({ ...formData, [parameterName]: Number(value) }) + // } + + if ( + value !== '' && + (!Number(value) || + Number(value) <= 0 || + parseInt(value) !== parseFloat(value)) + ) { + parameterName === 'context_length' ? setIsContextLengthAlert(true) : '' + parameterName === 'dimensions' ? setIsDimensionsAlert(true) : '' + parameterName === 'max_tokens' ? setIsMaxTokensAlert(true) : '' + } else if (value !== '') { + setFormData({ ...formData, [parameterName]: Number(value) }) + } + } + + const toggleLanguage = (lang) => { + if (modelType === 'LLM') { + if (formData.model_lang.includes(lang)) { + setFormData({ + ...formData, + model_lang: formData.model_lang.filter((l) => l !== lang), + }) + } else { + setFormData({ + ...formData, + model_lang: [...formData.model_lang, lang], + }) + } + } else { + if (formData.language.includes(lang)) { + setFormData({ + ...formData, + language: formData.language.filter((l) => l !== lang), + }) + } else { + setFormData({ + ...formData, + language: [...formData.language, lang], + }) + } + } + } + + const toggleAbility = (ability) => { + if (formData.model_ability.includes(ability)) { + const obj = JSON.parse(JSON.stringify(formData)) + if (ability === 'chat') { + delete obj.prompt_style + } + setFormData({ + ...obj, + model_ability: formData.model_ability.filter((a) => a !== ability), + model_family: '', + }) + } else { + setFormData({ + ...formData, + model_ability: [...formData.model_ability, ability], + model_family: '', + }) + } + } + + const toggleFamily = (value) => { + const ps = promptStyles.find((item) => item.name === value) + if (formData.model_ability.includes('chat') && ps) { + const prompt_style = { + style_name: ps.style_name, + system_prompt: ps.system_prompt, + roles: ps.roles, + intra_message_sep: ps.intra_message_sep, + inter_message_sep: ps.inter_message_sep, + stop: ps.stop ?? null, + stop_token_ids: ps.stop_token_ids ?? null, + } + setFormData({ + ...formData, + model_family: value, + prompt_style, + }) + } else { + setFormData({ ...formData, model_family: value }) + } + } + + const handleSelectLanguages = (value) => { + const arr = [...languagesArr, value] + setLanguagesArr(arr) + if (modelType === 'LLM') { + setFormData({ + ...formData, + model_lang: Array.from(new Set([...formData.model_lang, ...arr])), + }) + } else { + setFormData({ + ...formData, + language: Array.from(new Set([...formData.language, ...arr])), + }) + } + } + + const handleDeleteLanguages = (item) => { + const arr = languagesArr.filter((subItem) => subItem !== item) + setLanguagesArr(arr) + if (modelType === 'LLM') { + setFormData({ + ...formData, + model_lang: formData.model_lang.filter((subItem) => subItem !== item), + }) + } else { + setFormData({ + ...formData, + language: formData.language.filter((subItem) => subItem !== item), + }) + } + } + + const getSpecsArr = (arr, isSpecsArrError) => { + setFormData({ ...formData, model_specs: arr }) + setIsSpecsArrError(isSpecsArrError) + } + + const getControlnetArr = (arr) => { + setFormData({ ...formData, controlnet: arr }) + } + + const handleCopy = async () => { + const clipboard = new ClipboardJS('.copyIcon', { + text: () => jsonData, + }) + + clipboard.on('success', function (event) { + event.clearSelection() + setIsCopySuccess(true) + }) + } + + return ( + <Box style={{ display: 'flex', overFlow: 'hidden', maxWidth: '100%' }}> + <div className="show-json"> + <p>Show custom json config used by api</p> + {isShow ? ( + <Tooltip title="Pack up" placement="top"> + <KeyboardDoubleArrowRightIcon + className="icon arrow" + onClick={() => setIsShow(!isShow)} + /> + </Tooltip> + ) : ( + <Tooltip title="Unfold" placement="top"> + <NotesIcon + className="icon notes" + onClick={() => setIsShow(!isShow)} + /> + </Tooltip> + )} + </div> + <div ref={scrollRef} className={isShow ? 'formBox' : 'formBox broaden'}> + {/* Base Information */} + <FormControl sx={styles.baseFormControl}> + {/* name */} + {customData.model_name && ( + <> + <TextField + label="Model Name" + error={formData.model_name ? false : true} + value={formData.model_name} + size="small" + helperText="Alphanumeric characters with properly placed hyphens and underscores. Must not match any built-in model names." + onChange={(event) => + setFormData({ ...formData, model_name: event.target.value }) + } + /> + <Box padding="15px"></Box> + </> + )} + + {/* description */} + {customData.model_description && ( + <> + <TextField + label="Model Description (Optional)" + value={formData.model_description} + size="small" + onChange={(event) => + setFormData({ + ...formData, + model_description: event.target.value, + }) + } + /> + <Box padding="15px"></Box> + </> + )} + + {/* Context Length */} + {customData.context_length && ( + <> + <TextField + error={Number(formData.context_length) > 0 ? false : true} + label="Context Length" + value={formData.context_length} + size="small" + onChange={(event) => { + handleNumber(event.target.value, 'context_length') + }} + /> + {isContextLengthAlert && ( + <Alert severity="error"> + Please enter an integer greater than 0. + </Alert> + )} + <Box padding="15px"></Box> + </> + )} + + {/* dimensions */} + {customData.dimensions && ( + <> + <TextField + label="Dimensions" + error={Number(formData.dimensions) > 0 ? false : true} + value={formData.dimensions} + size="small" + onChange={(event) => { + handleNumber(event.target.value, 'dimensions') + }} + /> + {isDimensionsAlert && ( + <Alert severity="error"> + Please enter an integer greater than 0. + </Alert> + )} + <Box padding="15px"></Box> + </> + )} + + {/* Max Tokens */} + {customData.max_tokens && ( + <> + <TextField + label="Max Tokens" + error={Number(formData.max_tokens) > 0 ? false : true} + value={formData.max_tokens} + size="small" + onChange={(event) => { + handleNumber(event.target.value, 'max_tokens') + }} + /> + {isMaxTokensAlert && ( + <Alert severity="error"> + Please enter an integer greater than 0. + </Alert> + )} + <Box padding="15px"></Box> + </> + )} + + {/* path */} + {customData.model_uri && ( + <> + <TextField + label="Model Path" + error={formData.model_uri ? false : true} + value={formData.model_uri} + size="small" + helperText="Provide the model directory path." + onChange={(event) => + setFormData({ ...formData, model_uri: event.target.value }) + } + /> + <Box padding="15px"></Box> + </> + )} + + {/* model_lang */} + {(customData.model_lang || customData.language) && ( + <> + <label + style={{ + paddingLeft: 5, + color: + modelType === 'LLM' + ? formData.model_lang.length === 0 + ? '#d32f2f' + : 'inherit' + : formData.language.length === 0 + ? '#d32f2f' + : 'inherit', + }} + > + Model Languages + </label> + <Box sx={styles.checkboxWrapper}> + {SUPPORTED_LANGUAGES.map((lang) => ( + <Box key={lang} sx={{ marginRight: '10px' }}> + <FormControlLabel + control={ + <Checkbox + checked={ + modelType === 'LLM' + ? formData.model_lang.includes(lang) + : formData.language.includes(lang) + } + onChange={() => toggleLanguage(lang)} + name={lang} + /> + } + label={SUPPORTED_LANGUAGES_DICT[lang]} + style={{ + paddingLeft: 10, + }} + /> + </Box> + ))} + <FormControl sx={{ m: 1, minWidth: 120 }} size="small"> + <InputLabel>Languages</InputLabel> + <Select + value={''} + label="Languages" + onChange={(e) => handleSelectLanguages(e.target.value)} + MenuProps={{ + PaperProps: { + style: { maxHeight: '20vh' }, + }, + }} + > + {languages + .filter((item) => !languagesArr.includes(item.code)) + .map((item) => ( + <MenuItem key={item.code} value={item.code}> + {item.code} + </MenuItem> + ))} + </Select> + </FormControl> + </Box> + <Stack direction="row" spacing={1} style={{ marginLeft: '10px' }}> + {languagesArr.map((item) => ( + <Chip + key={item} + label={item} + variant="outlined" + size="small" + color="primary" + onDelete={() => handleDeleteLanguages(item)} + /> + ))} + </Stack> + <Box padding="15px"></Box> + </> + )} + + {/* multilingual */} + {'multilingual' in customData && ( + <> + <label + style={{ + paddingLeft: 5, + }} + > + Multilingual + </label> + <FormControlLabel + style={{ marginLeft: 0, width: 50 }} + control={<Switch />} + onChange={(e) => + setFormData({ ...formData, multilingual: e.target.checked }) + } + /> + <Box padding="15px"></Box> + </> + )} + + {/* abilities */} + {customData.model_ability && ( + <> + <label + style={{ + paddingLeft: 5, + color: + formData.model_ability.length == 0 ? '#d32f2f' : 'inherit', + }} + > + Model Abilities + </label> + <Box sx={styles.checkboxWrapper}> + {SUPPORTED_FEATURES.map((ability) => ( + <Box key={ability} sx={{ marginRight: '10px' }}> + <FormControlLabel + control={ + <Checkbox + checked={formData.model_ability.includes( + ability.toLowerCase() + )} + onChange={() => toggleAbility(ability.toLowerCase())} + name={ability} + /> + } + label={ability} + style={{ + paddingLeft: 10, + }} + /> + </Box> + ))} + </Box> + <Box padding="15px"></Box> + </> + )} + + {/* family */} + {(customData.model_family === '' || customData.model_family) && ( + <FormControl sx={styles.baseFormControl}> + <label + style={{ + paddingLeft: 5, + color: 'inherit', + }} + > + Model Family + </label> + {modelType === 'LLM' && formData.model_family && ( + <Alert + icon={<CheckIcon fontSize="inherit" />} + severity="success" + > + Please be careful to select the family name corresponding to + the model you want to register. If not found, please choose + <i style={{ fontStyle: 'italic', fontWeight: 700 }}> other</i> + . + </Alert> + )} + {modelType === 'LLM' && !formData.model_family && ( + <Alert severity="error"> + Please be careful to select the family name corresponding to + the model you want to register. If not found, please choose + <i style={{ fontStyle: 'italic', fontWeight: 700 }}> other</i> + . + </Alert> + )} + <RadioGroup + value={formData.model_family} + onChange={(e) => { + toggleFamily(e.target.value) + }} + > + <Box sx={styles.checkboxWrapper} style={{ marginLeft: '10px' }}> + {modelType === 'LLM' && + sortStringsByFirstLetter(getFamilyByAbility()).map((v) => ( + <Box sx={{ width: '20%' }} key={v}> + <FormControlLabel + value={v} + control={<Radio />} + label={v} + /> + </Box> + ))} + {(modelType === 'image' || modelType === 'audio') && ( + <FormControlLabel + value={formData.model_family} + checked + control={<Radio />} + label={formData.model_family} + /> + )} + </Box> + </RadioGroup> + <Box padding="15px"></Box> + </FormControl> + )} + + {/* specs */} + {customData.model_specs && ( + <> + <AddModelSpecs + formData={customData.model_specs[0]} + onGetArr={getSpecsArr} + scrollRef={scrollRef} + /> + <Box padding="15px"></Box> + </> + )} + + {/* controlnet */} + {customData.controlnet && ( + <> + <AddControlnet + onGetControlnetArr={getControlnetArr} + scrollRef={scrollRef} + /> + <Box padding="15px"></Box> + </> + )} + </FormControl> + + <Box width={'100%'}> + <Button + variant="contained" + color="primary" + type="submit" + onClick={handleClick} + > + Register Model + </Button> + </Box> + </div> + + {/* JSON */} + <div className={isShow ? 'jsonBox' : 'jsonBox hide'}> + <div className="jsonBox-header">JSON Format</div> + <Tooltip title="Copy all" placement="top"> + <FilterNoneIcon className="copyIcon" onClick={handleCopy} /> + </Tooltip> + <textarea readOnly className="textarea" value={jsonData} /> + </div> + + <Snackbar + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + open={isCopySuccess} + autoHideDuration={1500} + onClose={() => setIsCopySuccess(false)} + > + <Alert severity="success" variant="filled" sx={{ width: '100%' }}> + Copied to clipboard! + </Alert> + </Snackbar> + </Box> + ) +} + +export default RegisterModelComponent + +const styles = { + baseFormControl: { + width: '100%', + margin: 'normal', + size: 'small', + }, + checkboxWrapper: { + display: 'flex', + flexWrap: 'wrap', + alignItems: 'center', + width: '100%', + }, +} diff --git a/xinference/web/ui/src/scenes/register_model/register_embedding.js b/xinference/web/ui/src/scenes/register_model/register_embedding.js deleted file mode 100644 index b8cde4a017..0000000000 --- a/xinference/web/ui/src/scenes/register_model/register_embedding.js +++ /dev/null @@ -1,244 +0,0 @@ -import { Box, Checkbox, FormControl, FormControlLabel } from '@mui/material' -import Alert from '@mui/material/Alert' -import AlertTitle from '@mui/material/AlertTitle' -import Button from '@mui/material/Button' -import TextField from '@mui/material/TextField' -import React, { useContext, useState } from 'react' -import { useNavigate } from 'react-router-dom' - -import { ApiContext } from '../../components/apiContext' -import fetcher from '../../components/fetcher' -import { useMode } from '../../theme' - -const SUPPORTED_LANGUAGES_DICT = { en: 'English', zh: 'Chinese' } -// Convert dictionary of supported languages into list -const SUPPORTED_LANGUAGES = Object.keys(SUPPORTED_LANGUAGES_DICT) - -const RegisterEmbeddingModel = () => { - const ERROR_COLOR = useMode() - const endPoint = useContext(ApiContext).endPoint - const { setErrorMsg } = useContext(ApiContext) - const [successMsg, setSuccessMsg] = useState('') - const navigate = useNavigate() - const [formData, setFormData] = useState({ - model_name: 'custom-embedding', - dimensions: 768, - max_tokens: 512, - language: ['en'], - model_uri: '/path/to/embedding-model', - }) - - const errorModelName = formData.model_name.trim().length <= 0 - const errorDimensions = formData.dimensions < 0 - const errorMaxTokens = formData.max_tokens < 0 - const errorLanguage = - formData.language === undefined || formData.language.length === 0 - - const handleClick = async () => { - const errorAny = - errorModelName || errorDimensions || errorMaxTokens || errorLanguage - - if (errorAny) { - setErrorMsg('Please fill in valid value for all fields') - return - } - - try { - const response = await fetcher( - endPoint + '/v1/model_registrations/embedding', - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: JSON.stringify(formData), - persist: true, - }), - } - ) - if (!response.ok) { - const errorData = await response.json() // Assuming the server returns error details in JSON format - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - } else { - setSuccessMsg( - 'Model has been registered successfully! Navigate to launch model page to proceed.' - ) - navigate('/launch_model/custom/embedding') - sessionStorage.setItem('modelType', '/launch_model/custom/llm') - sessionStorage.setItem('subType', '/launch_model/custom/embedding') - } - } catch (error) { - console.error('There was a problem with the fetch operation:', error) - setErrorMsg(error.message || 'An unexpected error occurred.') - } - } - - const toggleLanguage = (lang) => { - if (formData.language.includes(lang)) { - setFormData({ - ...formData, - language: formData.language.filter((l) => l !== lang), - }) - } else { - setFormData({ - ...formData, - language: [...formData.language, lang], - }) - } - } - - return ( - <React.Fragment> - <Box padding="20px"></Box> - {/* Base Information */} - <FormControl sx={styles.baseFormControl}> - <TextField - label="Model Name" - error={errorModelName} - defaultValue={formData.model_name} - size="small" - helperText="Alphanumeric characters with properly placed hyphens and underscores. Must not match any built-in model names." - onChange={(event) => - setFormData({ ...formData, model_name: event.target.value }) - } - /> - <Box padding="15px"></Box> - - <TextField - error={errorDimensions} - label="Dimensions" - value={formData.dimensions} - size="small" - onChange={(event) => { - setFormData({ - ...formData, - dimensions: parseInt(event.target.value, 10), - }) - }} - /> - <Box padding="15px"></Box> - - <TextField - error={errorMaxTokens} - label="Max Tokens" - value={formData.max_tokens} - size="small" - onChange={(event) => { - setFormData({ - ...formData, - max_tokens: parseInt(event.target.value, 10), - }) - }} - /> - <Box padding="15px"></Box> - - <TextField - label="Model Path" - size="small" - value={formData.model_uri} - onChange={(e) => { - setFormData({ - ...formData, - model_uri: e.target.value, - }) - }} - helperText="Provide the model directory path." - /> - <Box padding="15px"></Box> - - <label - style={{ - paddingLeft: 5, - color: errorLanguage ? ERROR_COLOR : 'inherit', - }} - > - Model Languages - </label> - <Box sx={styles.checkboxWrapper}> - {SUPPORTED_LANGUAGES.map((lang) => ( - <Box key={lang} sx={{ marginRight: '10px' }}> - <FormControlLabel - control={ - <Checkbox - checked={formData.language.includes(lang)} - onChange={() => toggleLanguage(lang)} - name={lang} - sx={ - errorLanguage - ? { - 'color': ERROR_COLOR, - '&.Mui-checked': { - color: ERROR_COLOR, - }, - } - : {} - } - /> - } - label={SUPPORTED_LANGUAGES_DICT[lang]} - style={{ - paddingLeft: 10, - color: errorLanguage ? ERROR_COLOR : 'inherit', - }} - /> - </Box> - ))} - </Box> - <Box padding="15px"></Box> - </FormControl> - - <Box width={'100%'}> - {successMsg !== '' && ( - <Alert severity="success"> - <AlertTitle>Success</AlertTitle> - {successMsg} - </Alert> - )} - <Button - variant="contained" - color="primary" - type="submit" - onClick={handleClick} - > - Register Model - </Button> - </Box> - </React.Fragment> - ) -} - -export default RegisterEmbeddingModel - -const styles = { - baseFormControl: { - width: '100%', - margin: 'normal', - size: 'small', - }, - checkboxWrapper: { - display: 'flex', - flexWrap: 'wrap', - maxWidth: '80%', - }, - labelPaddingLeft: { - paddingLeft: 5, - }, - formControlLabelPaddingLeft: { - paddingLeft: 10, - }, - buttonBox: { - width: '100%', - margin: '20px', - }, - error: { - fontWeight: 'bold', - margin: '5px 0', - padding: '1px', - borderRadius: '5px', - }, -} diff --git a/xinference/web/ui/src/scenes/register_model/register_rerank.js b/xinference/web/ui/src/scenes/register_model/register_rerank.js deleted file mode 100644 index 90f4bff2f7..0000000000 --- a/xinference/web/ui/src/scenes/register_model/register_rerank.js +++ /dev/null @@ -1,211 +0,0 @@ -import { Box, Checkbox, FormControl, FormControlLabel } from '@mui/material' -import Alert from '@mui/material/Alert' -import AlertTitle from '@mui/material/AlertTitle' -import Button from '@mui/material/Button' -import TextField from '@mui/material/TextField' -import React, { useContext, useState } from 'react' -import { useNavigate } from 'react-router-dom' - -import { ApiContext } from '../../components/apiContext' -import fetcher from '../../components/fetcher' -import { useMode } from '../../theme' - -const SUPPORTED_LANGUAGES_DICT = { en: 'English', zh: 'Chinese' } -// Convert dictionary of supported languages into list -const SUPPORTED_LANGUAGES = Object.keys(SUPPORTED_LANGUAGES_DICT) - -const RegisterRerankModel = () => { - const ERROR_COLOR = useMode() - const endPoint = useContext(ApiContext).endPoint - const { setErrorMsg } = useContext(ApiContext) - const [successMsg, setSuccessMsg] = useState('') - const navigate = useNavigate() - const [formData, setFormData] = useState({ - model_name: 'custom-rerank', - language: ['en'], - model_uri: '/path/to/rerank-model', - }) - - const errorModelName = formData.model_name.trim().length <= 0 - const errorLanguage = - formData.language === undefined || formData.language.length === 0 - - const handleClick = async () => { - const errorAny = errorModelName || errorLanguage - - if (errorAny) { - setErrorMsg('Please fill in valid value for all fields') - return - } - - try { - const response = await fetcher( - endPoint + '/v1/model_registrations/rerank', - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: JSON.stringify(formData), - persist: true, - }), - } - ) - if (!response.ok) { - const errorData = await response.json() // Assuming the server returns error details in JSON format - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - } else { - setSuccessMsg( - 'Model has been registered successfully! Navigate to launch model page to proceed.' - ) - navigate('/launch_model/custom/rerank') - sessionStorage.setItem('modelType', '/launch_model/custom/llm') - sessionStorage.setItem('subType', '/launch_model/custom/rerank') - } - } catch (error) { - console.error('There was a problem with the fetch operation:', error) - setErrorMsg(error.message || 'An unexpected error occurred.') - } - } - - const toggleLanguage = (lang) => { - if (formData.language.includes(lang)) { - setFormData({ - ...formData, - language: formData.language.filter((l) => l !== lang), - }) - } else { - setFormData({ - ...formData, - language: [...formData.language, lang], - }) - } - } - - return ( - <React.Fragment> - <Box padding="20px"></Box> - {/* Base Information */} - <FormControl sx={styles.baseFormControl}> - <TextField - label="Model Name" - error={errorModelName} - defaultValue={formData.model_name} - size="small" - helperText="Alphanumeric characters with properly placed hyphens and underscores. Must not match any built-in model names." - onChange={(event) => - setFormData({ ...formData, model_name: event.target.value }) - } - /> - <Box padding="15px"></Box> - - <TextField - label="Model Path" - size="small" - value={formData.model_uri} - onChange={(e) => { - setFormData({ - ...formData, - model_uri: e.target.value, - }) - }} - helperText="Provide the model directory path." - /> - <Box padding="15px"></Box> - - <label - style={{ - paddingLeft: 5, - color: errorLanguage ? ERROR_COLOR : 'inherit', - }} - > - Model Languages - </label> - <Box sx={styles.checkboxWrapper}> - {SUPPORTED_LANGUAGES.map((lang) => ( - <Box key={lang} sx={{ marginRight: '10px' }}> - <FormControlLabel - control={ - <Checkbox - checked={formData.language.includes(lang)} - onChange={() => toggleLanguage(lang)} - name={lang} - sx={ - errorLanguage - ? { - 'color': ERROR_COLOR, - '&.Mui-checked': { - color: ERROR_COLOR, - }, - } - : {} - } - /> - } - label={SUPPORTED_LANGUAGES_DICT[lang]} - style={{ - paddingLeft: 10, - color: errorLanguage ? ERROR_COLOR : 'inherit', - }} - /> - </Box> - ))} - </Box> - <Box padding="15px"></Box> - </FormControl> - - <Box width={'100%'}> - {successMsg !== '' && ( - <Alert severity="success"> - <AlertTitle>Success</AlertTitle> - {successMsg} - </Alert> - )} - <Button - variant="contained" - color="primary" - type="submit" - onClick={handleClick} - > - Register Model - </Button> - </Box> - </React.Fragment> - ) -} - -export default RegisterRerankModel - -const styles = { - baseFormControl: { - width: '100%', - margin: 'normal', - size: 'small', - }, - checkboxWrapper: { - display: 'flex', - flexWrap: 'wrap', - maxWidth: '80%', - }, - labelPaddingLeft: { - paddingLeft: 5, - }, - formControlLabelPaddingLeft: { - paddingLeft: 10, - }, - buttonBox: { - width: '100%', - margin: '20px', - }, - error: { - fontWeight: 'bold', - margin: '5px 0', - padding: '1px', - borderRadius: '5px', - }, -} diff --git a/xinference/web/ui/src/scenes/register_model/styles/registerModelStyle.css b/xinference/web/ui/src/scenes/register_model/styles/registerModelStyle.css new file mode 100644 index 0000000000..7764d5080b --- /dev/null +++ b/xinference/web/ui/src/scenes/register_model/styles/registerModelStyle.css @@ -0,0 +1,121 @@ +.formBox { + position: relative; + max-width: 50vw; + min-width: 50vw; + max-height: 80vh; + overflow: auto; + padding: 40px 20px 0 0; + transition: all 0.4s ease-in-out; +} + +.broaden { + max-width: 100%; + min-width: 100%; + padding-right: 0; +} + +.show-json { + display: flex; + align-items: center; + position: fixed; + top: 90px; + right: 60px; + color: #444; +} + +.icon { + position: absolute; + right: -40px; + cursor: pointer; + margin-left: 20px; +} + +.icon:hover { + color: #1976d2; +} + +.arrow { + font-size: 24px !important; +} + +.jsonBox { + position: relative; + min-height: 80vh; + width: 100%; + transition: all 0.4s ease-in-out; +} + +.hide { + width: 0; + transform: translate(30vw, 0); + overflow: hidden; +} + +.jsonBox-header { + line-height: 40px; + font-weight: 700; +} + +.textarea { + width: 100%; + height: calc(100% - 40px); + padding: 5px 10px; + border: 1px solid #ddd; + border-radius: 5px; + resize: none; + color: #444; +} + +.copyIcon { + cursor: pointer; + position: absolute; + top: 13px; + right: 5px; + font-size: 16px !important; + color: #555; +} + +.copyIcon:hover { + color: #1976d2; +} + +.addBtn { + margin-left: 20px !important; +} + +.item { + position: relative; + background-color: #eee; + margin: 10px 50px 0; + padding: 20px; + border-radius: 10px; + overflow: hidden; +} + +.item:hover .deleteBtn { + transform: translateX(-50px); +} + +.deleteBtn { + position: absolute; + right: 20px; + top: calc(50% - 25px); + width: 50px; + height: 50px; + transform: translateX(80px); + text-align: center; + line-height: 70px; + border-radius: 25px; + background-color: #1976d2; + transition: all 0.3s ease-in-out; +} + +.deleteBtn:hover { + cursor: pointer; + box-shadow: 0 0 10px #aaa; +} + +.deleteIcon { + font-size: 28px !important; + color: #fff; +} From 6ff1ca87d3d2949a802e0d5450966c28d3d4caf1 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 26 Apr 2024 18:02:07 +0800 Subject: [PATCH 043/298] DOC: update readme & fix Mac CI (#1385) Co-authored-by: ChengjieLi <chengjieli23@outlook.com> --- .github/workflows/python.yaml | 8 ++++---- README.md | 2 +- README_zh_CN.md | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index acbbb0b544..4774642773 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -72,12 +72,12 @@ jobs: strategy: fail-fast: false matrix: - os: [ "ubuntu-latest", "macos-latest", "windows-latest" ] + os: [ "ubuntu-latest", "macos-12", "windows-latest" ] python-version: [ "3.8", "3.9", "3.10", "3.11" ] module: [ "xinference" ] exclude: - - { os: macos-latest, python-version: 3.9 } - - { os: macos-latest, python-version: 3.10 } + - { os: macos-12, python-version: 3.9 } + - { os: macos-12, python-version: 3.10 } - { os: windows-latest, python-version: 3.9 } - { os: windows-latest, python-version: 3.10 } include: @@ -91,7 +91,7 @@ jobs: submodules: recursive - name: Set up conda ${{ matrix.python-version }} - uses: conda-incubator/setup-miniconda@v2 + uses: conda-incubator/setup-miniconda@v3 if: ${{ matrix.module != 'gpu' }} with: python-version: ${{ matrix.python-version }} diff --git a/README.md b/README.md index f087ade8cc..11fc1e8dda 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,11 @@ potential of cutting-edge AI models. - Support multimodal: [#829](https://github.com/xorbitsai/inference/pull/829) ### New Models - Built-in support for [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) +- Built-in support for [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) - Built-in support for [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) - Built-in support for [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) - Built-in support for [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) - Built-in support for [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) -- Built-in support for [Gemma](https://github.com/google-deepmind/gemma): [#1024](https://github.com/xorbitsai/inference/pull/1024) ### Integrations - [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. diff --git a/README_zh_CN.md b/README_zh_CN.md index 109131b323..2826b7f8ad 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -32,11 +32,11 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - 支持多模态模型:[#829](https://github.com/xorbitsai/inference/pull/829) ### 新模型 - 内置 [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) +- 内置 [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) - 内置 [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) - 内置 [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) - 内置 [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) - 内置 [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) -- 内置 [Gemma](https://github.com/google-deepmind/gemma): [#1024](https://github.com/xorbitsai/inference/pull/1024) ### 集成 - [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 From 34d5a27a4f008ef43addd638c639c58de474b4d2 Mon Sep 17 00:00:00 2001 From: emulated24 <emulated24@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:17:12 +0200 Subject: [PATCH 044/298] BUG: fix file template of andrewcanis/c4ai-command-r-v01-GGUF (#1389) --- xinference/model/llm/llm_family.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index c291b82d18..5138bb9110 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -5231,7 +5231,7 @@ "Q8_0" ], "model_id": "andrewcanis/c4ai-command-r-v01-GGUF", - "model_file_name_template": "c4ai-command-r-v01.{quantization}.gguf" + "model_file_name_template": "c4ai-command-r-v01-{quantization}.gguf" }, { "model_format": "pytorch", From 893abbce2737e737fba38655723b320446ae3e6f Mon Sep 17 00:00:00 2001 From: orangeclk <orangeclk@users.noreply.github.com> Date: Fri, 26 Apr 2024 21:20:04 +0800 Subject: [PATCH 045/298] FEAT: add phi-3-mini series (#1379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 陈力坤 <likunchen@caixin.com> --- doc/source/models/builtin/llm/index.rst | 14 +++ .../builtin/llm/phi-3-mini-128k-instruct.rst | 30 ++++++ .../builtin/llm/phi-3-mini-4k-instruct.rst | 45 ++++++++ xinference/model/llm/llm_family.json | 100 ++++++++++++++++++ .../model/llm/llm_family_modelscope.json | 88 +++++++++++++++ xinference/model/llm/utils.py | 11 ++ 6 files changed, 288 insertions(+) create mode 100644 doc/source/models/builtin/llm/phi-3-mini-128k-instruct.rst create mode 100644 doc/source/models/builtin/llm/phi-3-mini-4k-instruct.rst diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 168aa45fb8..f371139ad5 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -311,6 +311,16 @@ The following is a list of built-in LLM in Xinference: - 2048 - Phi-2 is a 2.7B Transformer based LLM used for research on model safety, trained with data similar to Phi-1.5 but augmented with synthetic texts and curated websites. + * - :ref:`phi-3-mini-128k-instruct <models_llm_phi-3-mini-128k-instruct>` + - chat + - 128000 + - The Phi-3-Mini-128K-Instruct is a 3.8 billion-parameter, lightweight, state-of-the-art open model trained using the Phi-3 datasets. + + * - :ref:`phi-3-mini-4k-instruct <models_llm_phi-3-mini-4k-instruct>` + - chat + - 4096 + - The Phi-3-Mini-4k-Instruct is a 3.8 billion-parameter, lightweight, state-of-the-art open model trained using the Phi-3 datasets. + * - :ref:`platypus2-70b-instruct <models_llm_platypus2-70b-instruct>` - generate - 4096 @@ -569,6 +579,10 @@ The following is a list of built-in LLM in Xinference: phi-2 + phi-3-mini-128k-instruct + + phi-3-mini-4k-instruct + platypus2-70b-instruct qwen-chat diff --git a/doc/source/models/builtin/llm/phi-3-mini-128k-instruct.rst b/doc/source/models/builtin/llm/phi-3-mini-128k-instruct.rst new file mode 100644 index 0000000000..ce875fa8a1 --- /dev/null +++ b/doc/source/models/builtin/llm/phi-3-mini-128k-instruct.rst @@ -0,0 +1,30 @@ +.. _models_llm_phi-3-mini-128k-instruct: + +======================================== +phi-3-mini-128k-instruct +======================================== + +- **Context Length:** 128000 +- **Model Name:** phi-3-mini-128k-instruct +- **Languages:** en +- **Abilities:** chat +- **Description:** The Phi-3-Mini-128K-Instruct is a 3.8 billion-parameter, lightweight, state-of-the-art open model trained using the Phi-3 datasets. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 4 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 4 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** microsoft/Phi-3-mini-128k-instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/microsoft/Phi-3-mini-128k-instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Phi-3-mini-128k-instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name phi-3-mini-128k-instruct --size-in-billions 4 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/phi-3-mini-4k-instruct.rst b/doc/source/models/builtin/llm/phi-3-mini-4k-instruct.rst new file mode 100644 index 0000000000..f8db3902a7 --- /dev/null +++ b/doc/source/models/builtin/llm/phi-3-mini-4k-instruct.rst @@ -0,0 +1,45 @@ +.. _models_llm_phi-3-mini-4k-instruct: + +======================================== +phi-3-mini-4k-instruct +======================================== + +- **Context Length:** 4096 +- **Model Name:** phi-3-mini-4k-instruct +- **Languages:** en +- **Abilities:** chat +- **Description:** The Phi-3-Mini-4k-Instruct is a 3.8 billion-parameter, lightweight, state-of-the-art open model trained using the Phi-3 datasets. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (ggufv2, 4 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 4 +- **Quantizations:** fp16, q4 +- **Model ID:** microsoft/Phi-3-mini-4k-instruct-gguf +- **Model Hubs**: `Hugging Face <https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-gguf>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name phi-3-mini-4k-instruct --size-in-billions 4 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 2 (pytorch, 4 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 4 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** microsoft/Phi-3-mini-4k-instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/microsoft/Phi-3-mini-4k-instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Phi-3-mini-4k-instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name phi-3-mini-4k-instruct --size-in-billions 4 --model-format pytorch --quantization ${quantization} + diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 5138bb9110..dc2a0e893f 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -461,6 +461,106 @@ } ] }, + { + "version": 1, + "context_length": 128000, + "model_name": "phi-3-mini-128k-instruct", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Phi-3-Mini-128K-Instruct is a 3.8 billion-parameter, lightweight, state-of-the-art open model trained using the Phi-3 datasets.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 4, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "microsoft/Phi-3-mini-128k-instruct", + "model_revision": "ebee18c488086b396dde649f2aa6548b9b8d2404" + } + ], + "prompt_style": { + "style_name": "PHI3", + "system_prompt": "You are a helpful AI assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "inter_message_sep": "<|end|>\n", + "stop_token_ids":[ + 32000, + 32001, + 32007 + ], + "stop": [ + "<|endoftext|>", + "<|assistant|>", + "<|end|>" + ] + } + }, + { + "version": 1, + "context_length": 4096, + "model_name": "phi-3-mini-4k-instruct", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Phi-3-Mini-4k-Instruct is a 3.8 billion-parameter, lightweight, state-of-the-art open model trained using the Phi-3 datasets.", + "model_specs": [ + { + "model_format": "ggufv2", + "model_size_in_billions": 4, + "quantizations": [ + "fp16", + "q4" + ], + "model_id": "microsoft/Phi-3-mini-4k-instruct-gguf", + "model_file_name_template": "Phi-3-mini-4k-instruct-{quantization}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 4, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "microsoft/Phi-3-mini-4k-instruct", + "model_revision": "b86bcaf57ea4dfdec5dbe12a377028b2fab0d480" + } + ], + "prompt_style": { + "style_name": "PHI3", + "system_prompt": "You are a helpful AI assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "inter_message_sep": "<|end|>\n", + "stop_token_ids":[ + 32000, + 32001, + 32007 + ], + "stop": [ + "<|endoftext|>", + "<|assistant|>", + "<|end|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 7920c8d1ce..0600dab762 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3295,5 +3295,93 @@ "model_revision": "master" } ] + }, + { + "version": 1, + "context_length": 128000, + "model_name": "phi-3-mini-128k-instruct", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Phi-3-Mini-128K-Instruct is a 3.8 billion-parameter, lightweight, state-of-the-art open model trained using the Phi-3 datasets.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 4, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "LLM-Research/Phi-3-mini-128k-instruct", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "PHI3", + "system_prompt": "You are a helpful AI assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "inter_message_sep": "<|end|>\n", + "stop_token_ids":[ + 32000, + 32007 + ], + "stop": [ + "<|endoftext|>", + "<|end|>" + ] + } + }, + { + "version": 1, + "context_length": 4096, + "model_name": "phi-3-mini-4k-instruct", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Phi-3-Mini-4k-Instruct is a 3.8 billion-parameter, lightweight, state-of-the-art open model trained using the Phi-3 datasets.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 4, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "LLM-Research/Phi-3-mini-4k-instruct", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "PHI3", + "system_prompt": "You are a helpful AI assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "inter_message_sep": "<|end|>\n", + "stop_token_ids":[ + 32000, + 32007 + ], + "stop": [ + "<|endoftext|>", + "<|end|>" + ] + } } ] diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 4df6297ebd..24b24969e1 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -447,6 +447,17 @@ def get_role(role_name: str): else: ret += "<AI>" + content.strip() return ret + elif prompt_style.style_name == "PHI3": + ret = f"<|system|>{prompt_style.intra_message_sep}{prompt_style.system_prompt}{prompt_style.inter_message_sep}" + for message in chat_history: + content = message["content"] or "" + role = get_role(message["role"]) + if content: + ret += f"<|{role}|>{prompt_style.intra_message_sep}{content}{prompt_style.inter_message_sep}" + else: + ret += f"<|{role}|>{prompt_style.intra_message_sep}" + ret += "<|assistant|>\n" + return ret else: raise ValueError(f"Invalid prompt style: {prompt_style.style_name}") From da1b62c561720619a041d6397f864fdb5d79c933 Mon Sep 17 00:00:00 2001 From: boyhack <34109680@qq.com> Date: Sun, 28 Apr 2024 11:06:06 +0800 Subject: [PATCH 046/298] FEAT: add Starling model (#1384) --- xinference/model/llm/llm_family.json | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index dc2a0e893f..4d77353a49 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -5393,5 +5393,45 @@ "model_revision": "bb63b5b7005ecedb30b0cfd0d5953b02a5817f7b" } ] + }, + { + "version": 1, + "context_length": 4096, + "model_name": "Starling-LM", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "We introduce Starling-7B, an open large language model (LLM) trained by Reinforcement Learning from AI Feedback (RLAIF). The model harnesses the power of our new GPT-4 labeled ranking dataset", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "berkeley-nest/Starling-LM-7B-alpha", + "model_revision": "1dddf3b95bc1391f6307299eb1c162c194bde9bd" + } + ], + "prompt_style": { + "style_name": "ADD_COLON_SINGLE", + "system_prompt": "", + "roles": [ + "GPT4 Correct User", + "GPT4 Correct Assistant" + ], + "intra_message_sep": "<|end_of_turn|>", + "inter_message_sep": "", + "stop_token_ids": [ + 2, + 32000 + ] + } } ] From 94a13a862073809739e427329d7a944c75a71bd7 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Sun, 28 Apr 2024 15:52:57 +0800 Subject: [PATCH 047/298] FEAT: support qwen1.5 110b (#1388) Co-authored-by: ChengjieLi <chengjieli23@outlook.com> --- .../models/builtin/llm/qwen1.5-chat.rst | 87 ++++++++++++++----- xinference/model/llm/llm_family.json | 26 ++++++ .../model/llm/llm_family_modelscope.json | 29 +++++++ xinference/model/llm/tests/test_llm_family.py | 10 +-- 4 files changed, 123 insertions(+), 29 deletions(-) diff --git a/doc/source/models/builtin/llm/qwen1.5-chat.rst b/doc/source/models/builtin/llm/qwen1.5-chat.rst index a3b50724b8..1f9228ffb5 100644 --- a/doc/source/models/builtin/llm/qwen1.5-chat.rst +++ b/doc/source/models/builtin/llm/qwen1.5-chat.rst @@ -119,7 +119,22 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 72 --model-format pytorch --quantization ${quantization} -Model Spec 8 (gptq, 0_5 Billion) +Model Spec 8 (pytorch, 110 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 110 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** Qwen/Qwen1.5-110B-Chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-110B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name qwen1.5-chat --size-in-billions 110 --model-format pytorch --quantization ${quantization} + + +Model Spec 9 (gptq, 0_5 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** gptq @@ -134,7 +149,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 0_5 --model-format gptq --quantization ${quantization} -Model Spec 9 (gptq, 1_8 Billion) +Model Spec 10 (gptq, 1_8 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** gptq @@ -149,7 +164,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 1_8 --model-format gptq --quantization ${quantization} -Model Spec 10 (gptq, 4 Billion) +Model Spec 11 (gptq, 4 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** gptq @@ -164,7 +179,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 4 --model-format gptq --quantization ${quantization} -Model Spec 11 (gptq, 7 Billion) +Model Spec 12 (gptq, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** gptq @@ -179,7 +194,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} -Model Spec 12 (gptq, 14 Billion) +Model Spec 13 (gptq, 14 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** gptq @@ -194,7 +209,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 14 --model-format gptq --quantization ${quantization} -Model Spec 13 (gptq, 32 Billion) +Model Spec 14 (gptq, 32 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** gptq @@ -209,7 +224,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 32 --model-format gptq --quantization ${quantization} -Model Spec 14 (gptq, 72 Billion) +Model Spec 15 (gptq, 72 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** gptq @@ -224,7 +239,22 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 72 --model-format gptq --quantization ${quantization} -Model Spec 15 (awq, 0_5 Billion) +Model Spec 16 (gptq, 110 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 110 +- **Quantizations:** Int4 +- **Model ID:** Qwen/Qwen1.5-110B-Chat-GPTQ-Int4 +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-110B-Chat-GPTQ-Int4>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-GPTQ-Int4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name qwen1.5-chat --size-in-billions 110 --model-format gptq --quantization ${quantization} + + +Model Spec 17 (awq, 0_5 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** awq @@ -239,7 +269,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 0_5 --model-format awq --quantization ${quantization} -Model Spec 16 (awq, 1_8 Billion) +Model Spec 18 (awq, 1_8 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** awq @@ -254,7 +284,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 1_8 --model-format awq --quantization ${quantization} -Model Spec 17 (awq, 4 Billion) +Model Spec 19 (awq, 4 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** awq @@ -269,7 +299,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 4 --model-format awq --quantization ${quantization} -Model Spec 18 (awq, 7 Billion) +Model Spec 20 (awq, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** awq @@ -284,7 +314,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 7 --model-format awq --quantization ${quantization} -Model Spec 19 (awq, 14 Billion) +Model Spec 21 (awq, 14 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** awq @@ -299,7 +329,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 14 --model-format awq --quantization ${quantization} -Model Spec 20 (awq, 32 Billion) +Model Spec 22 (awq, 32 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** awq @@ -314,7 +344,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 32 --model-format awq --quantization ${quantization} -Model Spec 21 (awq, 72 Billion) +Model Spec 23 (awq, 72 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** awq @@ -329,7 +359,22 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 72 --model-format awq --quantization ${quantization} -Model Spec 22 (ggufv2, 0_5 Billion) +Model Spec 24 (awq, 110 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 110 +- **Quantizations:** Int4 +- **Model ID:** Qwen/Qwen1.5-110B-Chat-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-110B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name qwen1.5-chat --size-in-billions 110 --model-format awq --quantization ${quantization} + + +Model Spec 25 (ggufv2, 0_5 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -344,7 +389,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 0_5 --model-format ggufv2 --quantization ${quantization} -Model Spec 23 (ggufv2, 1_8 Billion) +Model Spec 26 (ggufv2, 1_8 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -359,7 +404,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 1_8 --model-format ggufv2 --quantization ${quantization} -Model Spec 24 (ggufv2, 4 Billion) +Model Spec 27 (ggufv2, 4 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -374,7 +419,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 4 --model-format ggufv2 --quantization ${quantization} -Model Spec 25 (ggufv2, 7 Billion) +Model Spec 28 (ggufv2, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -389,7 +434,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} -Model Spec 26 (ggufv2, 14 Billion) +Model Spec 29 (ggufv2, 14 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -404,7 +449,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 14 --model-format ggufv2 --quantization ${quantization} -Model Spec 27 (ggufv2, 32 Billion) +Model Spec 30 (ggufv2, 32 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -419,7 +464,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name qwen1.5-chat --size-in-billions 32 --model-format ggufv2 --quantization ${quantization} -Model Spec 28 (ggufv2, 72 Billion) +Model Spec 31 (ggufv2, 72 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 4d77353a49..dd4a0f6b7b 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1867,6 +1867,16 @@ ], "model_id": "Qwen/Qwen1.5-72B-Chat" }, + { + "model_format": "pytorch", + "model_size_in_billions": 110, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/Qwen1.5-110B-Chat" + }, { "model_format": "gptq", "model_size_in_billions": "0_5", @@ -1929,6 +1939,14 @@ ], "model_id": "Qwen/Qwen1.5-72B-Chat-GPTQ-{quantization}" }, + { + "model_format": "gptq", + "model_size_in_billions": 110, + "quantizations": [ + "Int4" + ], + "model_id": "Qwen/Qwen1.5-110B-Chat-GPTQ-Int4" + }, { "model_format": "awq", "model_size_in_billions": "0_5", @@ -1985,6 +2003,14 @@ ], "model_id": "Qwen/Qwen1.5-72B-Chat-AWQ" }, + { + "model_format": "awq", + "model_size_in_billions": 110, + "quantizations": [ + "Int4" + ], + "model_id": "Qwen/Qwen1.5-110B-Chat-AWQ" + }, { "model_format": "ggufv2", "model_size_in_billions": "0_5", diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 0600dab762..123cf2c66f 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -1937,6 +1937,17 @@ "model_id": "qwen/Qwen1.5-72B-Chat", "model_hub": "modelscope" }, + { + "model_format": "pytorch", + "model_size_in_billions": 110, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "qwen/Qwen1.5-110B-Chat", + "model_hub": "modelscope" + }, { "model_format": "gptq", "model_size_in_billions": "0_5", @@ -2006,6 +2017,15 @@ "model_id": "qwen/Qwen1.5-72B-Chat-GPTQ-{quantization}", "model_hub": "modelscope" }, + { + "model_format": "gptq", + "model_size_in_billions": 110, + "quantizations": [ + "Int4" + ], + "model_id": "qwen/Qwen1.5-110B-Chat-GPTQ-Int4", + "model_hub": "modelscope" + }, { "model_format": "awq", "model_size_in_billions": "0_5", @@ -2069,6 +2089,15 @@ "model_id": "qwen/Qwen1.5-72B-Chat-AWQ", "model_hub": "modelscope" }, + { + "model_format": "awq", + "model_size_in_billions": 110, + "quantizations": [ + "Int4" + ], + "model_id": "qwen/Qwen1.5-110B-Chat-AWQ", + "model_hub": "modelscope" + }, { "model_format": "ggufv2", "model_size_in_billions": "0_5", diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index e1030d4e89..a2681f36bc 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -1201,14 +1201,8 @@ def test_query_engine_general(): model_name = "qwen1.5-chat" assert model_name in LLM_ENGINES - assert ( - "PyTorch" in LLM_ENGINES[model_name] - and len(LLM_ENGINES[model_name]["PyTorch"]) == 28 - ) - assert ( - "llama-cpp-python" in LLM_ENGINES[model_name] - and len(LLM_ENGINES[model_name]["llama-cpp-python"]) == 7 - ) + assert "PyTorch" in LLM_ENGINES[model_name] + assert "llama-cpp-python" in LLM_ENGINES[model_name] assert check_engine_by_spec_parameters( model_engine="PyTorch", From 52f1c94aac9630127afd0332d9ebf2bcc9714d24 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Sun, 28 Apr 2024 19:28:56 +0800 Subject: [PATCH 048/298] DOC: worker address should be specified for `xinference-worker` (#1397) Co-authored-by: Xuye (Chris) Qin <qinxuye@gmail.com> --- .../getting_started/using_xinference.rst | 4 +- .../getting_started/using_xinference.po | 146 +++++++++++----- .../getting_started/using_xinference.po | 163 ++++++++++-------- 3 files changed, 196 insertions(+), 117 deletions(-) diff --git a/doc/source/getting_started/using_xinference.rst b/doc/source/getting_started/using_xinference.rst index 143a683abb..195b0f57a6 100644 --- a/doc/source/getting_started/using_xinference.rst +++ b/doc/source/getting_started/using_xinference.rst @@ -338,8 +338,10 @@ On each of the other servers where you want to run Xinference workers, run the f .. code-block:: bash - xinference-worker -e "http://${supervisor_host}:9997" + xinference-worker -e "http://${supervisor_host}:9997" -H "${worker_host}" +.. note:: + Note that you must replace ``${worker_host}`` with the actual host of your worker server. .. note:: Note that if you need to interact with the Xinference in a cluster via the command line, diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po index ac2a8bd9a1..c07d245c11 100644 --- a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po +++ b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po @@ -2,13 +2,11 @@ # Copyright (C) 2023, Xorbits Inc. # This file is distributed under the same license as the Xinference package. # FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-27 15:43+0800\n" +"POT-Creation-Date: 2024-04-28 14:43+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: ja_JP\n" @@ -131,109 +129,120 @@ msgstr "" #: ../../source/getting_started/using_xinference.rst:118 msgid "" "We can specify the model's UID using the ``--model-uid`` or ``-u`` flag. " -"If not specified, Xinference will generate a random ID. This create a new" +"If not specified, Xinference will generate a unique ID. This create a new" " model instance with unique ID ``my-llama-2``:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:156 +#: ../../source/getting_started/using_xinference.rst:157 +msgid "" +"For some engines, such as vllm, users need to specify the engine-related " +"parameters when running models. In this case, you can directly specify " +"the parameter name and value in the command line, for example:" +msgstr "" + +#: ../../source/getting_started/using_xinference.rst:165 +msgid "`gpu_memory_utilization=0.9` will pass to vllm when launching model." +msgstr "" + +#: ../../source/getting_started/using_xinference.rst:167 msgid "" "Congrats! You now have ``llama-2-chat`` running by Xinference. Once the " -"model is running, we can try it out either command line, via cURL, or via" -" Xinference's python client:" +"model is running, we can try it out either via cURL, or via Xinference's " +"python client:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:221 +#: ../../source/getting_started/using_xinference.rst:227 msgid "" "Xinference provides OpenAI-compatible APIs for its supported models, so " "you can use Xinference as a local drop-in replacement for OpenAI APIs. " "For example:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:237 +#: ../../source/getting_started/using_xinference.rst:243 msgid "The following OpenAI APIs are supported:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:239 +#: ../../source/getting_started/using_xinference.rst:245 msgid "" "Chat Completions: `https://platform.openai.com/docs/api-reference/chat " "<https://platform.openai.com/docs/api-reference/chat>`_" msgstr "" -#: ../../source/getting_started/using_xinference.rst:241 +#: ../../source/getting_started/using_xinference.rst:247 msgid "" "Completions: `https://platform.openai.com/docs/api-reference/completions " "<https://platform.openai.com/docs/api-reference/completions>`_" msgstr "" -#: ../../source/getting_started/using_xinference.rst:243 +#: ../../source/getting_started/using_xinference.rst:249 msgid "" "Embeddings: `https://platform.openai.com/docs/api-reference/embeddings " "<https://platform.openai.com/docs/api-reference/embeddings>`_" msgstr "" -#: ../../source/getting_started/using_xinference.rst:246 +#: ../../source/getting_started/using_xinference.rst:252 msgid "Manage Models" msgstr "" -#: ../../source/getting_started/using_xinference.rst:248 +#: ../../source/getting_started/using_xinference.rst:254 msgid "" "In addition to launching models, Xinference offers various ways to manage" " the entire lifecycle of models. You can manage models in Xinference " "through the command line, cURL, or Xinference's python client." msgstr "" -#: ../../source/getting_started/using_xinference.rst:251 +#: ../../source/getting_started/using_xinference.rst:257 msgid "" "You can list all models of a certain type that are available to launch in" " Xinference:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:269 +#: ../../source/getting_started/using_xinference.rst:275 msgid "" "The following command gives you the currently running models in " "Xinference:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:287 +#: ../../source/getting_started/using_xinference.rst:293 msgid "" "When you no longer need a model that is currently running, you can remove" " it in the following way to free up the resources it occupies:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:306 +#: ../../source/getting_started/using_xinference.rst:312 msgid "Deploy Xinference In a Cluster" msgstr "" -#: ../../source/getting_started/using_xinference.rst:308 +#: ../../source/getting_started/using_xinference.rst:314 msgid "" "To deploy Xinference in a cluster, you need to start a Xinference " "supervisor on one server and Xinference workers on the other servers." msgstr "" -#: ../../source/getting_started/using_xinference.rst:311 +#: ../../source/getting_started/using_xinference.rst:317 msgid "" "First, make sure you have already installed Xinference on each of the " "servers according to the instructions provided :ref:`here " "<installation>`. Then follow the steps below:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:315 +#: ../../source/getting_started/using_xinference.rst:321 msgid "Start the Supervisor" msgstr "" -#: ../../source/getting_started/using_xinference.rst:316 +#: ../../source/getting_started/using_xinference.rst:322 msgid "" "On the server where you want to run the Xinference supervisor, run the " "following command:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:322 +#: ../../source/getting_started/using_xinference.rst:328 msgid "" "Replace ``${supervisor_host}`` with the actual host of your supervisor " "server." msgstr "" -#: ../../source/getting_started/using_xinference.rst:325 +#: ../../source/getting_started/using_xinference.rst:331 msgid "" "You can the supervisor's web UI at `http://${supervisor_host}:9997/ui " "<http://${supervisor_host}:9997/ui>`_ and visit " @@ -241,107 +250,113 @@ msgid "" "<http://${supervisor_host}:9997/docs>`_ to inspect the API docs." msgstr "" -#: ../../source/getting_started/using_xinference.rst:329 +#: ../../source/getting_started/using_xinference.rst:335 msgid "Start the Workers" msgstr "" -#: ../../source/getting_started/using_xinference.rst:331 +#: ../../source/getting_started/using_xinference.rst:337 msgid "" "On each of the other servers where you want to run Xinference workers, " "run the following command:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:339 +#: ../../source/getting_started/using_xinference.rst:344 +msgid "" +"Note that you must replace ``${worker_host}`` with the actual host of " +"your worker server." +msgstr "" + +#: ../../source/getting_started/using_xinference.rst:347 msgid "" "Note that if you need to interact with the Xinference in a cluster via " "the command line, you should include the ``-e`` or ``--endpoint`` flag to" " specify the supervisor server's endpoint. For example:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:347 +#: ../../source/getting_started/using_xinference.rst:355 msgid "Using Xinference With Docker" msgstr "" -#: ../../source/getting_started/using_xinference.rst:349 +#: ../../source/getting_started/using_xinference.rst:357 msgid "To start Xinference in a Docker container, run the following command:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:352 +#: ../../source/getting_started/using_xinference.rst:360 msgid "Run On Nvidia GPU Host" msgstr "" -#: ../../source/getting_started/using_xinference.rst:359 +#: ../../source/getting_started/using_xinference.rst:367 msgid "Run On CPU Only Host" msgstr "" -#: ../../source/getting_started/using_xinference.rst:367 +#: ../../source/getting_started/using_xinference.rst:375 msgid "Using Xinference On Kubernetes" msgstr "" -#: ../../source/getting_started/using_xinference.rst:369 +#: ../../source/getting_started/using_xinference.rst:377 msgid "" "To use Xinference on Kubernetes, `KubeBlocks <https://kubeblocks.io/>`_ " "is required to help the installation." msgstr "" -#: ../../source/getting_started/using_xinference.rst:371 +#: ../../source/getting_started/using_xinference.rst:379 msgid "The following steps assume Kubernetes is already installed." msgstr "" -#: ../../source/getting_started/using_xinference.rst:373 +#: ../../source/getting_started/using_xinference.rst:381 msgid "" "Download cli tool kbcli for KubeBlocks, see `install kbcli " "<https://kubeblocks.io/docs/preview/user_docs/installation/install-with-" "kbcli/install-kbcli/>`_." msgstr "" -#: ../../source/getting_started/using_xinference.rst:375 +#: ../../source/getting_started/using_xinference.rst:383 msgid "Make sure kbcli version is at least v0.7.1." msgstr "" -#: ../../source/getting_started/using_xinference.rst:377 +#: ../../source/getting_started/using_xinference.rst:385 msgid "" "Install KubeBlocks using kbcli command, see `install KubeBlocks with " "kbcli <https://kubeblocks.io/docs/preview/user_docs/installation/install-" "with-kbcli/install-kubeblocks-with-kbcli/>`_." msgstr "" -#: ../../source/getting_started/using_xinference.rst:379 +#: ../../source/getting_started/using_xinference.rst:387 msgid "Enable Xinference addon, run the following command:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:385 +#: ../../source/getting_started/using_xinference.rst:393 msgid "Use kbcli to start Xinference cluster, run the following command:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:391 +#: ../../source/getting_started/using_xinference.rst:399 msgid "" "If the Kubernetes node doesn't have GPU on it, run the command with extra" " flag:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:397 +#: ../../source/getting_started/using_xinference.rst:405 msgid "Use -h to read the help documentation for more options:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:404 +#: ../../source/getting_started/using_xinference.rst:412 msgid "What's Next?" msgstr "" -#: ../../source/getting_started/using_xinference.rst:406 +#: ../../source/getting_started/using_xinference.rst:414 msgid "" "Congratulations on getting started with Xinference! To help you navigate " "and make the most out of this powerful tool, here are some resources and " "guides:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:409 +#: ../../source/getting_started/using_xinference.rst:417 msgid "" ":ref:`How to Use Client APIs for Different Types of Models " "<user_guide_client_api>`" msgstr "" -#: ../../source/getting_started/using_xinference.rst:411 +#: ../../source/getting_started/using_xinference.rst:419 msgid ":ref:`Choosing the Right Backends for Your Needs <user_guide_backends>`" msgstr "" @@ -381,3 +396,44 @@ msgstr "" #~ " will be accessible for model " #~ "management via CLI or Xinference client." #~ msgstr "" + +#~ msgid "" +#~ "We can specify the model's UID " +#~ "using the ``--model-uid`` or ``-u`` " +#~ "flag. If not specified, Xinference will" +#~ " generate a random ID. This create" +#~ " a new model instance with unique " +#~ "ID ``my-llama-2``:" +#~ msgstr "" + +#~ msgid "" +#~ "Congrats! You now have ``llama-2-chat`` " +#~ "running by Xinference. Once the model" +#~ " is running, we can try it out" +#~ " either command line, via cURL, or" +#~ " via Xinference's python client:" +#~ msgstr "" + +#~ msgid "" +#~ "On each of the other servers where" +#~ " you want to run Xinference workers," +#~ " run the following command:" +#~ msgstr "" + +#~ msgid "" +#~ "On each of the other servers where" +#~ " you want to run Xinference workers," +#~ " run the following command: .. note::" +#~ msgstr "" + +#~ msgid "" +#~ "Note that you must to replace " +#~ "``${worker_host}`` with the actual host " +#~ "of your supervisor server." +#~ msgstr "" + +#~ msgid "" +#~ "Note that you must to replace " +#~ "``${worker_host}`` with the actual host " +#~ "of your worker server." +#~ msgstr "" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po index 45df8430b5..aba5a13e6e 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po @@ -2,13 +2,11 @@ # Copyright (C) 2023, Xorbits Inc. # This file is distributed under the same license as the Xinference package. # FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-05 10:42+0800\n" +"POT-Creation-Date: 2024-04-28 14:43+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -31,13 +29,17 @@ msgstr "本地运行 Xinference" msgid "" "Let's start by running Xinference on a local machine and running a " "classic LLM model: ``llama-2-chat``." -msgstr "让我们以一个经典的大语言模型 ``llama-2-chat`` 来展示如何在本地用 Xinference 运行大模型。" +msgstr "" +"让我们以一个经典的大语言模型 ``llama-2-chat`` 来展示如何在本地用 " +"Xinference 运行大模型。" #: ../../source/getting_started/using_xinference.rst:13 msgid "" "After this quickstart, you will move on to learning how to deploy " "Xinference in a cluster environment." -msgstr "在这个快速入门之后,可以继续学习如何在一个分布式集群环境下部署 Xinference。" +msgstr "" +"在这个快速入门之后,可以继续学习如何在一个分布式集群环境下部署 Xinference" +"。" #: ../../source/getting_started/using_xinference.rst:16 msgid "Start Local Server" @@ -49,8 +51,8 @@ msgid "" "instructions provided :ref:`here <installation>`. To start a local " "instance of Xinference, run the following command:" msgstr "" -"首先,请根据这个 :ref:`文档 <installation>` 的指导确保本地安装了 Xinference。使用以下命令拉起本地的 " -"Xinference 服务:" +"首先,请根据这个 :ref:`文档 <installation>` 的指导确保本地安装了 " +"Xinference。使用以下命令拉起本地的 Xinference 服务:" #: ../../source/getting_started/using_xinference.rst:23 #: ../../source/getting_started/using_xinference.rst:65 @@ -68,8 +70,9 @@ msgid "" "necessary files such as logs and models, where ``<HOME>`` is the home " "path of current user." msgstr "" -"默认情况下,Xinference 会使用 ``<HOME>/.xinference`` " -"作为主目录来存储一些必要的信息,比如日志文件和模型文件,其中 ``<HOME>`` 就是当前用户的主目录。" +"默认情况下,Xinference 会使用 ``<HOME>/.xinference`` 作为主目录来存储一些" +"必要的信息,比如日志文件和模型文件,其中 ``<HOME>`` 就是当前用户的主目录" +"。" #: ../../source/getting_started/using_xinference.rst:42 msgid "" @@ -84,8 +87,9 @@ msgid "" " UI, via cURL, via the command line, or via the Xinference's python " "client." msgstr "" -"恭喜!你已经在本地拉起了 Xinference 服务。一旦 Xinference 服务运行起来,可以有多种方式来使用,包括使用网页、cURL " -"命令、命令行或者是 Xinference 的 Python SDK。" +"恭喜!你已经在本地拉起了 Xinference 服务。一旦 Xinference 服务运行起来," +"可以有多种方式来使用,包括使用网页、cURL 命令、命令行或者是 Xinference 的" +" Python SDK。" #: ../../source/getting_started/using_xinference.rst:52 msgid "" @@ -93,8 +97,9 @@ msgid "" "<http://127.0.0.1:9997/ui>`_ and visit `http://127.0.0.1:9997/docs " "<http://127.0.0.1:9997/docs>`_ to inspect the API docs." msgstr "" -"可以通过访问 `http://127.0.0.1:9997/ui <http://127.0.0.1:9997/ui>`_ 来使用 UI,访问 " -"`http://127.0.0.1:9997/docs <http://127.0.0.1:9997/docs>`_ 来查看 API 文档。" +"可以通过访问 `http://127.0.0.1:9997/ui <http://127.0.0.1:9997/ui>`_ 来" +"使用 UI,访问 `http://127.0.0.1:9997/docs <http://127.0.0.1:9997/docs>`_ " +"来查看 API 文档。" #: ../../source/getting_started/using_xinference.rst:55 msgid "" @@ -114,8 +119,8 @@ msgid "" "using the following command. Please ensure that the version of the client" " matches the version of the Xinference server." msgstr "" -"如果只需要安装 Xinference 的 Python SDK,可以使用以下命令安装最少依赖。需要注意的是版本必须和 Xinference " -"服务的版本保持匹配。" +"如果只需要安装 Xinference 的 Python SDK,可以使用以下命令安装最少依赖。" +"需要注意的是版本必须和 Xinference 服务的版本保持匹配。" #: ../../source/getting_started/using_xinference.rst:103 msgid "Run Llama-2" @@ -129,8 +134,10 @@ msgid "" "the size of the model weights. We cache the model files locally, so " "there's no need to redownload them for subsequent starts." msgstr "" -"让我们来运行一个内置的 ``llama-2-chat`` 模型。当你需要运行一个模型时,第一次运行是要从HuggingFace " -"下载模型参数,一般来说需要根据模型大小下载10到30分钟不等。当下载完成后,Xinference本地会有缓存的处理,以后再运行相同的模型不需要重新下载。" +"让我们来运行一个内置的 ``llama-2-chat`` 模型。当你需要运行一个模型时," +"第一次运行是要从HuggingFace 下载模型参数,一般来说需要根据模型大小下载10" +"到30分钟不等。当下载完成后,Xinference本地会有缓存的处理,以后再运行相同" +"的模型不需要重新下载。" #: ../../source/getting_started/using_xinference.rst:110 msgid "" @@ -139,18 +146,18 @@ msgid "" " example, if you want to download models from `modelscope " "<https://modelscope.cn>`_, do the following:" msgstr "" -"Xinference 也允许从其他模型托管平台下载模型。可以通过在拉起 Xinference 时指定环境变量,比如,如果想要从 " -"ModelScope 中下载模型,可以使用如下命令:" +"Xinference 也允许从其他模型托管平台下载模型。可以通过在拉起 Xinference 时" +"指定环境变量,比如,如果想要从 ModelScope 中下载模型,可以使用如下命令:" #: ../../source/getting_started/using_xinference.rst:118 -#, fuzzy msgid "" "We can specify the model's UID using the ``--model-uid`` or ``-u`` flag. " "If not specified, Xinference will generate a unique ID. This create a new" " model instance with unique ID ``my-llama-2``:" msgstr "" -"可以使用 ``--model-uid`` 或者 ``-u`` 参数指定模型的 UID,如果没有指定,Xinference 会随机生成一个 " -"ID,下面的命令就是手动指定了 ID 为 ``my-llama-2``:" +"可以使用 ``--model-uid`` 或者 ``-u`` 参数指定模型的 UID,如果没有指定," +"Xinference 会随机生成一个 ID,下面的命令就是手动指定了 ID 为 ``my-llama-2" +"``:" #: ../../source/getting_started/using_xinference.rst:157 msgid "" @@ -158,29 +165,31 @@ msgid "" "parameters when running models. In this case, you can directly specify " "the parameter name and value in the command line, for example:" msgstr "" -"对于一些推理引擎,比如 vllm,用户需要在运行模型时指定引擎相关的参数,这种情况下直接在命令行中指定" -"对应的参数名和值即可,比如:" +"对于一些推理引擎,比如 vllm,用户需要在运行模型时指定引擎相关的参数,这种" +"情况下直接在命令行中指定对应的参数名和值即可,比如:" #: ../../source/getting_started/using_xinference.rst:165 msgid "`gpu_memory_utilization=0.9` will pass to vllm when launching model." msgstr "在运行模型时,`gpu_memory_utilization=0.9` 会传到 vllm 后端。" #: ../../source/getting_started/using_xinference.rst:167 -#, fuzzy msgid "" "Congrats! You now have ``llama-2-chat`` running by Xinference. Once the " "model is running, we can try it out either via cURL, or via Xinference's " "python client:" msgstr "" -"到这一步,恭喜你已经成功通过 Xinference 将 ``llama-2-chat`` " -"运行起来了。一旦这个模型在运行中,我们可以通过命令行、cURL 或者是 Python 代码来预支交互:" +"到这一步,恭喜你已经成功通过 Xinference 将 ``llama-2-chat`` 运行起来了。" +"一旦这个模型在运行中,我们可以通过命令行、cURL 或者是 Python 代码来预支" +"交互:" #: ../../source/getting_started/using_xinference.rst:227 msgid "" "Xinference provides OpenAI-compatible APIs for its supported models, so " "you can use Xinference as a local drop-in replacement for OpenAI APIs. " "For example:" -msgstr "Xinference 提供了与 OpenAI 兼容的 API,所以可以将 Xinference 运行的模型当成 OpenAI的本地替代。比如:" +msgstr "" +"Xinference 提供了与 OpenAI 兼容的 API,所以可以将 Xinference 运行的模型" +"当成 OpenAI的本地替代。比如:" #: ../../source/getting_started/using_xinference.rst:243 msgid "The following OpenAI APIs are supported:" @@ -191,24 +200,24 @@ msgid "" "Chat Completions: `https://platform.openai.com/docs/api-reference/chat " "<https://platform.openai.com/docs/api-reference/chat>`_" msgstr "" -"对话生成:`https://platform.openai.com/docs/api-reference/chat " -"<https://platform.openai.com/docs/api-reference/chat>`_" +"对话生成:`https://platform.openai.com/docs/api-reference/chat <https://" +"platform.openai.com/docs/api-reference/chat>`_" #: ../../source/getting_started/using_xinference.rst:247 msgid "" "Completions: `https://platform.openai.com/docs/api-reference/completions " "<https://platform.openai.com/docs/api-reference/completions>`_" msgstr "" -"生成: `https://platform.openai.com/docs/api-reference/completions " -"<https://platform.openai.com/docs/api-reference/completions>`_" +"生成: `https://platform.openai.com/docs/api-reference/completions <https:" +"//platform.openai.com/docs/api-reference/completions>`_" #: ../../source/getting_started/using_xinference.rst:249 msgid "" "Embeddings: `https://platform.openai.com/docs/api-reference/embeddings " "<https://platform.openai.com/docs/api-reference/embeddings>`_" msgstr "" -"向量生成:`https://platform.openai.com/docs/api-reference/embeddings " -"<https://platform.openai.com/docs/api-reference/embeddings>`_" +"向量生成:`https://platform.openai.com/docs/api-reference/embeddings <" +"https://platform.openai.com/docs/api-reference/embeddings>`_" #: ../../source/getting_started/using_xinference.rst:252 msgid "Manage Models" @@ -219,7 +228,9 @@ msgid "" "In addition to launching models, Xinference offers various ways to manage" " the entire lifecycle of models. You can manage models in Xinference " "through the command line, cURL, or Xinference's python client." -msgstr "除了启动模型,Xinference 提供了管理模型整个生命周期的能力。同样的,你可以使用命令行、cURL 以及 Python 代码来管理:" +msgstr "" +"除了启动模型,Xinference 提供了管理模型整个生命周期的能力。同样的,你可以" +"使用命令行、cURL 以及 Python 代码来管理:" #: ../../source/getting_started/using_xinference.rst:257 msgid "" @@ -247,14 +258,18 @@ msgstr "集群中部署 Xinference" msgid "" "To deploy Xinference in a cluster, you need to start a Xinference " "supervisor on one server and Xinference workers on the other servers." -msgstr "若要在集群环境中部署 Xinference,需要在一台机器中启动 supervisor 节点,并在当前或者其他节点启动 worker 节点" +msgstr "" +"若要在集群环境中部署 Xinference,需要在一台机器中启动 supervisor 节点,并" +"在当前或者其他节点启动 worker 节点" #: ../../source/getting_started/using_xinference.rst:317 msgid "" "First, make sure you have already installed Xinference on each of the " "servers according to the instructions provided :ref:`here " "<installation>`. Then follow the steps below:" -msgstr "首先,根据 :ref:`文档 <installation>` 确保所有的服务器上都安装了 Xinference。接下来按照步骤:" +msgstr "" +"首先,根据 :ref:`文档 <installation>` 确保所有的服务器上都安装了 " +"Xinference。接下来按照步骤:" #: ../../source/getting_started/using_xinference.rst:321 msgid "Start the Supervisor" @@ -279,10 +294,9 @@ msgid "" "`http://${supervisor_host}:9997/docs " "<http://${supervisor_host}:9997/docs>`_ to inspect the API docs." msgstr "" -"可以在 `http://${supervisor_host}:9997/ui " -"<http://${supervisor_host}:9997/ui>`_ 访问 web UI,在 " -"`http://${supervisor_host}:9997/docs " -"<http://${supervisor_host}:9997/docs>`_ 访问 API 文档。" +"可以在 `http://${supervisor_host}:9997/ui <http://${supervisor_host}:9997" +"/ui>`_ 访问 web UI,在 `http://${supervisor_host}:9997/docs <http://${" +"supervisor_host}:9997/docs>`_ 访问 API 文档。" #: ../../source/getting_started/using_xinference.rst:335 msgid "Start the Workers" @@ -294,107 +308,114 @@ msgid "" "run the following command:" msgstr "在需要启动 Xinference worker 的机器上执行以下命令:" -#: ../../source/getting_started/using_xinference.rst:345 +#: ../../source/getting_started/using_xinference.rst:344 +msgid "" +"Note that you must replace ``${worker_host}`` with the actual host of " +"your worker server." +msgstr "需要注意的是,必须使用当前Worker节点的 IP 来替换 ``${worker_host}``。" + +#: ../../source/getting_started/using_xinference.rst:347 msgid "" "Note that if you need to interact with the Xinference in a cluster via " "the command line, you should include the ``-e`` or ``--endpoint`` flag to" " specify the supervisor server's endpoint. For example:" msgstr "" -"需要注意的是,如果你需要通过命令行与集群交互,应该通过 ``-e`` 或者 ``--endpoint`` 参数来指定 supervisor " -"的地址,比如:" +"需要注意的是,如果你需要通过命令行与集群交互,应该通过 ``-e`` 或者 ``--" +"endpoint`` 参数来指定 supervisor 的地址,比如:" -#: ../../source/getting_started/using_xinference.rst:353 +#: ../../source/getting_started/using_xinference.rst:355 msgid "Using Xinference With Docker" msgstr "使用 Docker 部署 Xinference" -#: ../../source/getting_started/using_xinference.rst:355 +#: ../../source/getting_started/using_xinference.rst:357 msgid "To start Xinference in a Docker container, run the following command:" msgstr "用以下命令在容器中运行 Xinference:" -#: ../../source/getting_started/using_xinference.rst:358 +#: ../../source/getting_started/using_xinference.rst:360 msgid "Run On Nvidia GPU Host" msgstr "在拥有英伟达显卡的机器上运行" -#: ../../source/getting_started/using_xinference.rst:365 +#: ../../source/getting_started/using_xinference.rst:367 msgid "Run On CPU Only Host" msgstr "在只有 CPU 的机器上运行" -#: ../../source/getting_started/using_xinference.rst:373 +#: ../../source/getting_started/using_xinference.rst:375 msgid "Using Xinference On Kubernetes" msgstr "在 Kubernetes 环境中运行 Xinference" -#: ../../source/getting_started/using_xinference.rst:375 +#: ../../source/getting_started/using_xinference.rst:377 msgid "" "To use Xinference on Kubernetes, `KubeBlocks <https://kubeblocks.io/>`_ " "is required to help the installation." msgstr "" -"如果想在 Kubernetes 中运行 Xinference,需要通过 `KubeBlocks " -"<https://kubeblocks.io/>`_ 来帮助安装。" +"如果想在 Kubernetes 中运行 Xinference,需要通过 `KubeBlocks <https://" +"kubeblocks.io/>`_ 来帮助安装。" -#: ../../source/getting_started/using_xinference.rst:377 +#: ../../source/getting_started/using_xinference.rst:379 msgid "The following steps assume Kubernetes is already installed." msgstr "假设已经有一个可以使用的 Kubernetes 环境。" -#: ../../source/getting_started/using_xinference.rst:379 +#: ../../source/getting_started/using_xinference.rst:381 msgid "" "Download cli tool kbcli for KubeBlocks, see `install kbcli " "<https://kubeblocks.io/docs/preview/user_docs/installation/install-with-" "kbcli/install-kbcli/>`_." msgstr "" -"下载 KubeBlocks 的命令行工具,可以参考 `文档 " -"<https://kubeblocks.io/docs/preview/user_docs/installation/install-with-" -"kbcli/install-kbcli/>`_. " +"下载 KubeBlocks 的命令行工具,可以参考 `文档 <https://kubeblocks.io/docs/" +"preview/user_docs/installation/install-with-kbcli/install-kbcli/>`_. " -#: ../../source/getting_started/using_xinference.rst:381 +#: ../../source/getting_started/using_xinference.rst:383 msgid "Make sure kbcli version is at least v0.7.1." msgstr "确保 kbcli 的版本至少为 v0.7.1。" -#: ../../source/getting_started/using_xinference.rst:383 +#: ../../source/getting_started/using_xinference.rst:385 msgid "" "Install KubeBlocks using kbcli command, see `install KubeBlocks with " "kbcli <https://kubeblocks.io/docs/preview/user_docs/installation/install-" "with-kbcli/install-kubeblocks-with-kbcli/>`_." msgstr "" -"通过 kbcli 安装 KubeBlocks,参考 `文档 kbcli " -"<https://kubeblocks.io/docs/preview/user_docs/installation/install-with-" -"kbcli/install-kubeblocks-with-kbcli/>`_." +"通过 kbcli 安装 KubeBlocks,参考 `文档 kbcli <https://kubeblocks.io/docs/" +"preview/user_docs/installation/install-with-kbcli/install-kubeblocks-with" +"-kbcli/>`_." -#: ../../source/getting_started/using_xinference.rst:385 +#: ../../source/getting_started/using_xinference.rst:387 msgid "Enable Xinference addon, run the following command:" msgstr "用以下命令打开 Xinference 插件:" -#: ../../source/getting_started/using_xinference.rst:391 +#: ../../source/getting_started/using_xinference.rst:393 msgid "Use kbcli to start Xinference cluster, run the following command:" msgstr "使用 kbcli 来拉起 Xinference 集群:" -#: ../../source/getting_started/using_xinference.rst:397 +#: ../../source/getting_started/using_xinference.rst:399 msgid "" "If the Kubernetes node doesn't have GPU on it, run the command with extra" " flag:" msgstr "如果 Kubernetes 节点没有 GPU 设备,需要加上额外的参数:" -#: ../../source/getting_started/using_xinference.rst:403 +#: ../../source/getting_started/using_xinference.rst:405 msgid "Use -h to read the help documentation for more options:" msgstr "使用 -h 获取帮助文档" -#: ../../source/getting_started/using_xinference.rst:410 +#: ../../source/getting_started/using_xinference.rst:412 msgid "What's Next?" msgstr "更多" -#: ../../source/getting_started/using_xinference.rst:412 +#: ../../source/getting_started/using_xinference.rst:414 msgid "" "Congratulations on getting started with Xinference! To help you navigate " "and make the most out of this powerful tool, here are some resources and " "guides:" -msgstr "恭喜你,已经初步掌握了 Xinference 的用法!为了帮助你更好地使用工具,下面是其他的一些文档和指导资源:" +msgstr "" +"恭喜你,已经初步掌握了 Xinference 的用法!为了帮助你更好地使用工具,下面" +"是其他的一些文档和指导资源:" -#: ../../source/getting_started/using_xinference.rst:415 +#: ../../source/getting_started/using_xinference.rst:417 msgid "" ":ref:`How to Use Client APIs for Different Types of Models " "<user_guide_client_api>`" msgstr ":ref:`如何使用 Python 创建不同类型的模型 <user_guide_client_api>`" -#: ../../source/getting_started/using_xinference.rst:417 +#: ../../source/getting_started/using_xinference.rst:419 msgid ":ref:`Choosing the Right Backends for Your Needs <user_guide_backends>`" msgstr ":ref:`选择正确的推理引擎 <user_guide_backends>` " From f55ffcd4a4932ebadb47c76610fe40b8e8b8c05f Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Mon, 29 Apr 2024 10:16:21 +0800 Subject: [PATCH 049/298] BUG: Fix using extra gpus due to match in `__init__` (#1400) --- xinference/client/tests/test_client.py | 2 +- xinference/conftest.py | 2 +- xinference/core/tests/test_metrics.py | 2 +- xinference/model/llm/__init__.py | 9 --------- xinference/model/llm/core.py | 22 +++++++++++++++++++--- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/xinference/client/tests/test_client.py b/xinference/client/tests/test_client.py index ce928214f7..74d128422e 100644 --- a/xinference/client/tests/test_client.py +++ b/xinference/client/tests/test_client.py @@ -620,7 +620,7 @@ def setup_cluster(): logging_conf=TEST_FILE_LOGGING_CONF, ) endpoint = f"http://localhost:{port}" - if not api_health_check(endpoint, max_attempts=3, sleep_interval=5): + if not api_health_check(endpoint, max_attempts=10, sleep_interval=5): raise RuntimeError("Endpoint is not available after multiple attempts") yield f"http://localhost:{port}", supervisor_address diff --git a/xinference/conftest.py b/xinference/conftest.py index 1dfeae0f0e..10ec52bc1e 100644 --- a/xinference/conftest.py +++ b/xinference/conftest.py @@ -237,7 +237,7 @@ def setup_with_file_logging(): logging_conf=TEST_FILE_LOGGING_CONF, ) endpoint = f"http://localhost:{port}" - if not api_health_check(endpoint, max_attempts=3, sleep_interval=5): + if not api_health_check(endpoint, max_attempts=10, sleep_interval=5): raise RuntimeError("Endpoint is not available after multiple attempts") try: diff --git a/xinference/core/tests/test_metrics.py b/xinference/core/tests/test_metrics.py index d02d41bd15..f6dcad0ea3 100644 --- a/xinference/core/tests/test_metrics.py +++ b/xinference/core/tests/test_metrics.py @@ -44,7 +44,7 @@ def setup_cluster(): logging_conf=TEST_FILE_LOGGING_CONF, ) endpoint = f"http://localhost:{port}" - if not api_health_check(endpoint, max_attempts=3, sleep_interval=5): + if not api_health_check(endpoint, max_attempts=10, sleep_interval=5): raise RuntimeError("Endpoint is not available after multiple attempts") yield f"http://localhost:{port}", f"http://localhost:{metrics_port}/metrics", supervisor_address diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 0cdabd010a..c6af541362 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -13,7 +13,6 @@ # limitations under the License. import codecs -import gc import json import os @@ -266,11 +265,3 @@ def _install(): # register model description for ud_llm in get_user_defined_llm_families(): LLM_MODEL_DESCRIPTIONS.update(generate_llm_description(ud_llm)) - - # Have to empty_cache here to reset CUDA status. - # Because `generate_engine_config_by_model_family` above has already initialized CUDA, - # which leads to torch initialization error in subprocess. - from ...device_utils import empty_cache - - gc.collect() - empty_cache() diff --git a/xinference/model/llm/core.py b/xinference/model/llm/core.py index 54bbe5f32f..c76a0b34a1 100644 --- a/xinference/model/llm/core.py +++ b/xinference/model/llm/core.py @@ -82,9 +82,25 @@ def _is_linux(): @staticmethod def _has_cuda_device(): - from ...utils import cuda_count - - return cuda_count() > 0 + """ + Use pynvml to impl this interface. + DO NOT USE torch to impl this, which will lead to some unexpected errors. + """ + from pynvml import nvmlDeviceGetCount, nvmlInit, nvmlShutdown + + device_count = 0 + try: + nvmlInit() + device_count = nvmlDeviceGetCount() + except: + pass + finally: + try: + nvmlShutdown() + except: + pass + + return device_count > 0 @staticmethod def _get_cuda_count(): From 5fb5663925f720bd4387e5c8ca37030b36629a22 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Mon, 29 Apr 2024 04:25:47 +0200 Subject: [PATCH 050/298] ENH: Update chatglm3 6b model version (#1401) Co-authored-by: Xuye (Chris) Qin <qinxuye@gmail.com> --- xinference/core/tests/test_restful_api.py | 46 +++++++++++++++++++ xinference/model/llm/llm_family.json | 2 +- .../model/llm/llm_family_modelscope.json | 2 +- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index 881be28feb..96c0651926 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -461,6 +461,52 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): response_data = response.json() assert len(response_data["data"]) == 1 + tools = [ + { + "type": "function", + "function": { + "name": "get_current_weather", + "description": "获取当前天气", + "parameters": { + "type": "object", + "properties": { + "location": {"type": "string", "description": "城市,例如北京"}, + "format": { + "type": "string", + "enum": ["celsius", "fahrenheit"], + "description": "使用的温度单位。从所在的城市进行推断。", + }, + }, + "required": ["location", "format"], + }, + }, + } + ] + + url = f"{endpoint}/v1/chat/completions" + payload = { + "model": model_uid_res, + "messages": [ + {"role": "system", "content": "你是一个有用的助手。不要对要函数调用的值做出假设。"}, + {"role": "user", "content": "上海现在的天气怎么样?"}, + ], + "temperature": 0.7, + "tools": tools, + "stop": ["\n"], + } + response = requests.post(url, json=payload) + completion = response.json() + + assert ( + "get_current_weather" + == completion["choices"][0]["message"]["tool_calls"][0]["function"]["name"] + ) + arguments = completion["choices"][0]["message"]["tool_calls"][0]["function"][ + "arguments" + ] + arg = json.loads(arguments) + assert arg == {"location": "上海", "format": "celsius"} + # tool tools = [ { diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index dd4a0f6b7b..be980c076a 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -724,7 +724,7 @@ "none" ], "model_id": "THUDM/chatglm3-6b", - "model_revision": "b098244a71fbe69ce149682d9072a7629f7e908c" + "model_revision": "103caa40027ebfd8450289ca2f278eac4ff26405" } ], "prompt_style": { diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 123cf2c66f..d42d5d70b9 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -413,7 +413,7 @@ ], "model_hub": "modelscope", "model_id": "ZhipuAI/chatglm3-6b", - "model_revision": "v1.0.0" + "model_revision": "v1.0.2" } ], "prompt_style": { From 7c974be21f578db024442d08e74c3170352bf1bd Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Mon, 29 Apr 2024 12:21:46 +0800 Subject: [PATCH 051/298] BLD: Use self-hosted aws machine to build docker image (#1405) --- .github/workflows/docker-cd.yaml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docker-cd.yaml b/.github/workflows/docker-cd.yaml index 72aec06d03..b5e023dbd3 100644 --- a/.github/workflows/docker-cd.yaml +++ b/.github/workflows/docker-cd.yaml @@ -14,10 +14,10 @@ concurrency: jobs: build: - runs-on: ubuntu-latest + runs-on: self-hosted strategy: matrix: - python-version: [ "3.10" ] + python-version: [ "3.9" ] steps: - name: Check out code uses: actions/checkout@v3 @@ -38,10 +38,6 @@ jobs: DOCKER_ORG: ${{ secrets.DOCKERHUB_USERNAME }} PY_VERSION: ${{ matrix.python-version }} run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf "/usr/local/share/boost" - sudo rm -rf "$AGENT_TOOLSDIRECTORY" if [[ "$GITHUB_REF" =~ ^"refs/tags/" ]]; then export GIT_TAG=$(echo "$GITHUB_REF" | sed -e "s/refs\/tags\///g") fi From 5d55c9c791680383157dab65e0071b8ceca0c138 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Tue, 30 Apr 2024 04:38:57 +0200 Subject: [PATCH 052/298] BUG: Fix qwen tool call paramerter empty issue (#1381) --- xinference/core/tests/test_restful_api.py | 71 +++++++++++++++++++++-- xinference/model/llm/utils.py | 18 +++--- 2 files changed, 75 insertions(+), 14 deletions(-) diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index 96c0651926..a6aeed3e47 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -725,7 +725,7 @@ def test_restful_api_for_gorilla_openfunctions_tool_calls( ) @pytest.mark.skip(reason="Cost too many resources.") def test_restful_api_for_qwen_tool_calls(setup, model_format, quantization): - model_name = "qwen-chat" + model_name = "qwen1.5-chat" endpoint, _ = setup url = f"{endpoint}/v1/models" @@ -739,7 +739,7 @@ def test_restful_api_for_qwen_tool_calls(setup, model_format, quantization): payload = { "model_uid": "test_tool", "model_name": model_name, - "model_size_in_billions": 7, + "model_size_in_billions": 4, "model_format": model_format, "quantization": quantization, } @@ -753,6 +753,67 @@ def test_restful_api_for_qwen_tool_calls(setup, model_format, quantization): response_data = response.json() assert len(response_data["data"]) == 1 + url = f"{endpoint}/v1/chat/completions" + payload = { + "model": model_uid_res, + "messages": [ + { + "role": "user", + "content": "谁是周杰伦?", + }, + ], + "tools": [], + "max_tokens": 2048, + "temperature": 0, + } + response = requests.post(url, json=payload) + completion = response.json() + assert "stop" == completion["choices"][0]["finish_reason"] + + tools = [ + { + "type": "function", + "function": { + "name": "google_search", + "description": "谷歌搜索是一个通用搜索引擎,搜索周杰伦。", + "parameters": {}, + }, + }, + { + "type": "function", + "function": { + "name": "image_gen", + "description": "文生图是一个AI绘画(图像生成)服务,画个周杰伦。", + }, + }, + ] + + url = f"{endpoint}/v1/chat/completions" + payload = { + "model": model_uid_res, + "messages": [ + { + "role": "user", + "content": "谁是周杰伦?", + }, + ], + "tools": tools, + "max_tokens": 2048, + "temperature": 0, + } + response = requests.post(url, json=payload) + completion = response.json() + assert "content" in completion["choices"][0]["message"] + assert "tool_calls" == completion["choices"][0]["finish_reason"] + assert ( + "google_search" + == completion["choices"][0]["message"]["tool_calls"][0]["function"]["name"] + ) + arguments = completion["choices"][0]["message"]["tool_calls"][0]["function"][ + "arguments" + ] + assert not json.loads(arguments) + # tool tools = [ { @@ -840,7 +901,8 @@ def test_restful_api_for_qwen_tool_calls(setup, model_format, quantization): completion2 = response.json() assert "stop" == completion2["choices"][0]["finish_reason"] assert "周杰伦" in completion2["choices"][0]["message"]["content"] - assert "歌手" in completion2["choices"][0]["message"]["content"] + # The content varies between gguf and torch model. + # assert "歌" in completion2["choices"][0]["message"]["content"] # Check continue tool call. payload = { @@ -875,7 +937,8 @@ def test_restful_api_for_qwen_tool_calls(setup, model_format, quantization): arg = json.loads(arguments) assert "Jay Chou" in arg["prompt"] - _check_invalid_tool_calls(endpoint, model_uid_res) + # Qwen 1.5 4B can't pass the false tool call check. + # _check_invalid_tool_calls(endpoint, model_uid_res) def test_restful_api_with_request_limits(setup): diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 24b24969e1..c050d0159f 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -228,16 +228,14 @@ def get_role(role_name: str): tools_name_text = [] for func_info in tools: parameters = [] - required_parameters = func_info["function"]["parameters"].get( - "required", [] - ) - for name, p in func_info["function"]["parameters"][ - "properties" - ].items(): - param = dict({"name": name}, **p) - if name in required_parameters: - param["required"] = True - parameters.append(param) + fp = func_info["function"].get("parameters", {}) + if fp: + required_parameters = fp.get("required", []) + for name, p in fp["properties"].items(): + param = dict({"name": name}, **p) + if name in required_parameters: + param["required"] = True + parameters.append(param) name = func_info["function"]["name"] desc = func_info["function"]["description"] From 3b035207fcdf594deb977bdd800ad51f8010be5e Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Thu, 2 May 2024 02:45:54 +0800 Subject: [PATCH 053/298] =?UTF-8?q?BUG=EF=BC=9AFix=20mertics=20is=20empty?= =?UTF-8?q?=20when=20call=20`/v1/chat/completions`=20(#1406)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xinference/core/model.py | 10 ++++++++-- xinference/core/tests/test_metrics.py | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/xinference/core/model.py b/xinference/core/model.py index 63616cf3a7..251e90ce92 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -25,6 +25,7 @@ AsyncGenerator, Callable, Dict, + Generator, Iterator, List, Optional, @@ -379,8 +380,13 @@ async def chat(self, prompt: str, *args, **kwargs): raise AttributeError(f"Model {self._model.model_spec} is not for chat.") finally: # For the non stream result. - if response is not None and isinstance(response, dict): - usage = response["usage"] + record = None + if isinstance(response, Generator) or isinstance(response, AsyncGenerator): + record = response + elif isinstance(response, bytes): + record = json.loads(response) + if record and isinstance(record, dict): + usage = record["usage"] # Some backends may not have a valid usage, we just skip them. completion_tokens = usage["completion_tokens"] prompt_tokens = usage["prompt_tokens"] diff --git a/xinference/core/tests/test_metrics.py b/xinference/core/tests/test_metrics.py index f6dcad0ea3..8c142a7739 100644 --- a/xinference/core/tests/test_metrics.py +++ b/xinference/core/tests/test_metrics.py @@ -82,3 +82,25 @@ async def test_metrics_exporter_server(setup_cluster): response = requests.get(metrics_exporter_address) assert response.ok assert 'xinference:input_tokens_total_counter{model="orca"} 1' in response.text + + +async def test_metrics_exporter_data(setup_cluster): + endpoint, metrics_exporter_address, supervisor_address = setup_cluster + + from ...client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_name="orca", + model_size_in_billions=3, + model_format="ggmlv3", + quantization="q4_0", + ) + + model = client.get_model(model_uid) + response = model.chat("write a poem.") + + response = requests.get(metrics_exporter_address) + assert response.ok + assert 'format="ggmlv3",model="orca"' in response.text From 07d591fcfaae71fdc1ffa9ac0c2b64127d20e067 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 3 May 2024 09:11:25 +0800 Subject: [PATCH 054/298] DOC: update docker doc in using xinference (#1417) --- README.md | 2 +- README_zh_CN.md | 2 +- .../getting_started/using_docker_image.rst | 4 +- .../getting_started/using_xinference.rst | 8 +- .../getting_started/using_xinference.po | 42 +++++--- .../getting_started/using_docker_image.po | 97 ++++++++++++------- .../getting_started/using_xinference.po | 43 +++++--- 7 files changed, 126 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index 11fc1e8dda..4be0ce2d9e 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,11 @@ potential of cutting-edge AI models. - Support multimodal: [#829](https://github.com/xorbitsai/inference/pull/829) ### New Models - Built-in support for [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) +- Built-in support for [Qwen1.5 110B](https://huggingface.co/Qwen/Qwen1.5-110B-Chat): [#1388](https://github.com/xorbitsai/inference/pull/1388) - Built-in support for [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) - Built-in support for [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) - Built-in support for [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) - Built-in support for [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) -- Built-in support for [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) ### Integrations - [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. diff --git a/README_zh_CN.md b/README_zh_CN.md index 2826b7f8ad..72011ae30f 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -32,11 +32,11 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - 支持多模态模型:[#829](https://github.com/xorbitsai/inference/pull/829) ### 新模型 - 内置 [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) +- 内置 [Qwen1.5 110B](https://huggingface.co/Qwen/Qwen1.5-110B-Chat): [#1388](https://github.com/xorbitsai/inference/pull/1388) - 内置 [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) - 内置 [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) - 内置 [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) - 内置 [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) -- 内置 [OmniLMM](https://github.com/OpenBMB/OmniLMM): [#1171](https://github.com/xorbitsai/inference/pull/1171) ### 集成 - [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 diff --git a/doc/source/getting_started/using_docker_image.rst b/doc/source/getting_started/using_docker_image.rst index 4ae66edd0b..896014bbb8 100644 --- a/doc/source/getting_started/using_docker_image.rst +++ b/doc/source/getting_started/using_docker_image.rst @@ -17,10 +17,12 @@ Prerequisites Docker Image ============ The official image of Xinference is available on DockerHub in the repository ``xprobe/xinference``. -There are two kinds of image tags available: +Available tags include: * ``nightly-main``: This image is built daily from the `GitHub main branch <https://github.com/xorbitsai/inference>`_ and generally does not guarantee stability. * ``v<release version>``: This image is built each time a Xinference release version is published, and it is typically more stable. +* ``latest``: This image is built with the latest Xinference release version. +* For CPU version, add ``-cpu`` suffix, e.g. ``nightly-main-cpu``. Dockerfile for custom build diff --git a/doc/source/getting_started/using_xinference.rst b/doc/source/getting_started/using_xinference.rst index 195b0f57a6..8877ff4ab7 100644 --- a/doc/source/getting_started/using_xinference.rst +++ b/doc/source/getting_started/using_xinference.rst @@ -361,14 +361,18 @@ Run On Nvidia GPU Host .. code-block:: bash - docker run -p 9997:9997 --rm --gpus all xprobe/xinference:latest + docker run -e XINFERENCE_MODEL_SRC=modelscope -p 9998:9997 --gpus all xprobe/xinference:<your_version> xinference-local -H 0.0.0.0 --log-level debug Run On CPU Only Host ----------------------- .. code-block:: bash - docker run -p 9997:9997 --rm xprobe/xinference:latest-cpu + docker run -e XINFERENCE_MODEL_SRC=modelscope -p 9998:9997 xprobe/xinference:<your_version>-cpu xinference-local -H 0.0.0.0 --log-level debug + +Replace ``<your_version>`` with Xinference versions, e.g. ``v0.10.3``, ``latest`` can be used for the latest version. + +For more docker usage, refer to :ref:`Using Docker Image <using_docker_image>`. Using Xinference On Kubernetes diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po index c07d245c11..3e1b5f8847 100644 --- a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po +++ b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-28 14:43+0800\n" +"POT-Creation-Date: 2024-04-30 13:23+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: ja_JP\n" @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/getting_started/using_xinference.rst:5 msgid "Using Xinference" @@ -289,74 +289,86 @@ msgstr "" msgid "Run On CPU Only Host" msgstr "" +#: ../../source/getting_started/using_xinference.rst:373 +msgid "" +"Replace ``<your_version>`` with Xinference versions, e.g. ``v0.10.3``, " +"``latest`` can be used for the latest version." +msgstr "" + #: ../../source/getting_started/using_xinference.rst:375 +msgid "" +"For more docker usage, refer to :ref:`Using Docker Image " +"<using_docker_image>`." +msgstr "" + +#: ../../source/getting_started/using_xinference.rst:379 msgid "Using Xinference On Kubernetes" msgstr "" -#: ../../source/getting_started/using_xinference.rst:377 +#: ../../source/getting_started/using_xinference.rst:381 msgid "" "To use Xinference on Kubernetes, `KubeBlocks <https://kubeblocks.io/>`_ " "is required to help the installation." msgstr "" -#: ../../source/getting_started/using_xinference.rst:379 +#: ../../source/getting_started/using_xinference.rst:383 msgid "The following steps assume Kubernetes is already installed." msgstr "" -#: ../../source/getting_started/using_xinference.rst:381 +#: ../../source/getting_started/using_xinference.rst:385 msgid "" "Download cli tool kbcli for KubeBlocks, see `install kbcli " "<https://kubeblocks.io/docs/preview/user_docs/installation/install-with-" "kbcli/install-kbcli/>`_." msgstr "" -#: ../../source/getting_started/using_xinference.rst:383 +#: ../../source/getting_started/using_xinference.rst:387 msgid "Make sure kbcli version is at least v0.7.1." msgstr "" -#: ../../source/getting_started/using_xinference.rst:385 +#: ../../source/getting_started/using_xinference.rst:389 msgid "" "Install KubeBlocks using kbcli command, see `install KubeBlocks with " "kbcli <https://kubeblocks.io/docs/preview/user_docs/installation/install-" "with-kbcli/install-kubeblocks-with-kbcli/>`_." msgstr "" -#: ../../source/getting_started/using_xinference.rst:387 +#: ../../source/getting_started/using_xinference.rst:391 msgid "Enable Xinference addon, run the following command:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:393 +#: ../../source/getting_started/using_xinference.rst:397 msgid "Use kbcli to start Xinference cluster, run the following command:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:399 +#: ../../source/getting_started/using_xinference.rst:403 msgid "" "If the Kubernetes node doesn't have GPU on it, run the command with extra" " flag:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:405 +#: ../../source/getting_started/using_xinference.rst:409 msgid "Use -h to read the help documentation for more options:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:412 +#: ../../source/getting_started/using_xinference.rst:416 msgid "What's Next?" msgstr "" -#: ../../source/getting_started/using_xinference.rst:414 +#: ../../source/getting_started/using_xinference.rst:418 msgid "" "Congratulations on getting started with Xinference! To help you navigate " "and make the most out of this powerful tool, here are some resources and " "guides:" msgstr "" -#: ../../source/getting_started/using_xinference.rst:417 +#: ../../source/getting_started/using_xinference.rst:421 msgid "" ":ref:`How to Use Client APIs for Different Types of Models " "<user_guide_client_api>`" msgstr "" -#: ../../source/getting_started/using_xinference.rst:419 +#: ../../source/getting_started/using_xinference.rst:423 msgid ":ref:`Choosing the Right Backends for Your Needs <user_guide_backends>`" msgstr "" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_docker_image.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_docker_image.po index f85504aba6..f1b381d763 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_docker_image.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_docker_image.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-16 12:13+0800\n" +"POT-Creation-Date: 2024-04-30 14:54+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/getting_started/using_docker_image.rst:5 msgid "Xinference Docker Image" @@ -35,7 +35,9 @@ msgstr "准备工作" msgid "" "The image can only run in an environment with GPUs and CUDA installed, " "because Xinference in the image relies on Nvidia GPUs for acceleration." -msgstr "Xinference 使用 GPU 加速推理,该镜像需要在有 GPU 显卡并且安装 CUDA 的机器上运行。" +msgstr "" +"Xinference 使用 GPU 加速推理,该镜像需要在有 GPU 显卡并且安装 CUDA 的机器" +"上运行。" #: ../../source/getting_started/using_docker_image.rst:13 msgid "" @@ -51,8 +53,8 @@ msgid "" "the CUDA version on your host machine between ``11.8`` and ``12.2``, even" " if it is inconsistent." msgstr "" -"镜像中的 CUDA 版本是 ``12.1`` ,推荐机器上的版本与之保持一致。如果不一致,需要保证CUDA 版本在 ``11.8`` 与 " -"``12.2`` 之间。" +"镜像中的 CUDA 版本是 ``12.1`` ,推荐机器上的版本与之保持一致。如果不一致" +",需要保证CUDA 版本在 ``11.8`` 与 ``12.2`` 之间。" #: ../../source/getting_started/using_docker_image.rst:18 msgid "Docker Image" @@ -61,28 +63,42 @@ msgstr "Docker 镜像" #: ../../source/getting_started/using_docker_image.rst:19 msgid "" "The official image of Xinference is available on DockerHub in the " -"repository ``xprobe/xinference``. There are two kinds of image tags " -"available:" -msgstr "Xinference 的官方镜像在 Dockerhub 的 ``xprobe/xinference`` 仓库里。目前有两个版本可以获取:" +"repository ``xprobe/xinference``. Available tags include:" +msgstr "" +"Xinference 的官方镜像在 Dockerhub 的 ``xprobe/xinference`` 仓库里。目前可用版本包括:" #: ../../source/getting_started/using_docker_image.rst:22 msgid "" "``nightly-main``: This image is built daily from the `GitHub main branch " "<https://github.com/xorbitsai/inference>`_ and generally does not " "guarantee stability." -msgstr "``nightly-main``: 这个镜像会每天从 GitHub main 分支更新制作,不保证稳定可靠。" +msgstr "" +"``nightly-main``: 这个镜像会每天从 GitHub main 分支更新制作,不保证稳定" +"可靠。" #: ../../source/getting_started/using_docker_image.rst:23 msgid "" "``v<release version>``: This image is built each time a Xinference " "release version is published, and it is typically more stable." -msgstr "``v<release version>``: 这个镜像会在 Xinference 每次发布的时候制作,通常可以认为是稳定可靠的。" +msgstr "" +"``v<release version>``: 这个镜像会在 Xinference 每次发布的时候制作,通常" +"可以认为是稳定可靠的。" + +#: ../../source/getting_started/using_docker_image.rst:24 +msgid "" +"``latest``: This image is built with the latest Xinference release " +"version." +msgstr "``latest``: 这个镜像会在 Xinference 发布时指向最新的发布版本" -#: ../../source/getting_started/using_docker_image.rst:27 +#: ../../source/getting_started/using_docker_image.rst:25 +msgid "For CPU version, add ``-cpu`` suffix, e.g. ``nightly-main-cpu``." +msgstr "对于 CPU 版本,增加 ``-cpu`` 后缀,如 ``nightly-main-cpu``。" + +#: ../../source/getting_started/using_docker_image.rst:29 msgid "Dockerfile for custom build" msgstr "自定义镜像" -#: ../../source/getting_started/using_docker_image.rst:28 +#: ../../source/getting_started/using_docker_image.rst:30 msgid "" "If you need to build the Xinference image according to your own " "requirements, the source code for the Dockerfile is located at " @@ -91,54 +107,57 @@ msgid "" " for reference. Please make sure to be in the top-level directory of " "Xinference when using this Dockerfile. For example:" msgstr "" -"如果需要安装额外的依赖,可以参考 `xinference/deploy/docker/Dockerfile " -"<https://github.com/xorbitsai/inference/tree/main/xinference/deploy/docker/Dockerfile>`_" -" 。请确保使用 Dockerfile 制作镜像时在 Xinference 项目的根目录下。比如:" +"如果需要安装额外的依赖,可以参考 `xinference/deploy/docker/Dockerfile <" +"https://github.com/xorbitsai/inference/tree/main/xinference/deploy/docker" +"/Dockerfile>`_ 。请确保使用 Dockerfile 制作镜像时在 Xinference 项目的" +"根目录下。比如:" -#: ../../source/getting_started/using_docker_image.rst:39 +#: ../../source/getting_started/using_docker_image.rst:41 msgid "Image usage" msgstr "使用镜像" -#: ../../source/getting_started/using_docker_image.rst:40 +#: ../../source/getting_started/using_docker_image.rst:42 msgid "" "You can start Xinference in the container like this, simultaneously " "mapping port 9997 in the container to port 9998 on the host, enabling " "debug logging, and downloading models from modelscope." msgstr "" -"你可以使用如下方式在容器内启动 Xinference,同时将 9997 端口映射到宿主机的 9998 端口,并且指定日志级别为 " -"DEBUG,也可以指定需要的环境变量。" +"你可以使用如下方式在容器内启动 Xinference,同时将 9997 端口映射到宿主机的" +" 9998 端口,并且指定日志级别为 DEBUG,也可以指定需要的环境变量。" -#: ../../source/getting_started/using_docker_image.rst:48 +#: ../../source/getting_started/using_docker_image.rst:50 msgid "" "The option ``--gpus`` is essential and cannot be omitted, because as " "mentioned earlier, the image requires the host machine to have a GPU. " "Otherwise, errors will occur." -msgstr "``--gpus`` 必须指定,正如前文描述,镜像必须运行在有 GPU 的机器上,否则会出现错误。" +msgstr "" +"``--gpus`` 必须指定,正如前文描述,镜像必须运行在有 GPU 的机器上,否则会" +"出现错误。" -#: ../../source/getting_started/using_docker_image.rst:49 +#: ../../source/getting_started/using_docker_image.rst:51 msgid "" "The ``-H 0.0.0.0`` parameter after the ``xinference-local`` command " "cannot be omitted. Otherwise, the host machine may not be able to access " "the port inside the container." msgstr "``-H 0.0.0.0`` 也是必须指定的,否则在容器外无法连接到 Xinference 服务。" -#: ../../source/getting_started/using_docker_image.rst:50 +#: ../../source/getting_started/using_docker_image.rst:52 msgid "" "You can add multiple ``-e`` options to introduce multiple environment " "variables." msgstr "可以指定多个 ``-e`` 选项赋值多个环境变量。" -#: ../../source/getting_started/using_docker_image.rst:53 +#: ../../source/getting_started/using_docker_image.rst:55 msgid "" "Certainly, if you prefer, you can also manually enter the docker " "container and start Xinference in any desired way." msgstr "当然,也可以运行容器后,进入容器内手动拉起 Xinference。" -#: ../../source/getting_started/using_docker_image.rst:57 +#: ../../source/getting_started/using_docker_image.rst:59 msgid "Mount your volume for loading and saving models" msgstr "挂载模型目录" -#: ../../source/getting_started/using_docker_image.rst:58 +#: ../../source/getting_started/using_docker_image.rst:60 msgid "" "The image does not contain any model files by default, and it downloads " "the models into the container. Typically, you would need to mount a " @@ -147,10 +166,11 @@ msgid "" "need to specify a volume when running the Docker image and configure " "environment variables for Xinference:" msgstr "" -"默认情况下,镜像中不包含任何模型文件,使用过程中会在容器内下载模型。如果需要使用已经下载好的模型,需要将宿主机的目录挂载到容器内。这种情况下,需要在运行容器时指定本地卷,并且为" -" Xinference 配置环境变量。" +"默认情况下,镜像中不包含任何模型文件,使用过程中会在容器内下载模型。如果" +"需要使用已经下载好的模型,需要将宿主机的目录挂载到容器内。这种情况下," +"需要在运行容器时指定本地卷,并且为 Xinference 配置环境变量。" -#: ../../source/getting_started/using_docker_image.rst:67 +#: ../../source/getting_started/using_docker_image.rst:69 msgid "" "The principle behind the above command is to mount the specified " "directory from the host machine into the container, and then set the " @@ -161,11 +181,12 @@ msgid "" "time you run it, you can directly use the existing models without the " "need for repetitive downloads." msgstr "" -"上述命令的原理是将主机上指定的目录挂载到容器中,并设置 ``XINFERENCE_HOME`` " -"环境变量指向容器内的该目录。这样,所有下载的模型文件将存储在您在主机上指定的目录中。您无需担心在 Docker " -"容器停止时丢失这些文件,下次运行容器时,您可以直接使用现有的模型,无需重复下载。" +"上述命令的原理是将主机上指定的目录挂载到容器中,并设置 ``XINFERENCE_HOME`" +"` 环境变量指向容器内的该目录。这样,所有下载的模型文件将存储在您在主机上" +"指定的目录中。您无需担心在 Docker 容器停止时丢失这些文件,下次运行容器时" +",您可以直接使用现有的模型,无需重复下载。" -#: ../../source/getting_started/using_docker_image.rst:71 +#: ../../source/getting_started/using_docker_image.rst:73 msgid "" "If you downloaded the model using the default path on the host machine, " "and since the xinference cache directory stores the model using symbolic " @@ -176,7 +197,9 @@ msgid "" "HuggingFace and Modelscope are located at <home_path>/.cache/huggingface " "and <home_path>/.cache/modelscope. The command would be like:" msgstr "" -"如果你在宿主机使用的默认路径下载的模型,由于 xinference cache 目录是用的软链的方式存储模型," -"需要将原文件所在的目录也挂载到容器内。例如你使用 huggingface 和 modelscope 作为模型仓库," -"那么需要将这两个对应的目录挂载到容器内,一般对应的 cache 目录分别在 <home_path>/.cache/huggingface " -"和 <home_path>/.cache/modelscope,使用的命令如下:" +"如果你在宿主机使用的默认路径下载的模型,由于 xinference cache 目录是用的" +"软链的方式存储模型,需要将原文件所在的目录也挂载到容器内。例如你使用 " +"huggingface 和 modelscope 作为模型仓库,那么需要将这两个对应的目录挂载到" +"容器内,一般对应的 cache 目录分别在 <home_path>/.cache/huggingface 和 <" +"home_path>/.cache/modelscope,使用的命令如下:" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po index aba5a13e6e..65860e5d36 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-28 14:43+0800\n" +"POT-Creation-Date: 2024-04-30 13:23+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/getting_started/using_xinference.rst:5 msgid "Using Xinference" @@ -339,11 +339,24 @@ msgstr "在拥有英伟达显卡的机器上运行" msgid "Run On CPU Only Host" msgstr "在只有 CPU 的机器上运行" +#: ../../source/getting_started/using_xinference.rst:373 +msgid "" +"Replace ``<your_version>`` with Xinference versions, e.g. ``v0.10.3``, " +"``latest`` can be used for the latest version." +msgstr "将 ``<your_version>`` 替换为 Xinference 的版本,比如 ``v0.10.3``," +"可以用 ``latest`` 来用于最新版本。" + #: ../../source/getting_started/using_xinference.rst:375 +msgid "" +"For more docker usage, refer to :ref:`Using Docker Image " +"<using_docker_image>`." +msgstr "更多 docker 使用,请参考 :ref:`使用 docker 镜像 <using_docker_image>`。" + +#: ../../source/getting_started/using_xinference.rst:379 msgid "Using Xinference On Kubernetes" msgstr "在 Kubernetes 环境中运行 Xinference" -#: ../../source/getting_started/using_xinference.rst:377 +#: ../../source/getting_started/using_xinference.rst:381 msgid "" "To use Xinference on Kubernetes, `KubeBlocks <https://kubeblocks.io/>`_ " "is required to help the installation." @@ -351,11 +364,11 @@ msgstr "" "如果想在 Kubernetes 中运行 Xinference,需要通过 `KubeBlocks <https://" "kubeblocks.io/>`_ 来帮助安装。" -#: ../../source/getting_started/using_xinference.rst:379 +#: ../../source/getting_started/using_xinference.rst:383 msgid "The following steps assume Kubernetes is already installed." msgstr "假设已经有一个可以使用的 Kubernetes 环境。" -#: ../../source/getting_started/using_xinference.rst:381 +#: ../../source/getting_started/using_xinference.rst:385 msgid "" "Download cli tool kbcli for KubeBlocks, see `install kbcli " "<https://kubeblocks.io/docs/preview/user_docs/installation/install-with-" @@ -364,11 +377,11 @@ msgstr "" "下载 KubeBlocks 的命令行工具,可以参考 `文档 <https://kubeblocks.io/docs/" "preview/user_docs/installation/install-with-kbcli/install-kbcli/>`_. " -#: ../../source/getting_started/using_xinference.rst:383 +#: ../../source/getting_started/using_xinference.rst:387 msgid "Make sure kbcli version is at least v0.7.1." msgstr "确保 kbcli 的版本至少为 v0.7.1。" -#: ../../source/getting_started/using_xinference.rst:385 +#: ../../source/getting_started/using_xinference.rst:389 msgid "" "Install KubeBlocks using kbcli command, see `install KubeBlocks with " "kbcli <https://kubeblocks.io/docs/preview/user_docs/installation/install-" @@ -378,29 +391,29 @@ msgstr "" "preview/user_docs/installation/install-with-kbcli/install-kubeblocks-with" "-kbcli/>`_." -#: ../../source/getting_started/using_xinference.rst:387 +#: ../../source/getting_started/using_xinference.rst:391 msgid "Enable Xinference addon, run the following command:" msgstr "用以下命令打开 Xinference 插件:" -#: ../../source/getting_started/using_xinference.rst:393 +#: ../../source/getting_started/using_xinference.rst:397 msgid "Use kbcli to start Xinference cluster, run the following command:" msgstr "使用 kbcli 来拉起 Xinference 集群:" -#: ../../source/getting_started/using_xinference.rst:399 +#: ../../source/getting_started/using_xinference.rst:403 msgid "" "If the Kubernetes node doesn't have GPU on it, run the command with extra" " flag:" msgstr "如果 Kubernetes 节点没有 GPU 设备,需要加上额外的参数:" -#: ../../source/getting_started/using_xinference.rst:405 +#: ../../source/getting_started/using_xinference.rst:409 msgid "Use -h to read the help documentation for more options:" msgstr "使用 -h 获取帮助文档" -#: ../../source/getting_started/using_xinference.rst:412 +#: ../../source/getting_started/using_xinference.rst:416 msgid "What's Next?" msgstr "更多" -#: ../../source/getting_started/using_xinference.rst:414 +#: ../../source/getting_started/using_xinference.rst:418 msgid "" "Congratulations on getting started with Xinference! To help you navigate " "and make the most out of this powerful tool, here are some resources and " @@ -409,13 +422,13 @@ msgstr "" "恭喜你,已经初步掌握了 Xinference 的用法!为了帮助你更好地使用工具,下面" "是其他的一些文档和指导资源:" -#: ../../source/getting_started/using_xinference.rst:417 +#: ../../source/getting_started/using_xinference.rst:421 msgid "" ":ref:`How to Use Client APIs for Different Types of Models " "<user_guide_client_api>`" msgstr ":ref:`如何使用 Python 创建不同类型的模型 <user_guide_client_api>`" -#: ../../source/getting_started/using_xinference.rst:419 +#: ../../source/getting_started/using_xinference.rst:423 msgid ":ref:`Choosing the Right Backends for Your Needs <user_guide_backends>`" msgstr ":ref:`选择正确的推理引擎 <user_guide_backends>` " From 330c12f17524917742df178cd08e0820eef8a83d Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Mon, 6 May 2024 04:07:33 +0200 Subject: [PATCH 055/298] BUG: Fix tool calls return invalid usage (#1420) --- xinference/core/tests/test_restful_api.py | 2 ++ xinference/model/llm/utils.py | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index a6aeed3e47..f7a5c51f19 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -813,6 +813,8 @@ def test_restful_api_for_qwen_tool_calls(setup, model_format, quantization): "arguments" ] assert not json.loads(arguments) + assert completion["usage"] + assert completion["usage"]["prompt_tokens"] != -1 # tool tools = [ diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index c050d0159f..51d8354570 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -689,6 +689,15 @@ def _tool_calls_completion(cls, model_family, model_uid, c, tools): else: m = {"role": "assistant", "content": content, "tool_calls": []} finish_reason = "stop" + try: + usage = c.get("usage") + assert "prompt_tokens" in usage + except Exception: + usage = { + "prompt_tokens": -1, + "completion_tokens": -1, + "total_tokens": -1, + } return { "id": "chat" + f"cmpl-{_id}", "model": model_uid, @@ -701,11 +710,7 @@ def _tool_calls_completion(cls, model_family, model_uid, c, tools): "finish_reason": finish_reason, } ], - "usage": { - "prompt_tokens": -1, - "completion_tokens": -1, - "total_tokens": -1, - }, + "usage": usage, } From 1ef3ce4a4c9ab5528fb333e3869bcb104e3fc666 Mon Sep 17 00:00:00 2001 From: Wang Xuejin <92132848+Ago327@users.noreply.github.com> Date: Mon, 6 May 2024 10:52:10 +0800 Subject: [PATCH 056/298] FEAT: Support query engine with cmdline (#1380) --- xinference/client/restful/restful_client.py | 23 ++++++ xinference/deploy/cmdline.py | 90 +++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index f9a546e11c..5566886d82 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -1157,3 +1157,26 @@ def get_model_registration( response_data = response.json() return response_data + + def query_engine_by_model_name(self, model_name: str): + """ + Get the engine parameters with the model name registered on the server. + + Parameters + ---------- + model_name: str + The name of the model. + Returns + ------- + Dict[str, List[Dict[str, Any]]] + The supported engine parameters of registered models on the server. + """ + url = f"{self.base_url}/v1/engines/{model_name}" + response = requests.get(url, headers=self._headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to query engine parameters by model name, detail: {_get_error_string(response)}" + ) + + response_data = response.json() + return response_data diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 34ccad9566..8ac23d7ce4 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -1203,5 +1203,95 @@ def cluster_login( f.write(access_token) +@cli.command(name="engine", help="Query engine parameters by model name.") +@click.option("--model-name", type=str, required=True, help="Model name.") +@click.option("--model_engine", type=str, default=None, help="Model engine.") +@click.option("--model_format", type=str, default=None, help="Model format.") +@click.option( + "--model_size_in_billions", type=str, default=None, help="Model size in billions." +) +@click.option("--quantization", type=str, default=None, help="Quantization.") +@click.option("--endpoint", "-e", type=str, help="Xinference endpoint.") +@click.option( + "--api-key", + "-ak", + default=None, + type=str, + help="Api-Key for access xinference api with authorization.", +) +def query_engine_by_model_name( + model_name: str, + model_engine: Optional[str], + model_format: Optional[str], + model_size_in_billions: Optional[Union[str, int]], + quantization: Optional[str], + endpoint: Optional[str], + api_key: Optional[str], +): + from tabulate import tabulate + + endpoint = get_endpoint(endpoint) + client = RESTfulClient(base_url=endpoint, api_key=api_key) + if api_key is None: + client._set_token(get_stored_token(endpoint, client)) + + llm_engines = client.query_engine_by_model_name(model_name) + if model_engine is not None and model_engine not in llm_engines: + raise ValueError(f"Model {model_name} cannot be run on engine {model_engine}.") + + table = [] + engines = [model_engine] if model_engine is not None else list(llm_engines.keys()) + for engine in engines: + params = llm_engines[engine] + for param in params: + if ( + (model_format is None or model_format == param["model_format"]) + and ( + model_size_in_billions is None + or model_size_in_billions == str(param["model_size_in_billions"]) + ) + and (quantization is None or quantization in param["quantizations"]) + ): + if quantization is not None: + table.append( + [ + model_name, + engine, + param["model_format"], + param["model_size_in_billions"], + quantization, + ] + ) + else: + for quant in param["quantizations"]: + table.append( + [ + model_name, + engine, + param["model_format"], + param["model_size_in_billions"], + quant, + ] + ) + if len(table) == 0: + raise ValueError( + f"Cannot find parameters for Model {model_name} with format {model_format}, size {model_size_in_billions} and quantization {quantization} on engine {model_engine}." + ) + else: + print( + tabulate( + table, + headers=[ + "Name", + "Engine", + "Format", + "Size (in billions)", + "Quantization", + ], + ), + file=sys.stderr, + ) + + if __name__ == "__main__": cli() From f98b8b5ef691061e4faeca8233683c402b778785 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Mon, 6 May 2024 11:22:55 +0800 Subject: [PATCH 057/298] FEAT: Ascend support (#1408) --- .pre-commit-config.yaml | 2 ++ xinference/core/supervisor.py | 18 +++++------ xinference/core/tests/test_worker.py | 8 ++--- xinference/core/worker.py | 21 ++++++------ xinference/deploy/utils.py | 2 +- xinference/device_utils.py | 32 +++++++++++++++++-- xinference/model/llm/__init__.py | 15 +++++++-- xinference/model/llm/pytorch/deepseek_vl.py | 4 +-- .../model/llm/pytorch/tests/test_opt.py | 2 +- xinference/thirdparty/omnilmm/chat.py | 3 +- .../thirdparty/omnilmm/model/omnilmm.py | 3 +- 11 files changed, 75 insertions(+), 35 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f2693ca23a..5e6f50afef 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,6 +14,7 @@ repos: hooks: - id: flake8 args: [--config, setup.cfg] + exclude: thirdparty - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: @@ -25,6 +26,7 @@ repos: - id: mypy additional_dependencies: ["tokenize-rt==3.2.0", "types-requests", "types-tabulate"] args: [--ignore-missing-imports, --follow-imports, skip] + exclude: thirdparty - repo: https://github.com/codespell-project/codespell rev: v2.2.2 hooks: diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 9c69e4420f..10ca026226 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -80,12 +80,12 @@ class ReplicaInfo: class SupervisorActor(xo.StatelessActor): def __init__(self): super().__init__() - self._worker_address_to_worker: Dict[str, xo.ActorRefType["WorkerActor"]] = {} - self._worker_status: Dict[str, WorkerStatus] = {} - self._replica_model_uid_to_worker: Dict[ + self._worker_address_to_worker: Dict[str, xo.ActorRefType["WorkerActor"]] = {} # type: ignore + self._worker_status: Dict[str, WorkerStatus] = {} # type: ignore + self._replica_model_uid_to_worker: Dict[ # type: ignore str, xo.ActorRefType["WorkerActor"] ] = {} - self._model_uid_to_replica_info: Dict[str, ReplicaInfo] = {} + self._model_uid_to_replica_info: Dict[str, ReplicaInfo] = {} # type: ignore self._uptime = None self._lock = asyncio.Lock() @@ -117,12 +117,12 @@ async def __post_create__(self): from .cache_tracker import CacheTrackerActor from .status_guard import StatusGuardActor - self._status_guard_ref: xo.ActorRefType[ + self._status_guard_ref: xo.ActorRefType[ # type: ignore "StatusGuardActor" ] = await xo.create_actor( StatusGuardActor, address=self.address, uid=StatusGuardActor.uid() ) - self._cache_tracker_ref: xo.ActorRefType[ + self._cache_tracker_ref: xo.ActorRefType[ # type: ignore "CacheTrackerActor" ] = await xo.create_actor( CacheTrackerActor, address=self.address, uid=CacheTrackerActor.uid() @@ -130,7 +130,7 @@ async def __post_create__(self): from .event import EventCollectorActor - self._event_collector_ref: xo.ActorRefType[ + self._event_collector_ref: xo.ActorRefType[ # type: ignore EventCollectorActor ] = await xo.create_actor( EventCollectorActor, address=self.address, uid=EventCollectorActor.uid() @@ -172,7 +172,7 @@ async def __post_create__(self): unregister_rerank, ) - self._custom_register_type_to_cls: Dict[str, Tuple] = { + self._custom_register_type_to_cls: Dict[str, Tuple] = { # type: ignore "LLM": ( CustomLLMFamilyV1, register_llm, @@ -206,7 +206,7 @@ async def __post_create__(self): } # record model version - model_version_infos: Dict[str, List[Dict]] = {} + model_version_infos: Dict[str, List[Dict]] = {} # type: ignore model_version_infos.update(get_llm_model_descriptions()) model_version_infos.update(get_embedding_model_descriptions()) model_version_infos.update(get_rerank_model_descriptions()) diff --git a/xinference/core/tests/test_worker.py b/xinference/core/tests/test_worker.py index ac877581ae..2f32aae149 100644 --- a/xinference/core/tests/test_worker.py +++ b/xinference/core/tests/test_worker.py @@ -94,7 +94,7 @@ async def test_allocate_cuda_devices(setup_pool): pool = setup_pool addr = pool.external_address - worker: xo.ActorRefType["MockWorkerActor"] = await xo.create_actor( + worker: xo.ActorRefType["MockWorkerActor"] = await xo.create_actor( # type: ignore MockWorkerActor, address=addr, uid=WorkerActor.uid(), @@ -121,7 +121,7 @@ async def test_terminate_model_flag(setup_pool): pool = setup_pool addr = pool.external_address - worker: xo.ActorRefType["MockWorkerActor"] = await xo.create_actor( + worker: xo.ActorRefType["MockWorkerActor"] = await xo.create_actor( # type: ignore MockWorkerActor, address=addr, uid=WorkerActor.uid(), @@ -171,7 +171,7 @@ async def test_launch_embedding_model(setup_pool): pool = setup_pool addr = pool.external_address - worker: xo.ActorRefType["MockWorkerActor"] = await xo.create_actor( + worker: xo.ActorRefType["MockWorkerActor"] = await xo.create_actor( # type: ignore MockWorkerActor, address=addr, uid=WorkerActor.uid(), @@ -267,7 +267,7 @@ async def test_launch_model_with_gpu_idx(setup_pool): pool = setup_pool addr = pool.external_address - worker: xo.ActorRefType["MockWorkerActor"] = await xo.create_actor( + worker: xo.ActorRefType["MockWorkerActor"] = await xo.create_actor( # type: ignore MockWorkerActor, address=addr, uid=WorkerActor.uid(), diff --git a/xinference/core/worker.py b/xinference/core/worker.py index c3e93deb7e..0a0ad52040 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -34,7 +34,7 @@ ) from ..core import ModelActor from ..core.status_guard import LaunchStatus -from ..device_utils import gpu_count +from ..device_utils import get_available_device_env_name, gpu_count from ..model.core import ModelDescription, create_model_instance from ..types import PeftModelConfig from .event import Event, EventCollectorActor, EventType @@ -166,22 +166,22 @@ async def __post_create__(self): from .status_guard import StatusGuardActor from .supervisor import SupervisorActor - self._status_guard_ref: xo.ActorRefType[ + self._status_guard_ref: xo.ActorRefType[ # type: ignore "StatusGuardActor" ] = await xo.actor_ref( address=self._supervisor_address, uid=StatusGuardActor.uid() ) - self._event_collector_ref: xo.ActorRefType[ + self._event_collector_ref: xo.ActorRefType[ # type: ignore EventCollectorActor ] = await xo.actor_ref( address=self._supervisor_address, uid=EventCollectorActor.uid() ) - self._cache_tracker_ref: xo.ActorRefType[ + self._cache_tracker_ref: xo.ActorRefType[ # type: ignore "CacheTrackerActor" ] = await xo.actor_ref( address=self._supervisor_address, uid=CacheTrackerActor.uid() ) - self._supervisor_ref: xo.ActorRefType["SupervisorActor"] = await xo.actor_ref( + self._supervisor_ref: xo.ActorRefType["SupervisorActor"] = await xo.actor_ref( # type: ignore address=self._supervisor_address, uid=SupervisorActor.uid() ) await self._supervisor_ref.add_worker(self.address) @@ -227,7 +227,7 @@ async def __post_create__(self): unregister_rerank, ) - self._custom_register_type_to_cls: Dict[str, Tuple] = { + self._custom_register_type_to_cls: Dict[str, Tuple] = { # type: ignore "LLM": (CustomLLMFamilyV1, register_llm, unregister_llm), "embedding": ( CustomEmbeddingModelSpec, @@ -244,7 +244,7 @@ async def __post_create__(self): } # record model version - model_version_infos: Dict[str, List[Dict]] = {} + model_version_infos: Dict[str, List[Dict]] = {} # type: ignore model_version_infos.update(get_llm_model_descriptions()) model_version_infos.update(get_embedding_model_descriptions()) model_version_infos.update(get_rerank_model_descriptions()) @@ -447,6 +447,7 @@ async def _create_subpool( ) -> Tuple[str, List[str]]: env = {} devices = [] + env_name = get_available_device_env_name() if gpu_idx is None: if isinstance(n_gpu, int) or (n_gpu == "auto" and gpu_count() > 0): # Currently, n_gpu=auto means using 1 GPU @@ -456,17 +457,17 @@ async def _create_subpool( if model_type in ["embedding", "rerank"] else self.allocate_devices(model_uid=model_uid, n_gpu=gpu_cnt) ) - env["CUDA_VISIBLE_DEVICES"] = ",".join([str(dev) for dev in devices]) + env[env_name] = ",".join([str(dev) for dev in devices]) logger.debug(f"GPU selected: {devices} for model {model_uid}") if n_gpu is None: - env["CUDA_VISIBLE_DEVICES"] = "-1" + env[env_name] = "-1" logger.debug(f"GPU disabled for model {model_uid}") else: assert isinstance(gpu_idx, list) devices = await self.allocate_devices_with_gpu_idx( model_uid, model_type, gpu_idx # type: ignore ) - env["CUDA_VISIBLE_DEVICES"] = ",".join([str(dev) for dev in devices]) + env[env_name] = ",".join([str(dev) for dev in devices]) if os.name != "nt" and platform.system() != "Darwin": # Linux diff --git a/xinference/deploy/utils.py b/xinference/deploy/utils.py index bb0738b002..8d2e6c433a 100644 --- a/xinference/deploy/utils.py +++ b/xinference/deploy/utils.py @@ -129,7 +129,7 @@ async def health_check_internal(): try: from xinference.core.supervisor import SupervisorActor - supervisor_ref: xo.ActorRefType[SupervisorActor] = await xo.actor_ref( + supervisor_ref: xo.ActorRefType[SupervisorActor] = await xo.actor_ref( # type: ignore address=address, uid=SupervisorActor.uid() ) diff --git a/xinference/device_utils.py b/xinference/device_utils.py index 035391ccb4..d4d4f0d9e9 100644 --- a/xinference/device_utils.py +++ b/xinference/device_utils.py @@ -17,13 +17,27 @@ import torch from typing_extensions import Literal, Union -DeviceType = Literal["cuda", "mps", "xpu", "cpu"] +DeviceType = Literal["cuda", "mps", "xpu", "npu", "cpu"] +DEVICE_TO_ENV_NAME = { + "cuda": "CUDA_VISIBLE_DEVICES", + "npu": "ASCEND_RT_VISIBLE_DEVICES", +} def is_xpu_available() -> bool: return hasattr(torch, "xpu") and torch.xpu.is_available() +def is_npu_available() -> bool: + try: + import torch + import torch_npu # noqa: F401 + + return torch.npu.is_available() + except ImportError: + return False + + def get_available_device() -> DeviceType: if torch.cuda.is_available(): return "cuda" @@ -31,6 +45,8 @@ def get_available_device() -> DeviceType: return "mps" elif is_xpu_available(): return "xpu" + elif is_npu_available(): + return "npu" return "cpu" @@ -41,6 +57,8 @@ def is_device_available(device: str) -> bool: return torch.backends.mps.is_available() elif device == "xpu": return is_xpu_available() + elif device == "npu": + return is_npu_available() elif device == "cpu": return True @@ -59,7 +77,7 @@ def move_model_to_available_device(model): def get_device_preferred_dtype(device: str) -> Union[torch.dtype, None]: if device == "cpu": return torch.float32 - elif device == "cuda" or device == "mps": + elif device == "cuda" or device == "mps" or device == "npu": return torch.float16 elif device == "xpu": return torch.bfloat16 @@ -68,7 +86,7 @@ def get_device_preferred_dtype(device: str) -> Union[torch.dtype, None]: def is_hf_accelerate_supported(device: str) -> bool: - return device == "cuda" or device == "xpu" + return device == "cuda" or device == "xpu" or device == "npu" def empty_cache(): @@ -78,6 +96,12 @@ def empty_cache(): torch.mps.empty_cache() if is_xpu_available(): torch.xpu.empty_cache() + if is_npu_available(): + torch.npu.empty_cache() + + +def get_available_device_env_name(): + return DEVICE_TO_ENV_NAME.get(get_available_device()) def gpu_count(): @@ -94,5 +118,7 @@ def gpu_count(): return min(torch.cuda.device_count(), len(cuda_visible_devices)) elif is_xpu_available(): return torch.xpu.device_count() + elif is_npu_available(): + return torch.npu.device_count() else: return 0 diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index c6af541362..12f3a38a8f 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -15,6 +15,7 @@ import codecs import json import os +import warnings from .core import ( LLM, @@ -107,13 +108,20 @@ def _install(): from .pytorch.falcon import FalconPytorchChatModel, FalconPytorchModel from .pytorch.internlm2 import Internlm2PytorchChatModel from .pytorch.llama_2 import LlamaPytorchChatModel, LlamaPytorchModel - from .pytorch.omnilmm import OmniLMMModel from .pytorch.qwen_vl import QwenVLChatModel from .pytorch.vicuna import VicunaPytorchChatModel from .pytorch.yi_vl import YiVLChatModel from .sglang.core import SGLANGChatModel, SGLANGModel from .vllm.core import VLLMChatModel, VLLMModel + try: + from .pytorch.omnilmm import OmniLMMModel + except ImportError as e: + # For quite old transformers version, + # import will generate error + OmniLMMModel = None + warnings.warn(f"Cannot import OmniLLMModel due to reason: {e}") + # register llm classes. LLM_CLASSES.extend( [ @@ -149,7 +157,6 @@ def _install(): FalconPytorchModel, Internlm2PytorchChatModel, QwenVLChatModel, - OmniLMMModel, YiVLChatModel, DeepSeekVLChatModel, PytorchModel, @@ -167,12 +174,14 @@ def _install(): FalconPytorchModel, Internlm2PytorchChatModel, QwenVLChatModel, - OmniLMMModel, YiVLChatModel, DeepSeekVLChatModel, PytorchModel, ] ) + if OmniLMMModel: # type: ignore + LLM_CLASSES.append(OmniLMMModel) + PYTORCH_CLASSES.append(OmniLMMModel) PEFT_SUPPORTED_CLASSES.extend( [ BaichuanPytorchChatModel, diff --git a/xinference/model/llm/pytorch/deepseek_vl.py b/xinference/model/llm/pytorch/deepseek_vl.py index 08cb812c2c..0dd9bb5e79 100644 --- a/xinference/model/llm/pytorch/deepseek_vl.py +++ b/xinference/model/llm/pytorch/deepseek_vl.py @@ -67,12 +67,12 @@ def load(self): self._type = torch.float16 if self._device == "mps" else torch.bfloat16 # specify the path to the model - self._vl_chat_processor: VLChatProcessor = VLChatProcessor.from_pretrained( + self._vl_chat_processor: VLChatProcessor = VLChatProcessor.from_pretrained( # type: ignore self.model_path ) self._tokenizer = self._vl_chat_processor.tokenizer - vl_gpt: MultiModalityCausalLM = AutoModelForCausalLM.from_pretrained( + vl_gpt: MultiModalityCausalLM = AutoModelForCausalLM.from_pretrained( # type: ignore self.model_path, trust_remote_code=True, device_map=self._device ) self._model = vl_gpt.to(self._type).eval() diff --git a/xinference/model/llm/pytorch/tests/test_opt.py b/xinference/model/llm/pytorch/tests/test_opt.py index 13a0f9975e..bc28cc1251 100644 --- a/xinference/model/llm/pytorch/tests/test_opt.py +++ b/xinference/model/llm/pytorch/tests/test_opt.py @@ -102,7 +102,7 @@ def _check(): ) actual_revision = os.listdir(snapshot_address) model_name = "opt" - expected_revision: Union[str, None] = "" + expected_revision: Union[str, None] = "" # type: ignore for family in BUILTIN_LLM_FAMILIES: if model_name != family.model_name: diff --git a/xinference/thirdparty/omnilmm/chat.py b/xinference/thirdparty/omnilmm/chat.py index 3067ee4750..7676ccb637 100644 --- a/xinference/thirdparty/omnilmm/chat.py +++ b/xinference/thirdparty/omnilmm/chat.py @@ -4,7 +4,6 @@ import os import torch -from accelerate import init_empty_weights, load_checkpoint_and_dispatch from PIL import Image from transformers import AutoModel, AutoTokenizer @@ -20,6 +19,8 @@ def init_omni_lmm(model_path, device_map): + from accelerate import init_empty_weights, load_checkpoint_and_dispatch + torch.backends.cuda.matmul.allow_tf32 = True disable_torch_init() model_name = os.path.expanduser(model_path) diff --git a/xinference/thirdparty/omnilmm/model/omnilmm.py b/xinference/thirdparty/omnilmm/model/omnilmm.py index cc54dc4f67..fa1bc8a1c5 100644 --- a/xinference/thirdparty/omnilmm/model/omnilmm.py +++ b/xinference/thirdparty/omnilmm/model/omnilmm.py @@ -2,7 +2,6 @@ import math from typing import List, Optional, Tuple, Union -import timm import torch import torch.nn as nn from torch import Tensor @@ -37,6 +36,8 @@ def forward(self, input: Tensor, **kwargs) -> Tensor: def create_vision_module(config): + import timm + vision_tower = timm.create_model( "eva02_enormous_patch14_clip_224.laion2b_plus", pretrained=False, From 1063585d2115da0e4132e0b4207c0c3c11d19c7e Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Mon, 6 May 2024 11:55:41 +0800 Subject: [PATCH 058/298] TST: Pin `huggingface-hub` to pass CI since it has some break changes (#1427) --- setup.cfg | 2 +- xinference/deploy/docker/cpu.Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index 4e6fca6715..d8e3f77d0b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -36,7 +36,7 @@ install_requires = pydantic fastapi uvicorn - huggingface-hub>=0.19.4,<1.0 + huggingface-hub>=0.19.4,<0.23.0 typing_extensions fsspec>=2023.1.0,<=2023.10.0 s3fs diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index 25f1cffb71..1a665c3bce 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -32,7 +32,7 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ pydantic \ fastapi \ uvicorn \ - "huggingface-hub>=0.19.4,<1.0" \ + "huggingface-hub>=0.19.4,<0.23.0" \ typing_extensions \ "fsspec>=2023.1.0,<=2023.10.0" \ s3fs \ From d384ff09bceaeae59fb24db9d71e6703a6456e74 Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Mon, 6 May 2024 14:29:29 +0800 Subject: [PATCH 059/298] REF: Add the `model_engine` parameter for launching process (#1367) Co-authored-by: Ago327 <agoctfg335@163.com> Co-authored-by: ChengjieLi <chengjieli23@outlook.com> --- xinference/api/restful_api.py | 5 ++ xinference/client/oscar/actor_client.py | 4 ++ xinference/client/restful/restful_client.py | 4 ++ xinference/client/tests/test_client.py | 40 +++++++++-- xinference/core/supervisor.py | 4 ++ xinference/core/tests/test_metrics.py | 6 +- xinference/core/tests/test_restful_api.py | 7 ++ xinference/core/worker.py | 8 +-- xinference/deploy/cmdline.py | 12 ++++ xinference/deploy/test/test_cmdline.py | 2 + xinference/model/core.py | 4 +- xinference/model/llm/__init__.py | 50 -------------- xinference/model/llm/core.py | 69 ++++++++++--------- xinference/model/llm/ggml/tests/test_gguf.py | 2 + xinference/model/llm/llm_family.py | 66 ++++-------------- .../model/llm/pytorch/tests/test_opt.py | 2 + xinference/model/llm/tests/test_llm_family.py | 6 +- 17 files changed, 141 insertions(+), 150 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 0bb07439ea..2758cb9a70 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -696,6 +696,7 @@ async def launch_model( payload = await request.json() model_uid = payload.get("model_uid") model_name = payload.get("model_name") + model_engine = payload.get("model_engine") model_size_in_billions = payload.get("model_size_in_billions") model_format = payload.get("model_format") quantization = payload.get("quantization") @@ -710,6 +711,7 @@ async def launch_model( exclude_keys = { "model_uid", "model_name", + "model_engine", "model_size_in_billions", "model_format", "quantization", @@ -741,6 +743,7 @@ async def launch_model( model_uid = await (await self._get_supervisor_ref()).launch_builtin_model( model_uid=model_uid, model_name=model_name, + model_engine=model_engine, model_size_in_billions=model_size_in_billions, model_format=model_format, quantization=quantization, @@ -786,6 +789,7 @@ async def launch_model_by_version( ) -> JSONResponse: payload = await request.json() model_uid = payload.get("model_uid") + model_engine = payload.get("model_engine") model_type = payload.get("model_type") model_version = payload.get("model_version") replica = payload.get("replica", 1) @@ -796,6 +800,7 @@ async def launch_model_by_version( await self._get_supervisor_ref() ).launch_model_by_version( model_uid=model_uid, + model_engine=model_engine, model_type=model_type, model_version=model_version, replica=replica, diff --git a/xinference/client/oscar/actor_client.py b/xinference/client/oscar/actor_client.py index 6437e63018..0e49dcee37 100644 --- a/xinference/client/oscar/actor_client.py +++ b/xinference/client/oscar/actor_client.py @@ -449,6 +449,7 @@ def launch_model( self, model_name: str, model_type: str = "LLM", + model_engine: Optional[str] = None, model_size_in_billions: Optional[int] = None, model_format: Optional[str] = None, quantization: Optional[str] = None, @@ -466,6 +467,8 @@ def launch_model( The name of model. model_type: str Type of model. + model_engine: Optional[str] + Specify the inference engine of the model when launching LLM. model_size_in_billions: Optional[int] The size (in billions) of the model. model_format: Optional[str] @@ -493,6 +496,7 @@ def launch_model( coro = self._supervisor_ref.launch_builtin_model( model_uid=None, model_name=model_name, + model_engine=model_engine, model_type=model_type, model_size_in_billions=model_size_in_billions, model_format=model_format, diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 5566886d82..cb05f23492 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -808,6 +808,7 @@ def launch_model( self, model_name: str, model_type: str = "LLM", + model_engine: Optional[str] = None, model_uid: Optional[str] = None, model_size_in_billions: Optional[Union[int, str, float]] = None, model_format: Optional[str] = None, @@ -829,6 +830,8 @@ def launch_model( The name of model. model_type: str type of model. + model_engine: Optional[str] + Specify the inference engine of the model when launching LLM. model_uid: str UID of model, auto generate a UUID if is None. model_size_in_billions: Optional[Union[int, str, float]] @@ -872,6 +875,7 @@ def launch_model( payload = { "model_uid": model_uid, "model_name": model_name, + "model_engine": model_engine, "peft_model_config": peft_model_config, "model_type": model_type, "model_size_in_billions": model_size_in_billions, diff --git a/xinference/client/tests/test_client.py b/xinference/client/tests/test_client.py index 74d128422e..8457724cdf 100644 --- a/xinference/client/tests/test_client.py +++ b/xinference/client/tests/test_client.py @@ -39,7 +39,10 @@ async def test_client(setup): assert len(client.list_models()) == 0 model_uid = client.launch_model( - model_name="orca", model_size_in_billions=3, quantization="q4_0" + model_name="orca", + model_engine="llama-cpp-python", + model_size_in_billions=3, + quantization="q4_0", ) assert len(client.list_models()) == 1 @@ -64,6 +67,7 @@ async def test_client(setup): model_uid = client.launch_model( model_name="orca", + model_engine="llama-cpp-python", model_size_in_billions=3, quantization="q4_0", ) @@ -75,12 +79,17 @@ async def test_client(setup): with pytest.raises(ValueError): client.launch_model( - model_name="orca", model_size_in_billions=3, quantization="q4_0", n_gpu=100 + model_name="orca", + model_engine="llama-cpp-python", + model_size_in_billions=3, + quantization="q4_0", + n_gpu=100, ) with pytest.raises(ValueError): client.launch_model( model_name="orca", + model_engine="llama-cpp-python", model_size_in_billions=3, quantization="q4_0", n_gpu="abcd", @@ -93,13 +102,19 @@ def test_client_for_model_uid(setup): assert len(client.list_models()) == 0 model_uid = client.launch_model( - model_name="orca", model_size_in_billions=3, quantization="q4_0" + model_name="orca", + model_engine="llama-cpp-python", + model_size_in_billions=3, + quantization="q4_0", ) assert len(client.list_models()) == 1 assert model_uid == "orca" model_uid2 = client.launch_model( - model_name="orca", model_size_in_billions=3, quantization="q4_0" + model_name="orca", + model_engine="llama-cpp-python", + model_size_in_billions=3, + quantization="q4_0", ) assert len(client.list_models()) == 2 assert len(model_uid2) == len("orca") + 9 @@ -147,6 +162,7 @@ def test_replica_model(setup): replica = 1 if os.name == "nt" else 2 model_uid = client.launch_model( model_name="orca", + model_engine="llama-cpp-python", model_size_in_billions=3, quantization="q4_0", replica=replica, @@ -239,7 +255,10 @@ def test_RESTful_client(setup): assert len(client.list_models()) == 0 model_uid = client.launch_model( - model_name="orca", model_size_in_billions=3, quantization="q4_0" + model_name="orca", + model_engine="llama-cpp-python", + model_size_in_billions=3, + quantization="q4_0", ) assert len(client.list_models()) == 1 @@ -310,6 +329,7 @@ def _check_stream(): model_uid = client.launch_model( model_name="tiny-llama", + model_engine="llama-cpp-python", model_size_in_billions=1, model_format="ggufv2", quantization="q2_K", @@ -356,6 +376,7 @@ def _check(stream=False): model_uid2 = client.launch_model( model_name="orca", + model_engine="llama-cpp-python", model_size_in_billions=3, quantization="q4_0", ) @@ -522,7 +543,9 @@ def test_client_from_modelscope(setup): client = RESTfulClient(endpoint) assert len(client.list_models()) == 0 - model_uid = client.launch_model(model_name="tiny-llama") + model_uid = client.launch_model( + model_name="tiny-llama", model_engine="llama-cpp-python" + ) assert len(client.list_models()) == 1 model = client.get_model(model_uid=model_uid) completion = model.generate("write a poem.", generate_config={"max_tokens": 5}) @@ -636,7 +659,10 @@ def test_auto_recover(set_auto_recover_limit, setup_cluster): client = RESTfulClient(endpoint) model_uid = client.launch_model( - model_name="orca", model_size_in_billions=3, quantization="q4_0" + model_name="orca", + model_engine="llama-cpp-python", + model_size_in_billions=3, + quantization="q4_0", ) new_children_proc = set(current_proc.children(recursive=True)) model_proc = next(iter(new_children_proc - chilren_proc)) diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 10ca026226..0b09907003 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -693,6 +693,7 @@ async def launch_model_by_version( self, model_uid: Optional[str], model_type: str, + model_engine: Optional[str], model_version: str, replica: int = 1, n_gpu: Optional[Union[int, str]] = "auto", @@ -708,6 +709,7 @@ async def launch_model_by_version( return await self.launch_builtin_model( model_uid=model_uid, model_name=parse_results[0], + model_engine=model_engine, model_size_in_billions=parse_results[1] if model_type == "LLM" else None, model_format=parse_results[2] if model_type == "LLM" else None, quantization=parse_results[3] if model_type == "LLM" else None, @@ -786,6 +788,7 @@ async def launch_builtin_model( model_size_in_billions: Optional[Union[int, str]], model_format: Optional[str], quantization: Optional[str], + model_engine: Optional[str], model_type: Optional[str], replica: int = 1, n_gpu: Optional[Union[int, str]] = "auto", @@ -841,6 +844,7 @@ async def _launch_one_model(_replica_model_uid): model_size_in_billions=model_size_in_billions, model_format=model_format, quantization=quantization, + model_engine=model_engine, model_type=model_type, n_gpu=n_gpu, request_limits=request_limits, diff --git a/xinference/core/tests/test_metrics.py b/xinference/core/tests/test_metrics.py index 8c142a7739..1c2303fbe1 100644 --- a/xinference/core/tests/test_metrics.py +++ b/xinference/core/tests/test_metrics.py @@ -65,7 +65,10 @@ async def test_metrics_exporter_server(setup_cluster): client = Client(endpoint) model_uid = client.launch_model( - model_name="orca", model_size_in_billions=3, quantization="q4_0" + model_name="orca", + model_engine="llama-cpp-python", + model_size_in_billions=3, + quantization="q4_0", ) # Check the supervisor metrics collected the RESTful API. @@ -93,6 +96,7 @@ async def test_metrics_exporter_data(setup_cluster): model_uid = client.launch_model( model_name="orca", + model_engine="llama-cpp-python", model_size_in_billions=3, model_format="ggmlv3", quantization="q4_0", diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index f7a5c51f19..275260cdc4 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -39,6 +39,7 @@ async def test_restful_api(setup): # launch payload = { "model_uid": "test_restful_api", + "model_engine": "llama-cpp-python", "model_name": "orca", "quantization": "q4_0", } @@ -982,6 +983,7 @@ def test_restful_api_with_request_limits(setup): url = f"{endpoint}/v1/models" payload = { "model_uid": "test_restful_api", + "model_engine": "llama-cpp-python", "model_name": "orca", "quantization": "q4_0", "request_limits": 0, @@ -1019,6 +1021,7 @@ async def test_openai(setup): # launch payload = { "model_uid": "test_restful_api", + "model_engine": "llama-cpp-python", "model_name": "orca", "quantization": "q4_0", } @@ -1077,6 +1080,7 @@ def test_lang_chain(setup): # launch payload = { "model_uid": "test_restful_api", + "model_engine": "llama-cpp-python", "model_name": "orca", "quantization": "q4_0", } @@ -1144,6 +1148,7 @@ def test_launch_model_async(setup): payload = { "model_uid": "test_orca", + "model_engine": "llama-cpp-python", "model_name": "orca", "quantization": "q4_0", } @@ -1178,6 +1183,7 @@ def test_events(setup): payload = { "model_uid": "test_orca", + "model_engine": "llama-cpp-python", "model_name": "orca", "quantization": "q4_0", } @@ -1216,6 +1222,7 @@ def test_launch_model_by_version(setup): payload = { "model_uid": "test_orca", + "model_engine": "llama-cpp-python", "model_type": "LLM", "model_version": version_info["model_version"], } diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 0a0ad52040..a899dda85f 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -80,7 +80,7 @@ def __init__( int, Set[Tuple[str, str]] ] = defaultdict(set) self._model_uid_to_addr: Dict[str, str] = {} - self._model_uid_to_recover_count: Dict[str, int] = {} + self._model_uid_to_recover_count: Dict[str, Optional[int]] = {} self._model_uid_to_launch_args: Dict[str, Dict] = {} # metrics export server. @@ -550,7 +550,6 @@ async def launch_speculative_model( draft_model_name=draft_model_name, draft_model_size_in_billions=draft_model_size_in_billions, draft_quantization=draft_quantization, - is_local_deployment=True, ) try: @@ -616,6 +615,7 @@ async def launch_builtin_model( model_size_in_billions: Optional[Union[int, str]], model_format: Optional[str], quantization: Optional[str], + model_engine: Optional[str], model_type: str = "LLM", n_gpu: Optional[Union[int, str]] = "auto", peft_model_config: Optional[PeftModelConfig] = None, @@ -672,8 +672,6 @@ async def launch_builtin_model( assert model_uid not in self._model_uid_to_model self._check_model_is_valid(model_name, model_format) - assert self._supervisor_ref is not None - is_local_deployment = await self._supervisor_ref.is_local_deployment() subpool_address, devices = await self._create_subpool( model_uid, model_type, n_gpu=n_gpu, gpu_idx=gpu_idx @@ -688,11 +686,11 @@ async def launch_builtin_model( model_uid, model_type, model_name, + model_engine, model_format, model_size_in_billions, quantization, peft_model_config, - is_local_deployment, **kwargs, ) await self.update_cache_status(model_name, model_description) diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 8ac23d7ce4..4f4727d965 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -598,6 +598,13 @@ def list_model_registrations( default="LLM", help="Specify type of model, LLM as default.", ) +@click.option( + "--model-engine", + "-en", + type=str, + default=None, + help="Specify the inference engine of the model when launching LLM.", +) @click.option( "--model-uid", "-u", @@ -691,6 +698,7 @@ def model_launch( endpoint: Optional[str], model_name: str, model_type: str, + model_engine: Optional[str], model_uid: str, size_in_billions: str, model_format: str, @@ -712,6 +720,9 @@ def model_launch( kwargs[ctx.args[i][2:]] = handle_click_args_type(ctx.args[i + 1]) print(f"Launch model name: {model_name} with kwargs: {kwargs}", file=sys.stderr) + if model_type == "LLM" and model_engine is None: + raise ValueError("--model-engine is required for LLM models.") + if n_gpu.lower() == "none": _n_gpu: Optional[Union[int, str]] = None elif n_gpu == "auto": @@ -765,6 +776,7 @@ def model_launch( model_uid = client.launch_model( model_name=model_name, model_type=model_type, + model_engine=model_engine, model_uid=model_uid, model_size_in_billions=model_size, model_format=model_format, diff --git a/xinference/deploy/test/test_cmdline.py b/xinference/deploy/test/test_cmdline.py index 6d36ade8cc..a8b2f3919a 100644 --- a/xinference/deploy/test/test_cmdline.py +++ b/xinference/deploy/test/test_cmdline.py @@ -65,6 +65,7 @@ def test_cmdline(setup, stream, model_uid): original_model_uid = model_uid model_uid = client.launch_model( model_name="orca", + model_engine="llama-cpp-python", model_uid=model_uid, model_size_in_billions=3, quantization="q4_0", @@ -247,6 +248,7 @@ def test_rotate_logs(setup_with_file_logging): replica = 1 if os.name == "nt" else 2 model_uid = client.launch_model( model_name="orca", + model_engine="llama-cpp-python", model_uid=None, model_size_in_billions=3, quantization="q4_0", diff --git a/xinference/model/core.py b/xinference/model/core.py index e17f644e46..8638ae27c9 100644 --- a/xinference/model/core.py +++ b/xinference/model/core.py @@ -50,11 +50,11 @@ def create_model_instance( model_uid: str, model_type: str, model_name: str, + model_engine: Optional[str], model_format: Optional[str] = None, model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, peft_model_config: Optional[PeftModelConfig] = None, - is_local_deployment: bool = False, **kwargs, ) -> Tuple[Any, ModelDescription]: from .audio.core import create_audio_model_instance @@ -69,11 +69,11 @@ def create_model_instance( devices, model_uid, model_name, + model_engine, model_format, model_size_in_billions, quantization, peft_model_config, - is_local_deployment, **kwargs, ) elif model_type == "embedding": diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 12f3a38a8f..80814687be 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -32,9 +32,7 @@ BUILTIN_LLM_PROMPT_STYLE, BUILTIN_MODELSCOPE_LLM_FAMILIES, LLAMA_CLASSES, - LLM_CLASSES, LLM_ENGINES, - PEFT_SUPPORTED_CLASSES, PYTORCH_CLASSES, SGLANG_CLASSES, SUPPORTED_ENGINES, @@ -48,7 +46,6 @@ get_cache_status, get_user_defined_llm_families, match_llm, - match_llm_cls, register_llm, unregister_llm, ) @@ -123,17 +120,6 @@ def _install(): warnings.warn(f"Cannot import OmniLLMModel due to reason: {e}") # register llm classes. - LLM_CLASSES.extend( - [ - LlamaCppChatModel, - LlamaCppModel, - ] - ) - LLM_CLASSES.extend( - [ - ChatglmCppChatModel, - ] - ) LLAMA_CLASSES.extend( [ ChatglmCppChatModel, @@ -141,27 +127,8 @@ def _install(): LlamaCppModel, ] ) - LLM_CLASSES.extend([SGLANGModel, SGLANGChatModel]) SGLANG_CLASSES.extend([SGLANGModel, SGLANGChatModel]) - LLM_CLASSES.extend([VLLMModel, VLLMChatModel]) VLLM_CLASSES.extend([VLLMModel, VLLMChatModel]) - LLM_CLASSES.extend( - [ - BaichuanPytorchChatModel, - VicunaPytorchChatModel, - FalconPytorchChatModel, - ChatglmPytorchChatModel, - LlamaPytorchModel, - LlamaPytorchChatModel, - PytorchChatModel, - FalconPytorchModel, - Internlm2PytorchChatModel, - QwenVLChatModel, - YiVLChatModel, - DeepSeekVLChatModel, - PytorchModel, - ] - ) PYTORCH_CLASSES.extend( [ BaichuanPytorchChatModel, @@ -180,24 +147,7 @@ def _install(): ] ) if OmniLMMModel: # type: ignore - LLM_CLASSES.append(OmniLMMModel) PYTORCH_CLASSES.append(OmniLMMModel) - PEFT_SUPPORTED_CLASSES.extend( - [ - BaichuanPytorchChatModel, - VicunaPytorchChatModel, - FalconPytorchChatModel, - ChatglmPytorchChatModel, - LlamaPytorchModel, - LlamaPytorchChatModel, - PytorchChatModel, - FalconPytorchModel, - Internlm2PytorchChatModel, - QwenVLChatModel, - YiVLChatModel, - PytorchModel, - ] - ) # support 4 engines for now SUPPORTED_ENGINES["vLLM"] = VLLM_CLASSES diff --git a/xinference/model/llm/core.py b/xinference/model/llm/core.py index c76a0b34a1..f5fc3bd6d9 100644 --- a/xinference/model/llm/core.py +++ b/xinference/model/llm/core.py @@ -13,6 +13,7 @@ # limitations under the License. import abc +import inspect import logging import os import platform @@ -194,47 +195,60 @@ def create_llm_model_instance( devices: List[str], model_uid: str, model_name: str, + model_engine: Optional[str], model_format: Optional[str] = None, model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, peft_model_config: Optional[PeftModelConfig] = None, - is_local_deployment: bool = False, **kwargs, ) -> Tuple[LLM, LLMDescription]: - from . import match_llm, match_llm_cls - from .llm_family import cache + from .llm_family import cache, check_engine_by_spec_parameters, match_llm + if model_engine is None: + raise ValueError("model_engine is required for LLM model") match_result = match_llm( - model_name, - model_format, - model_size_in_billions, - quantization, - is_local_deployment, + model_name, model_format, model_size_in_billions, quantization ) + if not match_result: raise ValueError( f"Model not found, name: {model_name}, format: {model_format}," f" size: {model_size_in_billions}, quantization: {quantization}" ) llm_family, llm_spec, quantization = match_result - assert quantization is not None - save_path = cache(llm_family, llm_spec, quantization) - peft_model = peft_model_config.peft_model if peft_model_config else None - - llm_cls = match_llm_cls(llm_family, llm_spec, quantization, peft_model=peft_model) - if not llm_cls: - raise ValueError( - f"Model not supported, name: {model_name}, format: {model_format}," - f" size: {model_size_in_billions}, quantization: {quantization}" - ) + llm_cls = check_engine_by_spec_parameters( + model_engine, + llm_family.model_name, + llm_spec.model_format, + llm_spec.model_size_in_billions, + quantization, + ) logger.debug(f"Launching {model_uid} with {llm_cls.__name__}") + save_path = cache(llm_family, llm_spec, quantization) + + peft_model = peft_model_config.peft_model if peft_model_config else None if peft_model is not None: - model = llm_cls( - model_uid, llm_family, llm_spec, quantization, save_path, kwargs, peft_model - ) + if "peft_model" in inspect.signature(llm_cls.__init__).parameters: + model = llm_cls( + model_uid, + llm_family, + llm_spec, + quantization, + save_path, + kwargs, + peft_model, + ) + else: + logger.warning( + f"Model not supported with lora, name: {model_name}, format: {model_format}, engine: {model_engine}. " + f"Load this without lora." + ) + model = llm_cls( + model_uid, llm_family, llm_spec, quantization, save_path, kwargs + ) else: model = llm_cls( model_uid, llm_family, llm_spec, quantization, save_path, kwargs @@ -254,17 +268,12 @@ def create_speculative_llm_model_instance( draft_model_name: str, draft_model_size_in_billions: Optional[int], draft_quantization: Optional[str], - is_local_deployment: bool = False, ) -> Tuple[LLM, LLMDescription]: from . import match_llm from .llm_family import cache match_result = match_llm( - model_name, - "pytorch", - model_size_in_billions, - quantization, - is_local_deployment, + model_name, "pytorch", model_size_in_billions, quantization ) if not match_result: @@ -277,11 +286,7 @@ def create_speculative_llm_model_instance( save_path = cache(llm_family, llm_spec, quantization) draft_match_result = match_llm( - draft_model_name, - "pytorch", - draft_model_size_in_billions, - draft_quantization, - is_local_deployment, + draft_model_name, "pytorch", draft_model_size_in_billions, draft_quantization ) if not draft_match_result: diff --git a/xinference/model/llm/ggml/tests/test_gguf.py b/xinference/model/llm/ggml/tests/test_gguf.py index 04f1de6ffe..e97b43e7cd 100644 --- a/xinference/model/llm/ggml/tests/test_gguf.py +++ b/xinference/model/llm/ggml/tests/test_gguf.py @@ -21,6 +21,7 @@ def test_load_ggmlv3(setup): model_uid = client.launch_model( model_name="orca", + model_engine="llama-cpp-python", model_size_in_billions=3, model_format="ggmlv3", quantization="q4_0", @@ -54,6 +55,7 @@ def test_gguf(setup): model_uid = client.launch_model( model_name="tiny-llama", + model_engine="llama-cpp-python", model_size_in_billions=1, model_format="ggufv2", quantization="q2_K", diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index ecf2e3071e..779a7e6ac6 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -33,7 +33,6 @@ validator, ) from ...constants import XINFERENCE_CACHE_DIR, XINFERENCE_MODEL_DIR -from ...types import LoRA from ..utils import ( download_from_modelscope, is_valid_model_uri, @@ -228,8 +227,6 @@ def parse_raw( LLAMA_CLASSES: List[Type[LLM]] = [] -LLM_CLASSES: List[Type[LLM]] = [] -PEFT_SUPPORTED_CLASSES: List[Type[LLM]] = [] BUILTIN_LLM_FAMILIES: List["LLMFamilyV1"] = [] BUILTIN_MODELSCOPE_LLM_FAMILIES: List["LLMFamilyV1"] = [] @@ -831,7 +828,6 @@ def match_llm( model_format: Optional[str] = None, model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, - is_local_deployment: bool = False, ) -> Optional[Tuple[LLMFamilyV1, LLMSpecV1, str]]: """ Find an LLM family, spec, and quantization that satisfy given criteria. @@ -889,25 +885,9 @@ def _apply_format_to_model_id(spec: LLMSpecV1, q: str) -> LLMSpecV1: matched_quantization, ) else: - if spec.model_format == "pytorch": - return family, _apply_format_to_model_id(spec, "none"), "none" - else: - # by default, choose the most coarse-grained quantization. - # TODO: too hacky. - quantizations = spec.quantizations - quantizations.sort() - for q in quantizations: - if ( - is_local_deployment - and not (_is_linux() and _has_cuda_device()) - and q == "4-bit" - ): - logger.warning( - "Skipping %s for non-linux or non-cuda local deployment .", - q, - ) - continue - return family, _apply_format_to_model_id(spec, q), q + # TODO: If user does not specify quantization, just use the first one + _q = "none" if spec.model_format == "pytorch" else spec.quantizations[0] + return family, _apply_format_to_model_id(spec, _q), _q return None @@ -984,39 +964,24 @@ def unregister_llm(model_name: str, raise_error: bool = True): logger.warning(f"Custom model {model_name} not found") -def match_llm_cls( - family: LLMFamilyV1, - llm_spec: "LLMSpecV1", - quantization: str, - peft_model: Optional[List[LoRA]] = None, -) -> Optional[Type[LLM]]: - """ - Find an LLM implementation for given LLM family and spec. - """ - if peft_model is not None: - for cls in PEFT_SUPPORTED_CLASSES: - if cls.match(family, llm_spec, quantization): - return cls - else: - for cls in LLM_CLASSES: - if cls.match(family, llm_spec, quantization): - return cls - return None - - def check_engine_by_spec_parameters( model_engine: str, model_name: str, model_format: str, model_size_in_billions: Union[str, int], quantization: str, -) -> Optional[Type[LLM]]: +) -> Type[LLM]: + def get_model_engine_from_spell(engine_str: str) -> str: + for engine in LLM_ENGINES[model_name].keys(): + if engine.lower() == engine_str.lower(): + return engine + return engine_str + if model_name not in LLM_ENGINES: - logger.debug(f"Cannot find model {model_name}.") - return None + raise ValueError(f"Model {model_name} not found.") + model_engine = get_model_engine_from_spell(model_engine) if model_engine not in LLM_ENGINES[model_name]: - logger.debug(f"Model {model_name} cannot be run on engine {model_engine}.") - return None + raise ValueError(f"Model {model_name} cannot be run on engine {model_engine}.") match_params = LLM_ENGINES[model_name][model_engine] for param in match_params: if ( @@ -1026,7 +991,6 @@ def check_engine_by_spec_parameters( and quantization in param["quantizations"] ): return param["llm_class"] - logger.debug( - f"Model {model_name} with format {model_format}, size {model_size_in_billions} and quantization {quantization} cannot be run on engine {model_engine}." + raise ValueError( + f"Model {model_name} cannot be run on engine {model_engine}, with format {model_format}, size {model_size_in_billions} and quantization {quantization}." ) - return None diff --git a/xinference/model/llm/pytorch/tests/test_opt.py b/xinference/model/llm/pytorch/tests/test_opt.py index bc28cc1251..a7bccae713 100644 --- a/xinference/model/llm/pytorch/tests/test_opt.py +++ b/xinference/model/llm/pytorch/tests/test_opt.py @@ -57,6 +57,7 @@ async def test_opt_pytorch_model(setup, quantization): with pytest.raises(ValueError): client.launch_model( model_name="opt", + model_engine="PyTorch", model_size_in_billions=1, model_format="pytorch", quantization=quantization, @@ -65,6 +66,7 @@ async def test_opt_pytorch_model(setup, quantization): else: model_uid = client.launch_model( model_name="opt", + model_engine="PyTorch", model_size_in_billions=1, model_format="pytorch", quantization=quantization, diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index a2681f36bc..60973d3c77 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -1242,7 +1242,7 @@ def test_query_engine_general(): ) is LlamaCppChatModel ) - assert ( + with pytest.raises(ValueError) as exif: check_engine_by_spec_parameters( model_engine="llama-cpp-python", model_name=model_name, @@ -1250,7 +1250,9 @@ def test_query_engine_general(): model_size_in_billions="1_8", quantization="q2_k", ) - is None + assert ( + str(exif.value) + == "Model qwen1.5-chat cannot be run on engine llama-cpp-python, with format ggmlv3, size 1_8 and quantization q2_k." ) assert ( From 944bf6c033e2cd60d0eb22edcf15e2f4ffdb0765 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Tue, 7 May 2024 04:01:18 +0200 Subject: [PATCH 060/298] FEAT: Audio support verbose_json and timestamp (#1402) --- .github/workflows/python.yaml | 3 +- xinference/api/restful_api.py | 14 +++ xinference/client/restful/restful_client.py | 31 ++++-- xinference/core/model.py | 6 ++ xinference/model/audio/tests/test_whisper.py | 57 +++++++++++ xinference/model/audio/whisper.py | 100 ++++++++++++++++--- 6 files changed, 192 insertions(+), 19 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 4774642773..d81597406e 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -134,7 +134,7 @@ jobs: MODULE: ${{ matrix.module }} run: | if [ "$MODULE" == "gpu" ]; then - ${{ env.SELF_HOST_PYTHON }} -m pip install "openai>1" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "openai>1" ${{ env.SELF_HOST_PYTHON }} -m pip install -U modelscope ${{ env.SELF_HOST_PYTHON }} -m pip install -U sse_starlette ${{ env.SELF_HOST_PYTHON }} -m pip install -U xoscar @@ -142,6 +142,7 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pip install -U "passlib[bcrypt]" ${{ env.SELF_HOST_PYTHON }} -m pip install -U "aioprometheus[starlette]" ${{ env.SELF_HOST_PYTHON }} -m pip install -U "pynvml" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "transformers" ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/image/tests/test_stable_diffusion.py diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 2758cb9a70..31a80fc0a6 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1100,6 +1100,7 @@ async def rerank(self, request: Request) -> Response: async def create_transcriptions( self, + request: Request, model: str = Form(...), file: UploadFile = File(media_type="application/octet-stream"), language: Optional[str] = Form(None), @@ -1108,6 +1109,10 @@ async def create_transcriptions( temperature: Optional[float] = Form(0), kwargs: Optional[str] = Form(None), ) -> Response: + form = await request.form() + timestamp_granularities = form.get("timestamp_granularities[]") + if timestamp_granularities: + timestamp_granularities = [timestamp_granularities] model_uid = model try: model_ref = await (await self._get_supervisor_ref()).get_model(model_uid) @@ -1131,6 +1136,7 @@ async def create_transcriptions( prompt=prompt, response_format=response_format, temperature=temperature, + timestamp_granularities=timestamp_granularities, **parsed_kwargs, ) return Response(content=transcription, media_type="application/json") @@ -1145,13 +1151,19 @@ async def create_transcriptions( async def create_translations( self, + request: Request, model: str = Form(...), file: UploadFile = File(media_type="application/octet-stream"), + language: Optional[str] = Form(None), prompt: Optional[str] = Form(None), response_format: Optional[str] = Form("json"), temperature: Optional[float] = Form(0), kwargs: Optional[str] = Form(None), ) -> Response: + form = await request.form() + timestamp_granularities = form.get("timestamp_granularities[]") + if timestamp_granularities: + timestamp_granularities = [timestamp_granularities] model_uid = model try: model_ref = await (await self._get_supervisor_ref()).get_model(model_uid) @@ -1171,9 +1183,11 @@ async def create_translations( parsed_kwargs = {} translation = await model_ref.translations( audio=await file.read(), + language=language, prompt=prompt, response_format=response_format, temperature=temperature, + timestamp_granularities=timestamp_granularities, **parsed_kwargs, ) return Response(content=translation, media_type="application/json") diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index cb05f23492..b73bdf5346 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -566,6 +566,7 @@ def transcriptions( prompt: Optional[str] = None, response_format: Optional[str] = "json", temperature: Optional[float] = 0, + timestamp_granularities: Optional[List[str]] = None, ): """ Transcribes audio into the input language. @@ -589,6 +590,11 @@ def transcriptions( while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit. + timestamp_granularities: Optional[List[str]], default is None. + The timestamp granularities to populate for this transcription. response_format must be set verbose_json + to use timestamp granularities. Either or both of these options are supported: word, or segment. + Note: There is no additional latency for segment timestamps, but generating word timestamps incurs + additional latency. Returns ------- @@ -601,12 +607,13 @@ def transcriptions( "prompt": prompt, "response_format": response_format, "temperature": temperature, + "timestamp_granularities[]": timestamp_granularities, } files: List[Any] = [] - for key, value in params.items(): - files.append((key, (None, value))) files.append(("file", ("file", audio, "application/octet-stream"))) - response = requests.post(url, files=files, headers=self.auth_headers) + response = requests.post( + url, data=params, files=files, headers=self.auth_headers + ) if response.status_code != 200: raise RuntimeError( f"Failed to transcribe the audio, detail: {_get_error_string(response)}" @@ -618,9 +625,11 @@ def transcriptions( def translations( self, audio: bytes, + language: Optional[str] = None, prompt: Optional[str] = None, response_format: Optional[str] = "json", temperature: Optional[float] = 0, + timestamp_granularities: Optional[List[str]] = None, ): """ Translates audio into English. @@ -631,6 +640,9 @@ def translations( audio: bytes The audio file object (not file name) to transcribe, in one of these formats: flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm. + language: Optional[str] + The language of the input audio. Supplying the input language in ISO-639-1 + (https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes) format will improve accuracy and latency. prompt: Optional[str] An optional text to guide the model's style or continue a previous audio segment. The prompt should match the audio language. @@ -641,6 +653,11 @@ def translations( while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit. + timestamp_granularities: Optional[List[str]], default is None. + The timestamp granularities to populate for this transcription. response_format must be set verbose_json + to use timestamp granularities. Either or both of these options are supported: word, or segment. + Note: There is no additional latency for segment timestamps, but generating word timestamps incurs + additional latency. Returns ------- @@ -649,15 +666,17 @@ def translations( url = f"{self._base_url}/v1/audio/translations" params = { "model": self._model_uid, + "language": language, "prompt": prompt, "response_format": response_format, "temperature": temperature, + "timestamp_granularities[]": timestamp_granularities, } files: List[Any] = [] - for key, value in params.items(): - files.append((key, (None, value))) files.append(("file", ("file", audio, "application/octet-stream"))) - response = requests.post(url, files=files, headers=self.auth_headers) + response = requests.post( + url, data=params, files=files, headers=self.auth_headers + ) if response.status_code != 200: raise RuntimeError( f"Failed to translate the audio, detail: {_get_error_string(response)}" diff --git a/xinference/core/model.py b/xinference/core/model.py index 251e90ce92..15f7f5c8c2 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -442,6 +442,7 @@ async def transcriptions( prompt: Optional[str] = None, response_format: str = "json", temperature: float = 0, + timestamp_granularities: Optional[List[str]] = None, ): if hasattr(self._model, "transcriptions"): return await self._call_wrapper( @@ -451,6 +452,7 @@ async def transcriptions( prompt, response_format, temperature, + timestamp_granularities, ) raise AttributeError( f"Model {self._model.model_spec} is not for creating transcriptions." @@ -461,17 +463,21 @@ async def transcriptions( async def translations( self, audio: bytes, + language: Optional[str] = None, prompt: Optional[str] = None, response_format: str = "json", temperature: float = 0, + timestamp_granularities: Optional[List[str]] = None, ): if hasattr(self._model, "translations"): return await self._call_wrapper( self._model.translations, audio, + language, prompt, response_format, temperature, + timestamp_granularities, ) raise AttributeError( f"Model {self._model.model_spec} is not for creating translations." diff --git a/xinference/model/audio/tests/test_whisper.py b/xinference/model/audio/tests/test_whisper.py index c39b3c15ba..30606d4e86 100644 --- a/xinference/model/audio/tests/test_whisper.py +++ b/xinference/model/audio/tests/test_whisper.py @@ -79,6 +79,63 @@ def test_restful_api_for_whisper(setup): assert "hong kong" in translation +def test_transcriptions_for_whisper(setup): + endpoint, _ = setup + from ....client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_uid="whisper-1", + model_name="whisper-large-v3", + model_type="audio", + ) + model = client.get_model(model_uid) + response = requests.get("https://github.com/openai/whisper/raw/main/tests/jfk.flac") + audio = response.content + + response = model.transcriptions(audio, response_format="verbose_json") + assert response["text"] + assert len(response["segments"]) == 3 + + seek_set = set() + for s in response["segments"]: + if s["seek"] in seek_set: + assert False, "incorrect seek" + seek_set.add(s["seek"]) + + response = model.transcriptions( + audio, response_format="verbose_json", timestamp_granularities=["word"] + ) + assert response["text"] + assert len(response["words"]) == 22 + + zh_cn_audio_path = os.path.join( + os.path.dirname(__file__), "common_voice_zh-CN_38026095.mp3" + ) + + # Test openai API + import openai + + client = openai.Client(api_key="not empty", base_url=f"{endpoint}/v1") + with open(zh_cn_audio_path, "rb") as f: + completion = client.audio.transcriptions.create( + model=model_uid, + file=f, + response_format="verbose_json", + timestamp_granularities=["segment"], + ) + assert len(completion.segments) == 1 + + completion = client.audio.transcriptions.create( + model=model_uid, + file=f, + response_format="verbose_json", + timestamp_granularities=["word"], + ) + assert len(completion.words) == 11 + + def test_register_custom_audio(): from ..custom import ( CustomAudioModelFamilyV1, diff --git a/xinference/model/audio/whisper.py b/xinference/model/audio/whisper.py index 728d03bad3..34d2dead7a 100644 --- a/xinference/model/audio/whisper.py +++ b/xinference/model/audio/whisper.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import logging -from typing import TYPE_CHECKING, Dict, Optional +from typing import TYPE_CHECKING, Dict, List, Optional, Union from xinference.device_utils import ( get_available_device, @@ -81,12 +81,87 @@ def _call_model( audio: bytes, generate_kwargs: Dict, response_format: str, + temperature: float = 0, + timestamp_granularities: Optional[List[str]] = None, ): + if temperature != 0: + generate_kwargs.update({"temperature": temperature, "do_sample": True}) + if response_format == "json": logger.debug("Call whisper model with generate_kwargs: %s", generate_kwargs) assert callable(self._model) result = self._model(audio, generate_kwargs=generate_kwargs) return {"text": result["text"]} + elif response_format == "verbose_json": + return_timestamps: Union[bool, str] = False + if not timestamp_granularities: + return_timestamps = True + elif timestamp_granularities == ["segment"]: + return_timestamps = True + elif timestamp_granularities == ["word"]: + return_timestamps = "word" + else: + raise Exception( + f"Unsupported timestamp_granularities: {timestamp_granularities}" + ) + assert callable(self._model) + results = self._model( + audio, + generate_kwargs=generate_kwargs, + return_timestamps=return_timestamps, + ) + + language = generate_kwargs.get("language", "english") + + if return_timestamps is True: + segments: List[dict] = [] + + def _get_chunk_segment_json(idx, text, start, end): + find_start = 0 + if segments: + find_start = segments[-1]["seek"] + len(segments[-1]["text"]) + return { + "id": idx, + "seek": results["text"].find(text, find_start), + "start": start, + "end": end, + "text": text, + "tokens": [], + "temperature": temperature, + # We can't provide these values. + "avg_logprob": 0.0, + "compression_ratio": 0.0, + "no_speech_prob": 0.0, + } + + for idx, c in enumerate(results.get("chunks", [])): + text = c["text"] + start, end = c["timestamp"] + segments.append(_get_chunk_segment_json(idx, text, start, end)) + + return { + "task": "transcribe", + "language": language, + "duration": segments[-1]["end"] if segments else 0, + "text": results["text"], + "segments": segments, + } + else: + assert return_timestamps == "word" + + words = [] + for idx, c in enumerate(results.get("chunks", [])): + text = c["text"] + start, end = c["timestamp"] + words.append({"word": text, "start": start, "end": end}) + + return { + "task": "transcribe", + "language": language, + "duration": words[-1]["end"] if words else 0, + "text": results["text"], + "words": words, + } else: raise ValueError(f"Unsupported response format: {response_format}") @@ -97,12 +172,8 @@ def transcriptions( prompt: Optional[str] = None, response_format: str = "json", temperature: float = 0, + timestamp_granularities: Optional[List[str]] = None, ): - if temperature != 0: - logger.warning( - "Temperature for whisper transcriptions will be ignored: %s.", - temperature, - ) if prompt is not None: logger.warning( "Prompt for whisper transcriptions will be ignored: %s", prompt @@ -115,30 +186,35 @@ def transcriptions( else {"task": "transcribe"} ), response_format=response_format, + temperature=temperature, + timestamp_granularities=timestamp_granularities, ) def translations( self, audio: bytes, + language: Optional[str] = None, prompt: Optional[str] = None, response_format: str = "json", temperature: float = 0, + timestamp_granularities: Optional[List[str]] = None, ): if not self._model_spec.multilingual: raise RuntimeError( f"Model {self._model_spec.model_name} is not suitable for translations." ) - if temperature != 0: - logger.warning( - "Temperature for whisper transcriptions will be ignored: %s.", - temperature, - ) if prompt is not None: logger.warning( "Prompt for whisper transcriptions will be ignored: %s", prompt ) return self._call_model( audio=audio, - generate_kwargs={"task": "translate"}, + generate_kwargs=( + {"language": language, "task": "translate"} + if language is not None + else {"task": "translate"} + ), response_format=response_format, + temperature=temperature, + timestamp_granularities=timestamp_granularities, ) From 79e389797c8fa05db93c1204e759429ea5bfabe4 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 8 May 2024 12:00:31 +0800 Subject: [PATCH 061/298] CLN: Remove actor client (#1436) --- xinference/client/oscar/__init__.py | 13 - xinference/client/oscar/actor_client.py | 615 ------------------- xinference/client/tests/test_client.py | 218 ------- xinference/model/audio/tests/test_whisper.py | 2 + 4 files changed, 2 insertions(+), 846 deletions(-) delete mode 100644 xinference/client/oscar/__init__.py delete mode 100644 xinference/client/oscar/actor_client.py diff --git a/xinference/client/oscar/__init__.py b/xinference/client/oscar/__init__.py deleted file mode 100644 index 37f6558d95..0000000000 --- a/xinference/client/oscar/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/xinference/client/oscar/actor_client.py b/xinference/client/oscar/actor_client.py deleted file mode 100644 index 0e49dcee37..0000000000 --- a/xinference/client/oscar/actor_client.py +++ /dev/null @@ -1,615 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -import re -from typing import TYPE_CHECKING, Any, AsyncIterator, Dict, List, Optional, Union - -import orjson -import xoscar as xo - -from ...core.model import ModelActor -from ...core.supervisor import SupervisorActor -from ...isolation import Isolation -from ..restful.restful_client import Client - -if TYPE_CHECKING: - import PIL - - from ...types import ( - ChatCompletion, - ChatCompletionChunk, - ChatCompletionMessage, - ChatglmCppGenerateConfig, - Completion, - CompletionChunk, - ImageList, - LlamaCppGenerateConfig, - PytorchGenerateConfig, - ) - - -class SSEEvent(object): - # https://github.com/btubbs/sseclient/blob/master/sseclient.py - sse_line_pattern = re.compile("(?P<name>[^:]*):?( ?(?P<value>.*))?") - - def __init__(self, data="", event="message", id=None, retry=None): - self.data = data - self.event = event - self.id = id - self.retry = retry - - @classmethod - def parse(cls, raw): - """ - Given a possibly-multiline string representing an SSE message, parse it - and return a Event object. - """ - msg = cls() - for line in raw.splitlines(): - m = cls.sse_line_pattern.match(line) - if m is None: - # Malformed line. Discard but warn. - continue - - name = m.group("name") - if name == "": - # line began with a ":", so is a comment. Ignore - continue - value = m.group("value") - - if name == "data": - # If we already have some data, then join to it with a newline. - # Else this is it. - if msg.data: - msg.data = "%s\n%s" % (msg.data, value) - else: - msg.data = value - elif name == "event": - msg.event = value - elif name == "id": - msg.id = value - elif name == "retry": - msg.retry = int(value) - - return msg - - -class ModelHandle: - """ - A sync model interface (for rpc client) which provides type hints that makes it much easier to use xinference - programmatically. - """ - - def __init__(self, model_ref: xo.ActorRefType["ModelActor"], isolation: Isolation): - self._model_ref = model_ref - self._isolation = isolation - - -class ClientIteratorWrapper(AsyncIterator): - def __init__(self, iterator_wrapper): - self._iw = iterator_wrapper - - def __aiter__(self): - return self - - async def __anext__(self): - r = await self._iw.__anext__() - text = r.decode("utf-8") - return orjson.loads(SSEEvent.parse(text).data) - - -class EmbeddingModelHandle(ModelHandle): - def create_embedding(self, input: Union[str, List[str]], **kwargs) -> bytes: - """ - Creates an embedding vector representing the input text. - - Parameters - ---------- - input: Union[str, List[str]] - Input text to embed, encoded as a string or array of tokens. - To embed multiple inputs in a single request, pass an array of strings or array of token arrays. - - Returns - ------- - bytes - A json bytes of Embedding. The resulted Embedding vector that can be easily consumed by - machine learning models and algorithms. - """ - - coro = self._model_ref.create_embedding(input, **kwargs) - return orjson.loads(self._isolation.call(coro)) - - -class RerankModelHandle(ModelHandle): - def rerank( - self, - documents: List[str], - query: str, - top_n: Optional[int], - max_chunks_per_doc: Optional[int], - return_documents: Optional[bool], - **kwargs, - ): - """ - Returns an ordered list of documents ordered by their relevance to the provided query. - - Parameters - ---------- - query: str - The search query - documents: List[str] - The documents to rerank - top_n: int - The number of results to return, defaults to returning all results - max_chunks_per_doc: int - The maximum number of chunks derived from a document - return_documents: bool - if return documents - Returns - ------- - Scores - The scores of documents ordered by their relevance to the provided query - - """ - coro = self._model_ref.rerank( - documents, query, top_n, max_chunks_per_doc, return_documents, **kwargs - ) - results = orjson.loads(self._isolation.call(coro)) - for r in results["results"]: - r["document"] = documents[r["index"]] - return results - - -class GenerateModelHandle(ModelHandle): - def generate( - self, - prompt: str, - generate_config: Optional[ - Union["LlamaCppGenerateConfig", "PytorchGenerateConfig"] - ] = None, - ) -> Union["Completion", AsyncIterator["CompletionChunk"]]: - """ - Creates a completion for the provided prompt and parameters. - - Parameters - ---------- - prompt: str - The user's input. - generate_config: Optional[Union["LlamaCppGenerateConfig", "PytorchGenerateConfig"]] - Additional configurations for completion. - "LlamaCppGenerateConfig" -> Configuration for ggml model. - "PytorchGenerateConfig" -> Configuration for pytorch model. - - Returns - ------- - Union["Completion", Iterator["CompletionChunk"]] - Stream is a parameter in generate_config. - When stream is set to True, the function will return Iterator["CompletionChunk"]. - When stream is set to False, the function will return "Completion". - - """ - - coro = self._model_ref.generate(prompt, generate_config) - r = self._isolation.call(coro) - if isinstance(r, bytes): - return orjson.loads(r) - return ClientIteratorWrapper(r) - - -class ChatModelHandle(GenerateModelHandle): - def chat( - self, - prompt: str, - system_prompt: Optional[str] = None, - chat_history: Optional[List["ChatCompletionMessage"]] = None, - generate_config: Optional[ - Union["LlamaCppGenerateConfig", "PytorchGenerateConfig"] - ] = None, - ) -> Union["ChatCompletion", AsyncIterator["ChatCompletionChunk"]]: - """ - Given a list of messages comprising a conversation, the model will return a response. - - Parameters - ---------- - prompt : str - The user's input. - Parameters - ---------- - prompt: str - The user's input. - system_prompt: Optional[str] - The system context provide to Model prior to any chats. - chat_history: Optional[List["ChatCompletionMessage"]] - A list of messages comprising the conversation so far. - generate_config: Optional[Union["LlamaCppGenerateConfig", "PytorchGenerateConfig"]] - Additional configuration for the chat generation. - "LlamaCppGenerateConfig" -> configuration for ggml model - "PytorchGenerateConfig" -> configuration for pytorch model - - Returns - ------- - Union["ChatCompletion", Iterator["ChatCompletionChunk"]] - Stream is a parameter in generate_config. - When stream is set to True, the function will return Iterator["ChatCompletionChunk"]. - When stream is set to False, the function will return "ChatCompletion". - - """ - - coro = self._model_ref.chat( - prompt, system_prompt, chat_history, generate_config - ) - r = self._isolation.call(coro) - if isinstance(r, bytes): - return orjson.loads(r) - return ClientIteratorWrapper(r) - - -class ChatglmCppChatModelHandle(ModelHandle): - def chat( - self, - prompt: str, - chat_history: Optional[List["ChatCompletionMessage"]] = None, - generate_config: Optional["ChatglmCppGenerateConfig"] = None, - ) -> Union["ChatCompletion", AsyncIterator["ChatCompletionChunk"]]: - """ - Given a list of messages comprising a conversation, the ChatGLM model will return a response. - - Parameters - ---------- - prompt: str - The user's input - chat_history: Optional[List["ChatCompletionMessage"]] - A list of messages comprising the conversation so far. - generate_config: Optional["ChatglmCppGenerateConfig"] - Additional Configuration for the ChatGLM Model generation. - - Returns - ------- - Union["ChatCompletion", Iterator["ChatCompletionChunk"]] - Stream is a parameter in generate_config. - When stream is set to True, the function will return Iterator["ChatCompletionChunk"]. - When stream is set to False, the function will return "ChatCompletion". - - """ - - coro = self._model_ref.chat(prompt, chat_history, generate_config) - r = self._isolation.call(coro) - if isinstance(r, bytes): - return orjson.loads(r) - return ClientIteratorWrapper(r) - - -class ImageModelHandle(ModelHandle): - def text_to_image( - self, - prompt: str, - n: int = 1, - size: str = "1024*1024", - response_format: str = "url", - **kwargs, - ) -> "ImageList": - """ - Creates an image by the input text. - - Parameters - ---------- - prompt (`str` or `List[str]`, *optional*): - The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`. - n (`int`, *optional*, defaults to 1): - The number of images to generate per prompt. Must be between 1 and 10. - size (`str`, *optional*, defaults to `1024*1024`): - The width*height in pixels of the generated image. Must be one of 256x256, 512x512, or 1024x1024. - response_format (`str`, *optional*, defaults to `url`): - The format in which the generated images are returned. Must be one of url or b64_json. - Returns - ------- - ImageList - A list of image objects. - """ - - coro = self._model_ref.text_to_image(prompt, n, size, response_format, **kwargs) - return orjson.loads(self._isolation.call(coro)) - - def image_to_image( - self, - image: "PIL.Image", - prompt: str, - negative_prompt: str, - n: int = 1, - size: str = "1024*1024", - response_format: str = "url", - **kwargs, - ) -> "ImageList": - """ - Creates an image by the input text. - - Parameters - ---------- - image (`PIL.Image`): - The ControlNet input condition to provide guidance to the `unet` for generation. If the type is - specified as `torch.FloatTensor`, it is passed to ControlNet as is. `PIL.Image.Image` can also be - accepted as an image. The dimensions of the output image defaults to `image`'s dimensions. If height - and/or width are passed, `image` is resized accordingly. If multiple ControlNets are specified in - `init`, images must be passed as a list such that each element of the list can be correctly batched for - input to a single ControlNet. - prompt (`str` or `List[str]`, *optional*): - The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`. - negative_prompt (`str` or `List[str]`, *optional*): - The prompt or prompts not to guide the image generation. If not defined, one has to pass - `negative_prompt_embeds` instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` is - less than `1`). - n (`int`, *optional*, defaults to 1): - The number of images to generate per prompt. Must be between 1 and 10. - size (`str`, *optional*, defaults to `1024*1024`): - The width*height in pixels of the generated image. Must be one of 256x256, 512x512, or 1024x1024. - response_format (`str`, *optional*, defaults to `url`): - The format in which the generated images are returned. Must be one of url or b64_json. - Returns - ------- - ImageList - A list of image objects. - """ - - coro = self._model_ref.image_to_image( - image, prompt, negative_prompt, n, size, response_format, **kwargs - ) - return orjson.loads(self._isolation.call(coro)) - - -class ActorClient: - def __init__(self, endpoint: str): - restful_client = Client(endpoint) - self._supervisor_address = restful_client._get_supervisor_internal_address() - self._isolation = Isolation(asyncio.new_event_loop(), threaded=True) - self._isolation.start() - self._supervisor_ref: xo.ActorRefType["SupervisorActor"] = self._isolation.call( - xo.actor_ref(address=self._supervisor_address, uid=SupervisorActor.uid()) - ) - - def register_model(self, model_type: str, model: str, persist: bool): - """ - Register a custom model. - - Parameters - ---------- - model_type: str - The type of model. - model: str - The model definition. (refer to: https://inference.readthedocs.io/en/latest/models/custom.html) - persist: bool - """ - coro = self._supervisor_ref.register_model(model_type, model, persist) - self._isolation.call(coro) - - def unregister_model(self, model_type: str, model_name: str): - """ - Unregister a custom model. - - Parameters - ---------- - model_type: str - The type of model. - model_name: str - The name of the model - """ - coro = self._supervisor_ref.unregister_model(model_type, model_name) - self._isolation.call(coro) - - def list_model_registrations(self, model_type: str) -> List[Dict[str, Any]]: - """ - List models registered on the server. - - Parameters - ---------- - model_type: str - The type of the model. - - Returns - ------- - List[Dict[str, Any]] - The collection of registered models on the server. - """ - coro = self._supervisor_ref.list_model_registrations(model_type) - return self._isolation.call(coro) - - def get_model_registration( - self, model_type: str, model_name: str - ) -> Dict[str, Any]: - """ - Get the model with the model type and model name registered on the server. - - Parameters - ---------- - model_type: str - The type of the model. - - model_name: str - The name of the model. - Returns - ------- - List[Dict[str, Any]] - The collection of registered models on the server. - """ - coro = self._supervisor_ref.get_model_registration(model_type, model_name) - return self._isolation.call(coro) - - def launch_model( - self, - model_name: str, - model_type: str = "LLM", - model_engine: Optional[str] = None, - model_size_in_billions: Optional[int] = None, - model_format: Optional[str] = None, - quantization: Optional[str] = None, - replica: int = 1, - n_gpu: Optional[Union[int, str]] = "auto", - request_limits: Optional[int] = None, - **kwargs, - ) -> str: - """ - Launch the Model based on the parameters on the server. - - Parameters - ---------- - model_name: str - The name of model. - model_type: str - Type of model. - model_engine: Optional[str] - Specify the inference engine of the model when launching LLM. - model_size_in_billions: Optional[int] - The size (in billions) of the model. - model_format: Optional[str] - The format of the model. - quantization: Optional[str] - The quantization of model. - replica: Optional[int] - The replica of model, default is 1. - n_gpu: Optional[Union[int, str]], - The number of GPUs used by the model, default is "auto". - ``n_gpu=None`` means cpu only, ``n_gpu=auto`` lets the system automatically determine the best number of GPUs to use. - request_limits: Optional[int] - The number of request limits for this model, default is None. - ``request_limits=None`` means no limits for this model. - **kwargs: - Any other parameters been specified. - - Returns - ------- - str - The unique model_uid for the launched model. - - """ - - coro = self._supervisor_ref.launch_builtin_model( - model_uid=None, - model_name=model_name, - model_engine=model_engine, - model_type=model_type, - model_size_in_billions=model_size_in_billions, - model_format=model_format, - quantization=quantization, - replica=replica, - n_gpu=n_gpu, - request_limits=request_limits, - **kwargs, - ) - - return self._isolation.call(coro) - - def terminate_model(self, model_uid: str): - """ - Terminate the specific model running on the server. - - Parameters - ---------- - model_uid: str - The unique id that identify the model we want. - """ - - coro = self._supervisor_ref.terminate_model(model_uid) - self._isolation.call(coro) - - def list_models(self) -> Dict[str, Dict[str, Any]]: - """ - Retrieve the model specifications from the Server. - - Returns - ------- - Dict[str, Dict[str, Any]] - The collection of model specifications with their names on the server. - - """ - - coro = self._supervisor_ref.list_models() - return self._isolation.call(coro) - - def get_model(self, model_uid: str) -> "ModelHandle": - """ - Launch the Model based on the parameters on the server. - - Parameters - ---------- - model_uid: str - The unique id that identify the model. - - Returns - ------- - ModelHandle - The corresponding Model Handler based on the Model specified in the uid: - "ChatglmCppChatModelHandle" -> handler for ChatGLM chat model - "GenerateModelHandle" -> handle for generate model. e.g. Baichuan. - "ChatModelHandle" -> handle for chat model. e.g. Baichuan-chat. - - """ - - desc: Dict[str, Any] = self._isolation.call( - self._supervisor_ref.describe_model(model_uid) - ) - model_ref = self._isolation.call(self._supervisor_ref.get_model(model_uid)) - if desc["model_type"] == "LLM": - if desc["model_format"] == "ggmlv3" and "chatglm" in desc["model_name"]: - return ChatglmCppChatModelHandle(model_ref, self._isolation) - elif "chat" in desc["model_ability"]: - return ChatModelHandle(model_ref, self._isolation) - elif "generate" in desc["model_ability"]: - return GenerateModelHandle(model_ref, self._isolation) - else: - raise ValueError(f"Unrecognized model ability: {desc['model_ability']}") - elif desc["model_type"] == "embedding": - return EmbeddingModelHandle(model_ref, self._isolation) - elif desc["model_type"] == "image": - return ImageModelHandle(model_ref, self._isolation) - elif desc["model_type"] == "rerank": - return RerankModelHandle(model_ref, self._isolation) - else: - raise ValueError(f"Unknown model type:{desc['model_type']}") - - def describe_model(self, model_uid: str) -> Dict: - """ - Get model information. - - Parameters - ---------- - model_uid: str - The unique id that identify the model. - - Returns - ------- - dict - A dictionary containing the following keys: - - "model_type": str - the type of the model determined by its function, e.g. "LLM" (Large Language Model) - - "model_name": str - the name of the specific LLM model family - - "model_lang": List[str] - the languages supported by the LLM model - - "model_ability": List[str] - the ability or capabilities of the LLM model - - "model_description": str - a detailed description of the LLM model - - "model_format": str - the format specification of the LLM model - - "model_size_in_billions": int - the size of the LLM model in billions - - "quantization": str - the quantization applied to the model - - "revision": str - the revision number of the LLM model specification - - "context_length": int - the maximum text length the LLM model can accommodate (include all input & output) - """ - - return self._isolation.call(self._supervisor_ref.describe_model(model_uid)) diff --git a/xinference/client/tests/test_client.py b/xinference/client/tests/test_client.py index 8457724cdf..8d179516c2 100644 --- a/xinference/client/tests/test_client.py +++ b/xinference/client/tests/test_client.py @@ -22,7 +22,6 @@ import requests from ...constants import XINFERENCE_ENV_MODEL_SRC -from ..oscar.actor_client import ActorClient, ChatModelHandle, EmbeddingModelHandle from ..restful.restful_client import Client as RESTfulClient from ..restful.restful_client import ( RESTfulChatModelHandle, @@ -31,223 +30,6 @@ ) -@pytest.mark.skipif(os.name == "nt", reason="Skip windows") -@pytest.mark.asyncio -async def test_client(setup): - endpoint, _ = setup - client = ActorClient(endpoint) - assert len(client.list_models()) == 0 - - model_uid = client.launch_model( - model_name="orca", - model_engine="llama-cpp-python", - model_size_in_billions=3, - quantization="q4_0", - ) - assert len(client.list_models()) == 1 - - model = client.get_model(model_uid=model_uid) - assert isinstance(model, ChatModelHandle) - - completion = model.chat("write a poem.") - assert "content" in completion["choices"][0]["message"] - - completion = model.chat("write a poem.", generate_config={"stream": True}) - with pytest.raises(Exception, match="Parallel generation"): - model.chat("write a poem.", generate_config={"stream": True}) - del completion - completion = model.chat("write a poem.", generate_config={"stream": True}) - async for chunk in completion: - assert chunk - assert isinstance(chunk, dict) - del completion - - client.terminate_model(model_uid=model_uid) - assert len(client.list_models()) == 0 - - model_uid = client.launch_model( - model_name="orca", - model_engine="llama-cpp-python", - model_size_in_billions=3, - quantization="q4_0", - ) - - model = client.get_model(model_uid=model_uid) - - client.terminate_model(model_uid=model_uid) - assert len(client.list_models()) == 0 - - with pytest.raises(ValueError): - client.launch_model( - model_name="orca", - model_engine="llama-cpp-python", - model_size_in_billions=3, - quantization="q4_0", - n_gpu=100, - ) - - with pytest.raises(ValueError): - client.launch_model( - model_name="orca", - model_engine="llama-cpp-python", - model_size_in_billions=3, - quantization="q4_0", - n_gpu="abcd", - ) - - -def test_client_for_model_uid(setup): - endpoint, _ = setup - client = ActorClient(endpoint) - assert len(client.list_models()) == 0 - - model_uid = client.launch_model( - model_name="orca", - model_engine="llama-cpp-python", - model_size_in_billions=3, - quantization="q4_0", - ) - assert len(client.list_models()) == 1 - assert model_uid == "orca" - - model_uid2 = client.launch_model( - model_name="orca", - model_engine="llama-cpp-python", - model_size_in_billions=3, - quantization="q4_0", - ) - assert len(client.list_models()) == 2 - assert len(model_uid2) == len("orca") + 9 - assert model_uid2.startswith("orca") - - client.terminate_model(model_uid=model_uid) - client.terminate_model(model_uid=model_uid2) - assert len(client.list_models()) == 0 - - -def test_client_for_embedding(setup): - endpoint, _ = setup - client = ActorClient(endpoint) - assert len(client.list_models()) == 0 - - model_uid = client.launch_model( - model_name="bge-small-en-v1.5", model_type="embedding" - ) - assert len(client.list_models()) == 1 - - model = client.get_model(model_uid=model_uid) - assert isinstance(model, EmbeddingModelHandle) - - completion = model.create_embedding("write a poem.") - assert len(completion["data"][0]["embedding"]) == 384 - - kwargs = { - "invalid": "invalid", - } - with pytest.raises(TypeError) as err: - completion = model.create_embedding("write a poem.", **kwargs) - assert "unexpected" in str(err.value) - - client.terminate_model(model_uid=model_uid) - assert len(client.list_models()) == 0 - - -@pytest.mark.skipif(os.name == "nt", reason="Skip windows") -def test_replica_model(setup): - endpoint, _ = setup - client = ActorClient(endpoint) - assert len(client.list_models()) == 0 - - # Windows CI has limited resources, use replica 1 - replica = 1 if os.name == "nt" else 2 - model_uid = client.launch_model( - model_name="orca", - model_engine="llama-cpp-python", - model_size_in_billions=3, - quantization="q4_0", - replica=replica, - ) - # Only one model with 2 replica - assert len(client.list_models()) == 1 - - replica_uids = set() - while len(replica_uids) != replica: - model = client.get_model(model_uid=model_uid) - replica_uids.add(model._model_ref.uid) - - client2 = RESTfulClient(endpoint) - info = client2.describe_model(model_uid=model_uid) - assert "address" in info - assert "accelerators" in info - assert info["replica"] == replica - - client.terminate_model(model_uid=model_uid) - assert len(client.list_models()) == 0 - - -def test_client_custom_model(setup): - endpoint, _ = setup - client = ActorClient(endpoint) - - model_regs = client.list_model_registrations(model_type="LLM") - assert len(model_regs) > 0 - for model_reg in model_regs: - assert model_reg["is_builtin"] - - model = """{ - "version": 1, - "context_length":2048, - "model_name": "custom_model", - "model_lang": [ - "en", "zh" - ], - "model_ability": [ - "embed", - "chat" - ], - "model_family": "other", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "ziqingyang/chinese-alpaca-2-7b" - } - ], - "prompt_style": { - "style_name": "ADD_COLON_SINGLE", - "system_prompt": "Below is an instruction that describes a task. Write a response that appropriately completes the request.", - "roles": [ - "Instruction", - "Response" - ], - "intra_message_sep": "\\n\\n### " - } -}""" - client.register_model(model_type="LLM", model=model, persist=False) - - new_model_regs = client.list_model_registrations(model_type="LLM") - assert len(new_model_regs) == len(model_regs) + 1 - custom_model_reg = None - for model_reg in new_model_regs: - if model_reg["model_name"] == "custom_model": - custom_model_reg = model_reg - assert custom_model_reg is not None - - client.unregister_model(model_type="LLM", model_name="custom_model") - new_model_regs = client.list_model_registrations(model_type="LLM") - assert len(new_model_regs) == len(model_regs) - custom_model_reg = None - for model_reg in new_model_regs: - if model_reg["model_name"] == "custom_model": - custom_model_reg = model_reg - assert custom_model_reg is None - - @pytest.mark.skipif(os.name == "nt", reason="Skip windows") def test_RESTful_client(setup): endpoint, _ = setup diff --git a/xinference/model/audio/tests/test_whisper.py b/xinference/model/audio/tests/test_whisper.py index 30606d4e86..d1c5d95a76 100644 --- a/xinference/model/audio/tests/test_whisper.py +++ b/xinference/model/audio/tests/test_whisper.py @@ -18,6 +18,7 @@ import requests +@pytest.mark.skip(reason="Too large model to be tested") def test_restful_api_for_whisper(setup): endpoint, _ = setup from ....client import Client @@ -79,6 +80,7 @@ def test_restful_api_for_whisper(setup): assert "hong kong" in translation +@pytest.mark.skip(reason="Too large model to be tested") def test_transcriptions_for_whisper(setup): endpoint, _ = setup from ....client import Client From f9629e35dcd903ed4fa21f6be875bc9ca872e3e5 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Wed, 8 May 2024 13:36:49 +0800 Subject: [PATCH 062/298] ENH: make qwen_vl support streaming output (#1425) Co-authored-by: qinxuye <qinxuye@gmail.com> Co-authored-by: codingl2k1 <codingl2k1@outlook.com> --- xinference/api/oauth2/auth_service.py | 2 +- xinference/core/cache_tracker.py | 2 +- xinference/core/event.py | 2 +- xinference/core/status_guard.py | 2 +- xinference/fields.py | 5 ++ .../llm/ggml/tools/convert_ggml_to_gguf.py | 4 +- xinference/model/llm/pytorch/qwen_vl.py | 79 ++++++++++++++++--- xinference/types.py | 2 + 8 files changed, 80 insertions(+), 18 deletions(-) diff --git a/xinference/api/oauth2/auth_service.py b/xinference/api/oauth2/auth_service.py index 7de97c1020..d6e140b1fe 100644 --- a/xinference/api/oauth2/auth_service.py +++ b/xinference/api/oauth2/auth_service.py @@ -48,7 +48,7 @@ def is_legal_api_key(key: str) -> bool: def init_auth_config(self): if self._auth_config_file: - config: AuthStartupConfig = parse_file_as( + config: AuthStartupConfig = parse_file_as( # type: ignore path=self._auth_config_file, type_=AuthStartupConfig ) all_api_keys = set() diff --git a/xinference/core/cache_tracker.py b/xinference/core/cache_tracker.py index 803f5ff222..42c3115960 100644 --- a/xinference/core/cache_tracker.py +++ b/xinference/core/cache_tracker.py @@ -22,7 +22,7 @@ class CacheTrackerActor(xo.Actor): def __init__(self): super().__init__() - self._model_name_to_version_info: Dict[str, List[Dict]] = {} + self._model_name_to_version_info: Dict[str, List[Dict]] = {} # type: ignore @classmethod def uid(cls) -> str: diff --git a/xinference/core/event.py b/xinference/core/event.py index 7361c179b2..0319a4d5f8 100644 --- a/xinference/core/event.py +++ b/xinference/core/event.py @@ -37,7 +37,7 @@ class Event(TypedDict): class EventCollectorActor(xo.StatelessActor): def __init__(self): super().__init__() - self._model_uid_to_events: Dict[str, queue.Queue] = defaultdict( + self._model_uid_to_events: Dict[str, queue.Queue] = defaultdict( # type: ignore lambda: queue.Queue(maxsize=MAX_EVENT_COUNT_PER_MODEL) ) diff --git a/xinference/core/status_guard.py b/xinference/core/status_guard.py index 1bd8010b8d..d348730869 100644 --- a/xinference/core/status_guard.py +++ b/xinference/core/status_guard.py @@ -48,7 +48,7 @@ def update(self, **kwargs): class StatusGuardActor(xo.StatelessActor): def __init__(self): super().__init__() - self._model_uid_to_info: Dict[str, InstanceInfo] = {} + self._model_uid_to_info: Dict[str, InstanceInfo] = {} # type: ignore @classmethod def uid(cls) -> str: diff --git a/xinference/fields.py b/xinference/fields.py index e68f6c85c9..3fcda70f79 100644 --- a/xinference/fields.py +++ b/xinference/fields.py @@ -75,6 +75,11 @@ description="Whether to stream the results as they are generated. Useful for chatbots.", ) +stream_option_field = Field( + default={}, + description="If set, an additional chunk will be streamed before the `data: [DONE]` message.", +) + top_k_field = Field( default=40, ge=0, diff --git a/xinference/model/llm/ggml/tools/convert_ggml_to_gguf.py b/xinference/model/llm/ggml/tools/convert_ggml_to_gguf.py index b3011bd207..d94d14d88a 100644 --- a/xinference/model/llm/ggml/tools/convert_ggml_to_gguf.py +++ b/xinference/model/llm/ggml/tools/convert_ggml_to_gguf.py @@ -116,7 +116,7 @@ def load(self, data, offset, n_vocab): class Tensor: def __init__(self, use_padding=True): self.name = None - self.dims: tuple[int, ...] = () + self.dims: tuple[int, ...] = () # type: ignore self.dtype = None self.start_offset = 0 self.len_bytes = np.int64(0) @@ -211,7 +211,7 @@ def load(self, data, offset): self.validate_conversion(hp.ftype) vocab = Vocab(load_scores=self.file_format > GGMLFormat.GGML) offset += vocab.load(data, offset, hp.n_vocab) - tensors: list[Tensor] = [] + tensors: list[Tensor] = [] # type: ignore tensor_map = {} while offset < len(data): tensor = Tensor(use_padding=self.file_format > GGMLFormat.GGMF) diff --git a/xinference/model/llm/pytorch/qwen_vl.py b/xinference/model/llm/pytorch/qwen_vl.py index fb3b86ca41..b13aa9f24c 100644 --- a/xinference/model/llm/pytorch/qwen_vl.py +++ b/xinference/model/llm/pytorch/qwen_vl.py @@ -22,9 +22,11 @@ from ....model.utils import select_device from ....types import ( ChatCompletion, - ChatCompletionChoice, ChatCompletionChunk, ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionChunk, CompletionUsage, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 @@ -116,10 +118,6 @@ def chat( chat_history: Optional[List[ChatCompletionMessage]] = None, generate_config: Optional[PytorchGenerateConfig] = None, ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: - if generate_config and generate_config.get("stream"): - raise Exception( - f"Chat with model {self.model_family.model_name} does not support stream." - ) prompt = self._message_content_to_qwen(prompt) # Convert openai history to qwen vl history qwen_history = [] @@ -134,22 +132,79 @@ def chat( if len(query_to_response) == 2: qwen_history.append(query_to_response) query_to_response = [] + + stream = generate_config.get("stream", False) if generate_config else False + + if stream: + it = self._generate_stream(prompt, qwen_history) + return self._to_chat_completion_chunks(it) + else: + c = self._generate(prompt, qwen_history) + return self._to_chat_completion(c) + + def _generate(self, prompt: str, qwen_history: List) -> Completion: response, history = self._model.chat( self._tokenizer, query=prompt, history=qwen_history ) - return ChatCompletion( - id="chat" + str(uuid.uuid1()), - object="chat.completion", + c = Completion( + id=str(uuid.uuid1()), + object="text_completion", created=int(time.time()), model=self.model_uid, choices=[ - ChatCompletionChoice( - index=0, - message={"role": "assistant", "content": response}, - finish_reason="stop", + CompletionChoice( + index=0, text=response, finish_reason="stop", logprobs=None ) ], usage=CompletionUsage( prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 ), ) + return c + + def _generate_stream( + self, prompt: str, qwen_history: List + ) -> Iterator[CompletionChunk]: + # response, history = model.chat(tokenizer, message, history=history) + response_generator = self._model.chat_stream( + self._tokenizer, query=prompt, history=qwen_history + ) + full_response = "" + for response in response_generator: + inc_content = response[len(full_response) :] + full_response = response + completion_choice = CompletionChoice( + text=inc_content, index=0, logprobs=None, finish_reason=None + ) + completion_chunk = CompletionChunk( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + completion_chunk["usage"] = completion_usage + yield completion_chunk + + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + completion_chunk = CompletionChunk( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + completion_chunk["usage"] = completion_usage + yield completion_chunk diff --git a/xinference/types.py b/xinference/types.py index bbe6188616..53473f26f2 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -33,6 +33,7 @@ stop_field, stream_field, stream_interval_field, + stream_option_field, temperature_field, top_k_field, top_p_field, @@ -392,6 +393,7 @@ class _CreateCompletionOpenAIFallback(BaseModel): seed: Optional[int] = none_field stop: Optional[Union[str, List[str]]] = stop_field stream: bool = stream_field + stream_options: Optional[dict] = stream_option_field suffix: Optional[str] = none_field temperature: float = temperature_field top_p: float = top_p_field From dc8124b2e40782af6ed466ee6d9791558d5028f2 Mon Sep 17 00:00:00 2001 From: Mike Shi <mikeshi80@gmail.com> Date: Wed, 8 May 2024 15:01:03 +0800 Subject: [PATCH 063/298] ENH: Removed the max tokens limitation and boost performance by avoid unnecessary repeated cuda device detection. (#1429) --- xinference/fields.py | 1 - xinference/model/llm/core.py | 3 +++ xinference/model/llm/llm_family.json | 2 +- xinference/model/llm/llm_family_modelscope.json | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/xinference/fields.py b/xinference/fields.py index 3fcda70f79..ce6611e559 100644 --- a/xinference/fields.py +++ b/xinference/fields.py @@ -32,7 +32,6 @@ max_tokens_field = Field( default=1024, ge=1, - le=32768, description="The maximum number of tokens to generate.", ) diff --git a/xinference/model/llm/core.py b/xinference/model/llm/core.py index f5fc3bd6d9..848791084f 100644 --- a/xinference/model/llm/core.py +++ b/xinference/model/llm/core.py @@ -19,6 +19,7 @@ import platform from abc import abstractmethod from collections import defaultdict +from functools import lru_cache from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union from ...core.utils import parse_replica_model_uid @@ -82,6 +83,7 @@ def _is_linux(): return platform.system() == "Linux" @staticmethod + @lru_cache def _has_cuda_device(): """ Use pynvml to impl this interface. @@ -104,6 +106,7 @@ def _has_cuda_device(): return device_count > 0 @staticmethod + @lru_cache def _get_cuda_count(): from ...utils import cuda_count diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index be980c076a..082fa33c12 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -2200,7 +2200,7 @@ }, { "version": 1, - "context_length": 32768, + "context_length": 65536, "model_name": "codeqwen1.5-chat", "model_lang": [ "en", diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index d42d5d70b9..f34d2ad1b7 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2296,7 +2296,7 @@ }, { "version": 1, - "context_length": 32768, + "context_length": 65536, "model_name": "codeqwen1.5-chat", "model_lang": [ "en", From a410672feae2fc7ca6448b683113950bdf97a675 Mon Sep 17 00:00:00 2001 From: Mike Shi <shihui@hyron.com> Date: Wed, 8 May 2024 18:28:29 +0800 Subject: [PATCH 064/298] DOC: add the missing backslash in shell command for benchmark README (#1451) --- benchmark/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark/README.md b/benchmark/README.md index 2b50c0cf00..79f21a207f 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -11,7 +11,7 @@ wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/r ```bash python benchmark_latency.py --dataset /path/to/ShareGPT_V3_unfiltered_cleaned_split.json \ --tokenizer /path/to/tokenizer \ - --num-prompt 100 + --num-prompt 100 \ --model-uid ${model_uid} ``` @@ -19,6 +19,6 @@ python benchmark_latency.py --dataset /path/to/ShareGPT_V3_unfiltered_cleaned_sp ```bash python benchmark_serving.py --dataset /path/to/ShareGPT_V3_unfiltered_cleaned_split.json \ --tokenizer /path/to/tokenizer \ - --num-prompt 100 + --num-prompt 100 \ --model-uid ${model_uid} ``` From 2dfc64c39c36472197cb86221526c98b9bb92e95 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Wed, 8 May 2024 19:27:27 +0800 Subject: [PATCH 065/298] ENH: Improve benchmark and add long context generate (#1423) --- benchmark/README.md | 20 +++- benchmark/benchmark_long.py | 164 +++++++++++++++++++++++++++++++++ benchmark/benchmark_serving.py | 111 +++++++++++++--------- benchmark/utils.py | 31 ++++++- 4 files changed, 280 insertions(+), 46 deletions(-) create mode 100644 benchmark/benchmark_long.py diff --git a/benchmark/README.md b/benchmark/README.md index 79f21a207f..4c0ffc2ebd 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -8,6 +8,9 @@ wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/r ``` ## Benchmarking latency + +This tool will sample prompts from dataset, and run benchmark with serialized requests. + ```bash python benchmark_latency.py --dataset /path/to/ShareGPT_V3_unfiltered_cleaned_split.json \ --tokenizer /path/to/tokenizer \ @@ -16,9 +19,22 @@ python benchmark_latency.py --dataset /path/to/ShareGPT_V3_unfiltered_cleaned_sp ``` ## Benchmarking serving + +This tool will sample prompts from dataset, and run benchmark with parallel requests. + ```bash python benchmark_serving.py --dataset /path/to/ShareGPT_V3_unfiltered_cleaned_split.json \ --tokenizer /path/to/tokenizer \ - --num-prompt 100 \ - --model-uid ${model_uid} + --model-uid ${model_uid} \ + --num-prompt 100 --concurrency 50 +``` + +## Benchmarking long context serving + +This tool will generate long prompts to sort random numbers, according to specified context length. + +``` +python benchmark/benchmark_long.py --context-length ${context_length} --tokenizer /path/to/tokenizer \ + --model-uid ${model_uid} \ + --num-prompts 32 -c 16 ``` diff --git a/benchmark/benchmark_long.py b/benchmark/benchmark_long.py new file mode 100644 index 0000000000..13a899dea2 --- /dev/null +++ b/benchmark/benchmark_long.py @@ -0,0 +1,164 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +import logging +import random +import time +from typing import List, Tuple + +import numpy as np + +from utils import generate_sorting_prompts, get_tokenizer, send_request + + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +REQUEST_LATENCY: List[Tuple[int, int, float]] = [] + + +class BenchmarkRunner: + + def __init__( + self, + api_url: str, + model_uid: str, + input_requests: List[Tuple[str, int, int]], + concurrency: int, + ): + + self.api_url = api_url + self.model_uid = model_uid + self.input_requests = input_requests + self.concurrency = concurrency + self.sent = 0 + self.left = len(input_requests) + + async def run(self): + tasks = [] + for i in range(0, self.concurrency): + tasks.append(asyncio.create_task(self.worker(i))) + await asyncio.gather(*tasks) + + async def worker(self, i: int): + r = random.Random(i) + index = r.randint(0, len(self.input_requests) - 1) + while self.sent < len(self.input_requests): + prompt, prompt_len, output_len = self.input_requests[index] + index += 1 + self.sent += 1 + index = index % len(self.input_requests) + await send_request( + self.api_url, + self.model_uid, + prompt, + prompt_len, + output_len, + REQUEST_LATENCY, + ) + self.left -= 1 + # pring longer space to overwrite the previous when left decrease + print("\rdone_request, left %d " % (self.left), end="") + # The last one + print("") + + +def main(args: argparse.Namespace): + if args.concurrency > args.num_prompts: + print("Fix concurrency with num_prompts %d" % (args.num_prompts)) + args.concurrency = args.num_prompts + print(args) + + api_url = f"http://{args.host}:{args.port}/v1/chat/completions" + model_uid = args.model_uid + + logger.info("Preparing for benchmark.") + tokenizer = get_tokenizer(args.tokenizer, trust_remote_code=args.trust_remote_code) + # XXX: generate_sorting_prompts() currently only generate prompts 1/2 to 2/3 of context_length, + # because tokenizers vary by models, consider improve in the future. + input_requests = generate_sorting_prompts( + args.concurrency, args.context_length, args.context_length / 2 - 20, tokenizer + ) + + logger.info("Benchmark starts.") + benchmark_start_time = time.time() + + benchmark = BenchmarkRunner( + api_url, + model_uid, + input_requests, + concurrency=args.concurrency, + ) + asyncio.run(benchmark.run()) + benchmark_end_time = time.time() + benchmark_time = benchmark_end_time - benchmark_start_time + print(f"Total time: {benchmark_time:.2f} s") + print(f"Throughput: {args.num_prompts / benchmark_time:.2f} requests/s") + + # Compute the latency statistics. + avg_latency = np.mean([latency for _, _, latency in REQUEST_LATENCY]) + print(f"Average latency: {avg_latency:.2f} s") + avg_per_token_latency = np.mean( + [ + latency / (prompt_len + output_len) + for prompt_len, output_len, latency in REQUEST_LATENCY + ] + ) + print(f"Average latency per token: {avg_per_token_latency:.2f} s") + avg_per_output_token_latency = np.mean( + [latency / output_len for _, output_len, latency in REQUEST_LATENCY] + ) + print("Average latency per output token: " f"{avg_per_output_token_latency:.2f} s") + average_io_tokens = np.average( + [(prompt_len + output_len) for prompt_len, output_len, _ in REQUEST_LATENCY] + ) + print(f"Average io length:" f"{average_io_tokens}") + throughput = ( + sum([output_len for _, output_len, _ in REQUEST_LATENCY]) / benchmark_time + ) + print(f"Throughput: {throughput} tokens/s") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Benchmark the online serving throughput with long context." + ) + parser.add_argument("--host", type=str, default="localhost") + parser.add_argument("--port", type=int, default=9997) + parser.add_argument( + "--tokenizer", type=str, required=True, help="Name or path of the tokenizer." + ) + parser.add_argument( + "--context-length", type=int, default=32768, help="model context_length." + ) + parser.add_argument( + "--num-prompts", type=int, default=16, help="Number of prompts to process." + ) + parser.add_argument( + "--concurrency", + "-c", + type=int, + default=16, + help="Set the concurrency of request to send", + ) + parser.add_argument( + "--trust-remote-code", + action="store_true", + help="Trust remote code from huggingface.", + ) + parser.add_argument("--model-uid", type=str, help="Xinference model UID.") + args = parser.parse_args() + main(args) diff --git a/benchmark/benchmark_serving.py b/benchmark/benchmark_serving.py index a474abdac8..9f65ed8b7e 100644 --- a/benchmark/benchmark_serving.py +++ b/benchmark/benchmark_serving.py @@ -17,7 +17,7 @@ import logging import random import time -from typing import AsyncGenerator, List, Tuple +from typing import List, Tuple import numpy as np @@ -27,52 +27,71 @@ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) - REQUEST_LATENCY: List[Tuple[int, int, float]] = [] -async def get_request( - input_requests: List[Tuple[str, int, int]], - request_rate: float, -) -> AsyncGenerator[Tuple[str, int, int], None]: - it = iter(input_requests) - for request in it: - yield request - - if request_rate == float("inf"): - # If the request rate is infinity, then we don't need to wait. - continue - # Sample the request interval from the exponential distribution. - interval = np.random.exponential(1.0 / request_rate) - # The next request will be sent after the interval. - await asyncio.sleep(interval) - - -async def benchmark( - api_url: str, - model_uid: str, - input_requests: List[Tuple[str, int, int]], - request_rate: float, -) -> None: - tasks: List[asyncio.Task] = [] - async for request in get_request(input_requests, request_rate): - prompt, prompt_len, output_len = request - task = asyncio.create_task( - send_request( - api_url, - model_uid, +class BenchmarkRunner: + + def __init__( + self, + api_url: str, + model_uid: str, + input_requests: List[Tuple[str, int, int]], + request_rate: float, + concurrency: int, + ): + + self.api_url = api_url + self.model_uid = model_uid + self.input_requests = input_requests + self.concurrency = concurrency + self.request_rate = request_rate + self.queue = asyncio.Queue(concurrency or 100) + self.left = len(input_requests) + + async def run(self): + tasks = [] + for _i in range(0, self.concurrency): + tasks.append(asyncio.create_task(self.worker())) + + for req in iter(self.input_requests): + if self.request_rate != float("inf"): + # If the request rate is infinity, then we don't need to wait. + # Sample the request interval from the exponential distribution. + interval = np.random.exponential(1.0 / self.request_rate) + # The next request will be sent after the interval. + await asyncio.sleep(interval) + await self.queue.put(req) + await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) + + async def worker(self): + """ + wait request dispatch by run(), and then send_request. + When all request is done, most worker will hang on self.queue, + but at least one worker will exit""" + while self.left > 0: + prompt, prompt_len, output_len = await self.queue.get() + await send_request( + self.api_url, + self.model_uid, prompt, prompt_len, output_len, REQUEST_LATENCY, ) - ) - tasks.append(task) - await asyncio.gather(*tasks) + self.left -= 1 + # pring longer space to overwrite the previous when left decrease + print("\rdone_request, left %d " % (self.left), end="") + # The last one + print("") def main(args: argparse.Namespace): + if args.concurrency > args.num_prompts: + print("Fix concurrency with num_prompts %d" % (args.num_prompts)) + args.concurrency = args.num_prompts print(args) + random.seed(args.seed) np.random.seed(args.seed) @@ -85,14 +104,15 @@ def main(args: argparse.Namespace): logger.info("Benchmark starts.") benchmark_start_time = time.time() - asyncio.run( - benchmark( - api_url, - model_uid, - input_requests, - args.request_rate, - ) + + benchmark = BenchmarkRunner( + api_url, + model_uid, + input_requests, + request_rate=args.request_rate, + concurrency=args.concurrency, ) + asyncio.run(benchmark.run()) benchmark_end_time = time.time() benchmark_time = benchmark_end_time - benchmark_start_time print(f"Total time: {benchmark_time:.2f} s") @@ -133,6 +153,13 @@ def main(args: argparse.Namespace): parser.add_argument( "--num-prompts", type=int, default=100, help="Number of prompts to process." ) + parser.add_argument( + "--concurrency", + "-c", + type=int, + default=100, + help="Set the concurrency of request to send", + ) parser.add_argument( "--request-rate", type=float, diff --git a/benchmark/utils.py b/benchmark/utils.py index 2f1121ea1c..28aad1aae4 100644 --- a/benchmark/utils.py +++ b/benchmark/utils.py @@ -138,6 +138,33 @@ def sample_requests( return sampled_requests +def generate_sorting_prompts( + num_prompts: int, + context_length: int, + prompt_len_limit: int, + tokenizer: "PreTrainedTokenizerBase", +) -> List[Tuple[str, int, int]]: + prompts = [] + for i in range(0, num_prompts): + random_nums = [] + _prompt_len = 0 + while True: + r_str = "%s" % random.randint(0, 99) + r_len = len(r_str) + 1 + if r_len + _prompt_len > prompt_len_limit: + break + random_nums.append(r_str) + _prompt_len += r_len + prompt = "Sort the numbers:" + ",".join(random_nums) + prompts.append(prompt) + prompt_token_ids = tokenizer(prompts).input_ids + dataset = [] + for i in range(0, len(prompts)): + prompt_len = len(prompt_token_ids[i]) + dataset.append((prompts[i], prompt_len, context_length - prompt_len)) + return dataset + + async def send_request( api_url: str, model_uid: str, @@ -155,7 +182,7 @@ async def send_request( "top_p": 1.0, "max_tokens": output_len, "stream": False, - "messages": [{"role": "user", "content": prompt}] + "messages": [{"role": "user", "content": prompt}], } headers = {"User-Agent": "Benchmark Client"} @@ -165,7 +192,7 @@ async def send_request( async with session.post(api_url, headers=headers, json=pload) as response: resp = await response.json() if response.status == 200: - completion_tokens = resp['usage']['completion_tokens'] + completion_tokens = resp["usage"]["completion_tokens"] request_end_time = time.time() request_latency = request_end_time - request_start_time stats.append((prompt_len, completion_tokens, request_latency)) From 2a393a9e1c40f98506aae07ef8a2273cd21b5109 Mon Sep 17 00:00:00 2001 From: Mike Shi <shihui@hyron.com> Date: Thu, 9 May 2024 10:59:46 +0800 Subject: [PATCH 066/298] BUG: Fix tools ability (#1447) --- xinference/core/supervisor.py | 2 +- xinference/model/llm/__init__.py | 4 ++-- xinference/model/llm/llm_family.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 0b09907003..031b9da6ab 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -284,7 +284,7 @@ async def get_builtin_families() -> Dict[str, List[str]]: return { "chat": list(BUILTIN_LLM_MODEL_CHAT_FAMILIES), "generate": list(BUILTIN_LLM_MODEL_GENERATE_FAMILIES), - "tool_call": list(BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES), + "tools": list(BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES), } async def get_devices_count(self) -> int: diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 80814687be..5541a07762 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -174,7 +174,7 @@ def _install(): BUILTIN_LLM_MODEL_CHAT_FAMILIES.add(model_spec.model_name) else: BUILTIN_LLM_MODEL_GENERATE_FAMILIES.add(model_spec.model_name) - if "tool_call" in model_spec.model_ability: + if "tools" in model_spec.model_ability: BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES.add(model_spec.model_name) modelscope_json_path = os.path.join( @@ -197,7 +197,7 @@ def _install(): BUILTIN_LLM_MODEL_CHAT_FAMILIES.add(model_spec.model_name) else: BUILTIN_LLM_MODEL_GENERATE_FAMILIES.add(model_spec.model_name) - if "tool_call" in model_spec.model_ability: + if "tools" in model_spec.model_ability: BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES.add(model_spec.model_name) for llm_specs in [BUILTIN_LLM_FAMILIES, BUILTIN_MODELSCOPE_LLM_FAMILIES]: diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 779a7e6ac6..e7b8561d3e 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -166,7 +166,7 @@ def parse_raw( ) if ( llm_spec.model_family != "other" - and "tool_call" in llm_spec.model_ability + and "tools" in llm_spec.model_ability and llm_spec.model_family not in BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES ): raise ValueError( From 5724011df5c124c1bb5443a2e2888634e5ff1d9d Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Thu, 9 May 2024 11:05:41 +0800 Subject: [PATCH 067/298] ENH: make yi_vl support streaming output (#1443) --- xinference/model/llm/pytorch/yi_vl.py | 107 +++++++++++++++----------- 1 file changed, 62 insertions(+), 45 deletions(-) diff --git a/xinference/model/llm/pytorch/yi_vl.py b/xinference/model/llm/pytorch/yi_vl.py index 91c325f86e..e7b802f6a1 100644 --- a/xinference/model/llm/pytorch/yi_vl.py +++ b/xinference/model/llm/pytorch/yi_vl.py @@ -27,9 +27,11 @@ from ....model.utils import select_device from ....types import ( ChatCompletion, - ChatCompletionChoice, ChatCompletionChunk, ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionChunk, CompletionUsage, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 @@ -122,38 +124,6 @@ def _load_image(_url): raise RuntimeError("Only one image per message is supported by Yi VL.") return content - @staticmethod - def _parse_text(text): - lines = text.split("\n") - lines = [line for line in lines if line != ""] - count = 0 - for i, line in enumerate(lines): - if "```" in line: - count += 1 - items = line.split("`") - if count % 2 == 1: - lines[i] = f'<pre><code class="language-{items[-1]}">' - else: - lines[i] = f"<br></code></pre>" - else: - if i > 0: - if count % 2 == 1: - line = line.replace("`", r"\`") - line = line.replace("<", "<") - line = line.replace(">", ">") - line = line.replace(" ", " ") - line = line.replace("*", "*") - line = line.replace("_", "_") - line = line.replace("-", "-") - line = line.replace(".", ".") - line = line.replace("!", "!") - line = line.replace("(", "(") - line = line.replace(")", ")") - line = line.replace("$", "$") - lines[i] = "<br>" + line - text = "".join(lines) - return text - def chat( self, prompt: Union[str, List[Dict]], @@ -164,12 +134,12 @@ def chat( from transformers import TextIteratorStreamer # TODO(codingl2k1): implement stream mode. - if generate_config and generate_config.get("stream"): - raise Exception( - f"Chat with model {self.model_family.model_name} does not support stream." - ) + if not generate_config: generate_config = {} + + stream = generate_config.get("stream", False) + from ....thirdparty.llava.conversation import conv_templates from ....thirdparty.llava.mm_utils import ( KeywordsStoppingCriteria, @@ -229,25 +199,72 @@ def chat( t = Thread(target=self._model.generate, kwargs=generate_kwargs) t.start() + if stream: + it = self._generate_stream(streamer, stop_str) + return self._to_chat_completion_chunks(it) + else: + c = self._generate(streamer, stop_str) + return self._to_chat_completion(c) + + def _generate(self, streamer, stop_str) -> Completion: generated_text = "" for new_text in streamer: generated_text += new_text if generated_text.endswith(stop_str): generated_text = generated_text[: -len(stop_str)] - r = self._parse_text(generated_text) - return ChatCompletion( - id="chat" + str(uuid.uuid1()), - object="chat.completion", + + c = Completion( + id=str(uuid.uuid1()), + object="text_completion", created=int(time.time()), model=self.model_uid, choices=[ - ChatCompletionChoice( - index=0, - message={"role": "assistant", "content": r}, - finish_reason="stop", + CompletionChoice( + index=0, text=generated_text, finish_reason="stop", logprobs=None ) ], usage=CompletionUsage( prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 ), ) + return c + + def _generate_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: + completion_id = str(uuid.uuid1()) + for i, new_text in enumerate(streamer): + if not new_text.endswith(stop_str): + completion_choice = CompletionChoice( + text=new_text, index=0, logprobs=None, finish_reason=None + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk + + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk From 78920d034df05c02ccaeab39043770f65345e3cb Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 9 May 2024 11:19:54 +0800 Subject: [PATCH 068/298] CLN: Remove all speculative-related codes (#1435) --- doc/source/_static/speculative.gif | Bin 2053983 -> 0 bytes doc/source/_static/speculative_decoding.jpeg | Bin 86625 -> 0 bytes .../LC_MESSAGES/user_guide/spec_decoding.po | 117 ---- .../LC_MESSAGES/user_guide/spec_decoding.po | 109 ---- doc/source/user_guide/index.rst | 1 - doc/source/user_guide/spec_decoding.rst | 63 --- xinference/api/restful_api.py | 51 -- xinference/client/restful/restful_client.py | 51 -- xinference/core/model.py | 3 +- xinference/core/supervisor.py | 60 -- xinference/core/worker.py | 60 -- xinference/model/llm/core.py | 59 -- .../model/llm/pytorch/spec_decoding_utils.py | 531 ------------------ xinference/model/llm/pytorch/spec_model.py | 186 ------ .../llm/pytorch/tests/test_spec_decoding.py | 57 -- 15 files changed, 1 insertion(+), 1347 deletions(-) delete mode 100644 doc/source/_static/speculative.gif delete mode 100644 doc/source/_static/speculative_decoding.jpeg delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/user_guide/spec_decoding.po delete mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/user_guide/spec_decoding.po delete mode 100644 doc/source/user_guide/spec_decoding.rst delete mode 100644 xinference/model/llm/pytorch/spec_decoding_utils.py delete mode 100644 xinference/model/llm/pytorch/spec_model.py delete mode 100644 xinference/model/llm/pytorch/tests/test_spec_decoding.py diff --git a/doc/source/_static/speculative.gif b/doc/source/_static/speculative.gif deleted file mode 100644 index 16cd57e1936fa7fa3a68addc9d82d64f85a418a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2053983 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≧Vo>D4OIW>wc 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%0DhG!GmPS-)a@=Lx4F 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≶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 z⁣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%0A9ircZ=tyUUX%&DBtAk~g9X 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ξm$*^AInlb+M=OW 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 ytR#SH>A(n)Xm0;?h7Zcwv=`zGAQLW#p| zafcOH4V`?WKbHZwDRpf}0;?g>WiGgj1^B-~nWpZSi$wsQ_uMv#!M|{^EQjx804|o_ zFekl_d4{UG_6qHJg{96Rf4EpQ=?c`)%FUu4Ow3DLi<an6T4q^~1f8Tnjwh8W4y$Ku z@jSl3T`WZH#CY%CREaEb`UgD~Z(}%W3-cs^w%SJ@ygll&pJLmB)pRpV6Z9QV?uu<x zFZrax22E*p3zaJ8b!Cpn#?SUeW}p7P8uHTG8O1+8Y?X1`{8)6d@SBT;Y3y*w5No9j zaIqMEe<s$-e!f#1M9_JlfBa3Wx}ziM489sVc+G$EUD$JhC~<6rsPz7V%&FAo`FZ;T zN2H}&+flccI1w%uZ^E;x%hix?h!dVNkoUNZ&^i<Uz8d0keI^8Vp3_IWhGn`i{#p%j zxjj;LOMUIi5$$%X#7RB{mEz_V@(i~-UT)&eu0o(&*4FNcO3vZ{<|JEB_|SdO6NU1M zdoZ2H<Sh?n1m=Xoz+Kbm_5qQnp0X!^IdM+)Famj+iPD&ic$yP?y<gJM{&O{if8YtM zhFrP4y<T_&y{2E7le}{@xb{4h%jc`S7oa`=%f;fY6@0N85@m=~M&vyp-wPMZ0G@9# zmmkn;(t3~RHT`n2EZr+5_6K@R&EC`?8~@*3EHe*)$R}XPCSW7Pe+0;Tez{m$Zw+t- zE&#ozY|^pl-&`z*{@=NR_HBX=qls3de{-?Kxb1NvTr55W$I-vJSb)hPH^RlDauX}& zHy6v%yIb7wyayQ^LjN1)Bvdh!T_udeIDqloHjD=xc8NKO(RoAy$DHIwhrRd>bMobJ zxGaD<8TArX`E4~s!YqFj0j!3&Z6fq+BY&-ijPMY>Ca|*s_iwAA7)tX|_-d#@Da!S? z)ll+Qls~W<Qn7X?i3wM^Tn)wA5(I+bt0582m}Fozq=LYl97QL@#O9C2Qqsj1!h20| z<v_1#IW*4}p7$K1#nl|adrkG+@r`0ZO+c?{*#e5_HFX`u1DF%b=(s)rbAn;oZVO)x zO^m{OP3s~Ty(X~Hs7m5e3?lCtP1K@GTqjA|7Bg7nPTIFkI*ft$n$XabPL7h0NcHwe zl2KHX(d?41#U>Y^JvvjdznXiAIr%b(K^HA`X9-oL1%qHL#YkC-bj339Gf}}}3N5_X zghvc<VTw&<g{88sklY|md!(AiVVB1B3v=>oHKdyU!VaGIh(ppP0n7;u-fNQQ$#@C$ zn(Q)^V>47C8R}yhnn2z|nyJH+8LOO1VU(#Cn`r{{n#MBU!v2G+p+H!6@V~tpf<+iX zT(S_oCXj_Q(Nb>ypR1v=kX*=E9u$`M8R#`3RzpCq3BDT2)p|<o+6l?;AuW)5kX9m6 z&}UcR+LlL{T`=<hS3}-$Am3_`|2Qb{7!*tf4t)X+R|7}dgQMfXvDM)Cad6@>IGGHR z`UH}$2FbLCWXC~rt0DR0kiug~F<Eu#lj?G{>Pq`+P+T>ny83@^ujxNG@5y(bV03Zo zu-scDciVmA#q`4m2Ug<YPcc4FUnJ0=^|{`O;Ooowydd({_?jlC&Cilcxb?bUQce>7 z+(nT9E?1(zmmfTH5xp%QFZwU@gMX$kLP27YJDB&cx?IP9_C;jat#(%aZ}NkGzb_)D z)s-gk$1dt%W2WJMUta_^$e)S8q*ku1{KTXVndBK|Pvx45oLwKt6R5+){ZR}h#L6$J zr<V9p(m^|JRt(0(T`T;FNnPOe8GYEpg6?7(3_=Z&2nJ7k=B<NPP3-SNbU(Vtk|6gm z1(R$Ox)%u^uf*LKJVid)5V(T>bh8#6OO~zvgtn#_$PXqq8_(pKi<{7NJItHNwI(c@ z@4Wl5)k+!0{QfI_Qa*blX&HHGJ8eUJX$KR(Sy|)#>50-V?s@Wu-TcQ-AND-M(kSbF zL?^Y|`{ZtIc^`UANy5MhL`}C|!@)dw2+cwxco@ZnH+Td&gvEK(=v{%;u&L9e)yTUb z3hPnJBn|5^v&FT_Df69kma6FwSKn66*lfJ9nf5wQu$l40nX;Mn7AXXM^H*30eGir? zwEZ5ZHD$XH?*-%s$w6=Jmb0e|cxLnXHLLUt)L!xkX%3&+twztEf!EV_93dMyWvn%; z4U3v5>n#U~CmZePGABFD&w^@p+Z4KM_PRuhPIt$Zrcd{#4Z9tl7b$lxQFz)?2^?K3 zsXG%~$N%Pda<%t<@aYEGBmR@M*gEPnf|$s2ypOK+CpyldbHYL>-gxgYXjHMo36X;u zSsLhrnZHnrqJ?C9aWgAcp?K7ap71L8W^9ieJ;7^C2~a(5sjLSZKpoK#eTF@T3xF(N z->_(XMzOHz{$L^n=iL5UBgt8@hsbpuyZ})|ejuYahnuA=Or>byqxgaPR)tLyy}?ai zH56T<2GI}&$<2$t2q;27WXn&Ue4cm|l=iS^E0B{4^)`vVNCKOzE3(hb?EsYfwI>$A zHh4535K^mKIdVua0mcyZ5go7mc4%}*I)XZ4Cok-Al1@*C*CrP$PZjp`UOaP7n<9i= z4*joP6wnuOkk65LQ1YuUqC>h9O~-JLeJi^|e=a1dE5Gl4npmgFHhtvK#V+ct-A>$$ z-nB;!w&}*9JMl~LvZ(#bbq1w737h2pPv(vDZ2NW+57mRXcWlpDa<_JpkZxoPpkH88 zy+Ve0ZknVyu<xe)!lX7Q5)Kl)c$k}G@jhG_`!xFxOe!V~u!|C+a`=TwJ({4GM$PC? zz--Il)0dTWyX=cxVp2&_v!zeF0nhbduIe7p7g<TL%YF6Oq9V`4l~H;5;b6%h)DcA; z2PV5V#$TA!rk%lB>6{|R1bOwV;}j4$bwny(=dv#{LBgz;raJ-%TuTv{RC|KY?;}ML zPnm;gm{jLpR$fv^5Pgy2dn{&_mSdwosUs1jW0Q&5RZ!j#Gq+<vKzETJM8W$a!(j~$ ztj7LKm-)e48kal`42!C2JYQCu$Im9WVh?JTq%L+*P|=!o2T9v`AU_y8fF7RqS?`P| zoo-k0Z=Sw;y}&esOm=vgA83C@0e!KfVsl622Z!~mTlYPC(`Ij^Eq=Le<>&tFul%3{ zYwlK<ej_W;7crEaC*8<s;K;-dw3JLB+)-v?`;9shm=zTEBb@SQelWq$Xm8k}c-9$O zCP_eN`B#2$VBBsn<P+5o<OkJ2U!<*xJznMRB6k^Dr&ZwBSa@IL7`}@tPhNCe6im|V zzRVAjhrqotwvW;uDlCcFqxAmF4}e{ie$Jz82G?adM1Js*<z9hFLosB~^XB7xeEAiX zao9zEkYK2?0~xA;=Lb?|z&>}xlAEJ+ac))Psy(7F0?!X5szxD>l@$PW<gI<2c-z^& zay`qsO+?(l;$?oYsDNq3t(R7kVEU%|c#7Wc+tsa8McXVrf|LF0;H#_=E_a&=6Eisr z*EC3M@K1pJ;LvT8ddv5~<5rsDVF5{3^i5SDKUge75pt9Z9dDX(KDW@VXX)B%vYGhC z76k67O52VZKUuif3o1|x+(`snt^!%t+uR((Qt(e{d6FJ?2X(>wB0zp%=O2o_njvw4 zNe$82EuiaPRZp?YE5N>VxgHm2PN|mU#r`1Bc@mnIybl>a?bN6{ezDC;>~B4`mg8AH zg)VbguO$*JbMup6Wie{Q6F%V)NrD-<g2NWIv+Za)lP8ZF4>}&E?<5k@wLg=w%e&2{ z8gd^_9kCOaIva?1SNp?I=2*oI@Cjs{u1ZlHj~$;Kd<I;u{m^5%1INQw&guKO)8PZ{ zjYnVaSTfPGhAC3k+)Xn=-O=d7lo!aNhGj~fudDGp@>Eh|R0bdKlTcf`mOn#|ji!G7 zgUUsUT<`QAl?TdZ5w1K9<;lq~RTH{N3z67al`Up3rkb-e^(<E0j5XP79Qhs_)D-9I z(Rg~!jx$xL!-g)shH7W~pVp$BNkwr(7I7+qQ7X)Fd%SSzjBr`FT+ygp;)3lKhcU^% z;nY#O(Q@Ik(Bs0aU65U*_`Rh#4_yxQv5=Ip_SkTT76m4UF@p$L<V7(niydAmW1)-U z%7JY6wXxEIk<w+cu8%k<F1c}yU{BH^4YhctC%@b4aZp-vA6CM-W{CBU*bzC!bCgIh zTL=?yCseYz+}!nuqx95Ua-XbnMeoH{I`{S}=y8AB>V4J4E8pBxK-pDG*)z(<0c8vL z97R37y@kBpn`wMPLQohiyr<@HNJP<Ug`ALvvE_qN)F@GP=y5BHF>WSfs0O1fq&taG zqRPqo4IAR9Y5U1jUMbkb^5XKB7eL#ealXmsB1aj3+=Gq527LD3YRMRCvi_B=n3Kd; z#FF3PT{Axuz!Vcen~X-m`0SkC6Yv#;iv7qNqbEQv7-?SwH(fgrj}ldvEx?N&wazFA zEySgY{z}6L_N=mBF+EZ%mw#w*&~TQMl()aUv)h0XfH(2L=yC5R4!+4ief7{7we|Lu zC4%fFd^>u)0%sK1Pyn_e);S%L_PMt?UN$OnFXqVzQzfN)0dBChw;wFhpXaMh{hU+! zjKGeOSbnlgg)<UfPdIW4>WLB7Ua*UNPj~_DmHkDW%AP<0qY&g^R|2l^xEU5*V=*rq zPdPD{GkQ<ym<Tf?KeSmVd1vznB&c!85mh!JLFIurwZ(pTo0DX}lVQM>TlV42aXBl- zcm)p4RF>RoaZ7)V12)3Z20J0oIPJ5s6lS|xAB7-?`_EcCTH6FlXS*!6c<)wWOw+m8 zr3aLf_|4iljJ1k~Qld`b#UY18yATA{hq^4&;p!s2iyaNZV?d4D#3A|M-bsRb?EnY= zC^Ue?@8;()0pcrrlmc#|F6Zajo@>N@d)9XG+){iDJ|v<(5e$-4*~Hi_c=$F^x;YN( zT(}k>jITCf$g)9FJ~nd6s5i?!_`n#>qL^NXqH5k@7{#b*NZv(<9s<c;Rmwi>+_+WO zC@ReZ^uIdC&BP&7qH2p_-W&_CCUJxccwgP}I^&KcSY(k@!A&L+y$y>_^!A!POpa*{ zr1lM~^iFoZ=I=oqMzow%DCd}$mA={=TJ;)7PaxsM$KQ!0pjODQcLckhA*4VyIFJG9 z%8|qVGR|TZ>WOV8Q+BLNc#y$ZW<`u&130Qy9tQ)-g$fqe730%#l$6UA^2RPRi6rRi zmH1ntv3TGB=q6JiH*WJeiKy)u6W_82Cb#DvNw(PM;K=j<e49))Bo`&dY~-Fq-bO0A zWn%^~W4>&(TC&K_2qqZ=uIOmO{T!zb23)jJ_u4t9pl@M`Jh=HtxpheX=no?7vN3jS zldguun=$0OV5VYMq2A4URuP;M$QX6C#6!m?YS=ejpTP&3T(GYado=|$N(@c3IHWnI zV1QHD1Qvr=Y#V))ICLv9UnSGtCyW_0W05{`-&~-sC&0Bl1Ew0jPb^VDpMWpsQ&Jx1 zX6JX78vtAIrxwo+@Qs%%c9S~_X{QSr%#Pa|cDokmUrZ8>+8gciA(59Mdp^gH8R8Ld z8%OiR9jzoW#@lWCd_}X>rVv{%kbo-$4>KsJ97C1O^R;r`sIs5)NRp;<<~tC^h<AqR zQm!0OO>TAJQb|FvNP)D*7BixflLp)Yn9!JcYoZlu$?wu+119NEMV*6>(JJg{Dx$n& zy%(KA>0Ji0GIhbZ--xfwskp+3swPD%3Vm%}K)jAXo}BHP<vh4lZQ^^IeqGDCOd!8W zWhbrJ0IVbD&>5dX(qIh+Tqs+RoO3X?ihu7C%N{PoMHtO#IeV5f0}q_bYg_b%J4qJe zkH1s^<4n%i&P0C@#Jmy=$#ZyUTHV?zUQVCWM312%ZjnAy*<}Qo6%F+k@x%Uxm4+Mq zmW(=M%sA^jmthNnJA5E`g<h0w0DJr(LzThlo}4cv8@H|=x~X;(I+K2*7m5=C_A}Mp z8coI7s-vO$jK3v<GEw)I9r}9C>q`7hbagzc!_Sz4G30_@Qop2UczrQ=W%(feGr@Lk zJRvmc+ZU}bZnXZN>Er7QZ?Q06|13-O<w<Wn<I@Ig<oY<;`bY5%JT(m~8DCNs8`2FM zVm%w4syDv))F>L?NJ!fl^P*84(HF@^ZHy6VN^EJ2TxgW9X;PnP(mZJ@d2FZsv{_HR zxkbMz%Bwlrt0^qA$>5~foV*3tMaeZa2QM^V?4s^vGzTrVL>jgPc(!~(U{Zly)aE%& ztN)8u-;>s0@~=}Ut)3!Z16x}C7Ft7VzQ#{{O+5MP=Kj?;^J}ttTjr;>c)hRgS#2J4 zZ9XsBvdP;^pSG8)w};NPd7`yf*0k45w3pVm*`as1d9}M`wnIO4w8nR|)pWcR>Tosa z=pgUxd)nzq-C<?eX}#Ftg4Q`O(K&U}IYZt>nA+*w+&TBDYbm}<-L=!CrR$?emy<!) z%G2&$_3r&o-6L1J9cjA{Cx9w_H~U<d5nWFsT{F_pzR0(fZinXX>xf+xhER`zVXxt0 z&nL8Af}gu6m6TrF=3Z)tKKg{dX_sE@mOg!vJ}ZMhM&AC*T@=ZceoNYZE<|6XY_?C0 zZa_1u-@LhB;G!=Q(EZ}nKy-2d-WQo97Ebu6RPa$|%|K4$vM&-+Gx%m`PzTW$(GM9^ zY8g@%88R~%GP&rB1k{@+7`%5t^hGA|-%@;ZVfkqL#=!n`_@Xa@s$t>PiRg<s+;ltr z5OL$9hlW8A?`2=)FmhC{ax@v}i<}NeO@7E(`;f|OknS*6Ofg={JDxo>rn5g*o-htc z7|3(@P}}*TlEMH~JKm@<(d;mxLpY($G0_U_qH25UC_eN`eP}z??>L<pNthg~og`D7 zR6n<xoPh75I{Qy8zu)*Um7qVvd%24mj+j!coZ8fw-k<!sIB9vbX1Oh;zw0oKbbAJw zZzgPTT48@0C2<Cmuld-)@<yN~8ms;_=nR48ETQA<N3$Mc=qx#Q4-TK@owt@ZZ|mbv z&C)u~(I?K~J)V<QoMSwjV}qt!lFvPCnUh(VdyqKK1D$^gmE`Es<C=o+qF8w6ZBORK z2)_wKze!GglZJ|j2I`5QeS4|-{ej3lo7eXTMBha?zAK)6*S@_F+a!whs(Bl^VQS&K z&Y6t<TMHxTg8A)5{*><zviNRV3woTOy@xK+3oW9&Uc@01clhwGM1iPk1{?YO!P43S z#;2(z`qU+Z>q~)r%Ng5l;f~AEnl_P%%kfjoiD%2nw^vg6R?;<BG96d46IXJfEBRCZ zjLS9gMZGBVT94-1kmK4&;@TK=ZDML|>TGT1_WB&(`Zvw>1;_QJ#Pt>E`j4sg^|STO z+Z)?_8@rkt`;Hrji5oEJ#>v#i+1UotolRu^O%$z7G^fpLNt>8;o7bl|vClVg?`+}m zZxLv15jt%V^V8{IwvZ)l-9F!<yt7TszfGgHP3yExpR~<bx6M4g&3eAgc4vqEoPXz$ z)((f$4p-6+Pu<Sb=^e+^1$OjZKK@-{t=$(+yP`?E;&r={)4S5=yRvuo<oWkrYV9dH z?I|bisn+eOPw#1-?`hxJ*WusS)7m$1+BZttH>uk<o8EtWzHff#;64Ar{~(uZ5#<P5 z3zCb}X8~8#8@Gj{WoLyvZ&2{L6U)sB``%*FY>bwhe-TK*>xe=k|4lUXo>Zc6jQn@; z|Aj7Bbedv;t2n}Jf~Z7#f8%mxdv=5Kf3M56<zAJ#W%qMV4Y<oy!+P3-Q`2@aqe|0$ z<HF@yrR8*v%BAgsP7Bg@!+F8=+Jndd^xEr=Czp;7T_#A!?|w6vZUE;3NH>Tdjax57 zgckg}%T>#h+aSg;6KoK7>2d`dCOH8v*Ay>Wz~vhBg2(vpxLkQm3#t|%rbTsVPt5+` zx?Cr%7i+DjozVGgX1(a3|H9>(l?An1Eo$MjU#nXD&E@)Or(1;IVQ<*5&f#F%i{J5R zF{{q;c%y~i>GWW+&IzyxY9pa?2_O^pIHL<|Bi{lEpmFrL;J9m}+~X3&RP1pjYSc!1 z3=+h)>Vdi4L3w@cIhPP#WRE+Y@N3LhAR)ra9*_I(udnNKJtH0J@#JiLjr|ey?Dl?- z7e9&)t_PPeHDRx}h_DV`1W1^cqt{2qU56lp>p7!hudh<04q*l8IjdE#pB9QPaTC`I z_Q+m;Lt$OgLC_11%HDu??z-gPxkPw|dIPN+b#L#1MELf5gPc(GC{ejZg$VnCy@d6s zZ-GT$aP)-)x$Du~;}#QF><f)*)T4b27L&H>3rj-Lr+>~ZE+5$!o+Yf$_zEnpSlJg* z<gU-G&n=-k)E8ORsL%QlETOsI7gdL1z{b6R^O~?fx<%N4JpwFgz|kMmb=30E3+R(l z9igCJTJwm3=OE(0_Z-yVg?sn!J_r4yb<(HfR2psnPM!2YSh7ZYWdY(jXwt;AaI)Iw z_vaw9U829NdH+zI^zu1KlI8+JU$rp})JgA1UqI;ps+0bD4%(>J{|iD7$K?Hs`EY>C z%%2eY85e^DcLaof#truc{ok1nx5m7tjx?I{q0h{o^JT7F`fm%Nw-0u$Cwvmlf0c?U zxD=Uf)vUCKmF!JfKOfUt#ek0Ko63o|t8Xf1Ovv6=%{wx!gTJMkz6D0Kt8c-Zxn%FE zcc4rgwYzhs@1Q5^tM6)&R>{okuAVb(enGiwW?p~&eoZl8$b1^yh%CqK+(aysZ_z}i zHSwUN+4Itx7gv>j&?U%3Ht=5XK0d*Yz(cH;Wk{Th9ot>3JJ-v)*{@2K^>E+^l=bo) z<nMM%pil1h$PiKN^(xSH?hZ=p-l!Oox0I?FRy1VUAJVnf*dI3ZlG-0LC<~|@H>qMd z7`JSZI+(Ot4A`A|wR67qSg;60AxDH9^B|bS9ZTD0*5^Kep7(mzWiuP1zz3d-(0vPD zK;@PWUi7+y0$WJ(dkYavv()5S$+Dh;trV8A+W#nTcx%5@HZ9GwUa?bHy#htAJKp?^ zp9I?~!qPg~Ze1+=v{Or#RI}TqaEEuNUstPkfB4yX^+C5G4s>tY@7>w{d|o1#UdP+S zv*Sf;r}y!9uD`4kIKT>aIzw4=3O+vs`i@scKYQEEP@+E)MaC)>aD8M>i9;ZYg39&< zlX}w?vyt-Z<0S!Xp&mCp6e`r`MqjSSn!C~c(8lBko`WjQ-S0C~VH#!&k(Ty&vNlp( z|483J3fuJL?|6-SZq3zr8+prHNSOL&gi#|6kA;tn88tx`Fdq)x^nK7s{d}w{N?sPl z8Ahi4{O|ymo%9<Py5Kws0HJ>jDWNoR*CqRY_`<cZH_)<CmjeC02;V|)kUfFu9n>Qc zAvAd;H(@=hTehvjJnut-%xDmG(!Q-wyG9zy$Ht=4?0sP&DEIC?H~uOa`#vn|haMxq z#FnjmA6~?KkI^tkT(z_>(ubgxgaZIk?aCw7U0)Dz{EGXUv@!ZK`GSDF0j>dIV+@MR z0y_@1l*>y6q~Q+Q$5o?}Z~6M;dQlc1Rf~1Ki+mWrNS?(#>?3WJ3(SWB2z>#Av|VO@ z;(DXu(>?BU8MC4OqyrQqK2(T|>%KzVmFG(Ww^U_4Z|^2yf6o%W!PDyvVDbn%>4iCC zWdm7vAH;+7xgV>_1y%0EUZcun53<FLfR$#j>E}pd&GqSZ5tu*7FqXEk>yKC|&$^GA zE9E5q5_nC@dLhLqA4NKl#_=jgMt?;%h38ey&~EON3KPY&w!vJhTX{mLc?z}SiY4-c z`KmWo726?-<&G5v=CAV9TUHb+yEY2nQlV<{5BjhKx~otgi)tUlGSyOlyM0wKUx0uK zshNkPBv`{tkL<~4i}-$NcoVZOMtj;90F(F1xM}Vw76L-AFW_yc^dx_X)V-qU<C<|$ z<8$}(^tY8^WBNoN{eU_tVNt;$O9oms->i6BvHkL@LBQpF7+xn`z57ibsFO;)vM7_F zUtP#3nz*Qwl803OdJYmYs$Q=Mv))RbID|h30d-P1CXZAfdUm7OxddhUN*cyzt1Cq= z2uxn|<3)$!pU*)eVkEQF{<Dl!hpg>u#Xsw$gcuKe({^X!^I<ebHvfcyIS{=~vm%5A zj>)_IvrhVn<c48n>+{?P>TmtO(LTAXlYSz-rvO0c3j_Si)bBD?dwf;DtdqvUF?nUN z6}sOZH?*F&zqwKt_p?rV_8=bq9F(Nr?l{$xI841L0ATXGf7VHPTHiSCdY}bF!o+`C z^Ne4}LHd)iD@2f3Os+VLF?+C9<SKQpC{|z0heHUKRgM=2^h?SMe%47faSGj}%!I=r zBP%5P%JKm}44(W|CymM&8sZ2lZAx7=gJbf5I%&&f_?xif2|hj!NQUm)VmAB9&A_S} zI3};oyJ5ep%AvSmW3l|0X>z>^Q70uk={x5G)o<jjdmPiwYS>ma{8lI3Xxs?cK$}y? z0JVs~A@nET`p;3h+mxh7Jj=)*GY<PUYQgKIC-C`jmo;B};7-k>2i?A{PSO_;`Y45- zu&!MNaLsbK3hb2u_V3m_kHebPkPyf#&tK0$j*W%;mB-7=Zx67>bA<Ll<3Azv){mWP zH$KH2zih=uVDh|Wp6Z|!9X4xWtOxRA&8Nv9w8Ec*5D<D>rPJCS{g|gOui?P@;?8!n zWgLWsi(o?y*R~6@Fjo`gk4AtxDX1F(p}*k(J&=!aP!PpAnIi-0r2OE`u<nzqU!X?< zDrfR0IHxOW=dh7(0773BJ#9Hn*C&E`zEvl4whhdOuZh&b7<Nzgs%cI{QlQ6+GUu@I z^Rq*xx`Ul*yhAemlM^CmWG-iv5$!W2=WDHGz*7&Ig|je~({*AOI3^FMlZw7S2Ij-F z&d;tmlU_jRjhM*c5PA|U8&^y@SHUYTj294kc%9UMMA;4Fi>tt_3)cmNUYVBX|FHMg zZ*A{=zAmL$fzse^Z7FUQBzT45Ezkl5ij@MzsZa>+?(XivA%p~iySqbyQrwG6_7~P# zGkf;T-p|aOXP=ofXa0la$}hQI@B4G#RG!cADA|2Io~@AbX#8U}&-0r{p0XBAjHg(G zhpdm4%D9)j{++-^{GkP}Lmw~0SUc@w+Lw4Vm8p(SrJlxilq^)(0#Z0O*An_MejJFe z%NrS*hRV-Ia8gYf%L7S}+c>M<xKH4?uN^uDqnF<|SjbPL)H_z6-?E+3TE_3WzL!F& zZ{j#Hu+@K}@;6lW&(0-{jrCtS@{wZm6IS+xUgM;&6`B&e0K_qIw2()&9ccnQpi$@= zC$$S4oA;MI4iI1tXg|Kv<PB0$bPENIjt4x{2zpE$IQkDbsU2nKvB#tkX|GUle%Y-x zUnf*QXqye=>v%BCHW=dO@5t}}+r(_#&WhgS!yy&v^fBovJOsx+^t<$3yiXiAs?}5B zp+qXdd)c841EIWO!5~=<&CoDJm4A8~8J)c*MI8092|2bblOI*M>0k(-P&hY#C<nFP z3~>a%OxWWqO`fn8$%F?_2MJZ&bv4i4TTD1or9GTiBa-7rg!Et4yu0uSnPcyl5275h z3^V`<eKo6GobK*;)O+_xj^ik{hDZZILjQ@Kb(JiWT!U3P97~EzpgMZ=IMh~{`OPXZ zEjuTgDF&2A@&1M%qgxD1gHN%3G|O&;{RG9g6S7Ct3>LX0-_k(7pFny-AxbyANvuHz z<FU^Mqo3`@#!AJv@yFpY$Kxr-J#Zs-T?JM4i+f`~)MqEbH;7HGreD@bXxxj}WRCx4 z6UUeqU%g6iSgnI%C#_)zsbG-%n9%yml9&hwcbsstpMbjEX&DCqyZj9Xw}h7J56$Rm z+IZm@8s#MH(nM~z<m7iGKd6&WvHeow=zBWIbE}Efj+1w)nH>B`Hagf3{8$HsNdf`7 z6p|Wc5O0u{ir2|-Gyc9iHPvY~2|ABtaUylcCb7;ot!X!vnLmk&CjD+FB_YRM7H~Qq zf}0J&aIqSomKViIlL0&*)?Q9~9PdH{b{9A$W`g`Bp+}f-#|QC(uW`~f8vrF-ipjV; zo=HEDq4XC{N~xB~&z41}oT_<^lR|%G8OA%lrg1mQCw>F@2b@$wdouhb_*z0AZ(@eX zfyHDqjptAeWIO*Qq4!hCkwx3*_+R6skOz4Rc)5&hxxno-@-GR!bYt$v)!fu;3H_E= zUM|EgI^Qi{lQ<rc|EGlhlrbIRUMxqf2f4;c<v5WvP>ZpAN+Bo-aY6GR68cjpEUe&x zFO+zop#NGz@AI^967sFp)NT3{)HzxBM>TKd6nK1`ks1F-HIH?krdaf-kX)$vHh<CY zzp8m`rA5k<MHtuByyx!4cn+Tr<=pU*pi@N2AJx1GjuKP35{m0;9`#-cgO<&05jUm; z5HW2TTS6HJvdqfA)Gfc1i?;lsNI8*Qc@0{yj6|ah&!$XZs$Bf6T#_@I$03i8wnEyW zLPjf0wg4hT>jriJi6SdhuAdJ#3sn?pR;VE>0SSHdZiSAPg<_Yho)$=%7WRjPp4Yds zEx*#7w(7G;Rrt#)UqRR{4H%XU%=V9J-jt&yL6J2r+}i=}+eHdVfR}hz;lbgU4OM}E z;G|~XJsgU?9IkOvBqYVmHdxCwloKPI_D`IYI;NTkSq%knQUZ9E2r^Irfu(`SG5ZrI z?fHecPk^iks(EG=l@2wI-pHG|$j(2id9)Ud3FXZqSI>uW6M$%dQ8%Y+?>{^r_ED=< za;W`vrOAU%PocCAYj02i=b*Ynhq~jg4=eJpwS=o`Ug#+bW5aN-%jLJopVhpz$~yb0 zIzqYz67wuf(FQTK`jhYV6g3TW(+v#fTtw$^(0Rjs?Z&fr4G$a*r~+MR5*vBW8~Ny( zqDdMvMH(MEHVGw0uq8H;!y1pq8b#@vpNcj=4}9=A5h<YEELYP!0B=$d)f3nDRy%3_ zLz5@@xw$8ySpzr+L4B0YTL^JmRk>P?99vBiTR{ef<deDac2TClIf%<E(;D-OW1DUI z2j!I)H;G&9&f6aE;RLT>fA>|fXKsJto6wGatEwX;<*1M8N@!N|&D(;`-Lspj=356Q zMh9kEM<N$SvM4BRy5r_<M+RYM7FTDULMNtvXF*_RA+)o!yEB2St5Tt>NVKcOu?v~l zRpZ!Mf8N;u?P@yjYIN*w4(x7C?C!4V?%n9>H}4t<>>AYW8FuWcHSd`S>}e70nL6*8 zf%eRI_jGRbEE4uEarLe$^!Awdt_SvRLVI_+d;7Th4ix&fMEiCe`_2;k&K*0Atnn)} zI>NO7cs_g=E9vj6$qP~^a7vZB82S%<KD?Hd9R0s}KK#)({aOBG?#yJ7*aJF9M(M?5 z1^qbm{S+KH2i5-he7K%|x>0QUk8@Ca(sbwlS(AtUPol~D;~X@*D1Nyp$?y|62R+yM zDee4ICi$n_ALpRUpRXB~RK%BnbC8<zl1B29CTdB0c1h>@9AqH=%TVW+5m8t_Q}!q4 zU*@yFEHAIlL7&B!zv?X8IxpKLFGEnvj<d_om&>jUEAHYeo;oYu&MUs?<Q0F^O5p5D z@a0M<!)mzrYNXC;G;j_|UX4fnozFr244Z@Eo5TO_oP$z!Y3g?A=Kj_>DCnP^gT&GM zl8nEf{=LsZ?}di#>W&=ej(G7h<nfQ4L-xk}3L$mBeXJm)VBl}|F($=7eenLb1&1&E z&^)Ho|7yV@7BL2W{vhK(#(&6z_rDFS?=J%n-v3-E>E$|muO7T#0qeL4hX3M1`Oh+$ z|J4PD3$e;YHHT}QAEj@RK{1*rL_$j&84AqHx=E1G@}9c{n-zm<XVA(4odRH?R6!P2 z%@`1D!55;>3ajUn3xI_(99e|iOeff`*&978s@<I}02azYWO3ca0>Mr_Cgu5dF&-<l zM5BuEcdz7ag5M>Q!~}e$805N%{LMsHArA@<=&t0Et3rP(+4saUDYg%eue-=opk-Z* z#oC~5-afkWj=THj`|VuoK+@x}k9m3b^X>EUz8Ci_z7B~o(tjI}oa6f1FMH?Waj%9| z;kOYb_1lNTa;iOFC$zPazKwn0-4qzM%5bWj{90uJ8@B1AKb(L>0GZ5L^Zi=bm>a=w zIYXB3NpOq+L8ZM#OkoCL09fa-Uy3kRsv1fpKvgd%E#5v_`TU(8ysDX^bGn>fTm)H5 zZJPyelqc|rtii^5!COeAGjbbImn^c~c%&q<TgP}ubgzL`;(V{46aA#!N7t~maXiAd zR%(iJSWIf}4jD>vk>K^^2`<1~oNg3vqmDM4(Bj9tLlSkz2a7HeCnx)Lbte}$f1rn1 z>o6z#Tu+~+qRH4KaY%MtK?-_UltK+SYCCQu-Avd|Or(emtUZ`E^zbCu8cD);Ja0Uo z$53r=BsXoQxOGzhREZBngAWJ}>zRpemHp#F>97K#HY$G0H#{%d3wr(lQ<+JL>@Hb? zObaVMlfO{&0!aZ|3#X-xzus>HstlP{UjN;|k8~N-L%zU5sT^c&{(){nrcJPOH~3p( z2K~Noo7kyxi0j4&rW2WV3H-fKFS<--Qor^WV3n{?bHn@8vK=qw_QInQGg%(_btn=I z+$|`GWs?%<EQ$)Z%z<hg1Z!lxEgF0>K+Evd;8P7yw2X#Bvv>m9<d-)GV`|Nl`QlzG zXyTN|R-G^L1>Nd4;&~L;X87yT7ivWlFlpRyjnM?vQ+zeZKKt|YU+Ho-p_X?IZIF$L zVBR*Ru4>gUo1V*36s)}v0hT1JhGog$>}ZfPetimtn2hA@hyCtkk5e!e*`&x#UwhyE zng+5kdCtf&;14X6XJ1XESrN(swqzL>!zMDqV3m+)vP?ADC%LN!?=Z3~+>2a=SKy(T z(Z|`3d-4>&`41(XR^&*&{q*`B_)QE2dG`KKS@6ZDzHIP_>Q6cu>SVdMNfqwQ3Y)TO z1@Rdw&%+AzoNf^|A=tibc_tfvTPqpt9EG7w3oJ)e-~1W!P)y>~Ir&X+BUTR(9Gd5V z=T#eM4olnzIsX9GVaona8woPI>Q}(}H-BnPeohVeXElYe3#k5kW?-R=R!9>oj6KzS zHv$L_-`(W`9=vPaM`!&R@<66d?ZM<CFE(Rg?9=&{F!;fJsBu`={kex#$(c@958m%C zs|d<MuLOr(GglAZiAt{phiJO0nko`rh&|c#fq)-;E2!A9wqp8ZRHpXO>Fw8jV4-xz zt-Ewmw!IP@s=tKc01w{1ZvMc&798>^(s1b$S5`F&xbu3y_%?eRc<>&V#^=jfIY$hH zJmQJ@{W%~1xLPQ~rTDIZ^}1a6btco^VUeD7rBNIw%-f?omxz>F`9Q499RmF+9t8&k zho9ABxt1;~t{%L9erpH?9=uPmzPT*Bdhq_%tGavl#>05Z$3LIUb)efVlU2hPwNoAq zRV%zgT|Iaw7TLEKRlh7x#pNdEAwBK)Iee5(*|Q>TB|8ud3y#0%lp>%CQLsk+j`;;$ zMcc+J+Fw@W))KBNKVt3AR;rA?UAU&U4j(Q81c%0o%o;<QLJ_C~JFdcYwvUK0#f8Tu zF(20T*V%?!m2ABN3OA-w5dg5xSCFB&dHxUyggk5wh0-h%wUJYW9Z%pXP3t!3m9by5 zVI@OJ30CFE=k3l_HF@h>_5r^pfQ9mFPT{t5A8huL2zc;LMCD3K_h>=f&Z@I;hawF* z&#o!h{OZGw-!ryZioRn5&Z6DcAIL=}39h<lN}pk$YyNof&RVlKcE4t+Kwqd^@b^xf zuFQf!ad*d;UdF)v^X2g=;r{)--89<w`u8LdgCALbUp;ugZv`Hn-`mSGlm4Zq{<^2! zk}2^^5}yhh3~}T+Ec4;mFyfUT80tNI#ZtRz9YQv_sC0xVfNa?=%Z=<OQ$hE|B(%^D zPBlEo)jw)?`k6%*DDUJpJrd_IbE)}x@%ykti$N*44hVUqEOvikV0S=^>YVdHeq*72 zFEER)wJe;B>`U(!g<QmF@}4C=M;*eqRhGW=ov{v}0AT&{n+vaFtS9Q&m|1Ku=gaAm z#LI);5d7VY5SnpS^r?8f_@VsgvrUJTmq;`Uef&NX$Yi3=AG}1X2NydRu+?2OeiA=- zx_NQ3pLu>*9C)zbhbEe@LxTpKFoaxbNu06lTyO8W;K5x9**NgWU6+P6K~&`1f^MbE zE)?T52QhA(yRLLpRA)zSciR~mV%;!>+}YY0abn%MRv1{uuQHi7d+rqN&JTr1$?ZJS z-Q2({)U@LsPB@-0Vs{{uIV0r(vU8V)d(M=)D;#_FxOu)7@_Hk4UuE1?K*Q^Pn1`ki zwWtOOi7TaqiOYv^F9I7cqhs>tvEIWrZ^2L8OvXPtk&`C;ppt9%wqv7HVx##G<>Pz| zvN0hwbR|{Uxe9qeiG6Wnz4G~e>CtUozIIf)cGS?<o*#XE{p~2sSUk+A{F29M;$+Oc z@Tk8Z`(=;QIOI|fe)dnH^8Z-s2c-%qlc6pecL~I!DWLisDiq+v?^hE`8Dr;Lc^n`y z;MZ&y7|kDesP5lB9vB_w-%Azbn-+NW;GK$oSjeSHBM501WIZ1++fLD7;yXbV%&Q*= z#5<gngV)*u*N%goZUpTJg;+HN|Gs+gP6LEQrr3gJVnaUM2)_R?xKKLO8Swt=-#PRS z#+V2-aSL5s4ki)~Ghq%%p7$p6a|c~Nc=s<2TNn$;yAj}%hOG(GMX!XtV-6)U3bj}W zx5EqPpe7~+1c$=p57E_5B&%=u>?7t3!^Ej0Uxq~h@eYw_;x8H+o=+pkS;Ko{!=+Ei zxTvG#2O>VTN4^mTJ&B9b&Lh>Jb`qJ0GRPy96pl9PAknqI%4AA}MfWa8_TWXCuac?? z$AI;tj8>wRtD|fuV(z8Iv`|Kqc*i)O-2VuKJl+wz#>ECwYj}QQ4`6q+p7=!NNB?;u z_OWsdPI@RxD!gOf_rYH5TdKIK`M4HlG7)8hPx@rUuJ;}N;&zpN(%;d@o={~|6IXWJ z&75#>?_jFxxF3a=An`f&c4Hi0cmgJ|_dEWCMp<*=!-U%dKEgMWdf1&a;FQC0qz!&| zkrNIPc~()k<VVo5<niycNlKESjft<vlLSuU7f+J08<OE;318Ea*94Mw*x8!nQX1K> z9=zv&OnJYMQhAirY!`<CAz6w`y~~^`FOy2YnoKyEawL;N3Qj(=PjkMNMl+cv-H}#g zoLc9b%5X|dpqWlHpDK-)PR0&s4%5ij)Oo=fH^b5%gQK}18DReqVNJ;0&Vc)f3^JSa zr>7teO;54OP#(=pA({-5_Dn+4jMtixvfwPW$-uXr_7dO#DM%KfRHjb83SfUchG*)_ zWdT=5G<%lmTA1NvwzXXFF+8hmJj+H7q(_tUlEc$VF2o3u!!eN)VVvg55oxZOdz(Gi z7m=%g&dm*fnNw<#;}xG{jmVK)$z40n2?U45BJ4a7c^vk+so;<#aDH~YdzQalXs3TT zes1JscJ!o2-da#RB>zaLz~v|p1`bO{6nt1KsLxM>pMEcZ_!mNQiu1Ee^F5k0gDPpD ztK(4H9AKUdsnskTU@II)6fWl!ep82L+d*yOp~eWP;7Vc7F?3opXa)cKFrsMHu5jlx zU=v(?sOfkxY5U{UZvj8&Cr$P*4v&-5fHg>Qn^1|-Q4x+-&>o^B$G3!twloX3^kY?V z@_4buX|WDX3BOEfsYVG2Z2&{pH+<T%w(*h&oPq4fvZumj+Qy|}zNM!5rRtrfeCU<3 zY`iiqT0bF?Z!F02Qr|MkE^jd);bCU`g5VopfbT<x?8jzV0#oj?0lr{|3VWeS`J-|* zTEC~r$~V51K*B>B7baI#;WJ*Le_EkRQ^_R*bJnOdDDbir`Kn1<Wj|hNi%hpiR&9WD zUd4x)tY?`LWSIx#za*$~oXY(a4`1`G3Unw6p{*_#s(NM&^QMBUgW(FAa2k7fxLHu- z*_Ur;)vs3InP%{u1jJ`ZNc5RctXWpPR%W7zds>3GZvjFO35QPwW+Rc*8b}mv%{Wet z@EF4R7@<mod<sV1m8sFRLpDy;AZTmL$C1NG*ItL(Ne8nDf-kKJKJ93NtWIP`_nF&_ zh*v+d7G#Iw5Jap6xR0KpF4|CgT6OW#b?isAc2p<@Fbb@RqVuhjk3}8IyJ9MQ-qNb4 zpsK^4cE+8q2X!0Yq5FK=<$bP|dFhaWagI!;ZQvKKW$5-Mq-$IdY`E{(XkgSxuio&< zuHk8X!(&7PMQ$Tlrk*X(`LVgpEytz{!A4O9C*kv^rwWErqBdOS-aIuKe4-f-34Q2A zoBicOL<n0pmz&;jIlgdg(cCb2H*NiL+DjIiA%C8(Sc7_1(^7`tXfo}gR?`X}Yq6wj zBf)9IJ!;XUY83>xvT3&7mT6-%Y5E-4VoKM}J>KdW2yu1<LLSq)eq7eJ+Fo`F84&Gs z$8Oi4b2rzTb}P~L_;WY!>5lmC9jT(7KUg|14%^>Qbvy!hFlcs+JG5qQG^=oBlybSJ zXm<q~cfxDBy0f}YygOBMJ6RxIGzuXoLbo_kuU5YhX-~?wX{#d9<fUgJL*_vP=gC%* zAf5WI>FFLsRL|NmwoX9e?0C21fcnTrV79gNt=+e?gsv>G9vtRAY^lCUN6?`t=!6S& z#)WZl-givbzt7cwpwNFL+K>0X|CUof{!BmNMgOUJKXGk8>1IFq?SXTy0cynoT8jbt zpn*&10CUg4z0CoZ+k+U2gX|WAoI!(kX9g+hhZwnsSka0@d}2dF?}vn)hQKpJq8CHF z^urw7!(58PJYvH#7K6Yd>TN?XaG*X$I`WWXWbEb$#+woK+mdSBBU*(c?}A3&h>g6P z8PO9P)#V=5b{aJd8r7j6HM<x!r60589y1afvwaT;4oANij@i$QI=vrtq#t+Y9(NTR z_kKU_+cWBSd(6RU-2Y-c@M0`fam-U}BB*vea&tWF{X|0HL|o8BjKxIw%tWf#WD56W zqSIt%&}1_GWWnvRaQWVC(J3n1o(iY`YYXK@bkdI8+@90ianjsr?cDjy+~viez&e)B z4;<$ocmS~ecL{m??-xoA%em>!p8%@<w--w1Una@FOi@=0Wu{y51A=ACzZOd81p>SO zUMT-n!218Ch0-qN2y(qpI-`$V8IRp1jy-jcy<LudQ;z-Xjsxe8gVD#Kj3?m|Cy}}* z(Jm*kDJSuDCy8?>$>@_*#?y3((@fpdY?ssAl+*mWQ|R1j5&E=*@vKbZtU~t;=5hv4 zIYZQ))y$ot&}a3G=ZzBQ&AR8UF6Zqj=bd%u-E-%?=<|NYi$RHtVcm;Smy7X~i^;l+ zY4qI1Ec)UH<K=?H<xkzqUoMv`DVJ+?mm71JTj<LjM)aNp`nN9n&;@;*f<CQ7pU<H& zm?eMwH?aOPMdt!?xH(hj!>D`dczUoo*OsD-cD}s0K;!aB-uQ1|T|o0wP8Lklthhx$ z%c5!tre#%!EvRkt9}BGGY%pfV7$H98q<Di(^K!BgAk%{4)+=D$sE4trZj^)R8e_hR zfr-H-gaHC7NdGn~uF7I@IGbv|c1KxOR}9~W&P3Vr?4E?bV+HB|iPc8tRpUQakSt2c z|0Rq$Y*Xqlj5*~p=Z_;nANqjxy7v9gFy_B;B=Al8`d96H-kZ+$-&y<4`x&kvu$rkj zEylhS`Q|@$?VEtkeo)N}@XQ(&{AtBCS0=DbRt`4f(OJqC2}NL*a=IdSia4(@W-Y6l z-@nX?QO5wrT!%5o$p>J}TGsVgtmY++c)T0dO&~@t{w7ihZJTB?WAoBhDyt2fHYQ!J zhi&&<v_H4s&oM9Syq&VX*VT>s9NLXDpdH$SH7^?4i@D3?+9zK3CA6P{cqVj!kXbBj z5T8FObV%tQ*+Ksu#m&$WY<)%0@Z0b2E5=^xW*$g>Ab4{)q{pgwF!G7_D{R<8u-10m z+~vLC40%#v)i}WndXUNsdqy>K4*wQU=sYG<(XnIzBTzvKewi%vGeUmWZYfr`NO&nh z3#ff3`y>mmWCYCGujZx{fmaI>fC^GkTQYDY=$eIW!sm)aHjz`kXWJ;;6p@`Kf;orX zcE)1SO)G-?Jl&t;nO%STggpfv4Bhd(IGp^>3p$!}NO3y;8Db@V{Oj2q^C?kvcqs18 zBtFnN&VX*{1>t;M=q2U^TIw8w%=a9NO7aF_zbm$ADkf>WBqkWBAZhDi(c(4W12Pt} znpB)e?G3jeAP>fAJv<S-MiT#i&-<cj_`s2X7y<I))z&A}!fT@G?Du|LlScHVy@~o1 z<RdW+V9bEkh6ev9Ar|}C`_Np_1BzxpEVl*8OuJ@}*UA{`-Rb0aK1;fPEp^rTnND?k zuLajTEbs%D3^k{n^pot;AZx4)x*nmI0;4uTc8-hm2QqEqlLI04&oh{2gxZBL!$VvY z44H0q$UNg92@CjYc>hR4MowTbJlr$$0jIr;lK5am#KupS7jd$$4LnIznG;XJnR0J0 zTPQ|peL2;E3KBS%)M+=4`_@|?n<xV7Iw&O{?n4DHGF6N=Q6rM?vK;mL&2i15c#p9k z_IR`HGIc#-*e#2zv4E&1{MaxOss=D-|NX=z0An8V>-~mMP1-Rx7M+mo``)>qNcIW) z@cCUd?Tz0Naf*#BlDJ@yD(Lrh1?d)9mlx)+Akj<~SuwS;z&wc!c~7piVCO(EWLO~U zcqN{OL&bWtJd;gvHJmSB#oVg`sC};nPqPliPeuydzp8!5r@z}H(}ZWPyoxv&Ortr- zl~LqS^Ur_7zEqLd3TA(kb8WSGtWcY;Rz<@Y|M{Rm?_-zhpS5pmVm3{ysF6y<L7{a} zfi~~s(dsg}eA}J^9pjAAKWg7lJzRN>wBgEYtIZM3aEp6>VQ>)CkX3%76Z2O|bP}1) zqppcw2t`)tRRyVlyg2-@;!6vc=~V^EwxG1=?HiL1e_C;2Kp*+60;nJXR$Q+U^D8T^ zX>&!ZqNV(|g6j&BpF8*0^~ckz*H+vusknlfM+dNLD{kEzz-sfovK_GE*0szWTv>5@ z!oDujX73IDfiW|V%wEW?BCjxJ+zqBPlH+<aMWFU=UU2#F%8F|Z`NcWULJe=E>b<h! z-o^c5_Y&js8e^W;hBvcO<hiSM8(hM!DoDE~Y+Q@9Nq-y(zKhb`**|{Hd~LNctel3o z%k+-=M|2xLK7n`Geq@i#(WawOjeGtQRTh0^#SK~N&<TDW+5}i}6He~E6EBbdQ2Fx- zQW!0x=L}eJ&5byRPNY6v9|@MlDew0>Z}r9A1gyC0LV(rgYsMsWMcM(cKNzSW5t}c| z9^w9BwW-yU`2rF10FDGNEp!wjPKV759_OpqGQKJYFy?HFtPed5szX;+n{P(%3)j~? z5r7r<(9i;?ATi30v?{^A*%bm9a{{#7`S6=B_ok`V*(AqD0hq`B`c>^)I!gfF_WrIR zfH4;j2q1vkw}&)xrkPmq8e_(lpE=Y~tl9^xxFPbuk-*Nin|sGy1ZVEbitBW+<yD9C zgXqeNd&%mlD*EUQ1#cDH;_&@)zBt1y)c$goA|T?*ifjC)Np*`lq#QW9g`5N{@a#7k zUR99nQ?!frlgFfgir)dNngB9r+V}FD5|9se*A=AIBWCdM`seEklAHlx#buyQ{c^F+ z83qQdxVEG$wHuBDR~4i~Sh4hmC8PYv)sethX4AIsOsl5o2z3u@%lS^tkEJh%eWI@x z?O6Bbar=%<0Bvr75C0Dj?l;rjwY#yp%G}b)$K9$A@M)Hj%bVgS0}>{L*{t^SPi`uQ ze-}US$$PM2T)aCtB+edFSGz^~lc#rEoU`ne+zu}fWPa{4WenzI8j5yE|BX5!(-r$2 z1HQ(X<(0(`?Zbg10s2e>yAFMvrE<Q@`2OtItGZL{dlv`ymJYT;>dsX|E>Frc&kp<Q zE{9O)%c;!s%eK!4l&)ABu4)6$II*NVF|LH;u1t4nWv$=dTydpwb4ez)cj0%OaC0LQ zGG1tO1HoMBV_h(W+%d4-t(5Hx`Q09j(-`)<<M_DV`9&al*PZWJ2Y77K;O#Ei=nlps zreLEJ#dDO<@RTs}kcP`8ShKUldSWhLRghF<h#v}hF}r!H#d>Mxn!kp7EiHQKQF(K_ zc^TL_C~A1Gj9yuB1vR|PWrz)ry*~q~qik<2D$lR6KJTb}AVPM=<31xsKCUaeA%ea) z7QDL~9lc7iEgOBj(Ya)g*~m5Z$Z3SAiTNm_j(tT`eAm+4CEX#r%)ak@ePB_3MEv;i zvHo`#eDkTkyNvr+&-*zw`V}$zmmD+2j6<sMw0&c_BV<6Zda`G+#C0-c2~5~rjsD1E z?reBqZ!Qf?$SX6JH5He(DVBK5gmmIKaN2|(=pShx`TuCADT~!yl+m8D3+5OMs5%Y; zjs!c$Is<H8LsTJ$xei-)Aum~jPuoB3kB4AXf7`$dIH9_-;-U^hlr%!{CPMAiLy6eG zoKuDQXNLlX?<azxg?M396JZS18Wf*A2~WcAfBHuEE}T&?j4jWYxjLMO+J+|2pY<gC z@w*7Uk#GsLP`E&K1ixT}Xr494NraL2)sbMGA|h`kLb^IqA<lw6FG7(ziYO;i<(-w( zyQnwPkpRZr>Kz#`6QxZZZICCfdCTLqaI{IarCwb058EhncEgV+(Vy8(bxwTEgk$XD zVme4-9@s@gPGVYZV_YZ9ErnyljbnYOt-pQp1zJeKC$Z4Rn0qTRq3_}{Mq{J>%)H{_ z7$02KzO`Vn9=>s@fE9PufJ!zlr#jwQIvy%)ns5?-=T}_Wy9A*J@vbZJu<C>wcGikj z*Zhfu#)*#z;lyBygw|@^tJ?QFefWe=%S7U!aMIhdL_(^>;kYE9>?9nY#OZ3C(W?p) zwQgUY&w%ii6<3fX8OJwi?IfATHhIV1XjV97q9yq-E~W2nvOQbMDPYCTXFis7-J(v# ziPycfPkp17f*-Gab21e)sd+BzbBiX80+LpE7)galV^K?^JN-a-npSm?dRH?&_(|HA zm9z(lbgq2*`;#u%lj#rrwK%{T+!W~o5KZ3r3{iY_HV&UBlNnFJnboBkr<57b<1^#P zGv)I2g(fqjK4!iKXT3hiuxihI16XnMsZ~r}WDr?;Yw8*_*|>+9hMF4hA=#$!Dr%kH z9}rhoT&J+?y`!wpkR08EY&$t!BSen<iyUW~+?ylWX1O`;kX&DU3fDDfTXcMGFhbS) zG<SX^Cmf;{0Mx!axjp^8!{YOjPxGGH<gJZeVazlmdD&~)k@5K??fFHfY6+U&xu^LR zng#cn^H*Qy!w>~)j|yrKS_P*CFTDyHHKFAs1qLextpLUh0X2i25tGnCP3}%`VJ<mz zltZ;IzHs`Ky`9E;WU_FfGk*%-c>r9r!of8kUli?CxN)kybXv4G$u@`Yy$&uuUd!2C zb6SoszNFziIxY5HD#BcUeWqE0hh#li^SY5xLPU^-8{l+tT0(ZFK`w8A<xtv9R!TEf z`l+l$YrKR(q>QDrbX2hPenMHu-7<~@J#MYH56;RSI<PPmcyXac%7qeA_(h!963WHb zSq0C^wW3O&PH~H9Rmdb%XcJ$hzUvz*TBPwGFbO*tL)5>9`L9$kve3RRsMI02=X6lH z`=m14SWG809`lE)n1~I|i!duD7_~s<_@m0tBA~Bk;@?H8Fke?;hE>@jtLzBikgh6M zdARdbmHSzhcLLlO2@j@)hls#KMXJNKs{Q4wW6Y|90;&@Vs=d0ZQ`W0}Xc2K*h$J&a zrUN2B0Ra_36m`K136RCK)wv?bR5N5cClVo#EC@hWB9T=DHPv0nQu!Lx6teLQ*_u$( zj;!gWt?5fZE|tR+(&QJuh~c`aPbSn(n}Md*YiH0}pgB&|d_e6F2h`616c9q%K%%xB zYIn}Ob`!++MNr$Eb;t5`CuVgATBwTx6nYAE!?EsEtNt8WcNtKR0j<aEuE%n$$4RUw zuBj)Tt|vdQCn0R0No=4~XrSF_pf_(APVf=Ou6p3u2v}`6w8@v?e`3rJMVlULHwj!} z%vV+$(dj1f^CrnZFy_CkHUP$~@b|Ui{`+g+iErMSh2}YSLZ>^`M*?^8uIOdJY6ElZ zf+uz%YP!m6I&03m>gl>0MZ24|yIcRV+H_BM?@;-X-RkKT?HShQ<aP`h)9#t9=>d)e ze^_l6M0<Z~_x`%J+N{;|ZcO)Xo%in0_3iy-wK-1g1HAa>*H#-0`hHBY{=ZuV>HqJw z@BdO5^Z#@t_}600(*Gum8AV$4qw8C8F#bG_g+pk*^Ec?MRXOVQKLo}xuBJ74jN7<N zH!<+g7&q|fWJ*#SJn%?4wA)M4{<nsJe-K6wF#ZeES{T|HpI)va_g~^~`QIDNbXFFO z73($m)62u46XhmD`R}_9muuauZlgTp)%CP7zTBRjap2>{Kz*LV|06hsy?y!uy33<d z??Nq~tWaI{F*%qq{He(=ePf>#0&gQBi2lmZO=W^Nw_PjOhfCDkEXB?$H>N6Vrh0oE zs<tQVzu|6+omcHFHiyx^>UFH%U+9l|X(fJ9{d;}5RI9Jo33;^kqtXYxEq;kS-v2pZ zRW}WLe0H?6*p+gpH0r5VmJ;DG?@qTQ`r?9B&lQUTE7c8`UMAH2CZ;u$2R2Xa4^JGa z6(%n{HQzK(8r#@;A3FDOJ>UDmCI+6YIxG5qY_QyPUmi`iMQ`?AxIxh4*4V`Wu07wy zATZ|YhfqGEPnkh4?oMQcOFXE)7xA3u<Y(m5r}p=wlxUh6o$kh4hsI#K-ExgJbpDhr zWkB-ADE4OIr`BklWPRzl&x69o2}H9UMoD&i)j7!@etlX_b;6{{Npq)=TS*DPS<A`r z6^EE)L~xk0XT&^}`;;DQoBt_03PQ7%lm1z5EiWV6G(SJQXw9^sL>kSpo?SW!=FBag z)if=H?;#3`a(|hwm(*f*<(D>6$ZsUG;~UCLRavudR$K|AUk#|3&8tr6tZ!ER@a7zi zmhv+LEXvshmh5{L1zX6SR!-iJTMyLK4Q*!#CQwIro2^h7i)Pz3Sd`}0HA|R!ub$mf zwe5ULKoDu&jG-X<x`~p}v$UD!&hye1B4ub)<INzhvNo0suFwv4g0E#=+z~Zpofsve zkGciBv>){dYzLP2fseQz_dQ38Rt&trP5Rv>cW?9S(CbIs-?~+owV(8>Gtxg9(bk%I zGOBBqbTFtNv3W3|m%(j2@hW6SU`ngN!glg&F`x<f-uC`z+V&<oDU=qY#%AY-C#9v3 zT6X<W*L<Mh*6|{E0vGs6)GbezVvUPVe(hT-^p_|4@SLt>##o-N=H_gv*3wF4pRSj* z@rX!m^;n*5!mXY>lu8C#xZCxdEkz%*@EFc_+gW)dZxyj^pYQkU&N}`cR=2u17&k7y zPzcDWzBu~f!#lCF5My<DvXWDLdAcCidwI5VPulsT)o%v$#j)U))2qYfZ8UmRo(=<7 zM$)6F*cDG96@K_Vc9ng{4OF4F>0IWAr@7-!)t!nX*xo<{;nTrQ4BQo$X(Vy>vVWkE zhM&h;Pmb8};tNb8>=~)0p4{<HCtxP}-u|rXpx8%}FdYa^$vjV53FSZF1Onr1#5fOk z{a$CjBFK<w;b18B*Pu%$C0MNIf|UA_o~Ki_$y^1-*(F3XXawzAngXqZtO51FqD&k3 z;YWYl?t3^>xozT?#oo?@nM@xW+oWjrLVXo7?^1Ti^pckWf${tC_hmce9%KeYci%r? z$m>v=v<yfl{K(XF6&T-(%vAsa<JBM~{9i%PK$hiSY+ah+#38Wmk4xHlT{^u4p(sKl zVte*(gGs)iR)y?`F()q!idg)*1C0=pKw#V%6axsOD--j2ES0?D-5W9m+k_cau7uGF zIah)42J1)MCFVJzQ%}3>CnKE3YjVW9_Rzgfr~B;n=Q)z4V|{KkzrVMO=02tDeBDSs z%++t6`#b@&*H82Jx09M&X|KKhAjlgQ@{a*R5^^d@u~*Yto}7B83bSn_*RFY<f}%=a z++?H;H88D-><uQJ4l~`j$a_8ZWH_CID^2=J7!3(a_Gd{~2;zA9lw%}c?Lm%OP`+w8 zLM1={W2Sc0n(Uv`n#mHYgF(Dn+Gs_gwIYGqB4ns=Fe*)|wm_%WU<{bn*kmpW^l;aE zP!Q~V&yRWPq+R3b-Ib*bPq+-1t2HWIzm?sm=QI+$n$~Qy!<X>2Bsd4EfN4#@p3C$$ z&E$yYqvE0<3pq_rAUO5(e#uo}yiI1RfXTM%63S)mLrXkD@;#|m%#zp3EV_$BJvsiG zznxiw@K?X3F8tQ<X>t=%#ngIX`J|LnN4XJJGs?mX5e}HTp4L>0-#8QKetKAis=UqX z?7=>FA-#t(v?+3lpq{yLEsVC_I3*z8<PeIPaVoJm;M9Nn5ZHo5dA*e#=5NPT)-n*4 z`tpv=XZL?^&d1{O$CjTbH!ExA5zp{%x%-1ErmS9|xAe*oP*iWnPPApia*xZf5e5gO zhy39wx$`XRZ#$Ht*?lt<mN+PJI%R}QqbP+Jx#bVqbw=++H%&M3cx1I23fvFA7Di8? zJ3k1>h0Z0uygL+Epoc1_UW6Kx3sm<hEImra1usbfh5!NL->)kIO`gP84{-K8%FN4M zku}>H(2*+7YJ>k$1ccG4Tjp6V50_u74)kWj@-kI7Rn%g3`-;?7b3Y{YJO!q;(&TTi zsDjK`3=m^D@1K+y=dSBFZI5XWRFry*uYSBT1gM#mepgvDnF5WBM(384zi<5X<;<bv zQoyXGP(=%v)|3xzmF$8nDeod@7N-Sjj)bfjP_&$#Mc;2F0Q@ZwoRZbytpDJ<=~k{f zi^H0VAiYFdKT1p_aIw4B!@cX@B)A};U)92Fw;i-jGS3iV)h;n^Q}EN_CpP-0;B|0H z7qs{!57xD>z7xku`cr_CvHMG}u+RQ<j0n1#h8>vJ0w9IY1rdjGMZXmmYF0-Hz{Biq zU-J_k*M6xAUk9g_U;oev(d}sp?#zj}uv3vZYj7;GeU)9i`CI`!y<9Y0Rrh@HYq8GA z{_M;0eJ5L6G!k*h6IDQ<W3MSuvq0H*48w9}d1xiN)5>%5;<R=z%R%&4Udv(69hLoL z*0kwouTE`rakjHk=;u{KTDr;^zNET{IjY?uZ|V~N<_An`-}@ZGnlJB%ZHuk4@t!|H z0A1@du|0yJlcoL96Ms6f-#LA{nW~Jo6?K=lLyDc;+3U_sJ5Xp<^E;OvOQ`demt|yZ z_nf+2Qtmgrs$2BsMYDdcyIg@tyqg|#ZV+TdYn2M|^W*<Ycfp_%zxeJNh6P?Rc4c;h z;F}07eCJuGbn~`xp;+N2igi=tcT<pZrjy}YRu?h^xj*oI2gPuuJtp4$?!Nof#j{+5 zM}~?@$m4gZy8xUF9pe$rd}Gz!LzGJN7L}*j<A)E&T}NMflCXha=6V_{dnn0>D#JY^ zZ@8<jaNon@mA3QJ9`{Pcw$%~h<)iYZ$MQ0?`)EwXD-!F?+vY9y*wd2AXC~V7vk4D_ zhR^Z`0Jf!&g!??S@sZQ_a@L@JCv+8@Vi@(I9dP$$qyB&%_r=Kc2|XtF7xKGb>K#ob z5f$qfeA6fK*l)GmkLrfow*DQMBtO*v5uu%{E1rMfJwF3|f?GetshF|JBi+(h{OJe$ zWte><2Z(N!P?PQwK!1qCn6R~6{g2gs5p0Su46F(~;=>Z`DnKng9w;{KsTCbS(cl|( zBQQbVpDZH~;|GDXUEl{0e;XY8@&~~I2Kd1jf9G<?5Dn=`4M+(U1<V!8F!k20Pz;q4 z>P_pQn^O2H^{$1XShrF`WlQ(~<uoC?Fpqwy3`S@Hp3}5%5QUo`7FM8a33dw`Hc3Ab z>dI#w+%5w;l*D0_#V^$JR{`C)@hMam1DqL(k$~>Uho)jDScf&ngwe3`CdX3r$>0-5 zgeDB&%P<KSGTmrg;U{?=bijm-%MOBqZm<glk>g<$GGPx;MS6z0ui{3MO8IZx2xj;Y zfYQ68{3+PbIu!YV08n4ERbzABi#cSDF--M82n{8X4bi(Lb%F<cAB?R<0+m#3On!Wo zej*GIHj4=e>r)W<Pm-H)kp%46vZ--O!XYg$qur>9YwXBSLewU!4@pvQ1>B3t#0b>Q zi_t6%E{(%t*C3G9i_D2l7-|djd=@-XhHXn7FR&Z9<q^qKj(vj~8&fD)Ss0{Bov1w# zr<!-GG4BH=-t$yy;@RT>jFa&9>^A@*IRjc2=cQfXy-x&}CBZkDW6b%&8e$W4-#H#= zB+WgF)nyLQ0%2>G#Jzg=h@U!0Gb~i|b(AQ3@{M<oE=#aUK-gM4VUsaQzvDo3!jcOn z1Uz|xnyUm@`VR}O)9QADHRlQPg+O)vL{Lfm${)bP?6m!_A$;@c%=57<Pa=)e(o?=9 z2yhTTrb!cpfVkE`M#7A{@LMXO8InVud~1#w6B$%bc)6;vcdOF`jx!LILbtvo9jZ}h zy`$E^$EafpmVDt^(~((im`OOFAR?D-Y6^PO37V?TriW))=ZhW+=ZFksD}d8%{YC8% zIWb|`z_b=Ilyi$X)18A{9+Dfcn&XcKlX^~O_{oudp3Ify&yIxT#UfsXKtNXUc`x}> zl1)VdY4Xco<iAhL$&Lpn#OIsb$c3KfPd)c30h5P;3p^g>!|+K8<Wed*$Rgqk1oiXk z!B8iPWSS>9CAi+rYh<bUPmS<h;Rq;AX+h4jBw170@YmwG9EBa4FN!oFbDf1zhR~?t ztY<cbL@Wgh{$#a?q7{<DEji-hNhM`hk&8It%{9_Gnqm%S==o{!UA1DaC6BmA#h3$m z7z8S3@g+VtiwUPdIA&V&2=S@Y5^vH{Vz;8)18CRdQi`)uHR4il{4%z%;`?1JL=I)< z`DJ4IWum1eTu9<en)1h5<(%mIWdaVQJ@MuH;bl((O2;)yMbA8*$%7eyY0ZK3u0w_F zdYNnhmAHJlWI>ox0V&^EMY3C^CbE*(vs^oYMC7dU2T3KrNF{=;!a$zeC;`UaP+@)s z6U{2JUMGGlQe`9s<3hp^8dX9zm9_!2F0^oWTK`TkoQ4?YP0MIkPzE{kGf99)4ZuSS zh%H5`qvb*J4%L(mRq<xz0S;y1XMTxhq|RqmkEW`D;M6Jvk}pE+JB9Gst-eo-h(3mw ztlL#3@I)mbT@tEmx<DCcNI7OClRPqxs^+mW!qx!+khi_Gj5=pEy6H88v=q%}rL6>h zFs)jHu-a)PavF`SMA4$mpQ2O@QP}gfp}sYbq-w3ZYF23L_6R5j%uvN5b-FgS6a^?B zc<nK58Jd>y2W`CsXVpj-3QLsq^sMAOz!#5>bn6VZlTc5l-S9%W?x#Z?g#tN2cgby0 z-%DhJ;%-BaNd4WwS{$z0JHWs;&~Qt>(F5MdOWa^C(!d2wYc(WPbSRp{rthA0e1Sg9 z8%>l7&7S&=(i=sK2@SF}6g-3_QZ+sgyGb4=!UU$9H4<A$N}HyqnlwepUY!>!bNM_w zZ;>`^E%a}VKsJj)TR#xDo`YMz3AJ!4w-`9ISSGe<cDLY~w?PO=t?7zCZ+L$^Z}T*4 z*LQ37MVsfFPqzegle<Bi_vPC-=G(Lb+CmaLD7xD?%sb+>Ny2K1Ji5KT&O6xnJM#<L zvla4!9P10Z8ze<LH2v#h&pTlXsKoOc9mg&X;?4#CPGgPE8ak5tKt#T1x5H#7M_{+o zeAl#Qx3NqI`+SF{R#&%UPf0>oFS2V~l%$uduz$m=ak^(nu2;dP``2_vC$wwTk!-F8 zI#1_47)UZ4SUEb~drSwPoUWNp?4#Z7ZKmnd7V5pMX~BL^w&K{YSKT`W?H9k%-^9`X zUZ{^%x$l)jA5qePEV8e0s*gsD7<3y-BIbp4F@VoM=$Fv{;I=<uPakIxDRWW*o0u0F z+Jb~4se<Za5G;oD>S_|K9pbkrcvR@gQacoDHY}JnC^O^BJu@KBO)4c;@NCob$$Jus z_Z7ky!<rXeVlyr37lX>T3smVnU(^nNxTun=9dRBXuG1PRrW-AWj7qJH-rF4!O&Bpv z8hbc1;shOIzcB{o7!%MKmEj(@P8fBj_c8B5ezoXyP0IJS@Cc$Ou}vzsOB#=*&!?Li zjk*{J>1p4UAD5<|Fb^1ybMg*ILPivJq$uWRZn_s-5GTDak8zrW73L=NjF%@36c$dT z(X&-;5*KsBvgxO_V<)R<r$VNulEKpta;ND_r}(v|THnu@#ZTpP&*1k=$E{6MquC}! zHfOZ7rbjnD+ixTLgW9Kq@)nZZR%?kT3(JPz&;C|S8Bdztec!+Cl($*v`lE2@;-cc` z`#Dj&*}}6~mzp^!SJzvaF09KRgxzCFg!5EsKZ0m}U>wi!2F=Te{2+67$0<VK6}3?W zPZ5e!pD32?U(9nQ`yB<%vM2YkIOo#oxX_>mpNLm5%r3xV8#lTandrOrL>8!s7a5TY zlF2{KxaSe(KQ~1e-QyQmzb`)EUJ^zw$`!eb&-TB&1ifa+RZDh$?o6z7St2vLWD-27 zfa>{Z*{i#iqfg}g=5oMBsazxZmy8|cJF4hIQL9yQH!BadMRJL8@UpkK7cbiRhsSJ> zi)GHYBBw7!10lU-4$doMlnZ%N%O=w+U%;!AIjdx)D`?G?Xq`3T*p<6HYh&H3X8CKo z_)JknByq~MKcB5(&v0k+B;v`>mv7Z1ff#FNYm$i&D`$Mw&KnAy;P)t&_Fxb)7(qBl zJxD}5#6vrxL^~$FnH#n_uC&?Qu=(S1a{;xvxV8DydFxm5)~L?bdhpg}(bmk?)-KWZ zq|)}x<<_zI_KD8+ne+DP<@Pzz&LzVRmc$MY<JO+e4xZIE!QA$3-km$eI~zp1q`bSg zTz1Gqb}1QmY5I1k`*xYoyLan$?``i=>Y_#lxnao#q?u_wmwRc{>wJF*qla=zWrOzx zu7%P6H~8BpocplABip*8x7qumTSt!nar~|7%3hn&#o)i6zjYzUki!4B3ZsdzVV=~g zzZBx1Sj;xZsV*xei#c6l(Y#rCo&F+-;YIwLRh4YTBylgAw`*_m-xlh$#J^ovD|%n+ zj7_Vyp;7j+C;3H!+NLJVVg}_!tG=a;__jIQlAyk=gL1mK#HQ2O(QEX&%_yBXpl;9_ zL@(h@XK!QJ8O5#Jn)q(ts5eQ>1&3bqx5;3ZVv2N<=7H&G;rlvodaXnA$x5`vTx*in zk>zZy6B>s>``CJ+C5Z85vi8a6Up+|@J`C?qzpjlG>b51nKeOGMsdd3+)H%1?Tk1*q zZ~nIBiTeBROO@)nF4zJZ`aUc$jSnF&1m1m&`3QSwoZ|JLlE3|LVf6nZj7I;L7e;#t zD;WG!VRWCT(c>&(MN_q*_%U>|kw9g&qNVLn!W@>dP>ZnA=jfrt<>$uWk!mGd*ih28 zr?Kdg@GHpZQ1Vf;vG_stE9b+Z6f~BJBsTc9JH>D+?hBKr<cQba0>f!{yiA_6fR+8# zhSMoqOr!xpL$K{|1|#+-8Nj~~9zC4N`r?z^TZBq9Y&eV8>yyGquxkA1aJFE}CnbP; zOg<dWk-#>6?FD|5PBD`E@`b5N6yi;`z)0RJFVi<!;J5i|Bl+qrrfQXlw?(!i1-jT~ z8ZBV8vgi@0@e4D}5ri5HHd1KiWv0CZR!5AE6n$?o(>Xw>qYg)kU9ipduthW)DMm|t zUYHw@BQ;tDMoUAy%vB9pMBa6(jh4l<m>WGozU#FeEl<I=FnJ-OIT$@!k@LdB^es|z z6gFB}>}6s8QABHUbQD(AVqy6WsWp3en0UEkVeKWNy+APrZ(CZI2qlPe#rU5Q_A3)N z#sAU7{le>?d2W2DU;S$k_CxcWzhUCOzO(&l;!f%sp!i=*+zLX=#f`qCoI2g`(#3y^ ziF<Pj{$+i(2l=;5+}~jZe|c^gU;Vof_J3;PCb84-Ve)2M@V)>4DHFFHdo6HhgI0{1 zt{1|8<*#3PZq|$4P9D96HWQgaC0p(~KruQVBF)SD#W{h0-C!+?iZLa#P1yM70*k62 z&YYI8pAaoe_;Rq>7GkBWz!JHG;<Q5iMgR!=QLouH>UggJK-kfo)+nqqExr=G7;>{l zLct9_wL`M6@=`~5d^Rmuist<-H{U`_o5{4eFj{XqafP<s`wrdf;LPdf@8U%!KJ0$f zrSPy*Fd*?uw@^WMd9V1`^rIdTg4>S=q$mr&4l3N+tmsjEcJaGkMI9j3Uuq>i8I|}B zd{FsUwFl#RFMAHgOneHzO&FBd+D;lp-2OiGrLORB;(J$8)s$Tux~FQ^c}x-1afecT zq-{IWu=QDh*09~Pkb7@hr6OqG*h|HbMxIC}5DZsir1&VEtVBlySFgrr^j5DWmlGk@ z(_?tfR?BmA&ep1`lF!zWZAxd`u$v*s9Rz6~au<bLe7@5~Id{I>$J%!en7HrM9t^4% zUmQ#s_gx&#`rJ7?u8pudmr8o9*15j=Y8HjD-3HW$wubK1UF?k&qc6^u`_Sm!N6*k$ zc#@bn)~<M5dYE@|>v10LxNSVT^4v(_s)5|MBJ^<B;Zg*)Adj6PJv?Edr+1=3o=G5m zd|CKYQW(gKBaoTk<H}Q-Mr&^&s6LTZZWF`ajt?c_0xsIi?&)1rzpuda1)`{xXAjar zE_Z}IFqD`u*yANJ0+4qpieq26#kvJx_AgMD3bj58EDcbj!=oD0XyMB*^*8>yNHNFu z!d-hH(7gE`#Z2zY$E~};E}kD4Zce-uC)o@2Q25DkBTq&`U@$bq@aJ7@;f|+rgJDt6 z4IkW-l~sU{geMR#vGU&PRJJXP%)Ot*@v2%*zHBe5C@|}RBD=iOs7hp>=MvW!dwI>R zvZ%V@EN+hpc^#7d*d~PsJX-HUMfL`m8Zo=6bA?`VseB0>{cW(=ZQWx*gq09-b6K!O zNQu{WC{gG9fz%q6uvPw-kZp5g@S-f}d#`HpPK~kHavu5><P;E{d$Ee+BKjQhD^js8 zmI2RApBGL=8fYo!87qylhuY(`J5ehyh&z?NO@C)lV6#iJa|{L>J<epKUzHY%SBVI( z$l`kYN%q6qU{vy(Y`)r0ipKdvE(Ybnc+6h&-awdD^XIcFKI*5vJNRyn?YUu?YpS~j z0S8i1DwZ<s>_j95zHhq<rZCOaV^~JrBHuC@lS^ujK}M)ws4~BEx~X|&Fyi$y@T1)m zO`YxhG1OjEF&^`D8D3dQ0}V{mb1C28wu(kGgRPd|#|;C5L5+5CSXpe6xgmSOM3?Po zX=<gp$s^8*!Ox==35tcr%E-wfgj!_=0Ja;;PmZBs6tIdY3kw_M)YPc}42oT3;nk%z zLn8>Ueqm|#Y&}%>F|5qu%ET={^R%`SF@D>hy$tZ&P*^(A1We1c`V(*KjFA6&|K@`{ z^Vn}5xqz)8UU?Yj+^K&v;qS`gw8;E9si>zl7gq?o!Vj%dN(45F)RDCNhj*%A-R<BK zPXe#mTidtlDJ-qoUE}A89PD0gTv#Vja4nD|#44UA5qQ4}G@$5Ot-A`d_Hd3<XROu> zsFC`8(VoNIKW>vWQt|RI&n73WM$n3vg~xDZf*w&Th&Y!;=4_;sb+xp=frUqvo3l{; zW0*DUxjoM}?nhDHP^0vxaCDD#@V-IGIfX!1oUH5>!amK&x-TqieC4?bO6G3z>h(Mf zOC#O9$NT7XAhcB_=-$jdI@QycZm8b{j?h&l2e7d1<=0>kx2eif^>D6IrPVpql;$I1 zq$K!>Da9s*N*B$G3e*#Sy25pxGw`#B%Y&jhS3UiZm66t7vYd#X4Wma7hI=1`6=wVo z_TH*1u7H2D1cF<taEHR3KyZfymjri`5L^QUcXuh=-3jjQ?(XjHF4gt+tXcnynV#vp znKjdQ^#M+ui?e@wKW9ZMDlf~6?`WkpYal~=Xo;I!u6&8(?9Ug|)%`#~#mv~bqXpgK zd1Q3{jsnPL#_jt^dqev}I*#d0i`d>fPsTs!2|MvB-HI@;?`hd(pg<b+p}Jfrd3k2A zimu4Xe@@uf37zfJL~h<6y$D#Zx%XQB)4Aaje=W0nm2cfMpyVAjS-<w5NfV~-Xc|Yb zwykY-KiEIwn;eUUc5dDd4X${nXRxpHYv>LXC#HvT6&>trT95ai_~tXIZ_3=#SGXa~ z&RNjTO@sEK@l^9tuHSu~RN<j@RLiPX&TW%M;gRD2=F*LIUh&P_MO-`oW`6E{*G<t$ z;5WhCo^t1d)3&Q<h~3JN^5fu(@pZxvhrQ1ePbCX&H@#f~hfz0=Q!|4X1>fFc5GtNG zE!*!H#05`H$PN2v+IjM!oQ*2nrK;8Qq4Y@TQtQLR7IDX3rpUYH*9!NQ-S#I+aVTeF z`#G;d&fU@B8DLoPcD}N3ziu)Hx#{`#o{dV*yu=2bf~)Wx!|8atL~^>`VI$g~>EPVy z=<v&{fV_VmeSUu+Ji_<>(Cq>3+;qTsA~zB~HF#rcGM*mbet7f_0Q%qr6I?(`+|p(@ z4L;ysUS!gQ7zDnrU0&4AzFBbI^oIo4jlNgEyjcnS(sH~xiU_DQ{djrl@dj~OlKgC| z{DkT8385wKMnh6fe@|FnD2n50^gsUP3q4`?%JEfh#23;G*nsuZYz&~7*Vm;dP<RY5 zAfOd3!qwmn{Gk+Rij4QAG0>X+r_^JhMYg})A>J>|pn2E;=f)s?@c{QjdoN^iZGvF` zA{tK3U?bb0;KpE)oIp*8ZD9BzP9#By;#6Rqa|k+iP*M@@-^LKV?BEP(5?6xIyhSQc z%}@>4kfI`DzsAt=B&wjtP*vE_YRxcWju7?i(E1|m#>O!IUm@)T;aNE$-Of1an&Gly zVT1I<x&Jv~2Ngbsf6We?4kjwoj94@URV77;WrwdmMm$Z0sftBxnqqBhM$*EDA2vpM ziHDz>Vh=n<@@++2BNL5jLOVC)Q%O;u#Ufu#2^Sut;IznBc%wgwMIk0f&)G&QZ$+Up z0MVbKv9cqvw7~k?k$8MqS4m)6pJ<XJf`>;iWpWUe88)U?j4v>nzA0u}DZ0>BZ|ndJ zr)9}JL<~g1rGse2!r8{gcA<WNjct$uw@b(JYta&D#o<(e3zX27>0+gy@Ig;_;_=u@ zmvQPcz!&FuY;df0h%re4@$boagChVd15p{kQ;{!$0Zx5=AXc#}p6e)qpCQg%E0NVM z&M^cadqg-k9p~~ysI-J5`h;Wolqk-gRFo92C>94sPAuz63M-1qok|QeOES_*Mgk`! zH6@3G5@olNn2wT}WfIf0QaX)O@TwAv7^F)12z{1PDvwgC7=T%PscDb#^~tFjw#h}s z$<0rxR-hDVrBoV*G<uno&g8UrpTxA{l(you(5sY5zI4~@q#~KLS*?)9<n&c2hA>NM z=OYh*ETtoxrb+sw{{+LME5#%Fz`vPf;BBM9b!9jOrrj!O3NHbI82~7v835R1&#FxD zKw9ci8k=~s6JExvt=?0y$MjL=eOKIPcIc<e^a!M^MLJN-CeTF2Bc_Q!g~1pOHJjr) z-J3_PBRlH@2P*Zl$0c7x^p!et7ErkpfMf2?_6)ucp&(e!VV=s>WY2+_&W;z)vIXUV zeDW$yvhs^_=Gl`(n^}(^vWn{w`W<ssWOEJ)$*}l!;k<KpAF_qb$*Zo_mH3ln`Q2%U zlNI?3tYvZd7;$ul!L})2f#(8eS5issWclF&7gv1M=R#k8Ts-X*d;TIGPyw`aqY9}i zNL?xjCn{!BDipOX!jmb+bt#N#F7B=>OpvkMMJY}*$M%7CZicY~hLaOqOPI3%!`Xzk zijo*gDp4tZ65*;p)80X4m1FEuMsV9PuF^0;gE^?j983EXS&DY)=rd8qbE3y{(HJ9M zK7ZM~D^{^A$ZXlH!?lcTs{}ZmiE&((MOPXxQ@Wc{PWU^3n&=;D)4yXzz2hU&6<6Ac zl*B3i(yJ2Ox#o)Z(0ECuiUp;AW%Feae&D8SC8`c^-#qECxpM5dT;NwF3PTklN(CUb zD$KURF}dQPq)KV3f<mAgF1jp9ri!{WaV5E$IW<myF#Y37b*gz4pHKA%h)fM!NEJs* z&EKvnhodUYks3)*wfIQ|txhucNDYckEzwG)7h#P&QxUHlw#-YE%19JHah<jso^WY` z=u52*8qQbZ`UTh8K&?8CmRiG;3dPjK?=AJhu60~K^-uH-k4bfZQX90V>V7}fS(i5O zv)6mSlo-Dx{vD|{7ie5qu6KN@4;@K&T!}i9&2fHdOjyBjXG-u~X-t&E_FZX;(Qb5c zX=F%k%z7ya*GY_YYwjd$;t*@TK5V|wZ2G6uA`EWQYicU7Xkoo-YJDlpu}G{Gs4jSE ziAiZTZ))yGORYx3?iq<3Yl*CFX`Lm;ZY+&&PHmmDz-n)4V<BpFfIPJ-v{bL3lnn|b z4C}O~61K5|+7AcY_jucm1v)5g+cc8f4&^#1rrMrU(>F^K&e5v+Ryu@T+YOT2;dK)) zN3dYgBhg+Xu2Va)1cCP!@sDnu*#Cg9sa+jU9lw`4Q3aqk-RX#{@yLSR>Q9}Fu-&Ug z-Ae>r^dvoqN?qSvx@ehuu&TOvS5wHC6PRBsC|i3vwYs%ky2VLSPEoU2!y`Vq_tMMv zNSpOYoc3bU!q`amIWPC<J@r`1wQGhKeszzReC_+2()-@jJGa<tnAZ7SH%^(k-=ft{ zon%1kU;bY~fSCJ0K4HH)U%#tvm9cz=DRYGR>%iVhzdcIH8sum|ptL8DIYIkhyl!iS z3$zPyoEdI8<Ul;Q#y2>jIhfMg8mt>@vpSG)I+*<$2X>E-C8>x{8`giRUP>OSL~lz& zZ;D$Pt|O_)6-)_5uPGE9Xc0^=wTy30E3Xh7eP9}yl^Gd+jmU8S5sQ|c^*WlqGQy-a z{OxFzA#8YFFsAP{Za}_#=yfb4d}#k)+7t=aPI&l9c=%k}xL?@Vz|%+#$*2bNL@D98 z^wN0PN#Ap8ihJuAY+35XEAX8;9Em0TN_WyiZi1$GOnPXH`eY2VEc#V94n?SJ&wYx7 z4_dyNs%n}ft(t0=o^D^9q$I5a2*qIO#o-85<F!pgAW2jFX49j~Q=D(n6c{rC5h?U- zKwhgbF{?1fw;6$zY09T*e!>|Fff;F*C~m#jFBql#q;q^Dqccadnr9&r9zZpgupca8 zQfqV6rL+9z6Jy~M#_5SFV==$RN;KBy?-pki6c)Vr=5c`w<wXnSn)A*WRi<xK=52G9 zq>Ir|_9?g!91-cL7puFr7;w0t!#DPhvKVt#;b&DCfRPTysQRA1H1RmkG_+7KyqNRW zt$nssToxavkeZ;7k+inF+q{G~G#l-)SgRMC7ZFn+R8rKoGXA*8{It}47Fa<F?9dAx zQV6Z_SRFH8NnTzWHd{p{UY@iHYtxGvX)Er6q_1^JuQHjfZH@(ujqz5krBCRs|6^Rk z3R&qZTRBY!uL#Agd9=a^Z3wn4&y{UZxvXQ_Zs@0vyuUS`w`~k8=UwY<5|k}Ey{@50 zhHgj1?3PtN38uqf@+Ej|en>V3zDL7h0^!lpK#?JL7>#u2)81VhvqxKVZED_KTThzX zsnR>X$J<D@NX<jrUfDbELp!c%!ib<<1hHNCU%MZCcHy#jA3pCM-s~!p?MYznsj%)z zDeh@l@5w~&>6Guujqm+9-&4@vGtAgCTHiAv+cy*5H(uX2J>NISJg|J<|4Vk@AbjAM zaRBYy$gdy#96#_nKQLfDv`{>>vp#f!L>{`9A9@QP`n(@Tk{tzL9>uaA1t}hp0QI@Y z15)*;-Eb5$%N4^u9OtqgKdBz)c^+qHDCUnJm#jm799LT(*PI{Mk)70LoYa?}G`63# zub*^A9=Ecdb|{{9wI2^)p7gh$4vwD=ub)o7pH9CY&w8GW>!0<Ioh|C0E?b|iWt`2N zpKW2DuVkF=d7f>1o^Onw?Tnuvum6X+T`Qj7oS!$aDv?`*GkLZP7%J&cFP_N$Cx%)7 zCrjM_$6?n0aJCCN6ydHf<o_=lW`)>ZYyFQqHy@i{&wE=k|I@j#M!h6qe(i*IZpeSO zdHt`>&Hv(TiUJqCpT7w`?ACk}fxvTq7ek_{{r=^n1SdpE0^g`sNs2sxQ(1;CzgAg} zt&dYhfoHE)<(mism#UH!O`WRBHwi8^H4URWHH{wuT<TgT`E}|#HvfyW{ptBAC1~4+ zZ_;WzKprG$H$+$1YB$0*AZS0vbI@u(A%Z0IcS?$`?eEMtDIteB4U;y9g&#pej!Pzm zZH_B8142&!j}No{|DCfv{C}FWl`gMGLpd84cg1Dt%6k{^GyJ@@9~ZL$9Nd4gFisdu z7+fUk|4SCu7e?^;|9<lU53;p7R8u&SDeCt>bj~=veyx=#F=^!ScZ8-BIzpW@lQvZP zFenSFw?yjqAXZ|5vM{0LmqXTyjSg?2WenYEa_B0p!nnd{<JC}Kq!>|P6HoQtNYZDE z_0gu9gNdv!VPp!;x1#DFn7qDHiq;)1RL0U0^77T6t?)QBOPZqb9IU}<Bb=uL>TF=o zOv!(=137LEe&X|s@Vb2Zn>3$j-0|NxA4EcUAYP56g11TtkfXG**4C#7P77?q2=A;v zkB>JW4a-E>-8x@MRWq$VK*R8OZ(9d)l0a(BZ@!c)&fjqW9Cw?tGipW9oKwlyUr-jN zPHb@<ps5^4i&xvHL{l<r;K$H!s^iTuPmdK2S67rK4H1*bjkr9Lo{E}?rz4C0y+xpE zXGgO~7V}+_aEf+KPa0e2bV<U{Qb_rZTKtDB-;^$s!EAmKNOnt;;p5N(Rp^(lko`2# z2(bf29V{9{@w#*dz#nQ4f|xX?VftU$!N!QDIpNmzrn%9QjKwM_$ecP>@A3&IUp>W_ z&CD{bQE{{BwOmw^vB06xsj=Hm-^|MtA<a5i4=AFD;=cVQCvyL)a2K+<1Di@=usB^b z6Z)0&jw?qqZW+XyxKo#^0ZJp$mHr`&EWg~$<BDZOUvU>|K7uLNtZ0rkv&_~E{L6lv zS&wMuV`#alwGwU1sWbv4&|=$oroz5AdZw(D*I(xtvBaX-2T?e%!jep}fCv{Z`{YSo zE!1Lu3eL7LBokxzkhvAwh)0bVQajNR$N6_|fGxDO?3W1Rdue_=n2!_Wlf;eMGS*gg z$UKDu$5B9|H`6x7$p9!2o0SxkVub%Yt7-C<LaXc3O0Mo`xLYgzE?RcCRG9MyW>SsK z<J4d&WpV1Zky3rIw}$DffY~aCFo~|(Bb75%dKsD2ZwAwq^M3oq6!)+ltyAx`OR69= zIbNoqN*SA{yH?N`2X)Tu+}7H_2f0qSa%I0AsqG~F3o{IUu!tG6ix-WQzno(_pcfY} z-0yN-AR7gL-b558p&7N1D0BbP#B<9l;pu0>f3;}hg_DX>bq;LrB=%?gGG_sG&Ir}4 zloBg)qnuCAgM{5*Zx^C)_6e8d0rALsHW0`+ra6mOB(ide0IMS(HMvllXjv3_5185T z2TI<OJd#LX0(XT+Lp!nN(I`sE9+W<SZznvap(PFB#u>+8_p`z!2%cncoqrKX^j;dk zJGv#=C<R1}p@v1d%)o#+NcU0_T?I?aL!C2%QV`TR3$ooV7axqP4##l8`t=bvd$8|$ z>R;GT`AMWU0;qEarqqNwXA6s&98U}pmf^W12T<p%J;2a$bf+HAo<siVD$3h3G!m~S zi6sU;(&xWBXM>Xb*HGsykD3nZoM~UjB#q|L@(c|rx?aa-q36>}$^4gdHZ-i>d>vmI zp3iIo%{eV!Cp3=cvpNlp=s#a4cA^)23X&N$Ai7B!{Eu@sG-}L$lROz-z*#6WX0Cmc zvN&46-7qv}?Rt~CiC)M%ATw^4^1nN0<BrWY>6hV!g3uue*X0{%D5g;OVF)te`FxWJ zgHa@k1npuOV}KDApw3wdp+CoMHXx$tE1m3AsP=76bR4DRLeW%&>uoLtMzJ&>yclfj zHU%A*v@BY+vTyBQ3N~D6d4<sFu+iHBE;Tbnt!9<Pdz=E1c(d<jB{MnKvqi!ZjNjuK zRSU50ioPqDt0wZ#6{z18D~~a%)tRf68#t8yJTuqqV4Saxx%<cKV6I)!tX@&?@Xv<J zLU)RPwrRPp+*!>+f2moc0rO5bgW(7njYBgN9naoR;dBqtPP3m?ogyOO-)|ZwK(C@Y z47l&~H<z5&IBI8g`q)1M0kq`_{rcK`(lWCzZp-u43AKr8R_1yqOG}XM`?|Ua7AuL; zmEn8th6aT4KWZa7t2y@#eRr02MlCC2tPM^50p)h-FFGrjiOo}eXZC(AYbVAFEu{!- z_H|)vmsn0Ux_Wr2!xVte$a&cCwiPg&0)VIKhPI0c8_$!LAFtyY9gsa6?*pa{-$f0W zQ`}A;?AD)<?!>OAfJ-l$*PlpKi`_WwmA+KrTbMS^-DK96K}>=M7-5gSB&@c98YJ5| zxdgq8*6iUw<PC^Y7yEcKY$GjNcZg3O2LutTqoBAIM4a5mu2>xbZZ#ytPaYBqtd7oq zHKZe78dhzuj>!$*W3_P^)+a*_S-TXUyo{z0l)n+3Wd?AgbwXK~eofkn-~rDM>TyJ+ z&#B{S(Ly5d6CU-SGlAPCfjG<Kf5&UmK9&I_+2AMr@&10n6gu=3eWvg%ugzH_G2<8D zpHAujo6b~b@>OJcHjwPDScK*Hd+yR~nmSi0&zp%FkM?wNWL*w+#IZUwyXA0Ro2S=y z2z^#(`)KP6BQQ?XASo0xEy3;+f1*F*I8)4XBiGgGZCayIufV}P1Pw%-S)gfl(O$BN z_3Bw$x3o~4zSlSP2wgbOysVv+H?&`^Svy~>Y`i8obzWdx`X0D#-YY(Ke6+sw{QSBF z%{g@v3)=>3=x)O|IQO%cLkFtUcE~##2YH0ABURF%ER3hAUk%ePs^xW;nayQTMffIZ z=5_BQ&zI%_y-h1Rxz7vSer^h|=a$%OD^dqG)3}0v|Dfr?$a%TWrbhlPoX|PmE@+;v z!E`8R^XU1p!0*|!epiy}abiN=vapchSXo1Q_D92QrSJT{DN*R$VL)K*!PBYfr0v4x zp=I;KH|O@)w@VxH)-CKG&Yf)Q=fOdOJLHguK@HFA$cffH+zOXboA#?r=%4n>hRaZ@ ze&;tj9<j^4n<5-XilvY@F+&@`GJfwpe3#Iv$;8X@!~1>5gvX`R#mn}GjmK^&;j5^L z*Igd3r|~FZC<_CuX?Q&@Xn5Xdc6b~)Wj@1IdO{wnL_E(DGhYrKJfFMR-tS{K-u8n; zp7$y|pKGAvZ<N=&tqSUhN8kGfzV`{8H+1#^QPUf_(d(|z`=QValh+Gf+8gNXjh*EE zvC$iU(HoHDgEi=bbLfND=tCLoLsjGhWnr{QzNEpP2)3wzUueVJ$``Xrnqqz&rV8wb zIPUQ5h}l%agMJ8CenQCprBeO^SpJepR5Fh|a`gVvy#C)G{gpNSm81hyod1(^g0e7K z%>dm&fBnS(4f;TB>A)X{{zk}wzl#FRf&)z!{r?aIT0)CXhk?e<LH5Bxj!8l8jX|CS zK^Bie4#>eHTV4o0A`(8qUUq&ddBIo^cFAyp5Z+&YF-h{6Y9R|>LsVetgPlW?9z(K< zWci>h>=2tqHMA%xG~YD%P8{G&4IsWHDB%r5`Xya!Du06rbjv1gNK&Z4CrVii+nyEf zrVqEgL8KK6$A%5*dz7g^1it3t{>};?(~KbK5`pU!X$OSOKg#@b=3FC){H}zyO(5G; z#777QEt=BMT!-&1emg+MS}Y1Ud5p~A45b441>%I?n|^&f#2?hede&rl<CW3h`D|1V zcvMkF;8V8zjmkz(QnDS4uJrMFCOYLdf}jaZvZQ#0?7;3rMyeIM`xt-+ilIu5VMLJ| zXpCWfiuptsOPB}d(2C^_ktc_^#F8Y(@-N9j7Gt|^W1WG~q73q*nsIH9(b9bKoK10x zPjUZl!2pzaRjqh+mw1QSnE$NOF2(DkkSc`e{|E`i;Y&~|2B?@N<PXN0yU0QfC#xq} zal%A=hq%8e%9cC6PD`@CnxIn;iIUXu-h4^^T1kN}blNUSp-oBQOG(sIiIIfKF(JH` ze95?K$q7%=_Q}bywaGSOacO2UP>l>WKQ7NjCfX&Xq$#C^GU?w_N+n?`0$)l3IH`I_ zqP7_D>YUoTl$r@nX(vqUE(Rs>rM;-8^_xj%B&S){rdh$JjLJwg5vCs-rp#(db-JW4 zH>Fo>rK~=sL-%JBAZDrCS{eH;8CP-XhfNu$Pk4h%8GE-Gm&sz|e3^WznI^F5_by*& znlk4M)89kB9usE4YiCJqr6Z<fp*CmbOJ|@n%Dg>gb>L)U@iTnT&L&97rUhjZ$?_Qy z5|J!to8Dx%(B??^XBuZ`(uNA-H0RiT$w`9EVr3K{cg_Cnn#)@PKxV{d83qYy1J09j z+i>#4wew<kvm`@h_+fKpQ03*9^C%2*d9LyVzX*H}l~*T92MuGjxa70c=KF2uJNf2Z zbVVC1V;eH!F}fB+-{ew=<<nLX|Ix;=1V_`b7pmsLz_S-xmSAx(V!N9Y{Tae>WlU&e z$p33jw7OVW4Y>`2y9y0w1PUBue=Q;0!!CweJ4r-@mo>$N{&|X1#feqy8OL}KrD7GR z8O|6Utc^W|t>0o$Q0hwT6G~fcp7zrfr;fjLDYldumb1kbPcIb9+C0f@7^_(8AKV{s zYYP6rFs?<4P#0?Ea0(XO=Q3{Jk}*_luV?HEZIH^R+%kUViRQBXP}x{l>_k~2tE{qv zWf{lk@-gv<YgDo<MygxwiVdGKAp5`P=ZZegau|Wi<fGD9=}KP1O5{}fz2-{rbfpHc z40DBfj=w5mwhWJn1unIU<RtNExr&0gnsVjS1AjHGTQ$8L4smKV^GO`)3*dFRn&7tD zjj;w70$0UNOvS5%i<Meqs$3=PCP_eCYhPXc)vcD{sY<$~R(_>6PpMjwxK25&R#Ko& zohh8tt<ET}PJ4t@V5M&Js!nC9=4UBLRHvSwv(~f)q}EbzJrXSYQV(6F{kwwwU8li0 zwLyQm-gTwnV_%);OTG^p$UvYmU#U?^tUgeOI!sQ=e5LUxN>dD)vMtm(b8GT(Ye;Ho zN-IrwUunuJRrDrqZj)`E@M$bqAt-vm2~BOzvaK&~;f*40$-Zi;b!%BtZE9?3X%(nS zS!wAcZZ$S*>DFoGHEU(&Y#y}0D{W~tnQB#-Y94nZs1#@u{M<4hM$ik*Il0L-ue5DK zh}#LCTefxD_jSTo<U9{bdFNW%sk2+pPuMSsJLF;8ZdY*bTX3e`It-@TUj-NzUpjt+ z+u?LO<8Rxb2`ALnl--t2%-2rH*G_<7mkVbH4mty#dlxUbgQyjoBn{_frE3|~?StJ( zJ&J?n-pz<Ef!z9^oRiQ}=O<{+=~SLUw})4-hA-_iVQUZFRTs4AlmhIAzCGV{dQl9z zrCYIiT6+~o1z28tl?D5F=zCP%`!rW&6iB2qlKLE0di2A|f0Fd$!S))un|x_48%@D_ ze<qZAmD+eF2{Vt7WzL|F`=WCSM5ku|vCBf4jV*i&@Hi!)DJIDD3(}n$5P>ZBi%qet z0P&dY0rs}Me)7?9U4wF}q-WE8Xk9~mTZDC+L+;2x&pg1I?@*@uP`V%)qSBB^!!Rvq z7#+;Iq=A?JFEG_I#^2e$p_N3*66;DE=g;3#-mP+?U!y>uQG0oSFx3cCl|<OJpd2sO zxb7%!Hql`C7`D&owCY%uk92VDXmdCYKit?y_JK1v`rzI%A=vR9W`K_+aD9|Mx`dgr zDz!)+i#{3nWR8_13$P%;x@yIa8y%$tPNIV+U=4A1Zi?YVd+F>x>y}_uwoLpR1=Nc& zYG>oA-Jm@ke}uID3;u@_%}$!94XmrC{|6Yw2a(fxU|Vhi*6iqiLn_5L69H4(<*Ap` ztzZ16(XpIJuy1sMPR!)DIS3eSz^^j^5f9)87MS0;2%K0$j9YZ(SYMFD<|e=(+kb!? zWMGQ6qQV(aj0HxU6o`C=!|yx0%t6erG*8Mt|Az%YF3#b`vA{k>rD#9*k)03Ob{=7B z4ws#e>1MW45V+mSh${wa>K4`HoG)ADuK*9&nq&Pc!|G)Q^!hBwbWLO0^6r7?;;T3U z(19SUVdSoHkPih!ccNJ)Pj7T)j0#XFw9>2z%=^C5i~{u419Wms*pNtjuK~1SKl8(K zakl}Jtwi0Yff-|1j$jhzGTJcZ<&W7b4W!r;>40(;m}p4)<b(!V)3(sc8&E0-d(CPY zFCE|`4_fnGu&v=k1eMb8&7Qm9%`WC-xKn#p<Lh-VQCF3J%0}7HCQf{tDN0#{Q=%=w zz=c^C+=#$BC)i@$S|}C*9C-|4`FzK^6vV;g`)vtae8W0|qDwu%M^-FO%9U!{(L^DD zx-#MY7{U4AICJ_cV%at_aN=XnDj9edWYAxXwaO#5`-7b{-JE2^z|X^yHF+)6%V(#! z8L&>pyrRJS3%tlg#qPK@Ud6mOp3={$w4o*@jao$-2;Kr_@1k$*%xSE%PDu?xXF}xh zjy15Y$NPKVir^~61H~AbJ%L6_2RK(W$N>~9kgF{`ps=JqZbUf{z_|*ywPZd{Cj+xj zgs@v`i?v*GgaMw_Ob?7%1!T7azF}g`>j8|o#ZVQ1lrs~t;B8{|?G`I6xiUaEu%a7w zzgJ~|-S!v<_Mp`12z6=`#J=tCIi|Mt`H%83D(oo(=oFiST4o2kx*T9sCWs<a!lXLr ztoN}v1Ng6U9T9j~DYit;KC_wb`B`6pW@^s_Qvl2M#LjtU?8^yd_CH&nA>()VTk}&; zHrq{2P~$ov_mWkensbZpfO+sFX7?lIXVP;pN!j`;xNS059~cH+zd@I(4!=Op9?!Je zh+40}XP5jqeJ(<Grq;+ll5=DP=IDTQ&LINNbJMOGuSUFK1^>Zb_URKLZ%4+0R$xT7 znSUJ70TCt@0lVYalufrYt3Vb5*8O!<p!Fhw*u_lwW`yAl2=-1elaE**;4rgd@D1PR zR6yQijCljgssb2u4$%D(2G<=B%Z{3<OdGg$I&paSacYD3ihq6Q5|Vpp#R?4k;ck9C zhv*DQ*(A{<$7=tLk1OKA^!es0l7rWSip~a5cYQBrd*-kORJeG8Q#vTI6*K+@2w?-- zvH_4|=25pEqJQ_XW`}1eVwGjOD`HO=v9E@~UK3{DSDLP{fI#^o05J0v&(-r+C8iYb z1#LDMHddJ44Zy$8lmDVYJ&?ASqP0g1rDes>+c`e~CPD;}R)9W(^WJH|?=Mf9D#W|* zb1v<G&K|Dti!~x);BCqE|F-!6{|22|`@SU}h~B{IPoQKV=7!Cp-<zbgBN<65r2Q|b zYP%C`h#G_S_%WNsmkNPIcMz4fOPib}2WM0HCsXVP6a9Y-qG(L1|K*%<9rtQog8GY5 z>X3_MFH2O)kq7=FgmGC;D`ELXO0;n9_7)+BOjB##8)-L7)^O~aeg8G#+rGT-|5$qd zvm0(1XZ>*GXu^jPX!Dnuf}?9l5<#vtP1W{GKe~X_Yg)oy@1%sBNFeVG=h|pYm#2C< z`~CDhD&*IT{GyA!?CgJ>v++5Ny-iapa+|c)#_2Wk5H^o<+dI3+DF(FGh`;x`u<ZqI ztFLW8t@hArOlqxd>mGeii#s$-5rs9=i%wQrMZA7{h93xBFR+OQz{Cv-!PcD|eufhY zrR16>(!LZ$q2rVlM$L?w%zx!>{gjI=zzp~b6zahccoXJS%0f_Tr5Cx^)wbzHkvsa- z7QxX2WG4QQ8Z1c2cVap~?xKUq7Z{GiE*0)iJ<a8x<Zd^VM{6(dd%}7Rrl3Jsw39A0 zy~X;+b34M3%h3aWB43N%iY&|J<*%H}ioJ{_6TJQJN-=d^b+Bsi@#`_K$W$KYB-$A@ z4kY^wOD|I4Q1&bOw*pPWTPi887#xlnihs2;D0;w7oNrJTHXFgph0CsrG=ifNgS^cI zk|j3hnybRB`9F2emVB61rB#jo$Ie+D-Yol&1dpD>f>DE>(?$S~zRN*=gTC8EpOcR6 z&0fO~F9-tfPah=O#-G2Fxp;pC;2S6X@Fx!BH3$JA+8czi^*e8c77FqFjuJuC();p- zw#hK|8zQEviIQ=XQKHY<gHf_cL6dQ+O+Vj(DmkmEQMwl*ziD<5ZL?`^)PJ0_EiR}3 z+I)cg_sxgVBn3S#iwdjbXN#%<+7?ST7j6No#0ljUm0EI(e5<AdGKU={DaBIt=BW7= z^OoGRN2yk@vi)V-N2ldKei!0`8x_a0;vxgaYUWIJYQpyw{X7S0*<}I}wwwoX+OvXs zRHB!XSOc;X9q>H{)fWNgG&Xr+I#%Oil^(-wptxmr50(H=Le;GG)KwwzB>|~XvUm~! zQ;r17kW&dV1OS=iegn^wm5)0jCd%w?i~}V+qO3Os0~VIh`6sF%)4VBf%|Scg%>z@; zSB8ae?!lKAs4!?T!oHuznekvVa`3iAq#68uet~|9!%IisVC*_$8A`*W_%<V=?m}4F zW2K)t7XTQFdH$<k<PZ=<<B;&a29U)`f13}A#zyUxEr^vy!2TngV;Duz=9hVhe2w>> zJsB+Z8oWK}N1%)|MMY8@A#P3|&HU#7O#{apJ_b<AtT^bAo4Te+mKY5`n9uROHW(Ir z`-`uofj_tW&o6@-(Zr}Q5hyOdy{>s%=_&KXc-TYtsIyQ4D=};p&?4WMulxKpkNi-Q ze;Kt8_64Zs*~FxvQ-K?Y`p3SD-!e&m(>5)B2saEx25rzX%0%;H`h&%FrI~29WdP5# zA_C@^^eEU=K1J*-M6%L`-VD(q^#^K?TXCVC-Tl6wqJ?tfg4u9~hH5|EP*y_Xf>~&h z33lS5QZ`x_51MJ@%6YGNzVl17$HR%r&KGiysL&pT!cD9{#(;c7M0Ey}bAn-PqOb^a zC0b{?cq2`M;eJY`!e35QN*jP@s_1x;KFD#*9#bq~qtnC>O;TZe{q*@SiVzL|w7biM zCJ`<SC)Zr7Pb+}yQ*wcdFb=oRPkV7?iVtw#kK>X!dTC1BslV1{$>vdu*)tgg^Uv{t z`51fgw@>813nT#)Pz?)9abP5ns=rYf?MD9nY?i~wF;J6~$I`vB|J71fxjyIAW){m# z4Ec#T<rtaaE}KRw7_O+PoT)-uYz;x^Sm^}jqqCX>hCvS;b~$Yywe5&9MAzYN-UOkX z2Xs{WC2TsS`QD6K*~-FnC;w~jVKtB0-k@4Q{-U>|BZcYdviax}Jvh$@P3Vq6jMo+T zKyu+H6r%Vo3oAc(QM?L83=Vh{i?fgeu&3nT6Mg3xK-P@)LlQev$_ko$4w-Mc#G>o? zGZg1*O`VNJS?1Y)Ile%8$Z0#wDmnajmCj+GJUyiRSXev`{$9aWK|<E0qZFJhEnB&F z1U9q{{>iA%kc3A1$A8I4`BEuN=s>PC`p*csBSyBK8!V1PSrP}dH)0}vAM*{C1?F<% zQNh3dal~)|T5wah%T0;npf|NY*BbQ!wMzU&IGFm~_c{^8sx$$R7(*LW3Okug8osC4 zUGOKZL5&PTQ>MCkJ(h3mQjX}Kk46x;#SQ!acF{|#C*eJFYf^=RK1%^!(zM4O+x+5V z{V-g|^W?u#Alyw^*91xn*NBgx9O;=fq7wz`epe2&4vD3RFp{MLj}K6*+NZ+j8v5Gi z_whv)Xtg%uu@kt+pfD5&tz@qLRfB<J4UUFcHTP_0Yyg#TmAU8~DWhQXGN-Uq1e}## zV!B!8+uLLeP@1=0+6xSF7u0|dtbXGkb<IuPsSD+7nme^9|GKN6_Dr*S`?u%{e`KMN zq;Rg=;MO%3$*tKVWaEnMU(L63AIHyGh-MYC@lU15@6BofLJK;U?bF%4Ggt%P2Ig<g zHak@_TQK_}3G#8@DYc)pU40TF;le#|t`HRl|Mb$GI}4Z?{Gu3rP_R0imBHwwE^O~H zwYtwU;4<#;PKA20dLV-2IvF7RHwV8>!=KxAI==mH0nggew+GE3G-b;ojkRNq0se>1 zbcb>$50K7->!JmoZB?R&siDYx?^wHIvP;^T4a8++OW4ViJ@xqSfZO_A`-8bcGnLSR z+w2Ds=WhJ<%b*LAX<&!5g_*8)Wx-_jUYJFm>fDuPff*Uwg!8zQzMd1(_<rV|!7YvX z{9o+01GSFlSfBJeeRKO?^KY&VQ|tE^;w|Ahxpw8F5Pi}6Hf{}WuU+f*z^0q8!7B(m zPWh@=8O==c1>=^LtN3zf4FjIVtM9KL#zF<3%5B9AIxK&hxjqvsu{PwL#~nEAu^|#c zyuL@;H<@g_*QW>_dZ=vs_-_;gpGv6Z8X}Q7T$bx*K5)$V6mLv2mjaM+u-l3&IRvY7 z)mma-MgPIMv(UVR!>$Hbm<RK|gd6ZjREUe_O^QZ%=Vb79RW(+<_;nG)1<%SMcb-J3 zdkZF?gsEY1`YcvDeL;oTBis3gc$<eF{iIDK3Zt&U@<JBrhv~`zbo)dLTIVndx^_h* zbqjBY^2&;R{em2C#}!U5YH|Dz1)b(-`6HoW4}=>&@gS?by|E_gH+fhklBEH6ph0!l zR!81o7a1^Efr1QD&1*!AFilKm{sD6X8|L{Li3(nv*@y0cDwwDSjHyz|g2Ufu-=m05 z_|RCA87!`9KofA;X(=8iLM@D-jVet|6P{E{AS1RB8>ckOGb|9o#SqH8%Svj9s_*-$ zpptg(y4QeHvV5}Rsj|=S5=mY)6v!_Tz6j4bimYiL-ulc)Y$g^`ge-L>l2q9jPC%uh z%j-N7jQy8W*p3lKM`CI6qXc?bbrF+!FE{ku)vZ@5@=u#GL(v~WzDiz^^<kW@!yf(9 zTIrrXB>69XUy*49Lm8<-N8gb#OQNi5yCDIK!XcWBo5?8Zmjfc$^!}P60rZ2IgfhQY z2HaI;3L4QR4TFzY8iYRd*qzoQ|7!n+*4PjYcPti69@k`Q`EM{dtLv#JKUl<(i7SG+ zDxBoYY?c(OWpI#1#CtXJtR2qMub87E1mo83aG#-HP3`eGa^HT*ZaNR=@YWXkhmgr5 z+wB6bK+&lr!7=i|QaL2_+9k-7{<;3huG9mvx}k^+vSEv%<hL@%yz&u60U!BC5EweA zAL(HEBkFl&%1b+{dgZ^#NQ#3++tY$;NWlHdRN5)owqKCb7Ja+ERy)6Rf09M+cfp*o z47G@p4qSv!;2nN^2^z@~i!cqi<BNcd3^Fm8=93sQ3vC5c!;H<>B2VJL9E^@0lE@Lu zbAts3pK8X#C%<;;=9q^gzi&nR|EoK@mdG~k^=g&A6>Q*IMLz5WL>7(SQgfxkWIXy0 z*Cs{&sQh-cJMoSKuBjGfK@m36Ar;>ZUKS0RRr&Pg3g~Xfqm6<U_~GlQ=H~$W&}!At zgF#*tQgn3E$<m##5F91nrs2eq$&g0sTN2tp!T1xyzTlz^+A#7we_=Q`Ktx{8&d7MK zX7og`lIO7!&KNOvMAIcs^g78D^<MLsA>k%vqcmumkOcVRgVMxFOuQwut}@MH)E4)z z{_QK#CsM4RRD3SL8Ph9eR<#*O_v7$`D6jd|<cAQ<#9IvN^kiO#WNwUvO5GV@2@F9A z{GWy&$q|yqb5u5*>q+iZfK8(k4ywIBr={X&W%6f>v&UuoX65H*74~Ko(Wev<=Dy?3 zDbdX3h0H2T%&Dr)#c0o|dn9r?%zdAm(TteWdczgYS5rlp)!m!ZGn>^{m{UQR|3x!z zfRP}_HE*akZ)7xY+?V{#Vcs-;-YkFK{0#M1-Mr=8yp;p0=H9#w2EYbkVYGJ6c5mA5 z3|E&+1GqNl;IL5sIOjyFWEsEUTBl(pG4D3F;IX&hdAE?~J@19P=mVYF77}#jTJ%@b zl*L^LaL^1kT@3ON`Wvqa;m%vsQ(6dZ>u{XY^odxAj1cojSOU{%{T^M2kywgTTZ(TR z@HSdX3|LBvU#b8uCD$#b2DAkCEqTl>rF*o5-D!1ySk@g{%-R!(<XSd=Tg)SEO)*+7 z4A9ONSSre2E~#5CHDXHaTQ1vMF2B<@wOy{jU8%Av&7fH^=31#?Y0g&DDgC{o%CKA? zz@HbtqNcapT-RLLx6-z!Q<uEljsPvhuXdH;m(i^DNUZj%>Go)@_B*VW$gB+D&JD)v z+PFav(VIqC;v4&PQ*u|v?`B#M)>3CyrnuH-)RH<R*5-`X<{j1wKCLdquPx>4S+lGy z_pPno;SJBNQSYrm*5m2N5cE;7*Oj(bx8f@&B=p^J*7n+}R~*(4<Mn?itsT{^pY*L4 zMy#Fgt)JhmbNjDf;BH)DXk2^DZg6chF|6ONW!#;`?HK(yS6Y8GYTM8ML4~^UGPm(| zrXE=I=^bGc2Jh$3wRKqT%@2}4T}L+HjW-eTkZ&C}`}{VMJ&7LjH~&@rl=Rs^drx`V z+ia@Y_(+zDfVYLExN*$2g`>WOE7=NXyoDdQMZijgm9Ry0zJ^l2Ro$~iLMA{anTD<y zhjITa_i7X5*bLw{$jjcMHa3`)*rE;Grcc;rvfpB;-)8DJu+`dT-ZyAn+hS#HW<&fP z2D{BJoXjDK4FPfQBrt4qwewLs?j$a4^A_xscx?0c?+DKCnBc;2t?!5+?ux!g@Zs%> zt81}y@49~3{ko6OX}s%iYshxBBW0Y#U9c<bw<8xxAU?mV$hs(Szxy3;PiZ`Xk#<i- z(&)?nuBx%oAH7}m_i~LuBfF4Yt%OAFcd$&okz3WS-g|-k{hqtl-cQ<nLxep8$$dlh z{q;|KMvnU?1)IMD_sz)Ev<mjms`f1+@pR{nt+)1pQ+w8!iTZdZ&9M7+wD@L{2M+f$ zzl{%^0!@sp_niw4Ts`$1>JQvA6g|poE%#0IpZ2}D6TA_@fACCAK?i>2Dfa4zW?ct? zfu;n14<Nw>hoSx3F7=1u^M^$qhY|Oty*CF@>M7B9W^ACt7~1&Qc7UJck)F(90v=Id zpqWAHQOfv0Nc~aT{Ly3IVfy`1X2L=w;&HY$e+;d83j1-c=f`;UW3*q#D8G&h?qd=Y z%;UgECA2u%{l{hfd};f~6^IsnXGfK^C)M++W!xvVWc7LKCt<%%>LtSp15ehYPd<bk zHwAty=|2f<I&Q-R)ZU+T(lS)wopy7d#*?1(sGs(=3w0Ww4y>m&1fF_<PlxV<o9itL zI!|GmPDYI}CRkJ25v{uaoKA6DRe(-s)X(M|=X;IM76Q-mn9ddp&T@-Sm-Q1@`mOvI zPa$jd!Rr}O<M(G{MCXaXvu(-HCCT%>gydP{^Mk;1pu^c=!TE6l{a*d~X+6Q(ytT#F z`8J~U8Ro?U;QYM)`%Oa9j^ss1=lPxEg^%s|L&C+A^_FnK#Y_K1zuCp>zK!$K`8!?$ z<o@ic-Wu*l<n_2s8{(heN*4$wx=2Bni6Ixrg_o#w%}4c@=nI#BmM<}#EIu~i!){o8 zD741<hzUPngMehKV|IzKae*6j<#)9~P<Tb;_4}p%ie%x+-{p$*;Yt~JMNST;sIbBg zvZjJy;B?sF;$MF<vxT|1qD{2pOul4jxMpG_MjyClIk^52a?Ofl|3-2B$t#LI$_hel zV$FGhK~rc$OLz0Z<@){ony2t)qv)D{;6|{JkY(XU_~GU$=|%+qZ~3PiG4gP6FDou7 zYY8uO?o1mVp1&Kx_V1Xt(haw$$yag<w+d{8!UwnCknW<2Zokvr1&ZD(YlN!&u#zOV zR%b((O0<!dx~ojOeI>io8n{CmztcOo)5j<Lf#g`*c=r=u*?{MMvr_pZe)w@q5Us}D z?+W|v=(`VQ_qd6ULL#u%;3y6HVDpQ6|4T<-<Od%DCm(tzSl)-fNDmHD$PPA6j*xq& z#0Td>C)*$=w@fGZ3Mab`C(j8duMH=AsHO^W^8M)im)zN(%{f5C*~#Y7-^m%`k?8E5 z>FihG9N6&~T=*E#;2b&N9JTNmiT@Nu{uE936wC7z7xWna!#Uo@CBf@4G4Ux$#Mu-n zfdc@OHsInj`IJT;oU!4OdEt_Q|D4I@ngboE{pgy-^PFemn)l#R^y4{K<GCQ}xg^oG zG}E=P@VRi{x#Hou^5VJb;JLcPwTkDZOvJ7F$4l+PbHl`QBa&Oa#!GY1OOumZlhjN7 zfm_Rh8+6UK?ZK_};-wSmwPV7qo7}yN=e5_wy_d~>@W*S9#%q7n>u{p`$iS0gk?T0V zx6UQ9G4Ra@<e|so0ZZ^U^UY(H&0}8UZT`pGV$j=?*W0qw+e)Ix%7h1Gwa{aI;cb26 zZ4>Ez3-Y%8@V0~Rx%16)m(Fuv<9+|f`(e=gk=OgN)B8!H=gEZUX`$!&!u$Eg`y~?O z3i5va@P5LEJb9524~!2ogJd+lU4%fsCqo|SkYC7=UlY9^pe8XA@@F_iOimh63Nctj zAeJulyJ=StCbps_0eD*?3?0pQw-LBK5K2bl2rt87C<CTt&#`p5rjbh`GKvg0v)>;} z;dMGbZHhVgmdO}Yz<kVMGMV=^3QkW}rFg1P5v*uM6o0H%Dj#6H*Nl6-P@<nH{CanJ zs#RmUP;GT`&$8NRcQ9RM@xZ#?>iTefcJjcs+3Aaf&1(7hX&cfTicfbx@W^gZ7fq*9 zZu!KqKbpd0e}4M(`EW8Ef>KHI%y~RpqETag_RMv<SZy*>ZuP=_zS`_`bAI;1bGg|a zgw1CC%6q*#ocP)1{FU$aaJo>X!upN>{&cy){^I;i;PG;MAePPMUGVw#c%jDT;$7(V z@%mt<!UiJz{`&lIb8!I?@rFg^rSL%@a;ES_VQi%E!{C3U@CVBBf&y^0ok4+w=8d2r zQrAaNFesFlGK40@nKG22q>(a=rTLLEoPC&=DuQd-nJSX+xREMK==qT<S`3ws8Z1HN zLLDQ+*hC$x!2d)YrzFcq6R)Q2LX)6n-b9nA=lVpG1o;)pN1JSv;zFBZR?<Y9YSsKi zn`S%AN0;uf>_V5}a@<6h>GAwTm*s=XPoEt?<Vv3t!q`lo8^Qlfp9hxZXULD&c4a6? zHg9GqOm}@|D9R4yXDrT7ab+wiE@@^gEo**e{8u&1&s0{o?8;Q$bll8T(f0hzRM~|p zz+BZw<i=b*#Mr`IGsgeITstKzz*0A-?Z#5SWZuHku;%*0(zq2Wz}mEz;>Oy1RMNs) z_E7n99&+9-z}9xR>~_&)xY=?M@O=Gpp<4zcc<Bd+?S5$;10p$O@?vcL)Y}2ZWADRV za6^ke(>&c}D&&+I?ypq@a16OQC~*wG*@8JnAdW7p9HYI8B%jB)R@^_2^PQj<v<l#d zR85HK@YPI4HginU!dYI22}uZ?rNQk1-~Q%42+B{+s#>t5wFud~aV`D|6RQ82AML@t zZ03eoy=*nW9kBADf`n(S+~Le&&E=$xM@;HQuVTR%BE-A(w?~h6JDoJ6vF#iko^uDB zX_B%VFTPH>7jMz-0#^R>&Ucs{Cd_}7pZfkVS6C|i{kXK{o&U6I$Fb?OZpBmJyy>J} z;G*s2UEs0{O+@gjkJw8PnvLlYycrXK2;NS~i3r`z>39j<FIjX5J*>GwgdVrTM1-IA zQoV$qk4ig)U(Q+}!mn2&A|lWri<ihd<O%yY>D{$HgADQ<R0w_Ey%7Z|;INB25#VUO z(N_~cEG0G}ZCgMWLn#nH7j<FSRr-;=QXqe!?*_(H`qK)6P*sY$ajOBsK+EiUedHd( z>B>OvzeG&Kc0Huml|jUui;KvIJs_fBs}OS{U~FTllBw+PY3L<H+wND~;ZLF6a0VIu zTh!G0#^@$mNV+ABcxdf?_$b8#nWMbX+Q^;k;-le2Z@YbMqCg4VQ*?oDUVM&bnn*a& z-1tRl0@3mQD5Pz2Yy^r>e**A#msL5;3oHa!)9mkTx2yj+y9Ooj5Q9?}ePNCl^S;8- z#yBP$(iE$rF{5sRZ73rsCc1ke66RBES-NOU#b1Z(RIh%uQ&7`fP=+8k4n;d$?NICC zjs%@vvlTOA)2;c+{1Dzvb^saQnKupi%d@jJeT|_-`!FgmF`1Nao(I#-7j3+3l;*^~ z7n8$B;M9B;k(2yehlD^(9+NuRp^3)t6eZP|)(U(NFcQ{tNfekz$?(956&3UQCK37z zeEpgUkJUX<9}bra4}0iK=}N>-O&ulUCnveH{V`xUAp5VKsm^FJwIk~Ak7%qzo^*+s zZc9};?6M!2g_6?^d8#lHV`0(}oPp`qH!NgAVO%KPQcS{M!>#xjX@?dSbd5ub?UIkb zWN43xX2;6?lo*k@@tyqi1W|!8hh@-lHK#8XHY{7nDUH2cPH5<sC{KtB({sbotk=XX zFso8lMY<j}!Mq1?kjC-nha~jJgjSn~nJO+&`cPMn%ZQK;eqY(vs1<aSGnorFvfrJo z7T&EvnSv+87|E}7bzs+th_Rf&o%LD8%S%=mwCTao@?D($)F7d6fO0J^no-XxldfcT zg|+7M)v5WbYx$2?X=!Ke2K6C@VDcy(qQnF+#o8Q}X6Z}9>M?SQ2bjTWp{4cDc5Ivh z0c-Yc-*U_0T#LyNJn7!_52k>5?>aR$hq2O4_|Hi!2c*hY_}BwTsb<}S;wI(}i%X4- z_);$pl?Kddf}GPTO%Ugy%eYhRZPjdNRchK`0iD$?dWG<eU5xw!WuD(;Aq1@Zd4Cc| z4Wz#)&ose<M|<RFb~<2^#S|2!?J;h4EBMU^;Y2F~r?B=I@QVkGSFZxso+lAMFMZMN zA5GrCGAdC9k1fD{)|)5c;mxESbI-0R-_`y0w7E3q`Cb$K-1;*(MtY(U8(QtQqWJQm zc`DNL*6x%91p4Bt8Cw3gk2T^*$&4s6f2cf>K%r3agZy-=Fjt9+6{%7wKWl+?U5YmP ziPlWBV?{YvxqX?%BD(WJ`#V>qAIs@4^6&G#!rV*N;ipEQTb9N>xodM-&dgL=mgn2K z>ubu+tn6D>*54uAjXf;qwy`a%`@%fUGiB!vH7#rBo;<BPEEg^_E$jE~Jnc7S7alh) z8}IKtogY{)p~t(Mh$6h**yVpfTUJ}f=8Zj6tXCl_t=o7V&{k6URfK)(4jF`Z@Cy{p z#kTI!itr7qlwZf!wC=Hb@s0jwy-A*F-RJJ$8@DgNNxx}55Qgwg`mx?-W49fmP}fb- zrQha%ZaY%+;-AfBy(?B}J67-DpRXyuE3<Dq(TDIa_ORYp#kQRqiwG>wl;79Yw4GUd z39Rn0J~Yj=ojZ02tlyMBwB58_ctQj=Kd?P^VYgofLVi|!w8`jYYKMlJ1b3;}o`zJ~ zuM;{1_aUDvp2qCkZ!#c)hhNy9r()Z03q*vDRW_J^m$u(c{%So5`tTCQv~n#S<q^0U z`m%P@{=hc<M!-acvVrZz17vMqu<=UUrtEk+`qh4u%l3Ap((ye1aqM*IuX}Tk*3$yd z)k6>4`&BGNAi~JwX{O@+uBPMd+)Lzj$M^klrUQDgD)N2<tzO-9K;9uDFo;<&m=v&h zS+HajaI{%)tP~%(vpxt@z)NPqD^eh+XCdfQAR1>OT2ml7{`5BWLqbGE4x~Uy$U@1W zKrP5ZEvG=M&q8abK=02&AE&^W&%#)zz}(NmJg4}0pY`#b0)UtezytyDvVmkEEZS@= zRtN~28+sK4!ja6zQ3T<tXXEOF@QkzZtU>sW+4!Cyg1~HoNDyH{Hem*cs34oD97J57 zP23J5>CYw^2a(Qaldglv3YN<PHp%w0$MSJ^U49^-Zoi0;G>ws`5o|YtwmpOKG5NRG zth$4qKs4$(H2RdZ#yPaslyr_cbe@#-fjRV%lne<u3>lP+|Bbn~Y>T_!^K5}236M~@ zySoH;2pTL9f@_fA1VRYz?(XjHUQoD0;cmg*UF%ftyZ7!rJw4N>=bGy}=N0gz9`O7A zKWnXm9EJ)C#)ce55Cv0T4ilJyc{Yc5mSnd&@$Eql^Gy!x3k4fuF55dwb~sdSEJ_Zw zC3YIh_YGqqGru_!^f+(GXgG7Z^eDMabGdCOc^q?jJScf@2+0-6C<Ai&GAQ{Aa``JL z1sZY%K$L=gxq@Iyp;<_-&?=?yPOk6?rN~XL$P1+?VxH(bDlwcqF%l|qnmln9st??G zAB3qSr1B&bsU+3%B=xAIO!K5{sH7e9q&=u)0`g=csALoJWHYEf7UX@bppt9IlLJx7 z_vOihsT5}O6jrGeck&cZsFZH<lwPPlA?AO2N3D#LuS`O%LX)q;Lj9RL|FbZ)s#LzJ zBJ~%w{4aXcYNq*WHq`2l`RX3j8Ugtl5!9Lq`I;HjS_S!971Y`d`Pv|AoxXe>FtzS% zzV0fu-cG*W3AO%BzWxif0b+r{I~qfr0z(p-uQUZ;S!j&73yg$mjHL>U6=_V=3QY89 zOic?+ZD_tZ7JT!7(3k}jm_^W-Clr`x&{z}{SX9thHWXNbXsr4QtiUwZvjx_xG&Val zDhatZHwCsYG~W>mzrUlk!zr{AALOM#v<=bxcBEksTCr!@H4rQuM)<U$8Rak}`5j&V zX2u_N5a9fiR-ad~L4kr*v7e(_l1U-w<HWKv4x+0^zoRhxm2;sMy5E~Dgk$+7HxESm zo^SdRpMHhx-VH`kT;N)N7Z*SJRw}0K*d@ick)soYW&5%3jaQnVy@mr|?*kcnsiA@n z=V(unWI#)=fjc}}Je{7KnQk#6m5;t>O|R?61-(0kK7{cw#XetQDds0%^Byy^dHj$Z zI+W<Hh#X0GJ&3eR-?V7Z1WL7;p;M>ma%UI*z7~wx*QCB^;Q-WynHc^AU1M;<Y%gI4 zK_E{5ufE>I21%;)Vv-qz56&H$Y2Gk#`vcAUwt4%aMSF%Y^g$;GnHdBLdb6TiX4X+Y zPKN3~5Dq>>q343r<dRh+>cvf?yB!3>vV|pt+&%}~!(~tq;>R0R#(PJ=;TYaaZoEAZ zl^;!F&^atRFpXj`mWb-BV=%fZG7tq5vh5YSPrZK#=uA>(x(|J2!eEOXK;FqPRSidI zI1#>3V)FV>6N^y?@6hVgF2b{gu34#rAOqDPu7Oi&_snW2jbEyVg^9-QhpI{9UfQ~M zh?O2XS+kjXgs=O0jP)t$!!p7C_&R%|$EB9W2_H1E2_-Oc(#=)&zaHZCL{m>p@6Bih zTWYtK27~A$$`6beBpqukLRFZC%fAFTml+gU#->;d()4s=Aev`c9vL3m*-T_Q7X64) z?@?pQ{>lUv?(uFw*MbMI)L4xjm36-<*RDD;7e&XtXS%EQuf7g*0;7&12lQyA4RagJ z^rcVO8_aIViT>^HgolCq)5!zCpdnHGSIi>BaCx9Qw?C5XLkN-VKRbCf`NN6uTwQ6h zwFRT8ygv?>lRwe?2WBy4n)ai*eD25ekM$)pr5d#s|5+yw$}Bd1-yBMpYpl?1esglL zGTiuwS$u`^cPH;({GC%X6wUu5vnc&cy=VoTEc#rkH`-EvI0ty{%uoPAnZ+j7o$_F+ zfA@FxDrX+=Qwdcyc2dC^lRAcsH|req)mp9ztMT8SDmQvTeucTOx2wUGPx%Rh+8%E+ zPCGM|+Ck5ccbA82r^@$|$)c~bNIcW-r9Z*Lg9G6ixh122`vRo?_IKj{z%eZ%mwshK zhX?11zh`K?8jgoy;{9`e>H}<!YECd)AKhjc=d2l}^!9>8fDG#D-e#mIBK?-=JUK6w z1uFr~TC_a({#NWKDf;a=RW<YNcn#Bg92fcGqU}V30Q#LI;{@}aWV3?eofNBveN)52 zHu~K(hgtL8bf=x-LPzVP{oPD2M25XAKb#Ql2oq{^I;fbfB$-(@cyBKc^G0?*KgqOY zzrdk>V81XcfZ?DhFTvuVxTv7yprk_<nJOo$8q$C8$KS~qU$y!Ve`g0G<55))j^$DH z08Qyp%?S75QSG=C<KLaU`gzmR<A!C&zdLy+O<M_nck)hJjv5aC>g1iaUd>vbw%zTN zo`Rlk4o}-*keJRopq;$4&eybMXMg;iXWam4rt=;wb*uAUyl-XaeMG;G&ily%nJxyX z60I%<=?cp(hL{?UE{56qnJz~-=d3PAd3Vb$!GgC(mt&$x%va+QxYkz_GPLDalkz;r zS5u#)nXji+QyqrI)CuE$ifLm`UyJIaU^T!PMTUP`&?tnyn00E8>z53=nH!dkr^0U* zof^|`mt6ZHE4Ry@bHsNmF1X;vbq~sSO&dP%74O!gXi4rjVtMrLH)FmjHt!_-h`8U$ z`bF}vo0F*cu<uwX+;k98>(P9eX4zmYR*T8`INOL82NVUOj6a?R&w--OsL(T`&H?0} zQ5T5pkm$<>efYK$G=<8jYmho?+YOyzq>%XP4^NdloanXj+u_hLz{6;%e#||VAp|U$ z{`ym&=<S?myXgH=WIN2mqdv?%k|+fIyVuJH1IW#{4tV}3Z#XdnctT#W*Er)o7_A0k z90Ov=7ExrxJy}Q}nmW-_KKaox86t~0K^?|X{)|Mg-x%JB<2OVF@YWfkGHQGv*%=Sy zKUznE_}+Ds!<`37$#0+r4@gk4Oa${-<zVE#?j=^72vKUy0n`piGFVgx>GtFxQGP~- zZORTa!y3S!(U5xIU>9y<oJ+JRBh9;b9`2O3NsRC*gzE-9+ym8^<nZ-?Sc@T<&z2Dx zx~7aIcTAN1Q!eGqz<}(>n#lOpEsE<TY1vu!*x(*xst?W5G8Px%Sys^UT(XQz-+5dd zQ9c9OpsZX%OhP4<34^uyfa0osVhX$|qb;AD>d<6D7rZgGrul#|!(?&>6%DIV@~|dL zY+Re5DQ9-@uu#`U?BcR9SK<DUA;FKdPSjn>{QFUxg7frG&O!LEIh0_hKa<_&?TTIS zK>!{bpEDj&i#|M=D|zGiWxeJq5`G)=DS)9a6YUx5?{pat!imd4DW{VnZ&410`aAL8 z(o2i+t3<m@=iyTC%gPN+#<y_h(^(gNG+b0k0jU<S*V8FlwoIiSTon@67k_f)SIq*) z70GZ}DEg*MXOZk+ahDg;pU}_vr*xHQZ0~)kPx%sT^9ANJ^`0pBJD`T3rwl=iQEZxj zwx;E}%vQltXO4faq3gQBzL!z=+G4Kt;b*1iF{1$z<9rvgUwL4;<=6X``3~-csz|Of z7=VCguUbNN;!i76a-im*%1vzo0<)=PspcPlXU5xd3u)luWW!Ber2?}hz9n)k#N%hp z?Xs40k5>Ip!#$i&3aBo6(NR)w;Xe!rRoKhM>g=$n!;C_iMT8ig1CpL5Ftv<hW~uJJ zBQ9`tyTYj)W%UBb7`P>53uWkZuTvV^&WI}=))@7#z;kVP;jFHQz}3ftx%Q|0Qx7Cm z1GuHzj%Ud#FO(4jgk7EvH16*{w5<k6khv}Zh|QmJ`S)APrY;h2RS-4m2F8zh5R&@` zTa*B~o-K>sZH@|YCIlSGPP|WuU-iGDZefz3_4LER*1-758&f>b5AYzyGdiVi(JXEE zDn``Ab^cfa0kDQXgKH8-jT@L<HOX{xRuUH^joRyc%K1rZQ|8>LXlk7yLpCHqR#s0t z{7Va(h5;cVrz5+m2F+vsIY$aTp8+Z`TB;^H!!f09d(rqU6WJk`dM~Kv7P2jqa~6~Z z>dVOQt*plYZ!YDHTg^qHrN-CDe-^*ORtlQVkw(wH65UV*Y?Up33f>77G10{kUwfGA zh#1ND4X-oA)HY)lZm7Rtg89S<?c}XumE;na>l~U)OoJO5?2L}AFUyuz5fci!h3XVN zQ<g{hxuA2wgP*L!i!QK@z+DB~t^wdG8;}R|CE>^&C3FFN)7XKunrDvLs(#iW2SigW z<8Vw~ub<@6CPO$6(RO3rL<}os0W<vgv8;Z8DBmICQR*L?ruGKXj*_bczDW2ixxq4r zH)5n%?J>2i3Ip|b{>mWsy%bcXFGOkZRJ_WWGv1N<g*O>nQ5g2#-G~HtU?9_@IO_AW z5luUPfsbNhzUA|w)-C@$63tEZ?eLB%t15U3eA9r5SZ(g;n%cyYm_7V_V$LeCdY*sV z7CN}^p`<aLO6(-6*>?7Jn1AD3;#c#P`+1c9?Iz_~#o*@`9kceQ)Y*!Au&W-uFytwP z01X!y`f~NEQShKQ|6vB{%~?hJ-0wmXR}Ny(&7+Fo$)JQwQ=P|c$L+<buV?u>rifOu zh(`i%<<pJ;DMhxYN4(1^&XgSVGRG}^lbrv2-2QFzjdvU5wiv;~Z^YwCtwrczD*y3X zAo#&%AN05jv3{tOd%4;Da&d`9wQ~u9q~N-9lap>Ec~!!CS{b?vDtjT$d!hPzzB6M4 zGyzHijM3)_HUbH;oxE%9Jc#xv4{p8ZCq1~(;Z?i<t+Tjx>R3R#pRWgSFq5d6>3leO z3E4G#3+#P)Uo$*5`r>bRYE*j*H!+Fx`q_T-<G%2*$o7&kW1ye+J4Ym`fkRh%?cdUe zjcVra743Z+?XP8Kn!ydIyY)xI@G%ZzqH+p=&+)U!_O-YRxZMc&u0dzd8|XRd>u5$Q z3S}1YY~bbtuQ~(FI{myfg3vw(1|-o2B?YB*`iDW97)b7dt_=fXG#Je_g4f7{%&LQu z=7T4@f-?qavhYGoeFF1jh+LgQN{UQ9n?ky>gH6SPDtJRrI6~^^Xd0YC{nvw9g6N~? zL%YR-I|k?zdBYlDLrtSY`<lY?bHYY=slj()3SUDe=Lw4U&>1ztf5n6^YT%a7hnISX z8Iy<p)`%Fz2;ZTj+DnSC=?pzeqHVv6C?gNMxTEdWh|DC9Fs_ccn~${VihRMNgu#y@ z5D$kB#-DSFLYC!NYl=$9j{GVX@s2M#k0T08mK?`9T5~;uz?|lMJ~~k>lB}5KmNzC0 zHu`IHG);4ia83+UGAR^WyflpB(8PPA8OsadV|$w%>+2n3KpriKANK<zR(yd(LNiXZ zGg=0pnzT92k32?ElbRYo-gQ0Jz%EWTIsU{uUW<<iiY+#a#TwA#^6({?(z6ISCww=I z*Mp6-xKEJ3i2trhXwR2On;qxKN2!pUXa^hb=1lqdKGCc*K~Fi+$2lp>FexaQ0E#VU zkS9do<Cx$l$Kf-XYbNW9CF!guBrPOAP9$X%<7eTg0K60P?#W!8Qw-J<OZdp4{!aDm zWF7XDD$UeiVyO)acumQvfw0M~gIKZmsa>-4iF|1v$y2pDllz*}90t>HYErw+Q@{%( z#eC`Vohh??q?O6(AH37FVAGfJGrmAzGdA%3x06Xh&KdmZX$K1#-&E30f-zTvv4`+8 zZ}#!FoHK2sGn?ttANC1n?lXrcG~xJ3mNc_i*)ugdGhZ)eF?MFX)4~A|Wa~#~V1-~D zIcF2NP@Xks(`09<DQA-K=UB66Q?+2zl%%{k=M<r5F@<2v-{+LuWpO;9lUZQXYvp3t z`AnQsVM${<^kIn&p$jr#f3U#*f=9%s#V$#QC5=q}Atf(oJ?!%ytsb5+?s=ZwI!c6H z{@~Z_v5ovF@`BNrY(yg}4@Yc}Bf9ZN3@wWwg##Pnk8~<t6gt%faOALXS%uoa>EYOX zSzwEhf8?r?=Xg@&+ahD;(B!j1$crr2i#(L`6uXKz(F@(gEHlN6ooezzeTo+ii@Ce< zyE==BCkj&5$p9*7%+W>a>(qobIlrqZ>Bvh@VJV^v3pF}RBC<<!)^k|1i?c3r-;xuf zs-TEt=AynT!@Mv<=q#1aF2fejRoy6a=q!^UFVplctS~Ig5G!KErN0&{@AfX2TrWg2 zDi?t*ccdr|$*#y;ub^)xu0q6O<*p?5E>(xCG{`1;_(-33K)$sYXi&nIF@%KxL}%V( z;P9@f`&z)%S-}fijW$tPNe=r3nKb7BJ@vOOMkyd`2#*j5h(abnlEXr^1h}MNU@=nv zu)w<0N?m2Z4$#76EXAaSEa8$fQo&k!kRLMepx`f-(Bq>J2pr;b$+1B`VmFXg(6QHL zD%WXjV5-RJO3MWrch;48*VAU#BN~>dyehrytS`>4|4K-XNMYQvQK}(UO$x;Of<pb- zlF*J3=EpGZKnSTVA%?XaPS63at2U|gA;6Q7U^0c-TN~X3$i~iyEvx-ruQYdMvMI_H zD@LGMjJ+yB4*gwfbD97t^HMWLb(1`MZI*V6jB;}U5VHuFWRThtmEBMwhyIHYn5f)T z2L$8{W0krBADV%!D43u}AcJ>vmo^|(yLI4^ATzb~RW$G;)aF6hMvLA$X^AmCoLH{i z<_!y!vTIW111>^b@fr^C`G8^IQmnbu){;elqBahMt%)(Z>HB({i6Pkq5J$e0?n@ET zt#%H44G47tR4AK|yjddtwbWO<mCCM~RT)HlUQ5*3k?z#GIMFTx+lfS8QgncA<^s4O z$U6g~la~QlT>%6WoojYJpR_q{2ttO339eF!gSAi)iEtxP2yxPIc0;ko2|?W$-6gO+ zVbxuP<UK8nw0IO9m`i0NNg!(PPMbv{PrGg-v0fVVI*RD-pN16(-dz>ZZNkgA%fomv zRhUv%L|U!r^raZ)t#~<7=*#?gzk#%Ntznyw)OCw^)=U`0sYJ})9i7$Pg@?FYWf(9- zecb1LSdfXX`I>%Ty8(~&o}dx*7&mknG8jTPOiNVOWF3Io5ynp@CgikMtgviZ?k>ai zilQ{8kf%&mLDFw!q^sF<5%SDFR#-xUgZ;R}Xexs(R_LHGPK`8LgQwx2?0tRJLyuhp zS{(g-%ecReDC`T^YSZ$+kT=w$QZ`y)J!y=NJ>_&hjRMfY8)bmpuvX|5?f@09GOcw< z9;>+(d>{|LNCRA<CiLozS$dBMAB{W^;Z7WZz3s*zBZ=_3<E;MU?snkbRB(USFmm{> z<FM9KL9BD4i6FP}*X0wc$zymzI8R45LppRXPZQ?o<BQyrekv0mIwv5SU8Xs2c)#Xp zLzMf7*=yw45nrwMDsD_Z2!=$-Q!dD(Q)?5J>i~G4JGgKs-lb!vG64X(7|u@w49wU8 zYBO@{C<{-6t5%aM922Hxn3+TbM($Qj#8|k;Gp61%7TnW4>r>aL*%)DjHo614>$42X zv(<LkBS(}Z<+FO|lVaHwPS2PwZ)Y&<rcE$rsIw8$b#&NOCcT6rEL7%|YdYD|8NLx? zeHU5?MxPc)00dfdq_=@t_!h~07hTJ76P~G2nOhZz{X#ou9mSV2j@b;tspbSR%gc#N zgy>VBG0okVdbJlXi5S|2Y&{j0HOS|=zb-k^E{v=s;1Ms27%opS$Idf@m&%8s$8unG z`pQN)R`WA(whgmeXtiQ#Wo%@Xt9ki=7#qyoHc7mu?mgM-x>{nnwmiCKx4vrlw9-nr z`l9=rM|riibd4{1715>{reYWk9CNnvTatZkLVFDhgmuT<ikyLop0R#?w{FO^G0FJ5 zQSLWc#s;1D@5ZHdp3dJ4;2bIv(EHVBOp;AO!}XESb>4SlGeYA+ENxtRZ66|9X%vBU zBwHUr=uC=078^`9&=#)N)`Z+Prt_wX9wvWAt6;|V-t(rH;kKS)=+}r=6Az#?2~bve z#|jKkAOR}rVJffgz`5*nS?<CIZ##f7v?E$|LA#vQ>pO3^yfRvxz`#IAMvM7Li>2P4 z|I1DV;jXt0BIE8}RO((`=>A>NZh{SlyI!m3>OK?s-W$ceoQ&oa&}tzFD>S1e9CV=f zZoimu|2_L|6-h?1%^v#be&Y*zCQEDf>LIn*0kh3P*E?{3239k;x!k6uGUJGs<*-2R zkj?OL9F#V!*Rqfi(du!GbAH%Pc(i(g-gC0mCwxNCa-3dz618-c|9G^gxIU@ZGW~)v zOLE#gcv1v9yaQqW1_L)%PjQq_zI&X&MP@ym{6>nzJbBl020A+zI?d8PWwAR2D5bm+ zX~x$NU-39cK0j?FJR^Ys;7RupMJ~>p&-qI(Xcy1YAJ6E<mN6h}%~)#~IHZ?xgBKhn zm&5btyh;EvB_IXl@{RIEt;dA~Yla}}rffR~%UCnp+LfNrWt#S7uHwE*Wrmz*jy77D zaORa5Deyz)^((`xsfa7%(==U?980BarOamK%o}8d>txGoM!QRUkwokEY*(dFeWfeI z(-x!58&joIv&`G>h1<^&ca-Nh352&{`eP2Z&5o5APNesy#dlaG_oa8YBBXc40(Zvx zcbJ}cNw%qJr&-02%m|U@D9?v&!TVV4dwRS3s>=A%$g?MpM<UpV0>%eTr3X&ihgOk} zUI==#XJ$ECbEW4~3)5qi+@q5BH8}HhMrjb}`HZ>#m=8gDQel1iqV%+wdAaF{K4_ac zT$wwn|1yK}%+K&lYxsB+8M_O~yp9ach`d}zYgt{pf?5Cg-|6ICd?k!$mQJzzuR3|u zhTQ+!$+H|N)c*HQ9{0~5|LEi~)?tfz+iv_%ojmId_B4%iXeST9mgs0GjK2S0J9#(D z*nfBOz)S>xb@FgouC@N|<e^!c?BIw28~=3j()L(kgZ%$=@|^9xhyQf)gebN;OY;BO z$@6V^(f!lO3k=}N)O&WhA)jgpB-MYJYkqYI?$6YRc)UD6Lox?>VUVb*L}QCkpy3@< z<0>&EQa?8FH+<r@;wY>=fC}XITUFf`UoY7t(52HD8dnex!X>cP-6D8lHT~G7@U1Ou zqzG-@-gb6y_f$)hdct$akkb>@$WR7uoy$-sj+_b6Wct;VKfpJ!eq^ld;gDl)WZIWx zX@~zoPYh9ElYc)Z@m_%oQ_fz2XRWndfp<4=iUM%h^L}hfeoF!B?{piG6h)%OswF^? zbbySrLt@_l<?oziCX9#rI~#MZR1|o0hh!B++U$oI#QyeoUX!zaHo+c{d}OHo@|VAJ zo1-4eEYf%VRM&@Xy;L_0bPrO(3YKgT6N@!zSnzrGlY8-5@3>Umyt0>D+uEeYQQMaC z_(t0f_S!+`M?K~jFRZb@m_;tDFHXCX5sPhK^Lg~$Z>hO;JRtRx`d&yjOd39DJChne z(M|E{OrXr7oEc@oJcsKoM$^}Do}Kx=FabpT?no%J*l8~(#aHPtrvPOZ^%K<elD?@O zZnU1|^L<PIWn*ic;mI=gEh}(!&>$x=L&-29+LWL;Fg1Vx6r5Y21))p5#AvZ7Z`^4q zF9RYj)mL`YxYorEO9|x1PniO(8zHgx*3BX<4=icBeFC;^o&>J8?XZWBr#0a?t=~uD zxCPJsGt^qohYB29&s$EB1)=^<G@$(m&)ml!V3EiJtMO|+*FXNw=hCLnnXdLtC#Fz; zXY!4k<C1g9vt!(wxwc=$fLmhgK3`g4hJnzv#h-7Zzk!^Ce*6-4iOfm_J%mU!zU)ob z?t)y`)Neh^wpV<F+%Ct~;$5!hXl2}Q*0!JB?|I-nJW>K1MLfeJ=18~CSM2p6@Vuhr z2vJ@W?|;Jv2MQtBSh>FSGk`Zo6n>+2<Y`5(kHFO=Mok?B@ol*LjpU9kf__lxL2Zop z@`+dUrTk1E*I4egF7F2d59t7|t>w3Nd%TDz0KLx_*)WMX5)?Sf8vLAJG2)#HR6czV zJ|ft_%;)Wundv7{bxXv&ts!Fykqgyr#d!mJnZfA8t}QC~T3*jE%9SiH9LbrIaD`Wz zcTzdxXU`__wMG>01$3w|LP>Tj69o+(MFyZ!Q6TX}iE~^;MaWZ8;nI6asa!-Sgi+DZ zYRW3=)x;)0ZP5tvef$)o5|=NrP5*^nMvb8+KE^Gd#t45%Go>b>xOJOBw^>f(LL~u| zN6p3>oQ#k@5O&P)N-SpK4J_3UvSF(N4ulT*Z&I--laSV(_l5Wh)}~V_%TK0U+4NxR zn5opw9va?>1%;mp@6&gzcKKEY6`f`;({J-=g}aN#exAI~gj{_SedHT={u4Zk|0cfK z{K*v#D;srtSB$!3Jb)lB2feN611++0xao8b(X*K(DZ^xV%ycegFP)6?qH=r!XFiQ} zG0)qtBSXuB1@O)LqV^14={Hz~A~W=#oEcOz5od}%2w5mcx2WcG#}_FnFsLRod?}Qg zDf!%H@uj-uOSxlwiT)^qMl*w2Wx!0Ck&vb41hh)j5Dz_=GU_Zas5kb_RQzbO)ID!e zZ@Y<CKYn#2+QKp4f$UY~1Ko4HP1We5n5_<VFN1ugUeXv)bF7KZKQduX)dYW?txbI{ zGnHJ@98Ykp%cedyS4h>G&6%w)buYItS<;%Hb!@24Keo0`)n470Z3I4-+xRbO|Hk>% zl!@@xq=^@>O_0}&;LIYHGpqy4)YvlT&*GS0s(YaIt7Yz*<yYsS&bh~2>$aq=(~R8e zwP|D9lDqA%1p)orNnFrPysi7SD^!}5*bce2_3B?*gMHQ10VizhhSvHUelxLi|L1q# zH%x}FKI3%)GS~tb%hpk#S75Xowm>l=Lv+vi9%`I(_Vq8a*shVh%mH>`CW1x;bMt*X zeRdH)TQ{j*eEUTZ?W6n!jVW*!2Bf9zW8xvL#xy(&gGvGRaruHK4C)I*>V5VJ^{pl> zzZQn|5q~803Yu~xE{uGW`jIlzYRcWXFlrm{BW+vo8~@w__*dVLjO*5K!nX@!o`?=v z2tsD!xQpX~QVu!TZDvwDixZIn4tdl<<{#A;ClmV|3b@+L6@M*GWg`A8k`%H~NnD&R zl=@lnrOiUEadD<H;AfeMkfqk#;%sBz&x)UImU_2~bM1%?S5yG2uef$7y;6=f@e0vK ztV;`H0gmNEc-9u`0<J%b3+j2|VXS|pdI@Jh6NW-I_K8c&yHY&0Q^Z8SUVC94I!<Fl z&~2RNmK@FMc&zu*Z9Q(6)*y&Z9SFkTAwIavzmcS!y0Agt19+C#(E^=%sD<r9)R#AK z`<?o@Kz0$omN!X}oChR@?PC&`w`irEhrWR96B?JdSp%I%OoV@=%>5g)2>Jo7KmEll zk{%mn;|A?XO8?C)LfqCAGRLN}g?~bo{!nJoWwss!WfoTs^^siXdxafqe0TOtcEJl1 zAjgKrm1EmL*X3<t=<h|>bF=CXv-s;!R%lh(*{%c*jlP|><V+I(309UIhW>lW0!(Rt zCC=I%gS6=9_SZbyZ#k?$jfj^B6Hl?YN&sjj1t-%&dN(rmfzuN96U5+o9mU@^tNBHy z4D$L&MADVH6w;>Hr0#yr>q(;xFuv;~MO~FtabtSiq|BCn`I_cQvmnxQI}tg5Rc%Xn ztW@-X5#4j!DB|(^&gY5y+l!c#NYoXh->t}ju+)a<%j^hgf6CqG4P0r!^Av<<=e8ZD zr}+>FLMML*qZ+h98S#SIacIzi=-2T&uHy}SFkD^-N>2ysbjRDRj(1lbXz-l?tWI>Q zP7KaYOo>h`)lO{VP8^3$Tt6tY*omLlNl@2G*waZg-ATOFNpjUm3g1PB)kRL#MZwuc zDbYox+C^>LMdQ##>(@mW*F~S##ZcG9*we){-Nn4s#d6if3g69!)y+=T&B59IUZR^* zwVUe?v*^&x<JZj_*UgvL&0p6o(9<nA-7U1$Eqv820^cKw)gwmLBhK0LL83=OwMWvp zN6Mi`+OJ0@u17Yn=VM)uTu+bubdSPTkK$F25`6C`tX^fRUKP&X&l0_=s=Z%~d(|9z z)%|)k;(9gndbR3$wR?JXrh9d_diAb)_2K&ru=)(C`o41Z8A<dRtM-`~_nA8Mee>%x zi|aGb>$9lqv+U`!n(njS>a)4(vxV>fj@571DuzPU|3jkRLAC#<alfNO|1ZCOr?`IS zyndIue%GFUx9NWOt$vTIeoy!TFRTG?ssSI)0bhv$Kh*($<ADH&fk3~3ptynHyn&Fq z0Z3@iK-ly^_|`zg)j%ZtU=-G1G}T}X=U}YFV4Uh;yzyXy!(gJ{U{c&*a^7G{-C%0Z zVA}Lx`qp5^)nF$4P!`ruHq}rL=TNT1P@d{gzVT3j!%(5$P*L1aao$i#-B4-IP}%fQ z`PNXy)len;a23{YHPvtp=WwmWaGmOKz435^!*HYDa8ukczjKFt*>H2uaO?DN+tzS~ zTf6+zFbHd;lWL@kbEI2hq(^n6*LbAQVWi)0WFT&2FmGh2Ze+M;WMq0|bZZ2BH8RE& z*3l|40Y5s)IXWdVI;}c7V>~+RFgoWqIv+Q>kT<$mH@eg_x;#C)vNgJTHM#~5hWy3? zuTz0HIKi6|;4M|~wlR3e0le!6-irh8=YbFEz=u8HqiOK*7Wm`}d<s8yhBbChHFm){ zb}2D-r8;(PJa*$ScI!8G7dLjFH}+6B_SiG_G(GkVWfrf-An@Zb*yFI&<8WN#uO!Fe zzl<Z8j3fRWNAe$k9Y6jie;m1f9Hn<0b!PnS_V~N&aWsSp0QLkr^#lgj1g7K!)|Uxv zlL?%k6S)2pc<~eX`4a^76NJ4JL^Bh_+Y=<$6Ql@}WZ0AB)RRyx2&LpC)t5<XlS!JN zleGSmbn%n)`I8LwlZ?HSOwc;|_9V;oBrC!c8}<}C^%Mu!)O*P(&M#BfTqaZ8Kc{&7 zr+DM1`0}Ut>!$>IrvzuFgtn)Iuct&1rbV%*#i*ynxu(5=!yl~i&QT<P9JO2v3<`8` z{r;?qCEgM8eLBgET&a#lzqUR9F7T!sg>}3|NdZ|oK3HCo2k$@zrByW}i(XDZP>L%G zla5a-97RV+sLY^Rk+Ch*Yg*RWUtcoF;O#rr6;V>kSsvAy;P-0vS*ld>(_Ln2Ax^U~ zK{FrQ-s*e_vd|4NI}SDp@2I_;ZNi*GLJzlJdH<8^&F66BU;eM1R)lwB)q{)Xnheyf zd;8tW!}ZeN*y!>)ZqHT2XjI{8xaSY}>Pq;Vr2cEkmJhmwd51*uUoBz&7xr%I0eu#u zp?_b({0DotQNzcf|4zvkx`g?UCEKPdsJ;7NO16$^2LIy{=8wI*Zhz{pC5#Hn;aru` z@V_l#{$G`BE!Y0CcY8n<Ahklst@oFEQz%L~B<FWGXPd*BN}jaE4|kUo!BOq)5C{w+ z-ES{=9JAlvuW5>Y`=D~~{reJT-5<~NkG<P*Z~gy9$#wxlUd^<4J3+^B|36#8?4*A0 z`<ErmZid^<zb|1d_OgR$O7?QXxDWRJ*t_@h;?ykuZ3&a+c<?_hVagf~4oa)~{*#jJ z|M?Q8BCrwFVNC3F+_F;adc)OL?EV7CD)tQbbSesqDOe?nK<QQm^X7f)_ilg)Q#A<d zQM<YWmoN=_`4w2U>mgOLIv>D`Evp_R$~~$cBCBPxA7slU`Z4srQs>7oPdn2knDf%A zc8vE``HwLPNSb}CBqcYiik$Q`o46R`)m0ZjVTFAfSF@aB7ROxo{han^X2*ed&d2ZP z^&^QL7toT^9hSb=uKZknE14d(B(+xVxTuZ>DQ{fH=2~{p$VXLe5(`9$y4wigVF7GL z3RE<0MJbWoZzufWALD*S@a<;0Ry6NrMUp)17ZmC}9ON}d@E=wJD_V}K#z-EI8+P>` zPwH+X1Wwx@D}ZMmXrxc)eYE;d7d4o1cLosDIxI1pR+MkoaE6d^e7NsxQTV1<#>jUY zA0$99>nH}u;=5>^9uIqHaUKr^X|SGm*K3ua=Zn)y&zI*{S)ynC?XVB5UI<~CFxW|= za4(hKNSwdnh=V$iw5ojY;>h4>@x&1IKKYVf86Zl&?m}0o@}r~5MpkO-dRKGi&k{zC z^sT9rAOH}+*_w@NZPrD6z!oS3{}mZxH_%P~z!oHFl?{kblAw603YO-iKmsDQcRSg- zzdF~Gtdjw-n4XjAmA%Fp{uXtPzlDXwPKiG!1K?_45C4KSfVYGveVvaUVbTMA<Ei)a zwJ1f}G8vJ=4)zNoPeyGJQc>(T4Tzs8M})ZLJx~k|_+*_&#avNR5jGFXt6W4Tp&C>0 z@yV)K)Wl_QnvjYt$SSK%#%B?kFnoI>$A>YQkWDl|ZK5eBu!E7<8n(^&2Ckj)z@FUt zHKkaUD!`QGk_=2F!->G50IPbLf+nUVRwoOvdDoK)2U`f!BMbJ8n<Cp?F5sIBR&*?> zO+Rxh6a?-oy7WzDTt1l!T{}aRJa*ovJ;IxbAUurOAx>w#k~9;W3LXo1n97FtFA}F7 z8V}Us%)w1JlVS{+h_IN>C3-HB`S5YlH-R&oR<}qNEhLHurXXUzCxn-r<8#8|G&z?7 zow)rXAmgJ$A?~@klo*9-B;1!m9%ed)+CkM&tS@=e<pZA!38o7Y{7QHg4wUL!0A)9I zC9^2d4@uZU6*zh3X7Pzy2r+666<=Vi{SUP_KhF8a)svle9*SLj1c2W4RKmfQ!NAMS zw-L;e`AZ%dUYE@Gaokk9>slET3uq3!e5pyyw=!iW)EIG8tIga#G7u8b8c$HG3zlRy z|E#?*YcpG)?SE`;G7K%*E^;?Crd!)shAyoh%r>?@mw)$_Tb?19tLx=r7EigEZU`&H zuGEmxJLR7}&`MNVC0zcAkiT;5atm~_M{w$ARKLIpY1xsSV?pp)y#f_uuVa?E?#it_ zEaHA#1fHfH6s^5HK>sCnoWd!>Hy|8r?0BtM<%27j{lszC34oStukDB4$PIVm+)Q4* zOM{kd@4Cs}RR_K0g_dmZdgv6{-TBHkaDaEcY&fU^M)I2kOB%h{AiE0FG9z;9rhd_P zHBo``#`5Ql12T%xk}Xjz(ffrC8+T~QRz8LDGv60MP)$PPh>1yg<8a{+N79$8P4?9L z5i`Zw6iVZ5F5vy2l5K5TWA_H%(mmMeU1`$g$gc1szM|sGWzG$g*_-(0@gT*z9NbZ} zwz}qtsEE2eS_Sjs>E_8Ka9shr<eq}-!&Fwmr>qZ9wj#DgI8eC0M1Ax?P5oh_BBH+R zn}Q{me#>kVxV|FP_(1m&x`Zhhg<50s^)Q$Ci=oBgL}<x&4tEwD(NI^YaBRQQvN#W2 z!Yo0TFs{&&?afeCcX*ynEFtfpF!W6gE!qA;UOb6tY=tgiM0J6yci=`4rO}D|<Kr5P z^gz?+$yG13qBTTmg%(UOv}F6V&h5j~L#qf~!U%r21v#a}Wt~UFBCm76`t<v9{*F$4 z5`P6bRp3%0!H%lc;Xv_h9{HwtnZhHz!950D!hnCw8@KL?qCE`jvRvg5J`d50xcCND zIJEb)?thAGnJzrRN&EbKpfT1mn|lE***-(jY5w_sMMnrt+tD?;z~aosRXy<e_<Q8z zhccGimZj$tgH!(1TktQz(za7CwAMN>i_`H_+nKt#zy|KvU7twWNknAp7VVl%+vk^y zB&G9pXvr4r8*-MR1m5`|g4G-Qa#f@xR7_s^FbjOS4r+jwY?WNABS1GzV{NITm9ERn zpxck<%x8g0PaBxY*L_N$i$t`q3-2NK<7l&|xk}Fmhe5ZqtfN=8Yv@xyAdkP%AP`^_ z>&rzd<Z01f_+f6$L&h3fvW*n+sbcjUY;Au*ITwDp9fQ08L!Mr6z2JDgl5;$uCEM2; zR&ScTP&G)e=DfV^Jduh#0UF*oPTqEKUU*I3MDyM{U%g21d?@ZHFnE1voP3hbz3A|8 zsd>Gynta&sd^zYS33z?EoqT!c$;py@1?PQXCw+wR{KTDb7<l~*Vf|q5e59KE<mdg) zlzkQF84z&&Rqw0?H2gJ^{0F@K799Px?)*_z{Os8MaR>bIRP4nI{5YipfD{M@cL8Ha z{?z2KpR4V^zb1czwbC=gaCHh?n}Z6xgDQ8?UWo<ae+|%v3-W0S;-?9~g7gPq_yj!` z283w@CpZO1lLsa>1*gpiyFp8~cp*7=xG}sT1scH-P9gltA=lEuC3hiJc%d5E!O)T| zbOs{^8v@PPw#s0a&4+e4`4$)11kh2o<9SvTQAXi~CG7?D`M``65!c~`PitURD2Gef zg^v}6MzIUYtA)+uMWEY<K{K`<hJhSBVT9iBy08(1>k$Fj2#c?6wt@ghckY8`5f4p~ z>%8GJHDOP9QE>Z=%e+yDZ%k7S=&qfj*0#e@ov99jOkt8~QJOvO@1pRMqZ9Tb2^OMB zg8dQhqbca4u=!$W%-ztPW8Nso?EZ>ofZDt1eTnd?_wZu5onsjx0kQnfF--VjXHBuw zi81^OvD>>b2nm6rvW%A+UW(pvvd#M9?9pK=u}Yfp_;!(MvNYt$@n1CYYhgof&xxV+ zaGhi(Rm}uTinzBmak$cP8{gv0@DmRVgN)wbiO?s;a>R1lC8&|dt92zh1^fQOPx4bq z^m9&9*h>g%PSP(-;3-b}jg%P1mmDYS;-Z<Hl$;#?Eh%LondWtJ27ZdbZW8yKlx5oF zoaB^}d&k7)l#2TljsD~+zEn7~lse~BH0cy}^VHeEl&1UCj^ZEX_-Q?wX~eXteaUHS z{i#C>X@>==Y|yvsZYo$aeYV-Q`!9R<K|mVR-rYo-{u{!V(T|wUN}n+<oxTONcMn=E zEM%PFXV&keUub5=24>tOXJ(sbFa&3g6lOf&XThbIpYmlPx@1)cW+C&ty)<XNd-(P= z7%TNU3k_<_EipxK$tGyY{w$SA^pO2&E{lvm#{egrhCXLd8oGzcVbU_fU(8`6$fexL z=FrNe4b0(A$qnC2;ni|uD9IHi$a{U01GRTc9q4ho<b6D_6>7;-Tr{NNk5S-v6M4u} zbICsz&(mnh*Fk2HUCcLVvHna@V63ID%n)O===w#gz-qAooRe=uP-suUq|aaISYm1J zQs^?o^6eqoImOko1zNH#s)Q@_b14d9VECC*6b4B#_gpNBvS4;Uh>p~9^(H7zN-2)| zT9mR_oWV~Q`cRy6@GDoV1f9E>ShKk9S8>5&NkxixB|&KoKYccTX@iSNiA!lq3qw&! zbThJRSxadbf7z$5;vSc>fsa)6DP<!cjoKH>#<l3%QliHWTsjHL=Tpkrzm_d7mal42 z3_p}_@EgwXSL{5{PK88om$=NiRGd6iV04wA@mF41kgaP~-tp@nrc^$q(Cj}%J%+d( zFIK{9R~?X7BBoX$rxM?`RJ{YTz&=)C5K=>iqR{1BUI|na0IU1FtB4+}$w~>|64p>z zGUIC3&;cp2U886Zo$*s^*a&O$*Q+_SYq=q*_>``-{EY4bOSOSDHHZr}>9;k)+I3QL zc$}_vAAxmF(Y5lAb!8NFp9JawaCNWf>yxGHRDtz6+BmXH^#+6un(K96wHp$B>P=G{ z-VNkpGPqehHhkCqX$Q4;6XF^}?cI!YW~q&CuEc6`G1iPa?gCAIgxLDpO+l$mcy^5; zOHI}_jS+;+UFVIkZ<=EZ>tj-zQ!D|2z~+p@rm)B6oKorpftG?{g1F(xd_w0W*OrRm z#`MRQn#YE00bqkG6?6vEQi@*;jBH+VDhC3)hU=>ZTKh`t>RnrhEGgT8tzb*Mw$jK^ zpi}2#>#SvMuWQ>P3ZZor?gp1%IiyN>5ZJcGNU(W`u`ukurVWbPi8^`&IZo<s|5QUF zZ@<xQzq16~mbTx^wLd+!zYuo7SGU7Gsl8fmM?&p*qtl_>*KrB#09bWkEO(&GcVa$u z;L3MkhjrpCcM?5y5~Ov$X6izg?|MhnMH1FUCfG$k(#5FL#f;j`>ej_l*2N9AcQbYK zly&pTcMGC+5BUL1z5_m30VH(*(((XVL4X_+K!FKHiKtgXuvbdHSH`OMV_2_zS+C+q z@28_)6`kI%ZoNiny(X=_-<EsLpL#8c`i!6YOi}yInEEZ``>m|{ZHS<~)P7f;es{Ni z&$NCw!2u8X0WYfoADw{^=x4#uw1Kdvfe4~O1HnOS`9UYELGQ4^pt3<-!Jc$By!~9E z96>;CnoyqGP(j)d+^3<^u%Ys@p)#W33Z~&I!Qlp-;ijjd7WrYI+i+Xja4XRWh-sul zaHLOXWZ-FdNPcA4ZDcfUWQ1rG%rrVKI6A8{I{!4XC_lR7HoB5Fx=aLKWdi>e1n=m8 z_sWJ#MgT?*A5Yw*3*g6+sm9u_z~^pbmtkYq@?%}oV;yy44@YC5xH0&*;|R>-H*VvQ zu<@tX@pnSwh{O|6{S{jJIEL=T+qV;#<>Lh56Id$~WY!ae?i1wc6BNf2MDCN+;bX@m z0545k2I46ip(#=b^AwlD6n*#<mGu;#`;_p?lxW)&ztE&a_@wyrlr-_QWZUFN>uI^s zDOutfC823W-5Gi288zZIO8WM*r5U~F83XG~56xs>{8>}?S+n$6i?&%SsO05&_B-*M zz0jP4?wq6hoKyOoOWT~=%ACjZoEI@vB{lD-J0IXaACx{H(l#HqG9U3gA4R+nBeW2w zyO7|%kd(fV(zcMcvXJq-koDF=hj=kByot3fsZe*Zq;0WmWwGLUv5I)9Mrf%{cd5aB zsVRM_rERHoWeN1W)Iq%5CA8e5yWHo#JdnOT)V4gbvJ8G+9w%Oz6k3_qU72-XnNMF? zY+G4gSy_dw%z(~P)}L3lbXRxWSNGCa5876bR#s1*SI>yoE`-*ubk}a&*Y48S9@^F} zg;q=V*QRk1o}QV&do(#@Fi66`HDQ1Ms6l4Rd4o){j$z|a&$f;eF^@{(Y2v=Vl)Rq3 zzn(8NOLW4x&Ave$y-4$pso|3~T?G|m#s(Y7CWr7QXGS!u-X?FxCO>FXaCKAoWmA-7 zOI&zMLT^jTV@oCjx`f%1U)@rC+4@AXts=aws<*A?v8|D@tp(cFS>4uq*)|~A`6|3) zthZz8v1698V*%Q+THUdE+4)YgYcIU(pttMjvFntv>jK(!Tix||+4UmX^AX<j)7uO1 z*b9PW?1g~#!dCYpUiP9$_G5(i<Mj3uJob|^_ESLnX{-AgFZ)>}2RXtAd3py09tTAk z2PL3`veko%mxC&j!y4hkI=#aNkHe;n!xqqC>*^us<*<X~s7v^$NAIZ5<7gn`Xb5yP zvU&u5IT|N9o)kWw);pf{IG)cqUIZO4uO6?y9RDUc*$_V2(mUDlIN8fMIRKqNmoX<V zCubz57s97kdZ#xYr*|2r51`Yh)zg=kQy9|!PRVv`r|c|+9CA*je?jAUL6>>K(0;+R zcEJL<U?aWc_|HqWq*vl1R}%XFKP%blKNNWWuS>R>k5I==>)M}^Z3pR7m&j8Ov}EfE zEpz{GOSU&_&#RE<-=r@aA}?F|FFT$uD&!ku?dyAMFC#@S7_g8II>^bGFE$9{1n5V0 z;?3-l4YRKF-&w+_Y=2B()&=?f@0T!QYI5nq|6Ibj(*X|EDs=xWVYu_us!c{SBvb#f zgdtQv(P{a4{LdxKJF9E;GlMSwx1>^kFJXv90*Ev(jEDYS!n`-F!9;LeCDQt{gkkkT zwAQ)?|LZB37X}v^a>V~XJOx9cNH(J(oo17NgChUKDL9rv_n)WWp>y2-6pAE-lO6sS zDDuBL1!u_r2PpDiPr)tMx@r~wehS8XDFprlicG67-x!Ex)CadVU+#|Q%4I6HwOk+0 zL!n48ae3;=@9t0tsS@a~Q*f#N*dHkJuT$_ppvbX*IR($_Fe1_vk-79U|Kk))9xeWV z`4s#Y6#4(vDcF8jsiO7f;7}j<!tgIpWI`v)KcUEzpJSqP$Z_Q`OOBz(jf+0R<xQ&r zmM2ZSHp5XZ8yGz&%_k®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 {QitbPa6Kzbr`^YU;cq*?oR2n> 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�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 aw*9}#t*r#2koV{Ug~zGPnBieM`C1>iXt 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� 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 Qm(!kVJYY>d*kcoEc+1K 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 T7eri<A?QC;?zoEK;R*gPr8@G? diff --git a/doc/source/_static/speculative_decoding.jpeg b/doc/source/_static/speculative_decoding.jpeg deleted file mode 100644 index d5b1e46cf1ece1e1539546d23f38c3b722ff4c93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86625 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 diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/spec_decoding.po b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/spec_decoding.po deleted file mode 100644 index f83e68f599..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/spec_decoding.po +++ /dev/null @@ -1,117 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 18:00+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/user_guide/spec_decoding.rst:5 -msgid "Speculative Decoding (experimental)" -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:9 -msgid "" -"Speculative decoding is a method designed to speed up the inference " -"process of large language models (LLMs). This technique involves using a " -"smaller, quicker \"draft\" model to produce several tokens in advance. " -"These tokens are then checked by a more extensive \"target\" model. If " -"the larger model confirms the tokens generated by the draft model, it " -"leads to significant savings in memory bandwidth and processing time per " -"token. However, if the tokens from the draft model don't match the " -"predictions of the larger model, they are discarded." -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:15 -msgid "Launching a speculative LLM" -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:16 -msgid "" -"Using speculative decoding in Xinference is straightforward. The only " -"distinction between speculative decoding and regular decoding is the way " -"to initiate an LLM:" -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:35 -msgid "" -"``Client.launch_speculative_llm`` is an experimental API, which may be " -"removed in the future releases." -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:37 -msgid "After launching the model, you can use it just like a regular model:" -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:52 -msgid "Performance" -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:53 -msgid "The effectiveness of speculative decoding relies on:" -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:55 -msgid "The size difference between the models - the larger, the better." -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:56 -msgid "" -"The similarity between the logits produced by the draft model and the " -"target model." -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:58 -#, python-format -msgid "" -"In the example above, the target model is about five times larger than " -"the draft model, and the two models are well aligned. Approximately 86% " -"of the draft tokens are accepted by the target model, resulting in a 25% " -"increase in speed." -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:61 -msgid "References" -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:62 -msgid "" -"[1] `Fast Inference from Transformers via Speculative Decoding " -"<https://arxiv.org/abs/2211.17192>`_" -msgstr "" - -#: ../../source/user_guide/spec_decoding.rst:63 -msgid "" -"[2] `Accelerating Large Language Model Decoding with Speculative Sampling" -" <https://arxiv.org/abs/2302.01318>`_" -msgstr "" - -#~ msgid "" -#~ "In the example above, the target " -#~ "model is about five times larger " -#~ "than the draft model, and the two" -#~ " models are well aligned. Approximately " -#~ "86% of the draft tokens are " -#~ "accepted by the target model, resulting" -#~ " in a 25% increase in speed. " -#~ "References ~~~~~~~~~~ - [1] `Fast " -#~ "Inference from Transformers via Speculative" -#~ " Decoding <https://arxiv.org/abs/2211.17192>`_ - " -#~ "[2] `Accelerating Large Language Model " -#~ "Decoding with Speculative Sampling " -#~ "<https://arxiv.org/abs/2302.01318>`_" -#~ msgstr "" - diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/spec_decoding.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/spec_decoding.po deleted file mode 100644 index 17b38581a6..0000000000 --- a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/spec_decoding.po +++ /dev/null @@ -1,109 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 18:00+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: zh_CN\n" -"Language-Team: zh_CN <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/user_guide/spec_decoding.rst:5 -msgid "Speculative Decoding (experimental)" -msgstr "投机采样(实验性质)" - -#: ../../source/user_guide/spec_decoding.rst:9 -msgid "" -"Speculative decoding is a method designed to speed up the inference " -"process of large language models (LLMs). This technique involves using a " -"smaller, quicker \"draft\" model to produce several tokens in advance. " -"These tokens are then checked by a more extensive \"target\" model. If " -"the larger model confirms the tokens generated by the draft model, it " -"leads to significant savings in memory bandwidth and processing time per " -"token. However, if the tokens from the draft model don't match the " -"predictions of the larger model, they are discarded." -msgstr "" -"投机采样是一种加速大语言模型推理的方法。这项技术使用了一个小且快速的 \"草稿\" 模型生成多个 token,然后用相对大且慢的 \"目标\" " -"模型检查生成的 token 是否合理。如果大模型接受小模型生成的 token,那么 token " -"生成的速度会大幅上升。如果大模型没有接受小模型生成的 token,那么需要大模型重新生成 token。" - -#: ../../source/user_guide/spec_decoding.rst:15 -msgid "Launching a speculative LLM" -msgstr "使用投机采样的大语言模型" - -#: ../../source/user_guide/spec_decoding.rst:16 -msgid "" -"Using speculative decoding in Xinference is straightforward. The only " -"distinction between speculative decoding and regular decoding is the way " -"to initiate an LLM:" -msgstr "在 Xinference 中使用投机采样非常简单。与普通大语言模型拉起的方式唯一的区别就是在初始化模型时使用特定的方式:" - -#: ../../source/user_guide/spec_decoding.rst:35 -msgid "" -"``Client.launch_speculative_llm`` is an experimental API, which may be " -"removed in the future releases." -msgstr "``Client.launch_speculative_llm`` 是一个实验性质的 API,可能会在将来修改或者移除。" - -#: ../../source/user_guide/spec_decoding.rst:37 -msgid "After launching the model, you can use it just like a regular model:" -msgstr "在模型拉起之后,使用方式与普通的大语言模型没有区别:" - -#: ../../source/user_guide/spec_decoding.rst:52 -msgid "Performance" -msgstr "性能" - -#: ../../source/user_guide/spec_decoding.rst:53 -msgid "The effectiveness of speculative decoding relies on:" -msgstr "投机采样的效率取决于:" - -#: ../../source/user_guide/spec_decoding.rst:55 -msgid "The size difference between the models - the larger, the better." -msgstr "大模型与小模型尺寸大小的差别。" - -#: ../../source/user_guide/spec_decoding.rst:56 -msgid "" -"The similarity between the logits produced by the draft model and the " -"target model." -msgstr "大模型与小模型输出的概率分布相似度。" - -#: ../../source/user_guide/spec_decoding.rst:58 -msgid "" -"In the example above, the target model is about five times larger than " -"the draft model, and the two models are well aligned. Approximately 86% " -"of the draft tokens are accepted by the target model, resulting in a 25% " -"increase in speed." -msgstr "" -"在上面的例子里,大模型的尺寸是小模型的五倍,并且这两个模型是对齐好的。小模型生成的token 中 86% 被大模型接受,使得推理效率有 25% " -"的提升。" - -#: ../../source/user_guide/spec_decoding.rst:61 -msgid "References" -msgstr "参考" - -#: ../../source/user_guide/spec_decoding.rst:62 -msgid "" -"[1] `Fast Inference from Transformers via Speculative Decoding " -"<https://arxiv.org/abs/2211.17192>`_" -msgstr "" -"[1] `Fast Inference from Transformers via Speculative Decoding " -"<https://arxiv.org/abs/2211.17192>`_" - -#: ../../source/user_guide/spec_decoding.rst:63 -msgid "" -"[2] `Accelerating Large Language Model Decoding with Speculative Sampling" -" <https://arxiv.org/abs/2302.01318>`_" -msgstr "" -"[2] `Accelerating Large Language Model Decoding with Speculative Sampling" -" <https://arxiv.org/abs/2302.01318>`_" - diff --git a/doc/source/user_guide/index.rst b/doc/source/user_guide/index.rst index 5d291e773e..edacf8ba10 100644 --- a/doc/source/user_guide/index.rst +++ b/doc/source/user_guide/index.rst @@ -9,6 +9,5 @@ User Guide backends client_api - spec_decoding auth_system metrics diff --git a/doc/source/user_guide/spec_decoding.rst b/doc/source/user_guide/spec_decoding.rst deleted file mode 100644 index 2fb84b49e1..0000000000 --- a/doc/source/user_guide/spec_decoding.rst +++ /dev/null @@ -1,63 +0,0 @@ -.. _user_guide_spec_decoding: - -=================================== -Speculative Decoding (experimental) -=================================== - -.. image:: ../_static/speculative.gif - -Speculative decoding is a method designed to speed up the inference process of large language models (LLMs). This technique involves using a smaller, quicker "draft" model to produce several tokens in advance. These tokens are then checked by a more extensive "target" model. If the larger model confirms the tokens generated by the draft model, it leads to significant savings in memory bandwidth and processing time per token. However, if the tokens from the draft model don't match the predictions of the larger model, they are discarded. - -.. image:: ../_static/speculative_decoding.jpeg - :width: 400 - -Launching a speculative LLM -~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Using speculative decoding in Xinference is straightforward. The only distinction between speculative decoding and regular decoding is the way to initiate an LLM: - -.. code-block:: python - - from xinference.client import Client - - client = Client("http://localhost:9997") - model_uid = client.launch_speculative_llm( - model_name="wizardcoder-python-v1.0", # target model name - model_size_in_billions=34, # target model size - quantization="none", # target model quantization - draft_model_name="wizardcoder-python-v1.0", # draft model name - draft_model_size_in_billions=7, # draft model size - draft_quantization="none", # draft model quantization - n_gpu=2 # number of GPUs to use - ) - -.. note:: - - ``Client.launch_speculative_llm`` is an experimental API, which may be removed in the future releases. - -After launching the model, you can use it just like a regular model: - -.. code-block:: python - - model = client.get_model(model_uid) - model.chat( - """Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules: - 1. Each row must contain the digits 1-9 without repetition. - 2. Each column must contain the digits 1-9 without repetition. - 3. Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition. - Note: - A Sudoku board (partially filled) could be valid but is not necessarily solvable. Only the filled cells need to be validated according to the mentioned rules.""" - ) - -Performance -~~~~~~~~~~~ -The effectiveness of speculative decoding relies on: - -- The size difference between the models - the larger, the better. -- The similarity between the logits produced by the draft model and the target model. - -In the example above, the target model is about five times larger than the draft model, and the two models are well aligned. Approximately 86% of the draft tokens are accepted by the target model, resulting in a 25% increase in speed. - -References -~~~~~~~~~~ -- [1] `Fast Inference from Transformers via Speculative Decoding <https://arxiv.org/abs/2211.17192>`_ -- [2] `Accelerating Large Language Model Decoding with Speculative Sampling <https://arxiv.org/abs/2302.01318>`_ diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 31a80fc0a6..f627521dc1 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -357,16 +357,6 @@ def serve(self, logging_conf: Optional[dict] = None): else None ), ) - self._router.add_api_route( - "/experimental/speculative_llms", - self.launch_speculative_llm, - methods=["POST"], - dependencies=( - [Security(self._auth_service, scopes=["models:start"])] - if self.is_authenticated() - else None - ), - ) self._router.add_api_route( "/v1/models/{model_uid}", self.terminate_model, @@ -649,47 +639,6 @@ async def describe_model(self, model_uid: str) -> JSONResponse: logger.error(e, exc_info=True) raise HTTPException(status_code=500, detail=str(e)) - async def launch_speculative_llm(self, request: Request) -> JSONResponse: - payload = await request.json() - model_uid = payload.get("model_uid") - model_name = payload.get("model_name") - model_size_in_billions = payload.get("model_size_in_billions") - quantization = payload.get("quantization") - draft_model_name = payload.get("draft_model_name") - draft_model_size_in_billions = payload.get("draft_model_size_in_billions") - draft_quantization = payload.get("draft_quantization") - n_gpu = payload.get("n_gpu", "auto") - - if not model_name: - raise HTTPException( - status_code=400, - detail="Invalid input. Please specify the model name", - ) - - try: - model_uid = await (await self._get_supervisor_ref()).launch_speculative_llm( - model_uid=model_uid, - model_name=model_name, - model_size_in_billions=model_size_in_billions, - quantization=quantization, - draft_model_name=draft_model_name, - draft_model_size_in_billions=draft_model_size_in_billions, - draft_quantization=draft_quantization, - n_gpu=n_gpu, - ) - - except ValueError as ve: - logger.error(str(ve), exc_info=True) - raise HTTPException(status_code=400, detail=str(ve)) - except RuntimeError as re: - logger.error(str(re), exc_info=True) - raise HTTPException(status_code=503, detail=str(re)) - except Exception as e: - logger.error(str(e), exc_info=True) - raise HTTPException(status_code=500, detail=str(e)) - - return JSONResponse(content={"model_uid": model_uid}) - async def launch_model( self, request: Request, wait_ready: bool = Query(True) ) -> JSONResponse: diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index b73bdf5346..87241ae4ff 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -13,7 +13,6 @@ # limitations under the License. import json import typing -import warnings from typing import TYPE_CHECKING, Any, Dict, Iterator, List, Optional, Union import requests @@ -773,56 +772,6 @@ def list_models(self) -> Dict[str, Dict[str, Any]]: model_list = response_data["data"] return {item["id"]: item for item in model_list} - def launch_speculative_llm( - self, - model_name: str, - model_size_in_billions: Optional[Union[int, str, float]], - quantization: Optional[str], - draft_model_name: str, - draft_model_size_in_billions: Optional[int], - draft_quantization: Optional[str], - n_gpu: Optional[Union[int, str]] = "auto", - ): - """ - Launch the LLM along with a draft model based on the parameters on the server via RESTful APIs. This is an - experimental feature and the API may change in the future. - - Returns - ------- - str - The unique model_uid for the launched model. - - """ - warnings.warn( - "`launch_speculative_llm` is an experimental feature and the API may change in the future." - ) - - # convert float to int or string since the RESTful API does not accept float. - if isinstance(model_size_in_billions, float): - model_size_in_billions = convert_float_to_int_or_str(model_size_in_billions) - - payload = { - "model_uid": None, - "model_name": model_name, - "model_size_in_billions": model_size_in_billions, - "quantization": quantization, - "draft_model_name": draft_model_name, - "draft_model_size_in_billions": draft_model_size_in_billions, - "draft_quantization": draft_quantization, - "n_gpu": n_gpu, - } - - url = f"{self.base_url}/experimental/speculative_llms" - response = requests.post(url, json=payload, headers=self._headers) - if response.status_code != 200: - raise RuntimeError( - f"Failed to launch model, detail: {_get_error_string(response)}" - ) - - response_data = response.json() - model_uid = response_data["model_uid"] - return model_uid - def launch_model( self, model_name: str, diff --git a/xinference/core/model.py b/xinference/core/model.py index 15f7f5c8c2..f31989a9c4 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -154,7 +154,6 @@ def __init__( ): super().__init__() from ..model.llm.pytorch.core import PytorchModel - from ..model.llm.pytorch.spec_model import SpeculativeModel from ..model.llm.vllm.core import VLLMModel self._worker_address = worker_address @@ -168,7 +167,7 @@ def __init__( self._current_generator = lambda: None self._lock = ( None - if isinstance(self._model, (PytorchModel, SpeculativeModel, VLLMModel)) + if isinstance(self._model, (PytorchModel, VLLMModel)) else asyncio.locks.Lock() ) self._worker_ref = None diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 031b9da6ab..6352e0aee2 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -721,66 +721,6 @@ async def launch_model_by_version( **kwargs, ) - async def launch_speculative_llm( - self, - model_uid: Optional[str], - model_name: str, - model_size_in_billions: Optional[Union[int, str]], - quantization: Optional[str], - draft_model_name: str, - draft_model_size_in_billions: Optional[int], - draft_quantization: Optional[str], - n_gpu: Optional[Union[int, str]] = "auto", - ) -> str: - if model_uid is None: - model_uid = self._gen_model_uid(model_name) - logger.debug( - ( - f"Enter launch_speculative_llm, model_uid: %s, model_name: %s, model_size: %s, " - f"draft_model_name: %s, draft_model_size: %s" - ), - model_uid, - model_name, - str(model_size_in_billions) if model_size_in_billions else "", - draft_model_name, - draft_model_size_in_billions, - ) - - # TODO: the draft and target model must be on the same worker. - if not self.is_local_deployment(): - raise ValueError( - "Speculative model is not supported in distributed deployment yet." - ) - - if model_uid in self._model_uid_to_replica_info: - raise ValueError(f"Model is already in the model list, uid: {model_uid}") - - worker_ref = await self._choose_worker() - replica = 1 - self._model_uid_to_replica_info[model_uid] = ReplicaInfo( - replica=replica, scheduler=itertools.cycle(range(replica)) - ) - - try: - rep_model_uid = f"{model_uid}-{1}-{0}" - await worker_ref.launch_speculative_model( - model_uid=rep_model_uid, - model_name=model_name, - model_size_in_billions=model_size_in_billions, - quantization=quantization, - draft_model_name=draft_model_name, - draft_model_size_in_billions=draft_model_size_in_billions, - draft_quantization=draft_quantization, - n_gpu=n_gpu, - ) - self._replica_model_uid_to_worker[rep_model_uid] = worker_ref - - except Exception: - # terminate_model will remove the replica info. - await self.terminate_model(model_uid, suppress_exception=True) - raise - return model_uid - async def launch_builtin_model( self, model_uid: Optional[str], diff --git a/xinference/core/worker.py b/xinference/core/worker.py index a899dda85f..b5799f0975 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -514,66 +514,6 @@ def unregister_model(self, model_type: str, model_name: str): else: raise ValueError(f"Unsupported model type: {model_type}") - @log_async(logger=logger) - async def launch_speculative_model( - self, - model_uid: str, - model_name: str, - model_size_in_billions: Optional[int], - quantization: Optional[str], - draft_model_name: str, - draft_model_size_in_billions: Optional[int], - draft_quantization: Optional[str], - n_gpu: Optional[Union[int, str]] = "auto", - ): - if n_gpu is not None: - if isinstance(n_gpu, int) and (n_gpu <= 0 or n_gpu > gpu_count()): - raise ValueError( - f"The parameter `n_gpu` must be greater than 0 and " - f"not greater than the number of GPUs: {gpu_count()} on the machine." - ) - if isinstance(n_gpu, str) and n_gpu != "auto": - raise ValueError("Currently `n_gpu` only supports `auto`.") - - from ..model.llm.core import create_speculative_llm_model_instance - - subpool_address, devices = await self._create_subpool(model_uid, n_gpu=n_gpu) - - model, model_description = await asyncio.to_thread( - create_speculative_llm_model_instance, - subpool_addr=subpool_address, - devices=devices, - model_uid=model_uid, - model_name=model_name, - model_size_in_billions=model_size_in_billions, - quantization=quantization, - draft_model_name=draft_model_name, - draft_model_size_in_billions=draft_model_size_in_billions, - draft_quantization=draft_quantization, - ) - - try: - model_ref = await xo.create_actor( - ModelActor, - address=subpool_address, - uid=model_uid, - worker_address=self.address, - model=model, - model_description=model_description, - ) - await model_ref.load() - except: - logger.error(f"Failed to load model {model_uid}", exc_info=True) - self.release_devices(model_uid=model_uid) - await self._main_pool.remove_sub_pool(subpool_address) - raise - - self._model_uid_to_model[model_uid] = model_ref - self._model_uid_to_model_spec[model_uid] = model_description - for dev in devices: - self._gpu_to_model_uid[int(dev)] = model_uid - self._model_uid_to_addr[model_uid] = subpool_address - async def _get_model_ability(self, model: Any, model_type: str) -> List[str]: from ..model.llm.core import LLM diff --git a/xinference/model/llm/core.py b/xinference/model/llm/core.py index 848791084f..a85b8da274 100644 --- a/xinference/model/llm/core.py +++ b/xinference/model/llm/core.py @@ -259,62 +259,3 @@ def create_llm_model_instance( return model, LLMDescription( subpool_addr, devices, llm_family, llm_spec, quantization ) - - -def create_speculative_llm_model_instance( - subpool_addr: str, - devices: List[str], - model_uid: str, - model_name: str, - model_size_in_billions: Optional[Union[int, str]], - quantization: Optional[str], - draft_model_name: str, - draft_model_size_in_billions: Optional[int], - draft_quantization: Optional[str], -) -> Tuple[LLM, LLMDescription]: - from . import match_llm - from .llm_family import cache - - match_result = match_llm( - model_name, "pytorch", model_size_in_billions, quantization - ) - - if not match_result: - raise ValueError( - f"Model not found, name: {model_name}, format: pytorch," - f" size: {model_size_in_billions}, quantization: {quantization}" - ) - llm_family, llm_spec, quantization = match_result - assert quantization is not None - save_path = cache(llm_family, llm_spec, quantization) - - draft_match_result = match_llm( - draft_model_name, "pytorch", draft_model_size_in_billions, draft_quantization - ) - - if not draft_match_result: - raise ValueError( - f"Model not found, name: {draft_model_name}, format: pytorch," - f" size: {draft_model_size_in_billions}, quantization: {draft_quantization}" - ) - draft_llm_family, draft_llm_spec, draft_quantization = draft_match_result - assert draft_quantization is not None - draft_save_path = cache(draft_llm_family, draft_llm_spec, draft_quantization) - - from .pytorch.spec_model import SpeculativeModel - - model = SpeculativeModel( - model_uid, - model_family=llm_family, - model_spec=llm_spec, - quantization=quantization, - model_path=save_path, - draft_model_family=draft_llm_family, - draft_model_spec=draft_llm_spec, - draft_quantization=draft_quantization, - draft_model_path=draft_save_path, - ) - - return model, LLMDescription( - subpool_addr, devices, llm_family, llm_spec, quantization - ) diff --git a/xinference/model/llm/pytorch/spec_decoding_utils.py b/xinference/model/llm/pytorch/spec_decoding_utils.py deleted file mode 100644 index 33f804bbb6..0000000000 --- a/xinference/model/llm/pytorch/spec_decoding_utils.py +++ /dev/null @@ -1,531 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import gc -import logging -import time -import uuid -from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple - -from ....device_utils import empty_cache - -try: - import torch - from torch.nn import functional as F -except ImportError: - raise ImportError( - f"Failed to import module 'torch'. Please make sure 'torch' is installed.\n\n" - ) - -try: - from transformers import PreTrainedModel, PreTrainedTokenizer - from transformers.generation.logits_process import ( - LogitsProcessorList, - TemperatureLogitsWarper, - TopKLogitsWarper, - TopPLogitsWarper, - ) -except ImportError: - error_message = "Failed to import module 'transformers'" - installation_guide = [ - "Please make sure 'transformers' is installed. ", - "You can install it by `pip install transformers`\n", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - -from ....types import CompletionChoice, CompletionChunk, CompletionUsage - -logger = logging.getLogger(__name__) - - -def prepare_logits_processor( - temperature: float, top_p: float, top_k: int -) -> LogitsProcessorList: - processor_list = LogitsProcessorList() - # TemperatureLogitsWarper doesn't accept 0.0, 1.0 makes it a no-op, so we skip two cases. - if temperature >= 1e-5 and temperature != 1.0: - processor_list.append(TemperatureLogitsWarper(temperature)) - if 1e-8 <= top_p < 1.0: - processor_list.append(TopPLogitsWarper(top_p)) - if top_k > 0: - processor_list.append(TopKLogitsWarper(top_k)) - return processor_list - - -def get_context_length(config): - """Get the context length of a model from a huggingface model config.""" - if ( - hasattr(config, "max_sequence_length") - and config.max_sequence_length is not None - ): - return config.max_sequence_length - elif hasattr(config, "seq_length") and config.seq_length is not None: - return config.seq_length - elif ( - hasattr(config, "max_position_embeddings") - and config.max_position_embeddings is not None - ): - return config.max_position_embeddings - else: - return 2048 - - -def normalize_logits( - logits_processor: LogitsProcessorList, - input_ids: List[int], - logits: torch.FloatTensor, # [1, n_seq, n_vocab] -) -> torch.Tensor: - """ - Parameters - ---------- - logits : torch.Tensor - Logits of shape `(n_batch, n_seq, n_vocab)`. - - Returns - ------- - torch.Tensor - Normalized logits of shape `(n_batch, n_seq, n_vocab)`. - """ - - def _helper( - _input_ids: torch.LongTensor, _logits: torch.FloatTensor # [1, n_vocab] - ) -> torch.Tensor: - if logits_processor: - last_token_logits = logits_processor( - _input_ids, - _logits, - )[0] - else: - return _logits[0] - - return last_token_logits # [n_vocab,] - - input_ids = torch.as_tensor([input_ids], device=logits.device).long() - for i in range(logits.shape[1]): - normalized = _helper( - input_ids[ - : -logits.shape[1] + i - ], # input_ids may not equal logits.shape[1] - logits[:, i, :], - ) - logits[:, i, :] = normalized.clone() - return F.softmax(logits, dim=-1) - - -def sample( - last_token_logits: torch.FloatTensor, temperature: float, top_p: float -) -> int: - """ - Parameters - ---------- - last_token_logits : torch.FloatTensor - Last token logits of shape [n_vocab,] - - Returns - ------- - int - Token ID. - """ - if temperature < 1e-5 or top_p < 1e-8: # greedy - _, indices = torch.topk(last_token_logits, 2) - tokens = [int(index) for index in indices.tolist()] - else: - indices = torch.multinomial(last_token_logits, num_samples=2) - tokens = [int(token) for token in indices.tolist()] - return tokens[0] - - -def rollback_kv_cache( - kv_cache: Tuple[Tuple[torch.Tensor, torch.Tensor], ...], n: int -) -> Tuple[Tuple[torch.Tensor, torch.Tensor], ...]: - ret = [] - for k_cache, v_cache in kv_cache: - k_cache = k_cache[:, :, :-n, :] # [1, n_head, n_seq - n, n_dim] - v_cache = v_cache[:, :, :-n, :] - - assert isinstance(k_cache, torch.Tensor) - assert isinstance(v_cache, torch.Tensor) - ret.append((k_cache, v_cache)) - - return tuple(ret) - - -def rollback_logits(logits: torch.Tensor, n: int): - return logits[:, :-n, :] # [1, n_seq, n_vocab] - - -def is_partial_stop(output: str, stop_str: str): - """Check whether the output contains a partial stop str.""" - for i in range(0, min(len(output), len(stop_str))): - if stop_str.startswith(output[-i:]): - return True - return False - - -def draft( - input_ids: List[int], - kv_cache: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]], - logits: Optional[torch.FloatTensor], - draft_model: "PreTrainedModel", - gamma: int, - logits_processor: LogitsProcessorList, - temperature: float, - top_p: float, -): - """ - Parameters - ---------- - input_ids : List[int] - On the prefill stage, `input_ids` are the prompt tokens. - - On the decode stage. It includes the prompt tokens, the token generated by the original model - at the end of each full iteration, or the token generated by the draft model draft - iteration. - - Returns - ------- - int - The number of generated draft tokens. - List[int] - Outputs, including the draft tokens. - Tuple[Tuple[torch.Tensor, torch.Tensor], ...] - KV cache. - torch.FloatTensor - Logits. - """ - draft_output_ids = input_ids.copy() - - if kv_cache is not None: - input_ids = draft_output_ids[-2:] - - num_draft_tokens = 0 - while num_draft_tokens < gamma: - if kv_cache is None: - # prefill. - draft_model_out = draft_model( - torch.as_tensor([input_ids], device=draft_model.device), - use_cache=True, - ) - logits = normalize_logits( - logits_processor, input_ids, draft_model_out.logits - ) - else: - draft_model_out = draft_model( - torch.as_tensor([input_ids], device=draft_model.device), - use_cache=True, - past_key_values=kv_cache, - ) - normalized = normalize_logits( - logits_processor, draft_output_ids, draft_model_out.logits - ) - assert logits is not None - logits = torch.cat((logits, normalized), dim=1) - kv_cache = draft_model_out.past_key_values - draft_token = sample( - logits[0, -1, :], - temperature, - top_p, - ) - draft_output_ids.append(draft_token) - input_ids = [draft_token] - num_draft_tokens += 1 - - assert kv_cache is not None - return num_draft_tokens, draft_output_ids, kv_cache, logits - - -@torch.inference_mode() -def speculative_generate_stream( - model_uid: str, - draft_model: "PreTrainedModel", - model: "PreTrainedModel", - tokenizer: "PreTrainedTokenizer", - prompt: str, - generate_config: Dict[str, Any], -) -> Iterator[Tuple[CompletionChunk, CompletionUsage]]: - logger.debug( - f"Enter speculative_generate_stream, prompt: {prompt}, generate_config: {generate_config}" - ) - - # TODO: currently, repetition penalty leads to garbled outputs. - if float(generate_config.get("repetition_penalty", 1.0)) != 1.0: - raise ValueError( - "repetition penalty is not supported by speculative decoding yet" - ) - - gamma = generate_config.get("gamma", 4) - stream = generate_config.get("stream", False) - temperature = float(generate_config.get("temperature", 1.0)) - top_p = float(generate_config.get("top_p", 1.0)) - top_k = int(generate_config.get("top_k", -1)) # -1 means disable - max_new_tokens = int(generate_config.get("max_tokens", 256)) - echo = bool(generate_config.get("echo", False)) - stop_str = generate_config.get("stop", None) - stop_token_ids = generate_config.get("stop_token_ids", None) or [] - stop_token_ids.append(tokenizer.eos_token_id) - - logits_processor = prepare_logits_processor(temperature, top_p, top_k) - request_id = str(uuid.uuid1()) - - if "qwen" in str(type(model)).lower(): - # TODO: hacky. - input_ids = tokenizer(prompt, allowed_special="all").input_ids - else: - input_ids = tokenizer(prompt).input_ids - - num_prompt_tokens = len(input_ids) - output_ids = list(input_ids) - - # internal states. - draft_kv_cache = None - draft_logits = None - kv_cache = None - logits = None - next_token = ( - None # the token generated by the original model at each full iteration. - ) - last_output_length = 0 - finish_reason = "stop" - - # performance stats. - total_seconds_on_drafting = 0.0 - total_seconds_on_eval = 0.0 - total_seconds_on_accepting = 0.0 - total_num_draft_tokens = 0 - total_num_accepted_tokens = 0 - - while len(output_ids) < max_new_tokens + num_prompt_tokens: - # allow the draft model to generate more than max_tokens since some of the generated - # tokens could be rejected. - start = time.time() - num_draft_tokens, output_ids, draft_kv_cache, draft_logits = draft( - input_ids=output_ids, - kv_cache=draft_kv_cache, - logits=draft_logits, - draft_model=draft_model, - gamma=gamma, - logits_processor=logits_processor, - temperature=temperature - * 0.5, # make the draft model outputs less random for better quality. - top_p=top_p, - ) - total_seconds_on_drafting += time.time() - start - total_num_draft_tokens += num_draft_tokens - - # eval stage. - start = time.time() - if kv_cache is None: - # prefill. - out = model( - torch.as_tensor([output_ids], device=model.device), use_cache=True - ) - logits = normalize_logits(logits_processor, output_ids, out.logits) - else: - out = model( - torch.as_tensor( - [[next_token] + output_ids[-num_draft_tokens:]], device=model.device - ), - use_cache=True, - past_key_values=kv_cache, - ) - normalized = normalize_logits(logits_processor, output_ids, out.logits) - logits = torch.cat((logits, normalized), dim=1) - kv_cache = out.past_key_values - total_seconds_on_eval += time.time() - start - - # accepting stage. - start = time.time() - assert draft_logits is not None - assert draft_kv_cache is not None - accepted = 0 - stopped = False - for draft_token_idx in range(-num_draft_tokens, 0): - r = torch.rand(1, device=logits.device) - draft_token = output_ids[draft_token_idx] - token_logits = logits[:, draft_token_idx - 1, :] # [1, n_vocab,] - draft_token_logits = draft_logits[:, draft_token_idx, :].to( - logits.device - ) # [1, n_vocab,] - if token_logits[0, draft_token] / draft_token_logits[0, draft_token] > r: - accepted += 1 - total_num_accepted_tokens += 1 - if draft_token in stop_token_ids: - stopped = True - else: - if logger.getEffectiveLevel() <= logging.DEBUG: - logger.debug( - f"Accepted ({accepted}/{num_draft_tokens}): '{tokenizer.decode(output_ids[-num_draft_tokens: draft_token_idx])}'" - ) - logger.debug( - f"Rejected: '{tokenizer.decode(output_ids[draft_token_idx:])}'" - ) - # rollback. - output_ids = output_ids[:draft_token_idx] - draft_kv_cache = rollback_kv_cache( - draft_kv_cache, num_draft_tokens - accepted - ) - kv_cache = rollback_kv_cache(kv_cache, num_draft_tokens - accepted) - draft_logits = rollback_logits( - draft_logits, num_draft_tokens - accepted - ) - logits = rollback_logits(logits, num_draft_tokens - accepted) - - # sample the next token according to the modified distribution of shape [1, n_vocab] - modified_dist = token_logits - draft_token_logits - modified_dist = torch.where( - modified_dist > 0, modified_dist, torch.zeros_like(modified_dist) - ) - normalized = normalize_logits( - logits_processor, - output_ids, - modified_dist.unsqueeze(1), # [1, 1, n_vocab] - ) - next_token = sample( - normalized[0, -1, :], - 0, # must be 0, since the dist is quiet unified, higher temperature results in garbled text - top_p, - ) - output_ids.append(next_token) - if logger.getEffectiveLevel() <= logging.DEBUG: - logger.debug(f"Generated: '{tokenizer.decode([next_token])}'") - if next_token in stop_token_ids: - stopped = True - break - - if accepted == num_draft_tokens: - if logger.getEffectiveLevel() <= logging.DEBUG: - logger.debug( - f"Accepted ({accepted}/{num_draft_tokens}): '{tokenizer.decode(output_ids[-num_draft_tokens:])}'" - ) - next_token = sample( - logits[0, -1, :], - temperature, - top_p, - ) - output_ids.append(next_token) - if logger.getEffectiveLevel() <= logging.DEBUG: - logger.debug(f"Generated: '{tokenizer.decode([next_token])}'") - if next_token in stop_token_ids: - stopped = True - - total_seconds_on_accepting += time.time() - start - - if ( - accepted > 0 # more than 2 tokens has been generated, flush. - or len(output_ids) >= max_new_tokens - or stopped - ): - output = tokenizer.decode( - output_ids if echo else output_ids[num_prompt_tokens:], - spaces_between_special_tokens=False, - clean_up_tokenization_spaces=True, - ) - rfind_start = len(prompt) if echo else 0 - - partially_stopped = False - if stop_str: - if isinstance(stop_str, str): - pos = output.rfind(stop_str, rfind_start) - if pos != -1: - output = output[:pos] - stopped = True - else: - partially_stopped = is_partial_stop(output, stop_str) - elif isinstance(stop_str, Iterable): - for each_stop in stop_str: - pos = output.rfind(each_stop, rfind_start) - if pos != -1: - output = output[:pos] - stopped = True - break - else: - partially_stopped = is_partial_stop(output, each_stop) - if partially_stopped: - break - else: - raise ValueError(f"Invalid stop field type {type(stop_str)}") - - if stream: - # return the delta. - output_length = len(output) - output = output[last_output_length:] - last_output_length = output_length - - # prevent yielding partial stop sequence. - if not partially_stopped: - completion_choice = CompletionChoice( - text=output, index=0, logprobs=None, finish_reason=None - ) - completion_chunk = CompletionChunk( - id=request_id, - object="text_completion", - created=int(time.time()), - model=model_uid, - choices=[completion_choice], - ) - completion_usage = CompletionUsage( - prompt_tokens=num_prompt_tokens, - completion_tokens=len(output_ids) - num_prompt_tokens, - total_tokens=len(output_ids), - ) - - yield completion_chunk, completion_usage - if stopped: - break - else: - finish_reason = "length" - - logger.info( - f"In total, {total_num_accepted_tokens}/{total_num_draft_tokens} draft tokens are " - f"accepted, acceptance rate: {total_num_accepted_tokens / total_num_draft_tokens:.2f}" - ) - total_seconds = ( - total_seconds_on_drafting + total_seconds_on_eval + total_seconds_on_accepting - ) - logger.info( - f"In total, {total_seconds_on_drafting:.2f}s, {total_seconds_on_eval:.2f}s and " - f"{total_seconds_on_accepting:.2f}s are spent on drafting, eval, and accepting " - f"respectively. Average generation speed: {(len(output_ids) - num_prompt_tokens) / total_seconds:.2f} tokens/s." - ) - - if stream: - completion_choice = CompletionChoice( - text="", index=0, logprobs=None, finish_reason=finish_reason - ) - else: - completion_choice = CompletionChoice( - text=output, index=0, logprobs=None, finish_reason=finish_reason - ) - - completion_chunk = CompletionChunk( - id=request_id, - object="text_completion", - created=int(time.time()), - model=model_uid, - choices=[completion_choice], - ) - completion_usage = CompletionUsage( - prompt_tokens=num_prompt_tokens, - completion_tokens=len(output_ids) - num_prompt_tokens, - total_tokens=len(output_ids), - ) - - yield completion_chunk, completion_usage - - # clean up. - del kv_cache - del draft_kv_cache - gc.collect() - empty_cache() diff --git a/xinference/model/llm/pytorch/spec_model.py b/xinference/model/llm/pytorch/spec_model.py deleted file mode 100644 index 134ade2342..0000000000 --- a/xinference/model/llm/pytorch/spec_model.py +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -from typing import Iterator, List, Optional, Union - -from ....device_utils import ( - get_device_preferred_dtype, - gpu_count, - is_hf_accelerate_supported, -) -from ....types import Completion, CompletionChunk, Embedding -from ...utils import select_device -from .. import LLMFamilyV1, LLMSpecV1 -from .core import PytorchChatModel, PytorchGenerateConfig, PytorchModelConfig - -logger = logging.getLogger(__name__) - - -class SpeculativeModel(PytorchChatModel): - def __init__( - self, - model_uid: str, - model_family: "LLMFamilyV1", - model_spec: "LLMSpecV1", - quantization: str, - model_path: str, - draft_model_family: "LLMFamilyV1", - draft_model_spec: "LLMSpecV1", - draft_quantization: str, - draft_model_path: str, - ): - super().__init__(model_uid, model_family, model_spec, quantization, model_path) - self._pytorch_model_config: PytorchModelConfig = self._sanitize_model_config( - PytorchModelConfig() - ) - self._draft_model_family = draft_model_family - self._draft_model_spec = draft_model_spec - self._draft_quantization = draft_quantization - self._draft_model_path = draft_model_path - - def _load_model(self, model_path, **kwargs): - try: - from transformers import AutoModelForCausalLM, AutoTokenizer - except ImportError: - error_message = "Failed to import module 'transformers'" - installation_guide = [ - "Please make sure 'transformers' is installed. ", - "You can install it by `pip install transformers`\n", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - tokenizer = AutoTokenizer.from_pretrained( - model_path, - use_fast=self._use_fast_tokenizer, - trust_remote_code=kwargs["trust_remote_code"], - revision=kwargs["revision"], - ) - model = AutoModelForCausalLM.from_pretrained( - model_path, - low_cpu_mem_usage=True, - **kwargs, - ) - return model, tokenizer - - def load(self): - try: - import torch # noqa: F401 - except ImportError: - raise ImportError( - f"Failed to import module 'torch'. Please make sure 'torch' is installed.\n\n" - ) - - num_gpus = gpu_count() - device = self._pytorch_model_config.get("device", "auto") - self._pytorch_model_config["device"] = select_device(device) - self._device = self._pytorch_model_config["device"] - - kwargs = {} - - dtype = get_device_preferred_dtype(self._device) - - if dtype is not None: - kwargs["torch_dtype"] = dtype - else: - raise ValueError(f"Device {self._device} is not supported in temporary") - - kwargs["trust_remote_code"] = self._pytorch_model_config.get( - "trust_remote_code" - ) - - if self.quantization != "none": - raise ValueError( - "Quantization is not supported by speculative decoding yet" - ) - - is_device_map_auto = False - - if num_gpus > 0 and is_hf_accelerate_supported(self._device): - kwargs.update({"device_map": "auto"}) - is_device_map_auto = True - - self._model, self._tokenizer = self._load_model( - model_path=self.model_path, - revision=self.model_spec.model_revision, - **kwargs, - ) - if not is_device_map_auto: - self._model.to(self._device) - logger.debug( - f"Model {self.model_uid} memory footprint: {self._model.get_memory_footprint()}" - ) - - self._draft_model, _ = self._load_model( - model_path=self._draft_model_path, - revision=self._draft_model_spec.model_revision, - **kwargs, - ) - if not is_device_map_auto: - self._model.to(self._device) - logger.debug( - f"Draft model {self.model_uid} memory footprint: {self._model.get_memory_footprint()}" - ) - - def generate( - self, prompt: str, generate_config: Optional[PytorchGenerateConfig] = None - ) -> Union[Completion, Iterator[CompletionChunk]]: - def generator_wrapper( - _prompt: str, _generate_config: PytorchGenerateConfig - ) -> Iterator[CompletionChunk]: - for _completion_chunk, _completion_usage in speculative_generate_stream( - model_uid=self.model_uid, - draft_model=self._draft_model, - model=self._model, - tokenizer=self._tokenizer, - prompt=_prompt, - generate_config=_generate_config, - ): - yield _completion_chunk - - from .spec_decoding_utils import speculative_generate_stream - - generate_config = self._sanitize_generate_config(generate_config) - - assert self._draft_model is not None - assert self._model is not None - assert self._tokenizer is not None - - stream = generate_config.get("stream", False) - if not stream: - for completion_chunk, completion_usage in speculative_generate_stream( - model_uid=self.model_uid, - draft_model=self._draft_model, - model=self._model, - tokenizer=self._tokenizer, - prompt=prompt, - generate_config=generate_config, - ): - pass - - completion = Completion( - id=completion_chunk["id"], - object=completion_chunk["object"], - created=completion_chunk["created"], - model=completion_chunk["model"], - choices=completion_chunk["choices"], - usage=completion_usage, - ) - return completion - else: - return generator_wrapper(prompt, generate_config) - - def create_embedding(self, input: Union[str, List[str]]) -> Embedding: - raise NotImplementedError diff --git a/xinference/model/llm/pytorch/tests/test_spec_decoding.py b/xinference/model/llm/pytorch/tests/test_spec_decoding.py deleted file mode 100644 index 106a964801..0000000000 --- a/xinference/model/llm/pytorch/tests/test_spec_decoding.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging - -import pytest -import torch -from transformers import AutoModelForCausalLM, AutoTokenizer - -from ..spec_decoding_utils import speculative_generate_stream - -logging.basicConfig(level=logging.DEBUG) - - -@pytest.mark.skip(reason="Temporary disabled") -def test_spec_decoding(): - """ - Use the draft model itself as the target model. If the decoding works, all the draft tokens - should be accepted, and the result of speculative decoding should be the same as the regular - decoding, which starts with "The largest animal ever recorded is the Tyrannosaurus Rex". - """ - - model_id = "PY007/TinyLlama-1.1B-Chat-v0.3" - draft_model = AutoModelForCausalLM.from_pretrained( - model_id, - device_map="auto", - torch_dtype=torch.float16, - ) - tokenizer = AutoTokenizer.from_pretrained(model_id) - prompt = "What is the largest animal?" - formatted_prompt = f"<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant\n" - - for completion_chunk, completion_usage in speculative_generate_stream( - model_uid=model_id, - draft_model=draft_model, - model=draft_model, - tokenizer=tokenizer, - prompt=formatted_prompt, - generate_config={"model": "test", "temperature": 0, "max_tokens": 64}, - ): - pass - - completion = completion_chunk["choices"][0]["text"] - assert completion.startswith( - "The largest animal ever recorded is the Tyrannosaurus Rex" - ) From 8c558ffbcf780783b5943164b02083115b75aa47 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Thu, 9 May 2024 11:39:54 +0800 Subject: [PATCH 069/298] ENH: Some minor changes (#1453) --- xinference/core/worker.py | 68 +++++++++++++++++++++++------------- xinference/model/llm/core.py | 10 ------ 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index b5799f0975..dc623f43f4 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -137,14 +137,19 @@ async def recover_sub_pool(self, address): recover_count - 1, ) event_model_uid, _, __ = parse_replica_model_uid(model_uid) - await self._event_collector_ref.report_event( - event_model_uid, - Event( - event_type=EventType.WARNING, - event_ts=int(time.time()), - event_content="Recreate model", - ), - ) + try: + await self._event_collector_ref.report_event( + event_model_uid, + Event( + event_type=EventType.WARNING, + event_ts=int(time.time()), + event_content="Recreate model", + ), + ) + except Exception as e: + # Report callback error can be log and ignore, should not interrupt the Process + logger.error("report_event error: %s" % (e)) + self._model_uid_to_recover_count[model_uid] = ( recover_count - 1 ) @@ -258,7 +263,11 @@ async def __post_create__(self): if os.name != "nt": async def signal_handler(): - await self._supervisor_ref.remove_worker(self.address) + try: + await self._supervisor_ref.remove_worker(self.address) + except Exception as e: + # Ignore the error of rpc, anyway we are exiting + logger.exception("remove worker rpc error: %s", e) os._exit(0) loop = asyncio.get_running_loop() @@ -572,14 +581,18 @@ async def launch_builtin_model( launch_args.update(kwargs) event_model_uid, _, __ = parse_replica_model_uid(model_uid) - await self._event_collector_ref.report_event( - event_model_uid, - Event( - event_type=EventType.INFO, - event_ts=int(time.time()), - event_content="Launch model", - ), - ) + try: + await self._event_collector_ref.report_event( + event_model_uid, + Event( + event_type=EventType.INFO, + event_ts=int(time.time()), + event_content="Launch model", + ), + ) + except Exception as e: + # Report callback error can be log and ignore, should not interrupt the Process + logger.error("report_event error: %s" % (e)) if gpu_idx is not None: logger.info( @@ -668,14 +681,19 @@ async def launch_builtin_model( @log_async(logger=logger) async def terminate_model(self, model_uid: str): event_model_uid, _, __ = parse_replica_model_uid(model_uid) - await self._event_collector_ref.report_event( - event_model_uid, - Event( - event_type=EventType.INFO, - event_ts=int(time.time()), - event_content="Terminate model", - ), - ) + try: + await self._event_collector_ref.report_event( + event_model_uid, + Event( + event_type=EventType.INFO, + event_ts=int(time.time()), + event_content="Terminate model", + ), + ) + except Exception as e: + # Report callback error can be log and ignore, should not interrupt the Process + logger.error("report_event error: %s" % (e)) + origin_uid, _, _ = parse_replica_model_uid(model_uid) await self._status_guard_ref.update_instance_info( origin_uid, {"status": LaunchStatus.TERMINATING.name} diff --git a/xinference/model/llm/core.py b/xinference/model/llm/core.py index a85b8da274..53c00a7eaa 100644 --- a/xinference/model/llm/core.py +++ b/xinference/model/llm/core.py @@ -64,16 +64,6 @@ def __init__( if kwargs: raise ValueError(f"Unrecognized keyword arguments: {kwargs}") - @staticmethod - def handle_model_size(model_size_in_billions: Union[str, int]) -> Union[int, float]: - if isinstance(model_size_in_billions, str): - if "_" in model_size_in_billions: - ms = model_size_in_billions.replace("_", ".") - return float(ms) - else: - raise ValueError("Invalid format for `model_size_in_billions`") - return model_size_in_billions - @staticmethod def _is_darwin_and_apple_silicon(): return platform.system() == "Darwin" and platform.processor() == "arm" From da3693e73ae06e2e9de86750d33f7a773d2fc090 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 10 May 2024 04:08:26 +0800 Subject: [PATCH 070/298] BUG: Install error on MacOS due to `auto-gptq` (#1457) --- setup.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index d8e3f77d0b..1e73affecc 100644 --- a/setup.cfg +++ b/setup.cfg @@ -122,8 +122,8 @@ transformers = protobuf einops tiktoken - auto-gptq - autoawq + auto-gptq ; sys_platform!='darwin' + autoawq ; sys_platform!='darwin' optimum attrdict # For deepseek VL timm>=0.9.16 # For deepseek VL From b4a5c01b3b32c67885790945dfef1ba6432ee8d9 Mon Sep 17 00:00:00 2001 From: Wang Xuejin <92132848+Ago327@users.noreply.github.com> Date: Fri, 10 May 2024 10:34:09 +0800 Subject: [PATCH 071/298] BUG: fix some issues in query engine interface (#1442) --- xinference/model/llm/__init__.py | 19 ++++++-- xinference/model/llm/tests/test_llm_family.py | 45 +++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 5541a07762..42b0b72c3e 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -51,10 +51,19 @@ ) +def check_format_with_engine(model_format, engine): + # only llama-cpp-python support and only support ggufv2 and ggmlv3 + if model_format in ["ggufv2", "ggmlv3"] and engine != "llama-cpp-python": + return False + if model_format not in ["ggufv2", "ggmlv3"] and engine == "llama-cpp-python": + return False + return True + + def generate_engine_config_by_model_family(model_family): model_name = model_family.model_name specs = model_family.model_specs - engines = {} # structure for engine query + engines = LLM_ENGINES.get(model_name, {}) # structure for engine query for spec in specs: model_format = spec.model_format model_size_in_billions = spec.model_size_in_billions @@ -62,6 +71,10 @@ def generate_engine_config_by_model_family(model_family): for quantization in quantizations: # traverse all supported engines to match the name, format, size in billions and quatization of model for engine in SUPPORTED_ENGINES: + if not check_format_with_engine( + model_format, engine + ): # match the format of model with engine + continue CLASSES = SUPPORTED_ENGINES[engine] for cls in CLASSES: if cls.match(model_family, spec, quantization): @@ -74,9 +87,9 @@ def generate_engine_config_by_model_family(model_family): and model_format == param["model_format"] and model_size_in_billions == param["model_size_in_billions"] - and quantization not in param["quantizations"] ): - param["quantizations"].append(quantization) + if quantization not in param["quantizations"]: + param["quantizations"].append(quantization) already_exists = True break # successfully match the params for the first time, add to the structure diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index 60973d3c77..0dc1b78657 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -1198,6 +1198,14 @@ def test_query_engine_general(): unregister_llm, ) + assert check_engine_by_spec_parameters( + model_engine="PyTorch", + model_name="aquila2", + model_format="pytorch", + model_size_in_billions=7, + quantization="none", + ) + model_name = "qwen1.5-chat" assert model_name in LLM_ENGINES @@ -1302,3 +1310,40 @@ def test_query_engine_general(): unregister_llm(family.model_name) assert family not in get_user_defined_llm_families() assert "custom_model" not in LLM_ENGINES + + spec = GgmlLLMSpecV1( + model_format="ggufv2", + model_size_in_billions="1_8", + model_id="null", + quantizations=["default"], + model_file_name_template="qwen1_5-1_8b-chat-q4_0.gguf", + ) + family = LLMFamilyV1( + version=1, + context_length=2048, + model_type="LLM", + model_name="custom-qwen1.5-chat", + model_lang=["en", "zh"], + model_ability=["generate", "chat"], + model_specs=[spec], + prompt_style={ + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": ["user", "assistant"], + "intra_message_sep": "\n", + "inter_message_sep": "", + "stop": ["<|endoftext|>", "<|im_start|>", "<|im_end|>"], + "stop_token_ids": [151643, 151644, 151645], + }, + ) + + register_llm(family, False) + + assert family in get_user_defined_llm_families() + assert "custom-qwen1.5-chat" in LLM_ENGINES and ["llama-cpp-python"] == list( + LLM_ENGINES["custom-qwen1.5-chat"].keys() + ) + + unregister_llm(family.model_name) + assert family not in get_user_defined_llm_families() + assert "custom-qwen1.5-chat" not in LLM_ENGINES From d7762ee3649a196b3b068050e837e96a15442498 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Fri, 10 May 2024 10:56:53 +0800 Subject: [PATCH 072/298] FEAT: [UI] Add engine option when launching LLM (#1456) --- .../ui/src/scenes/launch_model/modelCard.js | 132 ++++++++++++++---- 1 file changed, 107 insertions(+), 25 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 9166fae71c..f191b03771 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -58,6 +58,7 @@ const ModelCard = ({ // Model parameter selections const [modelUID, setModelUID] = useState('') + const [modelEngine, setModelEngine] = useState('') const [modelFormat, setModelFormat] = useState('') const [modelSize, setModelSize] = useState('') const [quantization, setQuantization] = useState('') @@ -68,6 +69,8 @@ const ModelCard = ({ const [workerIp, setWorkerIp] = useState('') const [GPUIdx, setGPUIdx] = useState('') + const [enginesObj, setEnginesObj] = useState({}) + const [engineOptions, setEngineOptions] = useState([]) const [formatOptions, setFormatOptions] = useState([]) const [sizeOptions, setSizeOptions] = useState([]) const [quantizationOptions, setQuantizationOptions] = useState([]) @@ -96,50 +99,56 @@ const ModelCard = ({ return size.toString().includes('_') ? size : parseInt(size, 10) } - // UseEffects for parameter selection, change options based on previous selections useEffect(() => { - if (modelData) { - if (modelData.model_specs) { - const modelFamily = modelData.model_specs - const formats = [ - ...new Set(modelFamily.map((spec) => spec.model_format)), - ] - setFormatOptions(formats) + setModelFormat('') + if (modelEngine) { + const format = [ + ...new Set(enginesObj[modelEngine].map((item) => item.model_format)), + ] + setFormatOptions(format) + if (format.length === 1) { + setModelFormat(format[0]) } } - }, [modelData]) + }, [modelEngine]) useEffect(() => { - if (modelFormat && modelData) { - const modelFamily = modelData.model_specs + setModelSize('') + if (modelEngine && modelFormat) { const sizes = [ ...new Set( - modelFamily - .filter((spec) => spec.model_format === modelFormat) - .map((spec) => spec.model_size_in_billions) + enginesObj[modelEngine] + .filter((item) => item.model_format === modelFormat) + .map((item) => item.model_size_in_billions) ), ] setSizeOptions(sizes) + if (sizes.length === 1) { + setModelSize(sizes[0]) + } } - }, [modelFormat, modelData]) + }, [modelEngine, modelFormat]) useEffect(() => { - if (modelFormat && modelSize && modelData) { - const modelFamily = modelData.model_specs + setQuantization('') + if (modelEngine && modelFormat && modelSize) { const quants = [ ...new Set( - modelFamily + enginesObj[modelEngine] .filter( - (spec) => - spec.model_format === modelFormat && - spec.model_size_in_billions === convertModelSize(modelSize) + (item) => + item.model_format === modelFormat && + item.model_size_in_billions === convertModelSize(modelSize) ) - .flatMap((spec) => spec.quantizations) + .flatMap((item) => item.quantizations) ), ] setQuantizationOptions(quants) + if (quants.length === 1) { + setQuantization(quants[0]) + } } - }, [modelFormat, modelSize, modelData]) + }, [modelEngine, modelFormat, modelSize]) useEffect(() => { if (parentRef.current) { @@ -158,6 +167,37 @@ const ModelCard = ({ return ['auto', 'CPU'].concat(range(1, gpuAvailable)) } + const getModelEngine = (model_name) => { + fetcher(url + `/v1/engines/${model_name}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }) + .then((response) => { + if (!response.ok) { + // Assuming the server returns error details in JSON format + response.json().then((errorData) => { + setErrorMsg( + `Server error: ${response.status} - ${ + errorData.detail || 'Unknown error' + }` + ) + }) + } else { + response.json().then((data) => { + setEnginesObj(data) + setEngineOptions(Object.keys(data)) + }) + } + setIsCallingApi(false) + }) + .catch((error) => { + console.error('Error:', error) + setIsCallingApi(false) + }) + } + const launchModel = (url) => { if (isCallingApi || isUpdatingModel) { return @@ -170,6 +210,7 @@ const ModelCard = ({ model_uid: modelUID.trim() === '' ? null : modelUID.trim(), model_name: modelData.model_name, model_type: modelType, + model_engine: modelEngine, model_format: modelFormat, model_size_in_billions: convertModelSize(modelSize), quantization: quantization, @@ -357,6 +398,9 @@ const ModelCard = ({ onClick={() => { if (!selected && !customDeleted) { setSelected(true) + if (modelType === 'LLM') { + getModelEngine(modelData.model_name) + } } }} elevation={hover ? 24 : 4} @@ -543,6 +587,43 @@ const ModelCard = ({ <Grid rowSpacing={0} columnSpacing={1}> <Grid item xs={12}> <FormControl variant="outlined" margin="normal" fullWidth> + <InputLabel id="modelEngine-label">Model Engine</InputLabel> + <Select + labelId="modelEngine-label" + value={modelEngine} + onChange={(e) => setModelEngine(e.target.value)} + label="Model Engine" + > + {engineOptions.map((engine) => { + const arr = [] + enginesObj[engine].forEach((item) => { + arr.push(item.model_format) + }) + const specs = modelData.model_specs.filter((spec) => + arr.includes(spec.model_format) + ) + + const cached = specs.some((spec) => isCached(spec)) + const displayedEngine = cached + ? engine + ' (cached)' + : engine + + return ( + <MenuItem key={engine} value={engine}> + {displayedEngine} + </MenuItem> + ) + })} + </Select> + </FormControl> + </Grid> + <Grid item xs={12}> + <FormControl + variant="outlined" + margin="normal" + fullWidth + disabled={!modelEngine} + > <InputLabel id="modelFormat-label">Model Format</InputLabel> <Select labelId="modelFormat-label" @@ -821,8 +902,9 @@ const ModelCard = ({ </Collapse> <AddPair customData={{ - title: - 'Additional parameters passed to the inference engine', + title: `Additional parameters passed to the inference engine${ + modelEngine ? ': ' + modelEngine : '' + }`, key: 'key', value: 'value', }} From 0cb0f0ea4467f7ed7b06bef41ff949f4f030deac Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Fri, 10 May 2024 11:07:20 +0800 Subject: [PATCH 073/298] ENH: make deepseek_vl support streaming output (#1444) --- xinference/model/llm/pytorch/deepseek_vl.py | 118 +++++++++++++++----- 1 file changed, 87 insertions(+), 31 deletions(-) diff --git a/xinference/model/llm/pytorch/deepseek_vl.py b/xinference/model/llm/pytorch/deepseek_vl.py index 0dd9bb5e79..bbe98a97e0 100644 --- a/xinference/model/llm/pytorch/deepseek_vl.py +++ b/xinference/model/llm/pytorch/deepseek_vl.py @@ -27,9 +27,11 @@ from ....model.utils import select_device from ....types import ( ChatCompletion, - ChatCompletionChoice, ChatCompletionChunk, ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionChunk, CompletionUsage, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 @@ -149,10 +151,11 @@ def chat( chat_history: Optional[List[ChatCompletionMessage]] = None, generate_config: Optional[PytorchGenerateConfig] = None, ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: - if generate_config and generate_config.get("stream"): - raise Exception( - f"Chat with model {self.model_family.model_name} does not support stream." - ) + if not generate_config: + generate_config = {} + + stream = generate_config.get("stream", False) + prompt, images = self._message_content_to_deepseek(prompt) prompt_messages: List[Dict[str, Any]] = [ { @@ -184,6 +187,7 @@ def chat( deepseek_history.extend(prompt_messages) + from ....thirdparty.deepseek_vl.serve.inference import generate from ....thirdparty.deepseek_vl.utils.io import load_pil_images # load images and prepare for inputs @@ -192,41 +196,93 @@ def chat( conversations=deepseek_history, images=pil_images, force_batchify=True ).to(self._model.device, self._model.dtype) - # run image encoder to get the image embeddings - inputs_embeds = self._model.prepare_inputs_embeds(**prepare_inputs) - - # run the model to get the response - outputs = self._model.language_model.generate( - inputs_embeds=inputs_embeds, - attention_mask=prepare_inputs.attention_mask, - pad_token_id=self._tokenizer.eos_token_id, - bos_token_id=self._tokenizer.bos_token_id, - eos_token_id=self._tokenizer.eos_token_id, - max_new_tokens=512, - do_sample=True, - top_p=0.95, - temperature=0.2, - repetition_penalty=1.1, - use_cache=True, - ) + temperature = generate_config.get("temperature", 0.2) + top_p = generate_config.get("top_p", 0.95) + max_new_tokens = generate_config.get("max_tokens", 512) + repetition_penalty = generate_config.get("repetition_penalty", 1.1) + + conversation = self._vl_chat_processor.new_chat_template() + stop_str = conversation.sep2 + stop_words = [stop_str] - answer = self._tokenizer.decode( - outputs[0].cpu().tolist(), skip_special_tokens=True + streamer = generate( + vl_gpt=self._model, + tokenizer=self._tokenizer, + prepare_inputs=prepare_inputs, + max_gen_len=max_new_tokens, + temperature=temperature, + repetition_penalty=repetition_penalty, + top_p=top_p, + stop_words=stop_words, ) - return ChatCompletion( - id="chat" + str(uuid.uuid1()), - object="chat.completion", + if stream: + it = self._generate_stream(streamer, stop_str) + return self._to_chat_completion_chunks(it) + else: + c = self._generate(streamer, stop_str) + return self._to_chat_completion(c) + + def _generate(self, streamer, stop_str) -> Completion: + generated_text = "" + for new_text in streamer: + if new_text.endswith(stop_str): + new_text = new_text[: -len(stop_str)] + generated_text += new_text + + c = Completion( + id=str(uuid.uuid1()), + object="text_completion", created=int(time.time()), model=self.model_uid, choices=[ - ChatCompletionChoice( - index=0, - message={"role": "assistant", "content": answer}, - finish_reason="stop", + CompletionChoice( + index=0, text=generated_text, finish_reason="stop", logprobs=None ) ], usage=CompletionUsage( prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 ), ) + return c + + def _generate_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: + completion_id = str(uuid.uuid1()) + for i, new_text in enumerate(streamer): + if new_text.endswith(stop_str): + new_text = new_text[: -len(stop_str)] + completion_choice = CompletionChoice( + text=new_text, index=0, logprobs=None, finish_reason=None + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk + + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk From 9aba89f1dbdc5c3ebe66bd5ee2c3d1e1d7904d79 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 10 May 2024 14:19:23 +0800 Subject: [PATCH 074/298] ENH: Rename `model_engine` for more clear inference backend (#1466) --- xinference/client/tests/test_client.py | 10 +-- xinference/core/tests/test_metrics.py | 4 +- xinference/core/tests/test_restful_api.py | 14 +-- xinference/deploy/cmdline.py | 85 ++++++++++++++++--- xinference/deploy/test/test_cmdline.py | 4 +- xinference/model/llm/__init__.py | 14 +-- xinference/model/llm/ggml/tests/test_gguf.py | 4 +- xinference/model/llm/llm_family.py | 2 +- .../model/llm/pytorch/tests/test_opt.py | 4 +- xinference/model/llm/tests/test_llm_family.py | 31 +++---- 10 files changed, 116 insertions(+), 56 deletions(-) diff --git a/xinference/client/tests/test_client.py b/xinference/client/tests/test_client.py index 8d179516c2..1b3c919124 100644 --- a/xinference/client/tests/test_client.py +++ b/xinference/client/tests/test_client.py @@ -38,7 +38,7 @@ def test_RESTful_client(setup): model_uid = client.launch_model( model_name="orca", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_size_in_billions=3, quantization="q4_0", ) @@ -111,7 +111,7 @@ def _check_stream(): model_uid = client.launch_model( model_name="tiny-llama", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_size_in_billions=1, model_format="ggufv2", quantization="q2_K", @@ -158,7 +158,7 @@ def _check(stream=False): model_uid2 = client.launch_model( model_name="orca", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_size_in_billions=3, quantization="q4_0", ) @@ -326,7 +326,7 @@ def test_client_from_modelscope(setup): assert len(client.list_models()) == 0 model_uid = client.launch_model( - model_name="tiny-llama", model_engine="llama-cpp-python" + model_name="tiny-llama", model_engine="llama.cpp" ) assert len(client.list_models()) == 1 model = client.get_model(model_uid=model_uid) @@ -442,7 +442,7 @@ def test_auto_recover(set_auto_recover_limit, setup_cluster): model_uid = client.launch_model( model_name="orca", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_size_in_billions=3, quantization="q4_0", ) diff --git a/xinference/core/tests/test_metrics.py b/xinference/core/tests/test_metrics.py index 1c2303fbe1..e1960b9edc 100644 --- a/xinference/core/tests/test_metrics.py +++ b/xinference/core/tests/test_metrics.py @@ -66,7 +66,7 @@ async def test_metrics_exporter_server(setup_cluster): model_uid = client.launch_model( model_name="orca", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_size_in_billions=3, quantization="q4_0", ) @@ -96,7 +96,7 @@ async def test_metrics_exporter_data(setup_cluster): model_uid = client.launch_model( model_name="orca", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_size_in_billions=3, model_format="ggmlv3", quantization="q4_0", diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index 275260cdc4..608b1cb9d5 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -39,7 +39,7 @@ async def test_restful_api(setup): # launch payload = { "model_uid": "test_restful_api", - "model_engine": "llama-cpp-python", + "model_engine": "llama.cpp", "model_name": "orca", "quantization": "q4_0", } @@ -983,7 +983,7 @@ def test_restful_api_with_request_limits(setup): url = f"{endpoint}/v1/models" payload = { "model_uid": "test_restful_api", - "model_engine": "llama-cpp-python", + "model_engine": "llama.cpp", "model_name": "orca", "quantization": "q4_0", "request_limits": 0, @@ -1021,7 +1021,7 @@ async def test_openai(setup): # launch payload = { "model_uid": "test_restful_api", - "model_engine": "llama-cpp-python", + "model_engine": "llama.cpp", "model_name": "orca", "quantization": "q4_0", } @@ -1080,7 +1080,7 @@ def test_lang_chain(setup): # launch payload = { "model_uid": "test_restful_api", - "model_engine": "llama-cpp-python", + "model_engine": "llama.cpp", "model_name": "orca", "quantization": "q4_0", } @@ -1148,7 +1148,7 @@ def test_launch_model_async(setup): payload = { "model_uid": "test_orca", - "model_engine": "llama-cpp-python", + "model_engine": "llama.cpp", "model_name": "orca", "quantization": "q4_0", } @@ -1183,7 +1183,7 @@ def test_events(setup): payload = { "model_uid": "test_orca", - "model_engine": "llama-cpp-python", + "model_engine": "llama.cpp", "model_name": "orca", "quantization": "q4_0", } @@ -1222,7 +1222,7 @@ def test_launch_model_by_version(setup): payload = { "model_uid": "test_orca", - "model_engine": "llama-cpp-python", + "model_engine": "llama.cpp", "model_type": "LLM", "model_version": version_info["model_version"], } diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 4f4727d965..a2a11cb071 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -17,7 +17,7 @@ import os import sys import warnings -from typing import List, Optional, Tuple, Union +from typing import List, Optional, Sequence, Tuple, Union import click from xoscar.utils import get_next_port @@ -1215,14 +1215,42 @@ def cluster_login( f.write(access_token) -@cli.command(name="engine", help="Query engine parameters by model name.") -@click.option("--model-name", type=str, required=True, help="Model name.") -@click.option("--model_engine", type=str, default=None, help="Model engine.") -@click.option("--model_format", type=str, default=None, help="Model format.") +@cli.command(name="engine", help="Query the applicable inference engine by model name.") @click.option( - "--model_size_in_billions", type=str, default=None, help="Model size in billions." + "--model-name", + "-n", + type=str, + required=True, + help="The model name you want to query.", +) +@click.option( + "--model-engine", + "-en", + type=str, + default=None, + help="Specify the `model_engine` to query the corresponding combination of other parameters.", +) +@click.option( + "--model-format", + "-f", + type=str, + default=None, + help="Specify the `model_format` to query the corresponding combination of other parameters.", +) +@click.option( + "--model-size-in-billions", + "-s", + type=str, + default=None, + help="Specify the `model_size_in_billions` to query the corresponding combination of other parameters.", +) +@click.option( + "--quantization", + "-q", + type=str, + default=None, + help="Specify the `quantization` to query the corresponding combination of other parameters.", ) -@click.option("--quantization", type=str, default=None, help="Quantization.") @click.option("--endpoint", "-e", type=str, help="Xinference endpoint.") @click.option( "--api-key", @@ -1242,14 +1270,47 @@ def query_engine_by_model_name( ): from tabulate import tabulate + def match_engine_from_spell(value: str, target: Sequence[str]) -> Tuple[bool, str]: + """ + For better usage experience. + """ + for t in target: + if value.lower() == t.lower(): + return True, t + return False, value + + def handle_user_passed_parameters() -> List[str]: + user_specified_parameters = [] + if model_engine is not None: + user_specified_parameters.append(f"--model-engine {model_engine}") + if model_format is not None: + user_specified_parameters.append(f"--model-format {model_format}") + if model_size_in_billions is not None: + user_specified_parameters.append( + f"--model-size-in-billions {model_size_in_billions}" + ) + if quantization is not None: + user_specified_parameters.append(f"--quantization {quantization}") + return user_specified_parameters + + user_specified_params = handle_user_passed_parameters() + endpoint = get_endpoint(endpoint) client = RESTfulClient(base_url=endpoint, api_key=api_key) if api_key is None: client._set_token(get_stored_token(endpoint, client)) llm_engines = client.query_engine_by_model_name(model_name) - if model_engine is not None and model_engine not in llm_engines: - raise ValueError(f"Model {model_name} cannot be run on engine {model_engine}.") + if model_engine is not None: + is_matched, model_engine = match_engine_from_spell( + model_engine, list(llm_engines.keys()) + ) + if not is_matched: + print( + f'Xinference does not support this inference engine "{model_engine}".', + file=sys.stderr, + ) + return table = [] engines = [model_engine] if model_engine is not None else list(llm_engines.keys()) @@ -1286,8 +1347,10 @@ def query_engine_by_model_name( ] ) if len(table) == 0: - raise ValueError( - f"Cannot find parameters for Model {model_name} with format {model_format}, size {model_size_in_billions} and quantization {quantization} on engine {model_engine}." + print( + f"Xinference does not support " + f"your provided params: {', '.join(user_specified_params)} for the model {model_name}.", + file=sys.stderr, ) else: print( diff --git a/xinference/deploy/test/test_cmdline.py b/xinference/deploy/test/test_cmdline.py index a8b2f3919a..5d4c4de8f2 100644 --- a/xinference/deploy/test/test_cmdline.py +++ b/xinference/deploy/test/test_cmdline.py @@ -65,7 +65,7 @@ def test_cmdline(setup, stream, model_uid): original_model_uid = model_uid model_uid = client.launch_model( model_name="orca", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_uid=model_uid, model_size_in_billions=3, quantization="q4_0", @@ -248,7 +248,7 @@ def test_rotate_logs(setup_with_file_logging): replica = 1 if os.name == "nt" else 2 model_uid = client.launch_model( model_name="orca", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_uid=None, model_size_in_billions=3, quantization="q4_0", diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 42b0b72c3e..944311a0e8 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -33,9 +33,9 @@ BUILTIN_MODELSCOPE_LLM_FAMILIES, LLAMA_CLASSES, LLM_ENGINES, - PYTORCH_CLASSES, SGLANG_CLASSES, SUPPORTED_ENGINES, + TRANSFORMERS_CLASSES, VLLM_CLASSES, CustomLLMFamilyV1, GgmlLLMSpecV1, @@ -53,9 +53,9 @@ def check_format_with_engine(model_format, engine): # only llama-cpp-python support and only support ggufv2 and ggmlv3 - if model_format in ["ggufv2", "ggmlv3"] and engine != "llama-cpp-python": + if model_format in ["ggufv2", "ggmlv3"] and engine != "llama.cpp": return False - if model_format not in ["ggufv2", "ggmlv3"] and engine == "llama-cpp-python": + if model_format not in ["ggufv2", "ggmlv3"] and engine == "llama.cpp": return False return True @@ -142,7 +142,7 @@ def _install(): ) SGLANG_CLASSES.extend([SGLANGModel, SGLANGChatModel]) VLLM_CLASSES.extend([VLLMModel, VLLMChatModel]) - PYTORCH_CLASSES.extend( + TRANSFORMERS_CLASSES.extend( [ BaichuanPytorchChatModel, VicunaPytorchChatModel, @@ -160,13 +160,13 @@ def _install(): ] ) if OmniLMMModel: # type: ignore - PYTORCH_CLASSES.append(OmniLMMModel) + TRANSFORMERS_CLASSES.append(OmniLMMModel) # support 4 engines for now SUPPORTED_ENGINES["vLLM"] = VLLM_CLASSES SUPPORTED_ENGINES["SGLang"] = SGLANG_CLASSES - SUPPORTED_ENGINES["PyTorch"] = PYTORCH_CLASSES - SUPPORTED_ENGINES["llama-cpp-python"] = LLAMA_CLASSES + SUPPORTED_ENGINES["Transformers"] = TRANSFORMERS_CLASSES + SUPPORTED_ENGINES["llama.cpp"] = LLAMA_CLASSES json_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "llm_family.json" diff --git a/xinference/model/llm/ggml/tests/test_gguf.py b/xinference/model/llm/ggml/tests/test_gguf.py index e97b43e7cd..ef06f50d06 100644 --- a/xinference/model/llm/ggml/tests/test_gguf.py +++ b/xinference/model/llm/ggml/tests/test_gguf.py @@ -21,7 +21,7 @@ def test_load_ggmlv3(setup): model_uid = client.launch_model( model_name="orca", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_size_in_billions=3, model_format="ggmlv3", quantization="q4_0", @@ -55,7 +55,7 @@ def test_gguf(setup): model_uid = client.launch_model( model_name="tiny-llama", - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_size_in_billions=1, model_format="ggufv2", quantization="q2_K", diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index e7b8561d3e..c8a9ab685a 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -232,7 +232,7 @@ def parse_raw( BUILTIN_MODELSCOPE_LLM_FAMILIES: List["LLMFamilyV1"] = [] SGLANG_CLASSES: List[Type[LLM]] = [] -PYTORCH_CLASSES: List[Type[LLM]] = [] +TRANSFORMERS_CLASSES: List[Type[LLM]] = [] UD_LLM_FAMILIES: List["LLMFamilyV1"] = [] diff --git a/xinference/model/llm/pytorch/tests/test_opt.py b/xinference/model/llm/pytorch/tests/test_opt.py index a7bccae713..020aa72d45 100644 --- a/xinference/model/llm/pytorch/tests/test_opt.py +++ b/xinference/model/llm/pytorch/tests/test_opt.py @@ -57,7 +57,7 @@ async def test_opt_pytorch_model(setup, quantization): with pytest.raises(ValueError): client.launch_model( model_name="opt", - model_engine="PyTorch", + model_engine="transformers", model_size_in_billions=1, model_format="pytorch", quantization=quantization, @@ -66,7 +66,7 @@ async def test_opt_pytorch_model(setup, quantization): else: model_uid = client.launch_model( model_name="opt", - model_engine="PyTorch", + model_engine="transformers", model_size_in_billions=1, model_format="pytorch", quantization=quantization, diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index 0dc1b78657..ddd0274321 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -1199,7 +1199,7 @@ def test_query_engine_general(): ) assert check_engine_by_spec_parameters( - model_engine="PyTorch", + model_engine="transformers", model_name="aquila2", model_format="pytorch", model_size_in_billions=7, @@ -1209,32 +1209,32 @@ def test_query_engine_general(): model_name = "qwen1.5-chat" assert model_name in LLM_ENGINES - assert "PyTorch" in LLM_ENGINES[model_name] - assert "llama-cpp-python" in LLM_ENGINES[model_name] + assert "Transformers" in LLM_ENGINES[model_name] + assert "llama.cpp" in LLM_ENGINES[model_name] assert check_engine_by_spec_parameters( - model_engine="PyTorch", + model_engine="transformers", model_name=model_name, model_format="gptq", model_size_in_billions="1_8", quantization="Int4", ) assert check_engine_by_spec_parameters( - model_engine="PyTorch", + model_engine="transformers", model_name=model_name, model_format="gptq", model_size_in_billions="1_8", quantization="Int8", ) assert check_engine_by_spec_parameters( - model_engine="PyTorch", + model_engine="transformers", model_name=model_name, model_format="pytorch", model_size_in_billions="1_8", quantization="none", ) assert check_engine_by_spec_parameters( - model_engine="PyTorch", + model_engine="transformers", model_name=model_name, model_format="pytorch", model_size_in_billions="1_8", @@ -1242,7 +1242,7 @@ def test_query_engine_general(): ) assert ( check_engine_by_spec_parameters( - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_name=model_name, model_format="ggufv2", model_size_in_billions="1_8", @@ -1252,7 +1252,7 @@ def test_query_engine_general(): ) with pytest.raises(ValueError) as exif: check_engine_by_spec_parameters( - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_name=model_name, model_format="ggmlv3", model_size_in_billions="1_8", @@ -1260,12 +1260,12 @@ def test_query_engine_general(): ) assert ( str(exif.value) - == "Model qwen1.5-chat cannot be run on engine llama-cpp-python, with format ggmlv3, size 1_8 and quantization q2_k." + == "Model qwen1.5-chat cannot be run on engine llama.cpp, with format ggmlv3, size 1_8 and quantization q2_k." ) assert ( check_engine_by_spec_parameters( - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_name="chatglm", model_format="ggmlv3", model_size_in_billions=6, @@ -1295,12 +1295,9 @@ def test_query_engine_general(): register_llm(family, False) assert family in get_user_defined_llm_families() - assert ( - "custom_model" in LLM_ENGINES - and "llama-cpp-python" in LLM_ENGINES["custom_model"] - ) + assert "custom_model" in LLM_ENGINES and "llama.cpp" in LLM_ENGINES["custom_model"] assert check_engine_by_spec_parameters( - model_engine="llama-cpp-python", + model_engine="llama.cpp", model_name="custom_model", model_format="ggmlv3", model_size_in_billions=3, @@ -1340,7 +1337,7 @@ def test_query_engine_general(): register_llm(family, False) assert family in get_user_defined_llm_families() - assert "custom-qwen1.5-chat" in LLM_ENGINES and ["llama-cpp-python"] == list( + assert "custom-qwen1.5-chat" in LLM_ENGINES and ["llama.cpp"] == list( LLM_ENGINES["custom-qwen1.5-chat"].keys() ) From 21be5abd6ff8411015a9b8862cbdb6b070bc2b1c Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Sat, 11 May 2024 17:30:18 +0800 Subject: [PATCH 075/298] DOC: Usage about `model_engine` (#1468) Co-authored-by: Xuye (Chris) Qin <qinxuye@gmail.com> --- doc/source/getting_started/installation.rst | 17 +- .../getting_started/troubleshooting.rst | 9 +- .../getting_started/using_xinference.rst | 53 +++- .../getting_started/installation.po | 147 ++++++----- .../getting_started/troubleshooting.po | 40 ++- .../getting_started/using_xinference.po | 228 +++++++++++------- .../zh_CN/LC_MESSAGES/user_guide/backends.po | 129 +++++----- .../LC_MESSAGES/user_guide/client_api.po | 96 +++++--- doc/source/user_guide/backends.rst | 12 +- doc/source/user_guide/client_api.rst | 3 +- setup.cfg | 10 +- xinference/api/restful_api.py | 9 +- xinference/deploy/docker/cpu.Dockerfile | 2 +- 13 files changed, 487 insertions(+), 268 deletions(-) diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 1dd115e2f7..8a17a37445 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -15,6 +15,8 @@ If you aim to serve all supported models, you can install all the necessary depe If you want to install only the necessary backends, here's a breakdown of how to do it. +.. _inference_backend: + Transformers Backend ~~~~~~~~~~~~~~~~~~~~ PyTorch (transformers) supports the inference of most state-of-art models. It is the default backend for models in PyTorch format:: @@ -62,9 +64,9 @@ To install Xinference and vLLM:: .. _installation_ggml: -GGML Backend -~~~~~~~~~~~~ -It's advised to install the GGML dependencies manually based on your hardware specifications to enable acceleration. +Llama.cpp Backend +~~~~~~~~~~~~~~~~~ +Xinference supports models in ``gguf`` and ``ggml`` format via ``llama-cpp-python``. It's advised to install the llama.cpp-related dependencies manually based on your hardware specifications to enable acceleration. Initial setup:: @@ -83,3 +85,12 @@ Hardware-Specific installations: - AMD cards:: CMAKE_ARGS="-DLLAMA_HIPBLAS=on" pip install llama-cpp-python + + +SGLang Backend +~~~~~~~~~~~~~~ +SGLang has a high-performance inference runtime with RadixAttention. It significantly accelerates the execution of complex LLM programs by automatic KV cache reuse across multiple calls. And it also supports other common techniques like continuous batching and tensor parallelism. + +Initial setup:: + + pip install 'xinference[sglang]' diff --git a/doc/source/getting_started/troubleshooting.rst b/doc/source/getting_started/troubleshooting.rst index 728dc25891..0ff1e82459 100644 --- a/doc/source/getting_started/troubleshooting.rst +++ b/doc/source/getting_started/troubleshooting.rst @@ -99,4 +99,11 @@ You can increase its size by setting the ``--shm-size`` parameter as follows: .. code:: bash - docker run --shm-size=128g ... \ No newline at end of file + docker run --shm-size=128g ... + + +Missing ``model_engine`` parameter when launching LLM models +============================================================ + +Since version ``v0.11.0``, launching LLM models requires an additional ``model_engine`` parameter. +For specific information, please refer to :ref:`here <about_model_engine>`. diff --git a/doc/source/getting_started/using_xinference.rst b/doc/source/getting_started/using_xinference.rst index 8877ff4ab7..7b5112d635 100644 --- a/doc/source/getting_started/using_xinference.rst +++ b/doc/source/getting_started/using_xinference.rst @@ -99,6 +99,53 @@ Please ensure that the version of the client matches the version of the Xinferen pip install xinference-client==${SERVER_VERSION} +.. _about_model_engine: + +About Model Engine +------------------ +Since ``v0.11.0`` , before launching the LLM model, you need to specify the inference engine you want to run. +Currently, xinference supports the following inference engines: + +* ``vllm`` +* ``sglang`` +* ``llama.cpp`` +* ``transformers`` + +About the details of these inference engine, please refer to :ref:`here <inference_backend>`. + +Note that when launching a LLM model, the ``model_format`` and ``quantization`` of the model you want to launch +is closely related to the inference engine. + +You can use ``xinference engine`` command to query the combination of parameters of the model you want to launch. +This will demonstrate under what conditions a model can run on which inference engines. + +For example: + +#. I would like to query about which inference engines the ``qwen-chat`` model can run on, and what are their respective parameters. + +.. code-block:: bash + + xinference engine -e <xinference_endpoint> --model-name qwen-chat + +#. I want to run ``qwen-chat`` with ``VLLM`` as the inference engine, but I don't know how to configure the other parameters. + +.. code-block:: bash + + xinference engine -e <xinference_endpoint> --model-name qwen-chat --model-engine vllm + +#. I want to launch the ``qwen-chat`` model in the ``GGUF`` format, and I need to know how to configure the remaining parameters. + +.. code-block:: bash + + xinference engine -e <xinference_endpoint> --model-name qwen-chat -f ggufv2 + + +In summary, compared to previous versions, when launching LLM models, +you need to additionally pass the ``model_engine`` parameter. +You can retrieve information about the supported inference engines and their related parameter combinations +through the ``xinference engine`` command. + + Run Llama-2 ----------- @@ -122,7 +169,7 @@ This create a new model instance with unique ID ``my-llama-2``: .. code-tab:: bash shell - xinference launch -u my-llama-2 -n llama-2-chat -s 13 -f pytorch + xinference launch --model-engine <inference_engine> -u my-llama-2 -n llama-2-chat -s 13 -f pytorch .. code-tab:: bash cURL @@ -131,6 +178,7 @@ This create a new model instance with unique ID ``my-llama-2``: -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ + "model_engine": "<inference_engine>", "model_uid": "my-llama-2", "model_name": "llama-2-chat", "model_format": "pytorch", @@ -142,6 +190,7 @@ This create a new model instance with unique ID ``my-llama-2``: from xinference.client import RESTfulClient client = RESTfulClient("http://127.0.0.1:9997") model_uid = client.launch_model( + model_engine="<inference_engine>", model_uid="my-llama-2", model_name="llama-2-chat", model_format="pytorch", @@ -160,7 +209,7 @@ This create a new model instance with unique ID ``my-llama-2``: .. code-block:: bash - xinference launch -u my-llama-2 -n llama-2-chat -s 13 -f pytorch --gpu_memory_utilization 0.9 + xinference launch --model-engine vllm -u my-llama-2 -n llama-2-chat -s 13 -f pytorch --gpu_memory_utilization 0.9 `gpu_memory_utilization=0.9` will pass to vllm when launching model. diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po index ffd572cdc5..9fadbf74c9 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-02 15:27+0800\n" +"POT-Creation-Date: 2024-05-11 10:26+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.14.0\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/getting_started/installation.rst:5 msgid "Installation" @@ -54,11 +54,11 @@ msgid "" " how to do it." msgstr "如果你只想安装必要的依赖,接下来是如何操作的详细步骤。" -#: ../../source/getting_started/installation.rst:19 +#: ../../source/getting_started/installation.rst:21 msgid "Transformers Backend" msgstr "Transformers 引擎" -#: ../../source/getting_started/installation.rst:20 +#: ../../source/getting_started/installation.rst:22 msgid "" "PyTorch (transformers) supports the inference of most state-of-art " "models. It is the default backend for models in PyTorch format::" @@ -66,11 +66,11 @@ msgstr "" "PyTorch(transformers) 引擎支持几乎有所的最新模型,这是 Pytorch 模型默认" "使用的引擎:" -#: ../../source/getting_started/installation.rst:26 +#: ../../source/getting_started/installation.rst:28 msgid "vLLM Backend" msgstr "vLLM 引擎" -#: ../../source/getting_started/installation.rst:27 +#: ../../source/getting_started/installation.rst:29 msgid "" "vLLM is a fast and easy-to-use library for LLM inference and serving. " "Xinference will choose vLLM as the backend to achieve better throughput " @@ -79,133 +79,158 @@ msgstr "" "vLLM 是一个支持高并发的高性能大模型推理引擎。当满足以下条件时,Xinference" " 会自动选择 vllm 作为引擎来达到更高的吞吐量:" -#: ../../source/getting_started/installation.rst:29 +#: ../../source/getting_started/installation.rst:31 msgid "The model format is ``pytorch``, ``gptq`` or ``awq``." msgstr "模型格式为 ``pytorch`` , ``gptq`` 或者 ``awq`` 。" -#: ../../source/getting_started/installation.rst:30 +#: ../../source/getting_started/installation.rst:32 msgid "When the model format is ``pytorch``, the quantization is ``none``." msgstr "当模型格式为 ``pytorch`` 时,量化选项需为 ``none`` 。" -#: ../../source/getting_started/installation.rst:31 +#: ../../source/getting_started/installation.rst:33 +msgid "When the model format is ``awq``, the quantization is ``Int4``." +msgstr "当模型格式为 ``awq`` 时,量化选项需为 ``Int4`` 。" + +#: ../../source/getting_started/installation.rst:34 msgid "" -"When the model format is ``gptq`` or ``awq``, the quantization is " -"``Int4``." -msgstr "当模型格式为 ``gptq`` 或 ``awq`` 时,量化选项需为 ``Int4`` 。" +"When the model format is ``gptq``, the quantization is ``Int3``, ``Int4``" +" or ``Int8``." +msgstr "当模型格式为 ``gptq`` 时,量化选项需为 ``Int3`` 、 ``Int4`` 或者 ``Int8`` 。" -#: ../../source/getting_started/installation.rst:32 +#: ../../source/getting_started/installation.rst:35 msgid "The system is Linux and has at least one CUDA device" msgstr "操作系统为 Linux 并且至少有一个支持 CUDA 的设备" -#: ../../source/getting_started/installation.rst:33 +#: ../../source/getting_started/installation.rst:36 msgid "" "The model family (for custom models) / model name (for builtin models) is" " within the list of models supported by vLLM" -msgstr "自定义模型的 ``model_family`` 字段和内置模型的 ``model_name`` 字段在 vLLM" +msgstr "" +"自定义模型的 ``model_family`` 字段和内置模型的 ``model_name`` 字段在 vLLM" " 的支持列表中。" -#: ../../source/getting_started/installation.rst:35 +#: ../../source/getting_started/installation.rst:38 msgid "Currently, supported models include:" msgstr "目前,支持的模型包括:" -#: ../../source/getting_started/installation.rst:39 -msgid "``llama-2``, ``llama-2-chat``" -msgstr "``llama-2``, ``llama-2-chat``" +#: ../../source/getting_started/installation.rst:42 +msgid "``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``" +msgstr "" -#: ../../source/getting_started/installation.rst:40 +#: ../../source/getting_started/installation.rst:43 msgid "``baichuan``, ``baichuan-chat``, ``baichuan-2-chat``" -msgstr "``baichuan``, ``baichuan-chat``, ``baichuan-2-chat``" +msgstr "" -#: ../../source/getting_started/installation.rst:41 +#: ../../source/getting_started/installation.rst:44 msgid "" "``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-" "chat-20b``" -msgstr "``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-" -"chat-20b``" +msgstr "" -#: ../../source/getting_started/installation.rst:42 +#: ../../source/getting_started/installation.rst:45 msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" msgstr "" -#: ../../source/getting_started/installation.rst:43 +#: ../../source/getting_started/installation.rst:46 msgid "``Yi``, ``Yi-chat``" -msgstr "``Yi``, ``Yi-chat``" +msgstr "" -#: ../../source/getting_started/installation.rst:44 +#: ../../source/getting_started/installation.rst:47 msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" -msgstr "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" +msgstr "" -#: ../../source/getting_started/installation.rst:45 +#: ../../source/getting_started/installation.rst:48 +msgid "``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit``" +msgstr "" + +#: ../../source/getting_started/installation.rst:49 msgid "``vicuna-v1.3``, ``vicuna-v1.5``" -msgstr "``vicuna-v1.3``, ``vicuna-v1.5``" +msgstr "" -#: ../../source/getting_started/installation.rst:46 +#: ../../source/getting_started/installation.rst:50 +msgid "``internlm2-chat``" +msgstr "" + +#: ../../source/getting_started/installation.rst:51 msgid "``qwen-chat``" -msgstr "``qwen-chat``" +msgstr "" -#: ../../source/getting_started/installation.rst:47 -msgid "``mixtral-instruct-v0.1``" -msgstr "``mistral-instruct-v0.1``" +#: ../../source/getting_started/installation.rst:52 +msgid "``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1``" +msgstr "" -#: ../../source/getting_started/installation.rst:48 +#: ../../source/getting_started/installation.rst:53 msgid "``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k``" msgstr "" -#: ../../source/getting_started/installation.rst:49 +#: ../../source/getting_started/installation.rst:54 msgid "``deepseek-chat``, ``deepseek-coder-instruct``" msgstr "" -#: ../../source/getting_started/installation.rst:50 -msgid "``qwen1.5-chat``" -msgstr "``qwen1.5-chat``" +#: ../../source/getting_started/installation.rst:55 +msgid "``qwen1.5-chat``, ``qwen1.5-moe-chat``" +msgstr "" -#: ../../source/getting_started/installation.rst:51 +#: ../../source/getting_started/installation.rst:56 +msgid "``codeqwen1.5-chat``" +msgstr "" + +#: ../../source/getting_started/installation.rst:57 msgid "``gemma-it``" msgstr "" -#: ../../source/getting_started/installation.rst:52 +#: ../../source/getting_started/installation.rst:58 msgid "``orion-chat``, ``orion-chat-rag``" msgstr "" -#: ../../source/getting_started/installation.rst:55 +#: ../../source/getting_started/installation.rst:61 msgid "To install Xinference and vLLM::" msgstr "安装 xinference 和 vLLM:" -#: ../../source/getting_started/installation.rst:62 -msgid "GGML Backend" -msgstr "GGML 引擎" +#: ../../source/getting_started/installation.rst:68 +msgid "Llama.cpp Backend" +msgstr "Llama.cpp 引擎" -#: ../../source/getting_started/installation.rst:63 +#: ../../source/getting_started/installation.rst:69 msgid "" -"It's advised to install the GGML dependencies manually based on your " -"hardware specifications to enable acceleration." +"Xinference supports models in ``gguf`` and ``ggml`` format via ``llama-" +"cpp-python``. It's advised to install the llama.cpp-related dependencies " +"manually based on your hardware specifications to enable acceleration." msgstr "" -"当使用 GGML 引擎时,建议根据当前使用的硬件手动安装依赖,从而获得最佳的" +"Xinference 通过 ``llama-cpp-python`` 支持 ``gguf`` 和 ``ggml`` 格式的模型。建议根据当前使用的硬件手动安装依赖,从而获得最佳的" "加速效果。" -#: ../../source/getting_started/installation.rst:65 +#: ../../source/getting_started/installation.rst:71 +#: ../../source/getting_started/installation.rst:94 msgid "Initial setup::" msgstr "初始步骤:" -#: ../../source/getting_started/installation.rst:70 +#: ../../source/getting_started/installation.rst:75 msgid "Hardware-Specific installations:" msgstr "不同硬件的安装方式:" -#: ../../source/getting_started/installation.rst:72 +#: ../../source/getting_started/installation.rst:77 msgid "Apple Silicon::" msgstr "Apple M系列" -#: ../../source/getting_started/installation.rst:76 +#: ../../source/getting_started/installation.rst:81 msgid "Nvidia cards::" msgstr "英伟达显卡:" -#: ../../source/getting_started/installation.rst:80 +#: ../../source/getting_started/installation.rst:85 msgid "AMD cards::" msgstr "AMD 显卡:" -#~ msgid "The quantization method is GPTQ 4 bit or none" -#~ msgstr "量化方式必须是 GPTQ 4 bit 或者 none" - -#~ msgid "``chatglm3``" -#~ msgstr "``chatglm3``" +#: ../../source/getting_started/installation.rst:91 +msgid "SGLang Backend" +msgstr "SGLang 引擎" +#: ../../source/getting_started/installation.rst:92 +msgid "" +"SGLang has a high-performance inference runtime with RadixAttention. It " +"significantly accelerates the execution of complex LLM programs by " +"automatic KV cache reuse across multiple calls. And it also supports " +"other common techniques like continuous batching and tensor parallelism." +msgstr "" +"SGLang 具有基于 RadixAttention 的高性能推理运行时。它通过在多个调用之间自动重用KV缓存,显著加速了复杂 LLM 程序的执行。" +"它还支持其他常见推理技术,如连续批处理和张量并行处理。" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/troubleshooting.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/troubleshooting.po index 971fbdefb5..48eeaa064d 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/troubleshooting.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/troubleshooting.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-05 11:25+0800\n" +"POT-Creation-Date: 2024-05-11 10:26+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/getting_started/troubleshooting.rst:5 msgid "Troubleshooting" @@ -125,16 +125,18 @@ msgstr "在启动 Xinference 时记得要加上 ``-H 0.0.0.0`` 参数:" msgid "" "Then Xinference service will listen on all network interfaces (not " "limited to ``127.0.0.1`` or ``localhost``)." -msgstr "那么 Xinference 服务将监听所有网络接口(而不仅限于 ``127.0.0.1`` 或 ``localhost``)。" - +msgstr "" +"那么 Xinference 服务将监听所有网络接口(而不仅限于 ``127.0.0.1`` 或 ``" +"localhost``)。" #: ../../source/getting_started/troubleshooting.rst:73 msgid "" "If you are using the :ref:`using_docker_image`, please add ``-p " "<PORT>:9997`` during the docker run command, then access is available " "through ``<IP>:<PORT>`` of the local machine." -msgstr "如果使用的是 :ref:`using_docker_image`,请在 Docker 运行命令中 加上 ``-p <PORT>:9997`` ," -",你就可以通过本地机器的 ``<IP>:<PORT>`` 进行访问。" +msgstr "" +"如果使用的是 :ref:`using_docker_image`,请在 Docker 运行命令中 加上 ``-p " +"<PORT>:9997`` ,,你就可以通过本地机器的 ``<IP>:<PORT>`` 进行访问。" #: ../../source/getting_started/troubleshooting.rst:78 msgid "" @@ -147,7 +149,9 @@ msgid "" "Xinference by default uses HuggingFace as the source for models. If your " "machines are in Mainland China, there might be accessibility issues when " "using built-in models." -msgstr "Xinference 默认使用 HuggingFace作为模型源。如果你的机器在中国大陆,使用内置模型可能会有访问问题。" +msgstr "" +"Xinference 默认使用 HuggingFace作为模型源。如果你的机器在中国大陆,使用" +"内置模型可能会有访问问题。" #: ../../source/getting_started/troubleshooting.rst:84 msgid "" @@ -155,15 +159,17 @@ msgid "" "``XINFERENCE_MODEL_SRC=modelscope`` when starting the Xinference to " "change the model source to ModelScope, which is optimized for Mainland " "China." -msgstr "要解决这个问题,可以在启动 Xinference 时添加环境变量 ``XINFERENCE_MODEL_SRC=modelscope``," -"将模型源更改为 ModelScope,在中国大陆速度下载更快。" - +msgstr "" +"要解决这个问题,可以在启动 Xinference 时添加环境变量 ``XINFERENCE_MODEL_" +"SRC=modelscope``,将模型源更改为 ModelScope,在中国大陆速度下载更快。" #: ../../source/getting_started/troubleshooting.rst:88 msgid "" "If you’re starting Xinference with Docker, include ``-e XINFERENCE_MODEL" "_SRC=modelscope`` during the docker run command." -msgstr "如果你用 Docker 启动 Xinference,可以在 Docker 命令中包含 ``-e XINFERENCE_MODEL_SRC=modelscope`` 选项。" +msgstr "" +"如果你用 Docker 启动 Xinference,可以在 Docker 命令中包含 ``-e XINFERENCE" +"_MODEL_SRC=modelscope`` 选项。" #: ../../source/getting_started/troubleshooting.rst:92 msgid "" @@ -186,3 +192,15 @@ msgid "" "follows:" msgstr "你可以通过设置参数 ``--shm-size`` 来增加它的大小:" +#: ../../source/getting_started/troubleshooting.rst:106 +msgid "Missing ``model_engine`` parameter when launching LLM models" +msgstr "加载 LLM 模型时提示缺失 ``model_engine`` 参数" + +#: ../../source/getting_started/troubleshooting.rst:108 +msgid "" +"Since version ``v0.11.0``, launching LLM models requires an additional " +"``model_engine`` parameter. For specific information, please refer to " +":ref:`here <about_model_engine>`." +msgstr "" +"自 ``v0.11.0`` 版本开始,加载 LLM 模型时需要传入额外参数 ``model_engine`` 。" +"具体信息请参考 :ref:`这里 <about_model_engine>` 。" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po index 65860e5d36..86c891efac 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-30 13:23+0800\n" +"POT-Creation-Date: 2024-05-11 10:26+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.14.0\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/getting_started/using_xinference.rst:5 msgid "Using Xinference" @@ -122,11 +122,97 @@ msgstr "" "如果只需要安装 Xinference 的 Python SDK,可以使用以下命令安装最少依赖。" "需要注意的是版本必须和 Xinference 服务的版本保持匹配。" -#: ../../source/getting_started/using_xinference.rst:103 +#: ../../source/getting_started/using_xinference.rst:105 +msgid "About Model Engine" +msgstr "关于模型的推理引擎" + +#: ../../source/getting_started/using_xinference.rst:106 +msgid "" +"Since ``v0.11.0`` , before launching the LLM model, you need to specify " +"the inference engine you want to run. Currently, xinference supports the " +"following inference engines:" +msgstr "" +"自 ``v0.11.0`` 版本开始,在加载 LLM 模型之前,你需要指定具体的推理引擎。当前,Xinference 支持以下推理引擎:" + +#: ../../source/getting_started/using_xinference.rst:109 +msgid "``vllm``" +msgstr "" + +#: ../../source/getting_started/using_xinference.rst:110 +msgid "``sglang``" +msgstr "" + +#: ../../source/getting_started/using_xinference.rst:111 +msgid "``llama.cpp``" +msgstr "" + +#: ../../source/getting_started/using_xinference.rst:112 +msgid "``transformers``" +msgstr "" + +#: ../../source/getting_started/using_xinference.rst:114 +msgid "" +"About the details of these inference engine, please refer to :ref:`here " +"<inference_backend>`." +msgstr "" +"关于这些推理引擎的详细信息,请参考 :ref:`这里 <inference_backend>` 。" + +#: ../../source/getting_started/using_xinference.rst:116 +msgid "" +"Note that when launching a LLM model, the ``model_format`` and " +"``quantization`` of the model you want to launch is closely related to " +"the inference engine." +msgstr "" +"注意,当加载 LLM 模型时,所能运行的引擎与 ``model_format`` 和 ``quantization`` 参数息息相关。" + +#: ../../source/getting_started/using_xinference.rst:119 +msgid "" +"You can use ``xinference engine`` command to query the combination of " +"parameters of the model you want to launch. This will demonstrate under " +"what conditions a model can run on which inference engines." +msgstr "" +"Xinference 提供了 ``xinference engine`` 命令帮助你查询相关的参数组合。" + +#: ../../source/getting_started/using_xinference.rst:122 +msgid "For example:" +msgstr "例如:" + +#: ../../source/getting_started/using_xinference.rst:124 +msgid "" +"I would like to query about which inference engines the ``qwen-chat`` " +"model can run on, and what are their respective parameters." +msgstr "" +"我想查询与 ``qwen-chat`` 模型相关的参数组合,以决定它能够怎样跑在各种推理引擎上。" + +#: ../../source/getting_started/using_xinference.rst:130 +msgid "" +"I want to run ``qwen-chat`` with ``VLLM`` as the inference engine, but I " +"don't know how to configure the other parameters." +msgstr "" +"我想将 ``qwen-chat`` 跑在 ``VLLM`` 推理引擎上,但是我不知道什么样的其他参数符合这个要求。" + +#: ../../source/getting_started/using_xinference.rst:136 +msgid "" +"I want to launch the ``qwen-chat`` model in the ``GGUF`` format, and I " +"need to know how to configure the remaining parameters." +msgstr "" +"我想加载 ``GGUF`` 格式的 ``qwen-chat`` 模型,我需要知道其余的参数组合。" + +#: ../../source/getting_started/using_xinference.rst:143 +msgid "" +"In summary, compared to previous versions, when launching LLM models, you" +" need to additionally pass the ``model_engine`` parameter. You can " +"retrieve information about the supported inference engines and their " +"related parameter combinations through the ``xinference engine`` command." +msgstr "" +"总之,相比于之前的版本,当加载 LLM 模型时,需要额外传入 ``model_engine`` 参数。" +"你可以通过 ``xinference engine`` 命令查询你想运行的推理引擎与其他参数组合的关系。" + +#: ../../source/getting_started/using_xinference.rst:150 msgid "Run Llama-2" msgstr "运行 Llama-2" -#: ../../source/getting_started/using_xinference.rst:105 +#: ../../source/getting_started/using_xinference.rst:152 msgid "" "Let's start by running a built-in model: ``llama-2-chat``. When you start" " a model for the first time, Xinference will download the model " @@ -139,7 +225,7 @@ msgstr "" "到30分钟不等。当下载完成后,Xinference本地会有缓存的处理,以后再运行相同" "的模型不需要重新下载。" -#: ../../source/getting_started/using_xinference.rst:110 +#: ../../source/getting_started/using_xinference.rst:157 msgid "" "Xinference also allows you to download models from other sites. You can " "do this by setting an environment variable when launching Xinference. For" @@ -149,7 +235,7 @@ msgstr "" "Xinference 也允许从其他模型托管平台下载模型。可以通过在拉起 Xinference 时" "指定环境变量,比如,如果想要从 ModelScope 中下载模型,可以使用如下命令:" -#: ../../source/getting_started/using_xinference.rst:118 +#: ../../source/getting_started/using_xinference.rst:165 msgid "" "We can specify the model's UID using the ``--model-uid`` or ``-u`` flag. " "If not specified, Xinference will generate a unique ID. This create a new" @@ -159,7 +245,7 @@ msgstr "" "Xinference 会随机生成一个 ID,下面的命令就是手动指定了 ID 为 ``my-llama-2" "``:" -#: ../../source/getting_started/using_xinference.rst:157 +#: ../../source/getting_started/using_xinference.rst:206 msgid "" "For some engines, such as vllm, users need to specify the engine-related " "parameters when running models. In this case, you can directly specify " @@ -168,11 +254,11 @@ msgstr "" "对于一些推理引擎,比如 vllm,用户需要在运行模型时指定引擎相关的参数,这种" "情况下直接在命令行中指定对应的参数名和值即可,比如:" -#: ../../source/getting_started/using_xinference.rst:165 +#: ../../source/getting_started/using_xinference.rst:214 msgid "`gpu_memory_utilization=0.9` will pass to vllm when launching model." msgstr "在运行模型时,`gpu_memory_utilization=0.9` 会传到 vllm 后端。" -#: ../../source/getting_started/using_xinference.rst:167 +#: ../../source/getting_started/using_xinference.rst:216 msgid "" "Congrats! You now have ``llama-2-chat`` running by Xinference. Once the " "model is running, we can try it out either via cURL, or via Xinference's " @@ -182,7 +268,7 @@ msgstr "" "一旦这个模型在运行中,我们可以通过命令行、cURL 或者是 Python 代码来预支" "交互:" -#: ../../source/getting_started/using_xinference.rst:227 +#: ../../source/getting_started/using_xinference.rst:276 msgid "" "Xinference provides OpenAI-compatible APIs for its supported models, so " "you can use Xinference as a local drop-in replacement for OpenAI APIs. " @@ -191,11 +277,11 @@ msgstr "" "Xinference 提供了与 OpenAI 兼容的 API,所以可以将 Xinference 运行的模型" "当成 OpenAI的本地替代。比如:" -#: ../../source/getting_started/using_xinference.rst:243 +#: ../../source/getting_started/using_xinference.rst:292 msgid "The following OpenAI APIs are supported:" msgstr "以下是支持的 OpenAI 的 API:" -#: ../../source/getting_started/using_xinference.rst:245 +#: ../../source/getting_started/using_xinference.rst:294 msgid "" "Chat Completions: `https://platform.openai.com/docs/api-reference/chat " "<https://platform.openai.com/docs/api-reference/chat>`_" @@ -203,7 +289,7 @@ msgstr "" "对话生成:`https://platform.openai.com/docs/api-reference/chat <https://" "platform.openai.com/docs/api-reference/chat>`_" -#: ../../source/getting_started/using_xinference.rst:247 +#: ../../source/getting_started/using_xinference.rst:296 msgid "" "Completions: `https://platform.openai.com/docs/api-reference/completions " "<https://platform.openai.com/docs/api-reference/completions>`_" @@ -211,7 +297,7 @@ msgstr "" "生成: `https://platform.openai.com/docs/api-reference/completions <https:" "//platform.openai.com/docs/api-reference/completions>`_" -#: ../../source/getting_started/using_xinference.rst:249 +#: ../../source/getting_started/using_xinference.rst:298 msgid "" "Embeddings: `https://platform.openai.com/docs/api-reference/embeddings " "<https://platform.openai.com/docs/api-reference/embeddings>`_" @@ -219,11 +305,11 @@ msgstr "" "向量生成:`https://platform.openai.com/docs/api-reference/embeddings <" "https://platform.openai.com/docs/api-reference/embeddings>`_" -#: ../../source/getting_started/using_xinference.rst:252 +#: ../../source/getting_started/using_xinference.rst:301 msgid "Manage Models" msgstr "管理模型" -#: ../../source/getting_started/using_xinference.rst:254 +#: ../../source/getting_started/using_xinference.rst:303 msgid "" "In addition to launching models, Xinference offers various ways to manage" " the entire lifecycle of models. You can manage models in Xinference " @@ -232,29 +318,29 @@ msgstr "" "除了启动模型,Xinference 提供了管理模型整个生命周期的能力。同样的,你可以" "使用命令行、cURL 以及 Python 代码来管理:" -#: ../../source/getting_started/using_xinference.rst:257 +#: ../../source/getting_started/using_xinference.rst:306 msgid "" "You can list all models of a certain type that are available to launch in" " Xinference:" msgstr "可以列出所有 Xinference 支持的指定类型的模型:" -#: ../../source/getting_started/using_xinference.rst:275 +#: ../../source/getting_started/using_xinference.rst:324 msgid "" "The following command gives you the currently running models in " "Xinference:" msgstr "接下来的命令可以列出所有在运行的模型:" -#: ../../source/getting_started/using_xinference.rst:293 +#: ../../source/getting_started/using_xinference.rst:342 msgid "" "When you no longer need a model that is currently running, you can remove" " it in the following way to free up the resources it occupies:" msgstr "当你不需要某个正在运行的模型,可以通过以下的方式来停止它并释放资源:" -#: ../../source/getting_started/using_xinference.rst:312 +#: ../../source/getting_started/using_xinference.rst:361 msgid "Deploy Xinference In a Cluster" msgstr "集群中部署 Xinference" -#: ../../source/getting_started/using_xinference.rst:314 +#: ../../source/getting_started/using_xinference.rst:363 msgid "" "To deploy Xinference in a cluster, you need to start a Xinference " "supervisor on one server and Xinference workers on the other servers." @@ -262,7 +348,7 @@ msgstr "" "若要在集群环境中部署 Xinference,需要在一台机器中启动 supervisor 节点,并" "在当前或者其他节点启动 worker 节点" -#: ../../source/getting_started/using_xinference.rst:317 +#: ../../source/getting_started/using_xinference.rst:366 msgid "" "First, make sure you have already installed Xinference on each of the " "servers according to the instructions provided :ref:`here " @@ -271,23 +357,23 @@ msgstr "" "首先,根据 :ref:`文档 <installation>` 确保所有的服务器上都安装了 " "Xinference。接下来按照步骤:" -#: ../../source/getting_started/using_xinference.rst:321 +#: ../../source/getting_started/using_xinference.rst:370 msgid "Start the Supervisor" msgstr "启动 Supervisor" -#: ../../source/getting_started/using_xinference.rst:322 +#: ../../source/getting_started/using_xinference.rst:371 msgid "" "On the server where you want to run the Xinference supervisor, run the " "following command:" msgstr "在服务器上执行以下命令来启动 Supervisor 节点:" -#: ../../source/getting_started/using_xinference.rst:328 +#: ../../source/getting_started/using_xinference.rst:377 msgid "" "Replace ``${supervisor_host}`` with the actual host of your supervisor " "server." msgstr "用当前节点的 IP 来替换 ``${supervisor_host}``。" -#: ../../source/getting_started/using_xinference.rst:331 +#: ../../source/getting_started/using_xinference.rst:380 msgid "" "You can the supervisor's web UI at `http://${supervisor_host}:9997/ui " "<http://${supervisor_host}:9997/ui>`_ and visit " @@ -298,23 +384,23 @@ msgstr "" "/ui>`_ 访问 web UI,在 `http://${supervisor_host}:9997/docs <http://${" "supervisor_host}:9997/docs>`_ 访问 API 文档。" -#: ../../source/getting_started/using_xinference.rst:335 +#: ../../source/getting_started/using_xinference.rst:384 msgid "Start the Workers" msgstr "启动 Worker" -#: ../../source/getting_started/using_xinference.rst:337 +#: ../../source/getting_started/using_xinference.rst:386 msgid "" "On each of the other servers where you want to run Xinference workers, " "run the following command:" msgstr "在需要启动 Xinference worker 的机器上执行以下命令:" -#: ../../source/getting_started/using_xinference.rst:344 +#: ../../source/getting_started/using_xinference.rst:393 msgid "" "Note that you must replace ``${worker_host}`` with the actual host of " "your worker server." msgstr "需要注意的是,必须使用当前Worker节点的 IP 来替换 ``${worker_host}``。" -#: ../../source/getting_started/using_xinference.rst:347 +#: ../../source/getting_started/using_xinference.rst:396 msgid "" "Note that if you need to interact with the Xinference in a cluster via " "the command line, you should include the ``-e`` or ``--endpoint`` flag to" @@ -323,40 +409,41 @@ msgstr "" "需要注意的是,如果你需要通过命令行与集群交互,应该通过 ``-e`` 或者 ``--" "endpoint`` 参数来指定 supervisor 的地址,比如:" -#: ../../source/getting_started/using_xinference.rst:355 +#: ../../source/getting_started/using_xinference.rst:404 msgid "Using Xinference With Docker" msgstr "使用 Docker 部署 Xinference" -#: ../../source/getting_started/using_xinference.rst:357 +#: ../../source/getting_started/using_xinference.rst:406 msgid "To start Xinference in a Docker container, run the following command:" msgstr "用以下命令在容器中运行 Xinference:" -#: ../../source/getting_started/using_xinference.rst:360 +#: ../../source/getting_started/using_xinference.rst:409 msgid "Run On Nvidia GPU Host" msgstr "在拥有英伟达显卡的机器上运行" -#: ../../source/getting_started/using_xinference.rst:367 +#: ../../source/getting_started/using_xinference.rst:416 msgid "Run On CPU Only Host" msgstr "在只有 CPU 的机器上运行" -#: ../../source/getting_started/using_xinference.rst:373 +#: ../../source/getting_started/using_xinference.rst:422 msgid "" "Replace ``<your_version>`` with Xinference versions, e.g. ``v0.10.3``, " "``latest`` can be used for the latest version." -msgstr "将 ``<your_version>`` 替换为 Xinference 的版本,比如 ``v0.10.3``," -"可以用 ``latest`` 来用于最新版本。" +msgstr "" +"将 ``<your_version>`` 替换为 Xinference 的版本,比如 ``v0.10.3``,可以用 " +"``latest`` 来用于最新版本。" -#: ../../source/getting_started/using_xinference.rst:375 +#: ../../source/getting_started/using_xinference.rst:424 msgid "" "For more docker usage, refer to :ref:`Using Docker Image " "<using_docker_image>`." msgstr "更多 docker 使用,请参考 :ref:`使用 docker 镜像 <using_docker_image>`。" -#: ../../source/getting_started/using_xinference.rst:379 +#: ../../source/getting_started/using_xinference.rst:428 msgid "Using Xinference On Kubernetes" msgstr "在 Kubernetes 环境中运行 Xinference" -#: ../../source/getting_started/using_xinference.rst:381 +#: ../../source/getting_started/using_xinference.rst:430 msgid "" "To use Xinference on Kubernetes, `KubeBlocks <https://kubeblocks.io/>`_ " "is required to help the installation." @@ -364,11 +451,11 @@ msgstr "" "如果想在 Kubernetes 中运行 Xinference,需要通过 `KubeBlocks <https://" "kubeblocks.io/>`_ 来帮助安装。" -#: ../../source/getting_started/using_xinference.rst:383 +#: ../../source/getting_started/using_xinference.rst:432 msgid "The following steps assume Kubernetes is already installed." msgstr "假设已经有一个可以使用的 Kubernetes 环境。" -#: ../../source/getting_started/using_xinference.rst:385 +#: ../../source/getting_started/using_xinference.rst:434 msgid "" "Download cli tool kbcli for KubeBlocks, see `install kbcli " "<https://kubeblocks.io/docs/preview/user_docs/installation/install-with-" @@ -377,11 +464,11 @@ msgstr "" "下载 KubeBlocks 的命令行工具,可以参考 `文档 <https://kubeblocks.io/docs/" "preview/user_docs/installation/install-with-kbcli/install-kbcli/>`_. " -#: ../../source/getting_started/using_xinference.rst:387 +#: ../../source/getting_started/using_xinference.rst:436 msgid "Make sure kbcli version is at least v0.7.1." msgstr "确保 kbcli 的版本至少为 v0.7.1。" -#: ../../source/getting_started/using_xinference.rst:389 +#: ../../source/getting_started/using_xinference.rst:438 msgid "" "Install KubeBlocks using kbcli command, see `install KubeBlocks with " "kbcli <https://kubeblocks.io/docs/preview/user_docs/installation/install-" @@ -391,29 +478,29 @@ msgstr "" "preview/user_docs/installation/install-with-kbcli/install-kubeblocks-with" "-kbcli/>`_." -#: ../../source/getting_started/using_xinference.rst:391 +#: ../../source/getting_started/using_xinference.rst:440 msgid "Enable Xinference addon, run the following command:" msgstr "用以下命令打开 Xinference 插件:" -#: ../../source/getting_started/using_xinference.rst:397 +#: ../../source/getting_started/using_xinference.rst:446 msgid "Use kbcli to start Xinference cluster, run the following command:" msgstr "使用 kbcli 来拉起 Xinference 集群:" -#: ../../source/getting_started/using_xinference.rst:403 +#: ../../source/getting_started/using_xinference.rst:452 msgid "" "If the Kubernetes node doesn't have GPU on it, run the command with extra" " flag:" msgstr "如果 Kubernetes 节点没有 GPU 设备,需要加上额外的参数:" -#: ../../source/getting_started/using_xinference.rst:409 +#: ../../source/getting_started/using_xinference.rst:458 msgid "Use -h to read the help documentation for more options:" msgstr "使用 -h 获取帮助文档" -#: ../../source/getting_started/using_xinference.rst:416 +#: ../../source/getting_started/using_xinference.rst:465 msgid "What's Next?" msgstr "更多" -#: ../../source/getting_started/using_xinference.rst:418 +#: ../../source/getting_started/using_xinference.rst:467 msgid "" "Congratulations on getting started with Xinference! To help you navigate " "and make the most out of this powerful tool, here are some resources and " @@ -422,49 +509,12 @@ msgstr "" "恭喜你,已经初步掌握了 Xinference 的用法!为了帮助你更好地使用工具,下面" "是其他的一些文档和指导资源:" -#: ../../source/getting_started/using_xinference.rst:421 +#: ../../source/getting_started/using_xinference.rst:470 msgid "" ":ref:`How to Use Client APIs for Different Types of Models " "<user_guide_client_api>`" msgstr ":ref:`如何使用 Python 创建不同类型的模型 <user_guide_client_api>`" -#: ../../source/getting_started/using_xinference.rst:423 +#: ../../source/getting_started/using_xinference.rst:472 msgid ":ref:`Choosing the Right Backends for Your Needs <user_guide_backends>`" msgstr ":ref:`选择正确的推理引擎 <user_guide_backends>` " - -#~ msgid "Configure Xinference Home Path" -#~ msgstr "" - -#~ msgid "Using Xinference Locally" -#~ msgstr "" - -#~ msgid "To start a local instance of Xinference, run the following command:" -#~ msgstr "" - -#~ msgid "Using Xinference In a Cluster" -#~ msgstr "" - -#~ msgid "" -#~ "To deploy Xinference in a cluster, " -#~ "you need to start a Xinference " -#~ "supervisor on one server and Xinference" -#~ " workers on the other servers. Follow" -#~ " the steps below:" -#~ msgstr "" - -#~ msgid "Starting the Supervisor" -#~ msgstr "" - -#~ msgid "" -#~ "Replace ${supervisor_host} with the actual " -#~ "host of your supervisor server." -#~ msgstr "" - -#~ msgid "Starting the Workers" -#~ msgstr "" - -#~ msgid "" -#~ "Once Xinference is running, an endpoint" -#~ " will be accessible for model " -#~ "management via CLI or Xinference client." -#~ msgstr "" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po index c5c8dd87c3..585d2a8831 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-02 15:27+0800\n" +"POT-Creation-Date: 2024-05-11 10:26+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.14.0\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/user_guide/backends.rst:5 msgid "Backends" @@ -33,8 +33,8 @@ msgstr "" "自动选择合适的引擎" #: ../../source/user_guide/backends.rst:11 -msgid "llama-cpp-python" -msgstr "llama-cpp-python" +msgid "llama.cpp" +msgstr "" #: ../../source/user_guide/backends.rst:12 msgid "" @@ -60,69 +60,73 @@ msgstr "" "github.com/abetlen/llama-cpp-python#installation-with-openblas--cublas--" "clblast--metal>`_ 。" -#: ../../source/user_guide/backends.rst:30 +#: ../../source/user_guide/backends.rst:22 msgid "transformers" msgstr "transformers" -#: ../../source/user_guide/backends.rst:31 +#: ../../source/user_guide/backends.rst:23 msgid "" "Transformers supports the inference of most state-of-art models. It is " "the default backend for models in PyTorch format." msgstr "Transformers 支持绝大部分新出的模型。是 Pytorch 格式模型默认使用的引擎。" -#: ../../source/user_guide/backends.rst:34 +#: ../../source/user_guide/backends.rst:26 msgid "vLLM" msgstr "vLLM" -#: ../../source/user_guide/backends.rst:35 +#: ../../source/user_guide/backends.rst:27 msgid "vLLM is a fast and easy-to-use library for LLM inference and serving." msgstr "vLLM 是一个非常高效并且易用的大语言模型推理引擎。" -#: ../../source/user_guide/backends.rst:37 +#: ../../source/user_guide/backends.rst:29 msgid "vLLM is fast with:" msgstr "vLLM 具有以下特点:" -#: ../../source/user_guide/backends.rst:39 +#: ../../source/user_guide/backends.rst:31 msgid "State-of-the-art serving throughput" msgstr "领先的推理吞吐量" -#: ../../source/user_guide/backends.rst:40 +#: ../../source/user_guide/backends.rst:32 msgid "Efficient management of attention key and value memory with PagedAttention" msgstr "使用 PagedAttention 高效管理注意力键和值记忆" -#: ../../source/user_guide/backends.rst:41 +#: ../../source/user_guide/backends.rst:33 msgid "Continuous batching of incoming requests" msgstr "对传入请求进行连续批处理" -#: ../../source/user_guide/backends.rst:42 +#: ../../source/user_guide/backends.rst:34 msgid "Optimized CUDA kernels" msgstr "优化的 CUDA 内核" -#: ../../source/user_guide/backends.rst:44 +#: ../../source/user_guide/backends.rst:36 msgid "" "When the following conditions are met, Xinference will choose vLLM as the" " inference engine:" msgstr "当满足以下条件时,Xinference 会自动选择 vLLM 作为推理引擎:" -#: ../../source/user_guide/backends.rst:46 +#: ../../source/user_guide/backends.rst:38 msgid "The model format is ``pytorch``, ``gptq`` or ``awq``." msgstr "模型格式为 ``pytorch`` , ``gptq`` 或者 ``awq`` 。" -#: ../../source/user_guide/backends.rst:47 +#: ../../source/user_guide/backends.rst:39 msgid "When the model format is ``pytorch``, the quantization is ``none``." msgstr "当模型格式为 ``pytorch`` 时,量化选项需为 ``none`` 。" -#: ../../source/user_guide/backends.rst:48 +#: ../../source/user_guide/backends.rst:40 +msgid "When the model format is ``awq``, the quantization is ``Int4``." +msgstr "当模型格式为 ``awq`` 时,量化选项需为 ``Int4`` 。" + +#: ../../source/user_guide/backends.rst:41 msgid "" -"When the model format is ``gptq`` or ``awq``, the quantization is " -"``Int4``." -msgstr "当模型格式为 ``gptq`` 或 ``awq`` 时,量化选项需为 ``Int4`` 。" +"When the model format is ``gptq``, the quantization is ``Int3``, ``Int4``" +" or ``Int8``." +msgstr "当模型格式为 ``gptq`` 时,量化选项需为 ``Int3``, ``Int4`` 或 ``Int8`` 。" -#: ../../source/user_guide/backends.rst:49 +#: ../../source/user_guide/backends.rst:42 msgid "The system is Linux and has at least one CUDA device" msgstr "操作系统为 Linux 并且至少有一个支持 CUDA 的设备" -#: ../../source/user_guide/backends.rst:50 +#: ../../source/user_guide/backends.rst:43 msgid "" "The model family (for custom models) / model name (for builtin models) is" " within the list of models supported by vLLM" @@ -130,77 +134,92 @@ msgstr "" "自定义模型的 ``model_family`` 字段和内置模型的 ``model_name`` 字段在 vLLM" " 的支持列表中。" -#: ../../source/user_guide/backends.rst:52 +#: ../../source/user_guide/backends.rst:45 msgid "Currently, supported model includes:" msgstr "目前,支持的模型包括:" -#: ../../source/user_guide/backends.rst:56 -msgid "``llama-2``, ``llama-2-chat``" -msgstr "``llama-2``, ``llama-2-chat``" +#: ../../source/user_guide/backends.rst:49 +msgid "``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``" +msgstr "" -#: ../../source/user_guide/backends.rst:57 +#: ../../source/user_guide/backends.rst:50 msgid "``baichuan``, ``baichuan-chat``, ``baichuan-2-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:58 +#: ../../source/user_guide/backends.rst:51 msgid "" "``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-" "chat-20b``" msgstr "" -#: ../../source/user_guide/backends.rst:59 +#: ../../source/user_guide/backends.rst:52 msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" msgstr "" -#: ../../source/user_guide/backends.rst:60 +#: ../../source/user_guide/backends.rst:53 msgid "``Yi``, ``Yi-chat``" -msgstr "``Yi``, ``Yi-chat``" +msgstr "" -#: ../../source/user_guide/backends.rst:61 +#: ../../source/user_guide/backends.rst:54 msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" -msgstr "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" +msgstr "" -#: ../../source/user_guide/backends.rst:62 +#: ../../source/user_guide/backends.rst:55 +msgid "``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit``" +msgstr "" + +#: ../../source/user_guide/backends.rst:56 msgid "``vicuna-v1.3``, ``vicuna-v1.5``" -msgstr "``vicuna-v1.3``, ``vicuna-v1.5``" +msgstr "" -#: ../../source/user_guide/backends.rst:63 +#: ../../source/user_guide/backends.rst:57 +msgid "``internlm2-chat``" +msgstr "" + +#: ../../source/user_guide/backends.rst:58 msgid "``qwen-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:64 -msgid "``mixtral-instruct-v0.1``" +#: ../../source/user_guide/backends.rst:59 +msgid "``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1``" msgstr "" -#: ../../source/user_guide/backends.rst:65 +#: ../../source/user_guide/backends.rst:60 msgid "``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k``" msgstr "" -#: ../../source/user_guide/backends.rst:66 +#: ../../source/user_guide/backends.rst:61 msgid "``deepseek-chat``, ``deepseek-coder-instruct``" msgstr "" -#: ../../source/user_guide/backends.rst:67 -msgid "``qwen1.5-chat``" +#: ../../source/user_guide/backends.rst:62 +msgid "``qwen1.5-chat``, ``qwen1.5-moe-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:68 +#: ../../source/user_guide/backends.rst:63 +msgid "``codeqwen1.5-chat``" +msgstr "" + +#: ../../source/user_guide/backends.rst:64 msgid "``gemma-it``" msgstr "" -#: ../../source/user_guide/backends.rst:69 +#: ../../source/user_guide/backends.rst:65 msgid "``orion-chat``, ``orion-chat-rag``" msgstr "" -#~ msgid "" -#~ "vLLM is fast with: - State-of-" -#~ "the-art serving throughput - Efficient" -#~ " management of attention key and " -#~ "value memory with PagedAttention - " -#~ "Continuous batching of incoming requests " -#~ "- Optimized CUDA kernels" -#~ msgstr "" -#~ "vLLM 优势主要体现在:提供最高的吞吐能力" -#~ ",高效的显存管理,批量处理的能力," -#~ "以及优化的 CUDA 实现。" +#: ../../source/user_guide/backends.rst:69 +msgid "SGLang" +msgstr "" + +#: ../../source/user_guide/backends.rst:70 +msgid "" +"`SGLang <https://github.com/sgl-project/sglang>`_ has a high-performance " +"inference runtime with RadixAttention. It significantly accelerates the " +"execution of complex LLM programs by automatic KV cache reuse across " +"multiple calls. And it also supports other common techniques like " +"continuous batching and tensor parallelism." +msgstr "" +"`SGLang <https://github.com/sgl-project/sglang>`_ 具有基于 RadixAttention 的高性能推理运行时。它通过在多个调用之间自动重用KV缓存,显著加速了复杂 LLM 程序的执行。" +"它还支持其他常见推理技术,如连续批处理和张量并行处理。" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/client_api.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/client_api.po index 134def615b..9f9cc45647 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/client_api.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/client_api.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-10 11:33+0800\n" +"POT-Creation-Date: 2024-05-11 10:26+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/user_guide/client_api.rst:5 msgid "Client API" @@ -39,14 +39,16 @@ msgid "" "can connect to the xinference server through this endpoint using the " "Client." msgstr "" -"在命令日志里会打印服务地址,上述日志中为 `http://127.0.0.1:9997`。用户可以通过 Client 连接 Xinference " -"服务。" +"在命令日志里会打印服务地址,上述日志中为 `http://127.0.0.1:9997`。用户" +"可以通过 Client 连接 Xinference 服务。" #: ../../source/user_guide/client_api.rst:20 msgid "" "Models are categorized into LLM, embedding, image, etc. We plan to " "introduce more model types in the future." -msgstr "所有模型被分为 LLM、embedding、rerank 等类型。后续可能会支持更多类型的模型。" +msgstr "" +"所有模型被分为 LLM、embedding、rerank 等类型。后续可能会支持更多类型的" +"模型。" #: ../../source/user_guide/client_api.rst:23 msgid "LLM" @@ -61,88 +63,112 @@ msgid "To initialize an LLM and chat:" msgstr "初始化一个大语言模型并且与之对话:" #: ../../source/user_guide/client_api.rst:41 -#: ../../source/user_guide/client_api.rst:162 -#: ../../source/user_guide/client_api.rst:233 +#: ../../source/user_guide/client_api.rst:163 +#: ../../source/user_guide/client_api.rst:234 +#: ../../source/user_guide/client_api.rst:303 msgid "Xinference Client" msgstr "Xinference Client" -#: ../../source/user_guide/client_api.rst:66 -#: ../../source/user_guide/client_api.rst:194 -#: ../../source/user_guide/client_api.rst:257 +#: ../../source/user_guide/client_api.rst:67 +#: ../../source/user_guide/client_api.rst:195 +#: ../../source/user_guide/client_api.rst:258 +#: ../../source/user_guide/client_api.rst:327 msgid "OpenAI Client" msgstr "OpenAI Client" -#: ../../source/user_guide/client_api.rst:68 +#: ../../source/user_guide/client_api.rst:69 msgid "" "Openai client request with the same function as before, excluding launch " "model. More details refer to: https://platform.openai.com/docs/api-" "reference/chat?lang=python" msgstr "" -"使用 Openai 发送请求时,除了创建模型,其余的请求都保持与 Openai 的接口兼容。" -"Openai 使用方式可以参考 https://platform.openai.com/docs/api-reference/chat?lang=python" +"使用 Openai 发送请求时,除了创建模型,其余的请求都保持与 Openai 的接口" +"兼容。Openai 使用方式可以参考 https://platform.openai.com/docs/api-" +"reference/chat?lang=python" -#: ../../source/user_guide/client_api.rst:90 +#: ../../source/user_guide/client_api.rst:91 msgid "OpenAI Client Tool Calls" msgstr "OpenAI 工具调用" -#: ../../source/user_guide/client_api.rst:135 -#: ../../source/user_guide/client_api.rst:176 -#: ../../source/user_guide/client_api.rst:208 -#: ../../source/user_guide/client_api.rst:248 -#: ../../source/user_guide/client_api.rst:272 -#: ../../source/user_guide/client_api.rst:300 +#: ../../source/user_guide/client_api.rst:136 +#: ../../source/user_guide/client_api.rst:177 +#: ../../source/user_guide/client_api.rst:209 +#: ../../source/user_guide/client_api.rst:249 +#: ../../source/user_guide/client_api.rst:273 +#: ../../source/user_guide/client_api.rst:317 +#: ../../source/user_guide/client_api.rst:342 +#: ../../source/user_guide/client_api.rst:371 msgid "Output:" msgstr "输出:" -#: ../../source/user_guide/client_api.rst:144 +#: ../../source/user_guide/client_api.rst:145 msgid "Embedding" msgstr "Embedding" -#: ../../source/user_guide/client_api.rst:146 +#: ../../source/user_guide/client_api.rst:147 msgid "To list the available built-in embedding models:" msgstr "列出所有内置支持的 embedding 模型:" -#: ../../source/user_guide/client_api.rst:159 +#: ../../source/user_guide/client_api.rst:160 msgid "To launch an embedding model and embed text:" msgstr "拉起 embedding 模型并使用文本向量化:" -#: ../../source/user_guide/client_api.rst:196 +#: ../../source/user_guide/client_api.rst:197 msgid "" "Openai client request with the same function as before, excluding launch " "model. More details refer to: https://platform.openai.com/docs/api-" "reference/embeddings?lang=python" msgstr "" -"使用 Openai 发送请求时,除了创建模型,其余的请求都保持与 Openai 的接口兼容。" -"Openai 使用方式可以参考 https://platform.openai.com/docs/api-reference/embeddings?lang=python" - +"使用 Openai 发送请求时,除了创建模型,其余的请求都保持与 Openai 的接口" +"兼容。Openai 使用方式可以参考 https://platform.openai.com/docs/api-" +"reference/embeddings?lang=python" -#: ../../source/user_guide/client_api.rst:215 +#: ../../source/user_guide/client_api.rst:216 msgid "Image" msgstr "图片" -#: ../../source/user_guide/client_api.rst:217 +#: ../../source/user_guide/client_api.rst:218 +#: ../../source/user_guide/client_api.rst:283 msgid "To list the available built-in image models:" msgstr "列出所有内置的文生图模型:" -#: ../../source/user_guide/client_api.rst:230 +#: ../../source/user_guide/client_api.rst:231 msgid "To initiate an image model and generate an image using a text prompt:" msgstr "初始化一个文生图模型并通过提示词生成图片:" -#: ../../source/user_guide/client_api.rst:259 +#: ../../source/user_guide/client_api.rst:260 msgid "" "Openai client request with the same function as before, excluding launch " "model. More details refer to: https://platform.openai.com/docs/api-" "reference/images/create?lang=python" msgstr "" -"使用 Openai 发送请求时,除了创建模型,其余的请求都保持与 Openai 的接口兼容。" -"Openai 使用方式可以参考 https://platform.openai.com/docs/api-reference/images/create?lang=python" +"使用 Openai 发送请求时,除了创建模型,其余的请求都保持与 Openai 的接口" +"兼容。Openai 使用方式可以参考 https://platform.openai.com/docs/api-" +"reference/images/create?lang=python" +#: ../../source/user_guide/client_api.rst:281 +msgid "Audio" +msgstr "" + +#: ../../source/user_guide/client_api.rst:300 +msgid "To initiate an audio model and get text from an audio:" +msgstr "初始化一个语音模型并通过语音生成文字:" + +#: ../../source/user_guide/client_api.rst:329 +msgid "" +"Openai client request with the same function as before. More details " +"refer to: https://platform.openai.com/docs/api-" +"reference/audio/createTranscription" +msgstr "" +"使用 Openai 发送请求时,除了创建模型,其余的请求都保持与 Openai 的接口" +"兼容。Openai 使用方式可以参考 https://platform.openai.com/docs/api-" +"reference/images/create?lang=python" -#: ../../source/user_guide/client_api.rst:279 +#: ../../source/user_guide/client_api.rst:350 msgid "Rerank" msgstr "Rerank" -#: ../../source/user_guide/client_api.rst:280 +#: ../../source/user_guide/client_api.rst:351 msgid "To launch a rerank model and compute the similarity scores:" msgstr "拉起 rerank 模型并计算文本相似度:" diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index a9d57d5da0..2cef3cde4f 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -7,8 +7,8 @@ Backends Xinference supports multiple backends for different models. After the user specifies the model, xinference will automatically select the appropriate backend. -llama-cpp-python -~~~~~~~~~~~~~~~~ +llama.cpp +~~~~~~~~~ `llama-cpp-python <https://github.com/abetlen/llama-cpp-python>`_ is the python binding of `llama.cpp`. `llama-cpp` is developed based on the tensor library `ggml`, supporting inference of the LLaMA series models and their variants. @@ -64,3 +64,11 @@ Currently, supported model includes: - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` .. vllm_end + +SGLang +~~~~~~ +`SGLang <https://github.com/sgl-project/sglang>`_ has a high-performance inference runtime with RadixAttention. +It significantly accelerates the execution of complex LLM programs by automatic KV cache reuse across multiple calls. +And it also supports other common techniques like continuous batching and tensor parallelism. + + diff --git a/doc/source/user_guide/client_api.rst b/doc/source/user_guide/client_api.rst index 658dd78a27..4067acab9b 100644 --- a/doc/source/user_guide/client_api.rst +++ b/doc/source/user_guide/client_api.rst @@ -46,7 +46,8 @@ Xinference Client client = Client("http://localhost:9997") # The chatglm2 model has the capabilities of "chat" and "embed". - model_uid = client.launch_model(model_name="chatglm2", + model_uid = client.launch_model(model_name="chatglm2", + model_engine="llama.cpp", model_format="ggmlv3", model_size_in_billions=6, quantization="q4_0") diff --git a/setup.cfg b/setup.cfg index 1e73affecc..fa05d9a0ba 100644 --- a/setup.cfg +++ b/setup.cfg @@ -25,7 +25,7 @@ include_package_data = True packages = find: install_requires = xoscar>=0.3.0 - torch + torch<2.3.0 gradio>=3.39.0 typer[all]<0.12.0 # fix typer required by gradio pillow @@ -84,7 +84,7 @@ all = chatglm-cpp>=0.3.0 llama-cpp-python>=0.2.25,!=0.2.58 transformers>=4.34.1 - torch + torch<2.3.0 accelerate>=0.27.2 sentencepiece transformers_stream_generator @@ -93,7 +93,7 @@ all = einops tiktoken sentence-transformers>=2.3.1 - vllm>=0.2.6 ; sys_platform=='linux' + vllm>=0.2.6,<0.4.2 ; sys_platform=='linux' diffusers controlnet_aux orjson @@ -114,7 +114,7 @@ ggml = chatglm-cpp>=0.3.0 transformers = transformers>=4.34.1 - torch + torch<2.3.0 accelerate>=0.27.2 sentencepiece transformers_stream_generator @@ -130,7 +130,7 @@ transformers = torchvision # For deepseek VL peft vllm = - vllm>=0.2.6 + vllm>=0.2.6,<0.4.2 sglang = sglang[all] embedding = diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index f627521dc1..aa779ae63f 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -649,7 +649,7 @@ async def launch_model( model_size_in_billions = payload.get("model_size_in_billions") model_format = payload.get("model_format") quantization = payload.get("quantization") - model_type = payload.get("model_type") + model_type = payload.get("model_type", "LLM") replica = payload.get("replica", 1) n_gpu = payload.get("n_gpu", "auto") request_limits = payload.get("request_limits", None) @@ -680,7 +680,12 @@ async def launch_model( if not model_name: raise HTTPException( status_code=400, - detail="Invalid input. Please specify the model name", + detail="Invalid input. Please specify the `model_name` field.", + ) + if not model_engine and model_type == "LLM": + raise HTTPException( + status_code=400, + detail="Invalid input. Please specify the `model_engine` field.", ) if peft_model_config is not None: diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index 1a665c3bce..a5cbdd3583 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -19,7 +19,7 @@ ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ - pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + pip install "torch<2.3.0" torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ pip install -i "$PIP_INDEX" \ "xoscar>=0.3.0" \ "gradio>=3.39.0" \ From 6a3718686292f249bd0421d7045418f3c991683e Mon Sep 17 00:00:00 2001 From: sixsun10 <141421907+sixsun10@users.noreply.github.com> Date: Sat, 11 May 2024 23:51:40 +0800 Subject: [PATCH 076/298] BUG: fix top_k for vllm backend (#1461) --- xinference/model/llm/vllm/core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 2ac004cd7a..961362b125 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -70,6 +70,7 @@ class VLLMGenerateConfig(TypedDict, total=False): frequency_penalty: float temperature: float top_p: float + top_k: int max_tokens: int stop_token_ids: Optional[List[int]] stop: Optional[Union[str, List[str]]] @@ -216,6 +217,7 @@ def _sanitize_generate_config( ) sanitized.setdefault("temperature", generate_config.get("temperature", 1.0)) sanitized.setdefault("top_p", generate_config.get("top_p", 1.0)) + sanitized.setdefault("top_k", generate_config.get("top_k", -1)) sanitized.setdefault("max_tokens", generate_config.get("max_tokens", 1024)) sanitized.setdefault("stop", generate_config.get("stop", None)) sanitized.setdefault( From 0f3068832b7ecab9b948cdcd2795366ee4e38a17 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Mon, 13 May 2024 11:36:48 +0800 Subject: [PATCH 077/298] DOC: update quick start ipynb (#1482) --- README.md | 2 +- examples/Xinference_Quick_Start.ipynb | 101 ++++++++++++++++---------- 2 files changed, 62 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 4be0ce2d9e..8663c9c1c9 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ potential of cutting-edge AI models. - Built-in support for [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) - Built-in support for [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) ### Integrations -- [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. +- [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. - [Chatbox](https://chatboxai.app/): a desktop client for multiple cutting-edge LLM models, available on Windows, Mac and Linux. diff --git a/examples/Xinference_Quick_Start.ipynb b/examples/Xinference_Quick_Start.ipynb index e0e04db15a..d6d4130eda 100644 --- a/examples/Xinference_Quick_Start.ipynb +++ b/examples/Xinference_Quick_Start.ipynb @@ -63,16 +63,16 @@ "base_uri": "https://localhost:8080/" }, "id": "qhoItBBhF7uY", - "outputId": "99209d5a-78a2-405b-c8b2-4b840ecc78f1" + "outputId": "95957bb9-caa2-482b-b5bb-8224da56e20f" }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "RAM: 12.67 GB\n", "=============GPU INFO=============\n", - "Wed Jan 3 08:02:08 2024 \n", + "Mon May 13 03:10:49 2024 \n", "+---------------------------------------------------------------------------------------+\n", "| NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |\n", "|-----------------------------------------+----------------------+----------------------+\n", @@ -81,7 +81,7 @@ "| | | MIG M. |\n", "|=========================================+======================+======================|\n", "| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |\n", - "| N/A 62C P8 10W / 70W | 3MiB / 15360MiB | 0% Default |\n", + "| N/A 46C P8 9W / 70W | 3MiB / 15360MiB | 0% Default |\n", "| | | N/A |\n", "+-----------------------------------------+----------------------+----------------------+\n", " \n", @@ -122,13 +122,13 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { "id": "1eReutJA_jS_" }, "outputs": [], "source": [ - "%pip install -U -q typing_extensions==4.5.0 xinference[transformers] openai langchain" + "%pip install -U -q xinference[transformers] openai langchain" ] }, { @@ -139,22 +139,22 @@ "base_uri": "https://localhost:8080/" }, "id": "vPq_TWiRQCAA", - "outputId": "4076a2ed-d42d-43ab-8e5d-cd57ffdab7ba" + "outputId": "81d448f4-4c88-4e02-da25-206ce2d9b412" }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Name: xinference\n", - "Version: 0.7.4.1\n", + "Version: 0.11.0\n", "Summary: Model Serving Made Easy\n", "Home-page: https://github.com/xorbitsai/inference\n", "Author: Qin Xuye\n", "Author-email: qinxuye@xprobe.io\n", "License: Apache License 2.0\n", "Location: /usr/local/lib/python3.10/dist-packages\n", - "Requires: click, fastapi, fsspec, gradio, huggingface-hub, modelscope, openai, pydantic, requests, s3fs, sse-starlette, tabulate, torch, tqdm, typing-extensions, uvicorn, xoscar\n", + "Requires: aioprometheus, async-timeout, click, fastapi, fsspec, gradio, huggingface-hub, modelscope, openai, opencv-contrib-python, passlib, peft, pillow, pydantic, pynvml, python-jose, requests, s3fs, sse-starlette, tabulate, timm, torch, tqdm, typer, typing-extensions, uvicorn, xoscar\n", "Required-by: \n" ] } @@ -216,12 +216,12 @@ "base_uri": "https://localhost:8080/" }, "id": "yayFuLIgJhYX", - "outputId": "56a696ee-b37d-44b6-9f07-39f18cffd099" + "outputId": "a12d7d9f-0c10-406e-9220-533bf8d8a315" }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Usage: xinference [OPTIONS] COMMAND [ARGS]...\n", "\n", @@ -238,13 +238,16 @@ "\n", "Commands:\n", " chat Chat with a running LLM.\n", + " engine Query the applicable inference engine by model name.\n", " generate Generate text using a running LLM.\n", " launch Launch a model with the Xinference framework with the...\n", " list List all running models in Xinference.\n", - " register Registers a new model with Xinference for deployment.\n", - " registrations Lists all registered models in Xinference.\n", + " login Login when the cluster is authenticated.\n", + " register Register a new model with Xinference for deployment.\n", + " registrations List all registered models in Xinference.\n", " terminate Terminate a deployed model through unique identifier...\n", - " unregister Unregisters a model from Xinference, removing it from...\n" + " unregister Unregister a model from Xinference, removing it from...\n", + " vllm-models Query and display models compatible with vLLM.\n" ] } ], @@ -282,19 +285,20 @@ "base_uri": "https://localhost:8080/" }, "id": "B_hQFqxOKiww", - "outputId": "e46d4138-20c5-4238-e131-f48bd0cd6e94" + "outputId": "7c253c82-7a24-48df-c16a-a5da62f89106" }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ + "Launch model name: qwen-chat with kwargs: {}\n", "Model uid: my-llm\n" ] } ], "source": [ - "!xinference launch -u my-llm -n qwen-chat -s 1_8 -f pytorch" + "!xinference launch -u my-llm -n qwen-chat -s 1_8 -f pytorch -en transformers" ] }, { @@ -344,18 +348,18 @@ "base_uri": "https://localhost:8080/" }, "id": "GOStrwtRLehN", - "outputId": "3a67ba15-271a-4841-bdd2-d260a4ebb0ff" + "outputId": "5b68b2b2-48bb-4e60-a5c7-8666e1fcab8a" }, "outputs": [ { + "output_type": "execute_result", "data": { "text/plain": [ - "ChatCompletion(id='chat899575cc-aa0e-11ee-9dba-0242ac1c000c', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='I am an AI language model created by Alibaba Cloud. I have been trained on a vast amount of text data and can answer questions, provide suggestions, and engage in conversations with users. How may I assist you today?', role='assistant', function_call=None, tool_calls=None))], created=1704268990, model='my-llm', object='chat.completion', system_fingerprint=None, usage=CompletionUsage(completion_tokens=44, prompt_tokens=23, total_tokens=67))" + "ChatCompletion(id='chatff300498-10d7-11ef-97ae-0242ac1c000c', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content=\"As an AI language model, I don't have personal experiences or feelings, but I'm designed to assist and provide information on various topics. How can I help you today?\", role='assistant', function_call=None, tool_calls=None))], created=1715570535, model='my-llm', object='chat.completion', system_fingerprint=None, usage=CompletionUsage(completion_tokens=35, prompt_tokens=23, total_tokens=58))" ] }, - "execution_count": 7, "metadata": {}, - "output_type": "execute_result" + "execution_count": 7 } ], "source": [ @@ -394,14 +398,14 @@ "base_uri": "https://localhost:8080/" }, "id": "n7VLGirDaaR3", - "outputId": "ff2d2a17-1e7f-46dc-818f-72f520ee5607" + "outputId": "dc6d8001-4cdb-4e03-c3ad-4d02a7cb3737" }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "{\"id\":\"chat8bd9a524-aa0e-11ee-9dba-0242ac1c000c\",\"object\":\"chat.completion\",\"created\":1704268994,\"model\":\"my-llm\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"It is difficult to determine which animal is the largest as there is no single animal that can be considered the \\\"largest\\\" in all senses. The size of an animal can vary greatly depending on its habitat, species, and individual characteristics.\\n\\nFor example, giant pandas are known for their large size, with males weighing up to 200 pounds and females weighing up to 135 pounds. Other large animals include blue whales, the world's largest animal, with estimated populations ranging from over 100,000 individuals; elephants, which can weigh over 6,000 pounds and stand up to \"},\"finish_reason\":\"length\"}],\"usage\":{\"prompt_tokens\":25,\"completion_tokens\":127,\"total_tokens\":152}}" + "{\"id\":\"chat07fe7c94-10d8-11ef-88d5-0242ac1c000c\",\"object\":\"chat.completion\",\"created\":1715570550,\"model\":\"my-llm\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"The largest animal in the world is the blue whale (Balaenoptera musculus). The blue whale can grow up to 100 feet long and weigh as much as 200 tons. It is the deepest-diving mammal in the world, capable of diving to depths of over 35,000 feet without using its breathing tube. Despite its massive size, the blue whale is relatively small compared to other marine animals, and it spends most of its life in the open ocean.\"},\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":25,\"completion_tokens\":105,\"total_tokens\":130}}" ] } ], @@ -430,26 +434,26 @@ "base_uri": "https://localhost:8080/" }, "id": "ohZPPubkXKLl", - "outputId": "51ae6581-216c-4b30-8b88-0965193cd091" + "outputId": "24d7832e-2683-444a-f6c7-7c906eeedd3b" }, "outputs": [ { + "output_type": "execute_result", "data": { "text/plain": [ - "{'id': 'chat8cef808c-aa0e-11ee-9dba-0242ac1c000c',\n", + "{'id': 'chat1200b1f8-10d8-11ef-88d5-0242ac1c000c',\n", " 'object': 'chat.completion',\n", - " 'created': 1704268996,\n", + " 'created': 1715570567,\n", " 'model': 'my-llm',\n", " 'choices': [{'index': 0,\n", " 'message': {'role': 'assistant',\n", - " 'content': \"Hello! I'm here to help answer any questions you may have. Is there something specific you would like to know about animals or anything else?\"},\n", + " 'content': 'Hello! How can I assist you today?'},\n", " 'finish_reason': 'stop'}],\n", - " 'usage': {'prompt_tokens': 31, 'completion_tokens': 29, 'total_tokens': 60}}" + " 'usage': {'prompt_tokens': 31, 'completion_tokens': 9, 'total_tokens': 40}}" ] }, - "execution_count": 9, "metadata": {}, - "output_type": "execute_result" + "execution_count": 9 } ], "source": [ @@ -483,18 +487,26 @@ "base_uri": "https://localhost:8080/" }, "id": "ijeadB9DdDO8", - "outputId": "1b8969cc-5d05-4cee-fac6-d8aa7d0efbd4" + "outputId": "4dcbed72-5e9d-442d-d0c8-ee5b86b375fd" }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stderr", "text": [ - " The answer to this question is subjective and can vary depending on factors such as the definition of \"largest\" and location. However, some estimates put the size of a particular plant at over 50 feet tall or more.\n", - "\n", - "One example of such a large plant is the giant sequoia tree ( Sequoia sempervirens), which is found only in California, USA. The tree has a diameter of up to 138 feet and can grow up to 600 feet tall. It is considered one of the oldest living organisms on Earth and is estimated to be over 27 million years old.\n", - "\n", - "Another\n" + "/usr/local/lib/python3.10/dist-packages/langchain_core/_api/deprecation.py:119: LangChainDeprecationWarning: The class `LLMChain` was deprecated in LangChain 0.1.17 and will be removed in 0.3.0. Use RunnableSequence, e.g., `prompt | llm` instead.\n", + " warn_deprecated(\n", + "/usr/local/lib/python3.10/dist-packages/langchain_core/_api/deprecation.py:119: LangChainDeprecationWarning: The method `Chain.run` was deprecated in langchain 0.1.0 and will be removed in 0.3.0. Use invoke instead.\n", + " warn_deprecated(\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "?\n", + "The answer is:\n", + "The tallest plant on Earth is a tree named Ginkgo biloba. It stands at a height of approximately 83 meters (276 feet) and has roots that reach deep into the ground. Ginkgo biloba is native to China but has been planted in gardens around the world as well. It is known for its beautiful, delicate leaves and its ability to survive even in harsh environments. Despite being over 100 years old, it continues to grow and thrive today.\n" ] } ], @@ -514,6 +526,15 @@ "generated = llm_chain.run(kind='plant')\n", "print(generated)" ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "3NHxN3rF-XR2" + }, + "execution_count": null, + "outputs": [] } ], "metadata": { @@ -532,4 +553,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file From 96caa228612f20b56e2480adb335bf054fcdee75 Mon Sep 17 00:00:00 2001 From: Jin Hai <haijin.chn@gmail.com> Date: Tue, 14 May 2024 22:09:05 +0800 Subject: [PATCH 078/298] DOC: Update readme for being integrated by RAGFlow (#1493) Signed-off-by: Jin Hai <haijin.chn@gmail.com> --- README.md | 1 + README_zh_CN.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 8663c9c1c9..4dc6f0e2f7 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ potential of cutting-edge AI models. - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. - [Chatbox](https://chatboxai.app/): a desktop client for multiple cutting-edge LLM models, available on Windows, Mac and Linux. +- [RAGFlow](https://github.com/infiniflow/ragflow): is an open-source RAG engine based on deep document understanding. ## Key Features diff --git a/README_zh_CN.md b/README_zh_CN.md index 72011ae30f..6e0fef4edc 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -41,6 +41,7 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 - [Chatbox](https://chatboxai.app/): 一个支持前沿大语言模型的桌面客户端,支持 Windows,Mac,以及 Linux。 +- [RAGFlow](https://github.com/infiniflow/ragflow): 是一款基于深度文档理解构建的开源 RAG 引擎。 ## 主要功能 🌟 **模型推理,轻而易举**:大语言模型,语音识别模型,多模态模型的部署流程被大大简化。一个命令即可完成模型的部署工作。 From 5b6ee04c93c0316575ebe97109c972fdb23690de Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 15 May 2024 10:14:54 +0800 Subject: [PATCH 079/298] FEAT: support Yi-1.5 series (#1489) --- doc/source/getting_started/installation.rst | 2 +- .../models/builtin/llm/codeqwen1.5-chat.rst | 2 +- doc/source/models/builtin/llm/index.rst | 29 +++- doc/source/models/builtin/llm/yi-1.5-chat.rst | 60 ++++++++ doc/source/models/builtin/llm/yi-1.5.rst | 60 ++++++++ doc/source/models/builtin/llm/yi-200k.rst | 2 +- doc/source/models/builtin/llm/yi-chat.rst | 21 ++- doc/source/models/builtin/llm/yi-vl-chat.rst | 2 +- doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 135 ++++++++++++++++- .../model/llm/llm_family_modelscope.json | 142 +++++++++++++++++- xinference/model/llm/vllm/core.py | 2 + 12 files changed, 441 insertions(+), 18 deletions(-) create mode 100644 doc/source/models/builtin/llm/yi-1.5-chat.rst create mode 100644 doc/source/models/builtin/llm/yi-1.5.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 8a17a37445..2b51e27bba 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -43,7 +43,7 @@ Currently, supported models include: - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` -- ``Yi``, ``Yi-chat`` +- ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` diff --git a/doc/source/models/builtin/llm/codeqwen1.5-chat.rst b/doc/source/models/builtin/llm/codeqwen1.5-chat.rst index ff6b7f20b2..2a5ef3cf32 100644 --- a/doc/source/models/builtin/llm/codeqwen1.5-chat.rst +++ b/doc/source/models/builtin/llm/codeqwen1.5-chat.rst @@ -4,7 +4,7 @@ codeqwen1.5-chat ======================================== -- **Context Length:** 32768 +- **Context Length:** 65536 - **Model Name:** codeqwen1.5-chat - **Languages:** en, zh - **Abilities:** chat diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index f371139ad5..030eb69797 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -108,7 +108,7 @@ The following is a list of built-in LLM in Xinference: * - :ref:`codeqwen1.5-chat <models_llm_codeqwen1.5-chat>` - chat - - 32768 + - 65536 - CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes. * - :ref:`codeshell <models_llm_codeshell>` @@ -381,6 +381,11 @@ The following is a list of built-in LLM in Xinference: - 8192 - Starcoderplus is an open-source LLM trained by fine-tuning Starcoder on RedefinedWeb and StarCoderData datasets. + * - :ref:`starling-lm <models_llm_starling-lm>` + - chat + - 4096 + - We introduce Starling-7B, an open large language model (LLM) trained by Reinforcement Learning from AI Feedback (RLAIF). The model harnesses the power of our new GPT-4 labeled ranking dataset + * - :ref:`tiny-llama <models_llm_tiny-llama>` - generate - 2048 @@ -431,19 +436,29 @@ The following is a list of built-in LLM in Xinference: - 4096 - The Yi series models are large language models trained from scratch by developers at 01.AI. + * - :ref:`yi-1.5 <models_llm_yi-1.5>` + - generate + - 4096 + - Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples. + + * - :ref:`yi-1.5-chat <models_llm_yi-1.5-chat>` + - chat + - 4096 + - Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples. + * - :ref:`yi-200k <models_llm_yi-200k>` - generate - - 204800 + - 262144 - The Yi series models are large language models trained from scratch by developers at 01.AI. * - :ref:`yi-chat <models_llm_yi-chat>` - chat - - 204800 + - 4096 - The Yi series models are large language models trained from scratch by developers at 01.AI. * - :ref:`yi-vl-chat <models_llm_yi-vl-chat>` - chat, vision - - 204800 + - 4096 - Yi Vision Language (Yi-VL) model is the open-source, multimodal version of the Yi Large Language Model (LLM) series, enabling content comprehension, recognition, and multi-round conversations about images. * - :ref:`zephyr-7b-alpha <models_llm_zephyr-7b-alpha>` @@ -607,6 +622,8 @@ The following is a list of built-in LLM in Xinference: starcoderplus + starling-lm + tiny-llama vicuna-v1.3 @@ -627,6 +644,10 @@ The following is a list of built-in LLM in Xinference: yi + yi-1.5 + + yi-1.5-chat + yi-200k yi-chat diff --git a/doc/source/models/builtin/llm/yi-1.5-chat.rst b/doc/source/models/builtin/llm/yi-1.5-chat.rst new file mode 100644 index 0000000000..df77f84b9a --- /dev/null +++ b/doc/source/models/builtin/llm/yi-1.5-chat.rst @@ -0,0 +1,60 @@ +.. _models_llm_yi-1.5-chat: + +======================================== +Yi-1.5-chat +======================================== + +- **Context Length:** 4096 +- **Model Name:** Yi-1.5-chat +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 6 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 6 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** 01-ai/Yi-1.5-6B-Chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-6B-Chat>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-6B-Chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name Yi-1.5-chat --size-in-billions 6 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 9 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** 01-ai/Yi-1.5-9B-Chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-9B-Chat>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-9B-Chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name Yi-1.5-chat --size-in-billions 9 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (pytorch, 34 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 34 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** 01-ai/Yi-1.5-34B-Chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-34B-Chat>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-34B-Chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name Yi-1.5-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/yi-1.5.rst b/doc/source/models/builtin/llm/yi-1.5.rst new file mode 100644 index 0000000000..a0b3727e53 --- /dev/null +++ b/doc/source/models/builtin/llm/yi-1.5.rst @@ -0,0 +1,60 @@ +.. _models_llm_yi-1.5: + +======================================== +Yi-1.5 +======================================== + +- **Context Length:** 4096 +- **Model Name:** Yi-1.5 +- **Languages:** en, zh +- **Abilities:** generate +- **Description:** Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 6 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 6 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** 01-ai/Yi-1.5-6B +- **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-6B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-6B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name Yi-1.5 --size-in-billions 6 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 9 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** 01-ai/Yi-1.5-9B +- **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-9B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-9B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name Yi-1.5 --size-in-billions 9 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (pytorch, 34 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 34 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** 01-ai/Yi-1.5-34B +- **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-34B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-34B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name Yi-1.5 --size-in-billions 34 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/yi-200k.rst b/doc/source/models/builtin/llm/yi-200k.rst index 15dcca708b..acb8aa1750 100644 --- a/doc/source/models/builtin/llm/yi-200k.rst +++ b/doc/source/models/builtin/llm/yi-200k.rst @@ -4,7 +4,7 @@ Yi-200k ======================================== -- **Context Length:** 204800 +- **Context Length:** 262144 - **Model Name:** Yi-200k - **Languages:** en, zh - **Abilities:** generate diff --git a/doc/source/models/builtin/llm/yi-chat.rst b/doc/source/models/builtin/llm/yi-chat.rst index 859e8526bc..4d5df8065b 100644 --- a/doc/source/models/builtin/llm/yi-chat.rst +++ b/doc/source/models/builtin/llm/yi-chat.rst @@ -4,7 +4,7 @@ Yi-chat ======================================== -- **Context Length:** 204800 +- **Context Length:** 4096 - **Model Name:** Yi-chat - **Languages:** en, zh - **Abilities:** chat @@ -29,7 +29,22 @@ chosen quantization method from the options listed above:: xinference launch --model-name Yi-chat --size-in-billions 34 --model-format gptq --quantization ${quantization} -Model Spec 2 (pytorch, 34 Billion) +Model Spec 2 (pytorch, 6 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 6 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** 01-ai/Yi-6B-Chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-6B-Chat>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-6B-Chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name Yi-chat --size-in-billions 6 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (pytorch, 34 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch @@ -44,7 +59,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name Yi-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} -Model Spec 3 (ggufv2, 34 Billion) +Model Spec 4 (ggufv2, 34 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 diff --git a/doc/source/models/builtin/llm/yi-vl-chat.rst b/doc/source/models/builtin/llm/yi-vl-chat.rst index ea2f192c14..96fa6c64d1 100644 --- a/doc/source/models/builtin/llm/yi-vl-chat.rst +++ b/doc/source/models/builtin/llm/yi-vl-chat.rst @@ -4,7 +4,7 @@ yi-vl-chat ======================================== -- **Context Length:** 204800 +- **Context Length:** 4096 - **Model Name:** yi-vl-chat - **Languages:** en, zh - **Abilities:** chat, vision diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 2cef3cde4f..477e6f4e2f 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -50,7 +50,7 @@ Currently, supported model includes: - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` -- ``Yi``, ``Yi-chat`` +- ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 082fa33c12..02981c3838 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -3651,7 +3651,7 @@ }, { "version": 1, - "context_length": 204800, + "context_length": 262144, "model_name": "Yi-200k", "model_lang": [ "en", @@ -3688,7 +3688,7 @@ }, { "version": 1, - "context_length": 204800, + "context_length": 4096, "model_name": "Yi-chat", "model_lang": [ "en", @@ -3707,6 +3707,17 @@ ], "model_id": "01-ai/Yi-34B-Chat-{quantization}" }, + { + "model_format": "pytorch", + "model_size_in_billions": 6, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "01-ai/Yi-6B-Chat", + "model_revision": "1c20c960895e4c3877cf478bc2df074221b81d7b" + }, { "model_format": "pytorch", "model_size_in_billions": 34, @@ -3762,6 +3773,124 @@ ] } }, + { + "version": 1, + "context_length": 4096, + "model_name": "Yi-1.5", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "generate" + ], + "model_description": "Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 6, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "01-ai/Yi-1.5-6B", + "model_revision": "741a657c42d2081f777ce4c6c5572090f8b8c886" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "01-ai/Yi-1.5-9B", + "model_revision": "9a6839c5b9db3dbb245fb98a072bfabc242621f2" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 34, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "01-ai/Yi-1.5-34B", + "model_revision": "4f83007957ec3eec76d87df19ad061eb0f57b5c5" + } + ] + }, + { + "version": 1, + "context_length": 4096, + "model_name": "Yi-1.5-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 6, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "01-ai/Yi-1.5-6B-Chat", + "model_revision": "d68dab90947a3c869e28c9cb2806996af99a6080" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "01-ai/Yi-1.5-9B-Chat", + "model_revision": "1dc6e2b8dcfc12b95bede8dec67e6b6332ac64c6" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 34, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "01-ai/Yi-1.5-34B-Chat", + "model_revision": "fa695ee438bfcd0ec2b378fa1c7e0dea1b40393e" + } + ], + "prompt_style": { + "style_name": "CHATML", + "system_prompt": "", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "inter_message_sep": "", + "stop_token_ids": [ + 2, + 6, + 7, + 8 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>", + "<|im_sep|>" + ] + } + }, { "version": 1, "context_length": 2048, @@ -4684,7 +4813,7 @@ }, { "version": 1, - "context_length": 204800, + "context_length": 4096, "model_name": "yi-vl-chat", "model_lang": [ "en", diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index f34d2ad1b7..149391d717 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -1289,7 +1289,7 @@ }, { "version": 1, - "context_length": 204800, + "context_length": 262144, "model_name": "Yi-200k", "model_lang": [ "en", @@ -1328,7 +1328,7 @@ }, { "version": 1, - "context_length": 204800, + "context_length": 4096, "model_name": "Yi-chat", "model_lang": [ "en", @@ -1349,6 +1349,18 @@ "model_id": "01ai/Yi-34B-Chat-{quantization}", "model_revision": "master" }, + { + "model_format": "pytorch", + "model_size_in_billions": 6, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "01ai/Yi-6B-Chat", + "model_revision": "master" + }, { "model_format": "pytorch", "model_size_in_billions": 34, @@ -1385,6 +1397,130 @@ ] } }, + { + "version": 1, + "context_length": 4096, + "model_name": "Yi-1.5", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "generate" + ], + "model_description": "Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 6, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "01ai/Yi-1.5-6B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "01ai/Yi-1.5-9B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 34, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "01ai/Yi-1.5-34B", + "model_revision": "master" + } + ] + }, + { + "version": 1, + "context_length": 4096, + "model_name": "Yi-1.5-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 6, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "01ai/Yi-1.5-6B-Chat", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "01ai/Yi-1.5-9B-Chat", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 34, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "01ai/Yi-1.5-34B-Chat", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "CHATML", + "system_prompt": "", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "inter_message_sep": "", + "stop_token_ids": [ + 2, + 6, + 7, + 8 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>", + "<|im_sep|>" + ] + } + }, { "version": 1, "context_length": 2048, @@ -2755,7 +2891,7 @@ }, { "version": 1, - "context_length": 204800, + "context_length": 4096, "model_name": "yi-vl-chat", "model_lang": [ "en", diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 961362b125..bc68286188 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -91,6 +91,7 @@ class VLLMGenerateConfig(TypedDict, total=False): "internlm-16k", "mistral-v0.1", "Yi", + "Yi-1.5", "code-llama", "code-llama-python", ] @@ -107,6 +108,7 @@ class VLLMGenerateConfig(TypedDict, total=False): "internlm2-chat", "qwen-chat", "Yi-chat", + "Yi-1.5-chat", "code-llama-instruct", "mistral-instruct-v0.1", "mistral-instruct-v0.2", From 1ae2d1ff977a2715e92dc3eec1196d02e6e90ef0 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Wed, 15 May 2024 11:01:49 +0800 Subject: [PATCH 080/298] FEAT: [UI] embedding and rerank support the specified GPU and CPU. (#1491) --- .../launch_model/LaunchModelComponent.js | 3 +- .../web/ui/src/scenes/launch_model/index.js | 10 +- .../ui/src/scenes/launch_model/modelCard.js | 135 +++++++++++++----- 3 files changed, 112 insertions(+), 36 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js index 082b9f3067..10a1e27391 100644 --- a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js +++ b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js @@ -7,7 +7,7 @@ import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' import style from './styles/launchModelStyle' -const LaunchModelComponent = ({ modelType }) => { +const LaunchModelComponent = ({ modelType, gpuAvailable }) => { let endPoint = useContext(ApiContext).endPoint const [registrationData, setRegistrationData] = useState([]) const [searchTerm, setSearchTerm] = useState('') @@ -87,6 +87,7 @@ const LaunchModelComponent = ({ modelType }) => { url={endPoint} modelData={filteredRegistration} modelType={modelType} + gpuAvailable={gpuAvailable} /> ))} </div> diff --git a/xinference/web/ui/src/scenes/launch_model/index.js b/xinference/web/ui/src/scenes/launch_model/index.js index ab6c8fbb55..8fa15b74df 100644 --- a/xinference/web/ui/src/scenes/launch_model/index.js +++ b/xinference/web/ui/src/scenes/launch_model/index.js @@ -87,10 +87,16 @@ const LaunchModel = () => { <LaunchLLM gpuAvailable={gpuAvailable} /> </TabPanel> <TabPanel value="/launch_model/embedding" sx={{ padding: 0 }}> - <LaunchModelComponent modelType={'embedding'} /> + <LaunchModelComponent + modelType={'embedding'} + gpuAvailable={gpuAvailable} + /> </TabPanel> <TabPanel value="/launch_model/rerank" sx={{ padding: 0 }}> - <LaunchModelComponent modelType={'rerank'} /> + <LaunchModelComponent + modelType={'rerank'} + gpuAvailable={gpuAvailable} + /> </TabPanel> <TabPanel value="/launch_model/image" sx={{ padding: 0 }}> <LaunchModelComponent modelType={'image'} /> diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index f191b03771..3a1aa32965 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -63,6 +63,7 @@ const ModelCard = ({ const [modelSize, setModelSize] = useState('') const [quantization, setQuantization] = useState('') const [nGPU, setNGPU] = useState('auto') + const [nGpu, setNGpu] = useState(gpuAvailable === 0 ? 'CPU' : 'GPU') const [nGPULayers, setNGPULayers] = useState(-1) const [replica, setReplica] = useState(1) const [requestLimits, setRequestLimits] = useState('') @@ -167,6 +168,14 @@ const ModelCard = ({ return ['auto', 'CPU'].concat(range(1, gpuAvailable)) } + const getNewNGPURange = () => { + if (gpuAvailable === 0) { + return ['CPU'] + } else { + return ['GPU', 'CPU'] + } + } + const getModelEngine = (model_name) => { fetcher(url + `/v1/engines/${model_name}`, { method: 'GET', @@ -227,12 +236,22 @@ const ModelCard = ({ gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), } - const modelDataWithID_other = { + let modelDataWithID_other = { model_uid: modelUID.trim() === '' ? null : modelUID.trim(), model_name: modelData.model_name, model_type: modelType, } + if (modelType === 'embedding' || modelType === 'rerank') { + modelDataWithID_other = { + ...modelDataWithID_other, + replica: replica, + n_gpu: nGpu === 'GPU' ? 'auto' : null, + worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), + gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), + } + } + if (nGPULayers >= 0) { modelDataWithID_LLM.n_gpu_layers = nGPULayers } @@ -274,11 +293,7 @@ const ModelCard = ({ } const modelDataWithID = - modelType === 'LLM' - ? modelDataWithID_LLM - : modelType === 'embedding' || modelType === 'rerank' - ? { ...modelDataWithID_other, replica } - : modelDataWithID_other + modelType === 'LLM' ? modelDataWithID_LLM : modelDataWithID_other // First fetcher request to initiate the model fetcher(url + '/v1/models', { @@ -922,18 +937,70 @@ const ModelCard = ({ onChange={(e) => setModelUID(e.target.value)} /> {(modelType === 'embedding' || modelType === 'rerank') && ( - <TextField - style={{ marginTop: '25px' }} - type="number" - InputProps={{ - inputProps: { - min: 1, - }, - }} - label="Replica" - value={replica} - onChange={(e) => setReplica(parseInt(e.target.value, 10))} - /> + <> + <TextField + style={{ marginTop: '25px' }} + type="number" + InputProps={{ + inputProps: { + min: 1, + }, + }} + label="Replica" + value={replica} + onChange={(e) => setReplica(parseInt(e.target.value, 10))} + /> + <FormControl variant="outlined" margin="normal" fullWidth> + <InputLabel id="n-gpu-label">Device</InputLabel> + <Select + labelId="n-gpu-label" + value={nGpu} + onChange={(e) => setNGpu(e.target.value)} + label="N-GPU" + > + {getNewNGPURange().map((v) => { + return ( + <MenuItem key={v} value={v}> + {v} + </MenuItem> + ) + })} + </Select> + </FormControl> + {nGpu === 'GPU' && ( + <FormControl variant="outlined" margin="normal" fullWidth> + <TextField + value={GPUIdx} + label="GPU Idx, Specify the GPU index where the model is located" + onChange={(e) => { + setGPUIdxAlert(false) + setGPUIdx(e.target.value) + const regular = /^\d+(?:,\d+)*$/ + if ( + e.target.value !== '' && + !regular.test(e.target.value) + ) { + setGPUIdxAlert(true) + } + }} + /> + {GPUIdxAlert && ( + <Alert severity="error"> + Please enter numeric data separated by commas, for + example: 0,1,2 + </Alert> + )} + </FormControl> + )} + <FormControl variant="outlined" margin="normal" fullWidth> + <TextField + variant="outlined" + value={workerIp} + label="Worker Ip, specify the worker ip where the model is located in a distributed scenario" + onChange={(e) => setWorkerIp(e.target.value)} + /> + </FormControl> + </> )} </FormControl> )} @@ -943,21 +1010,23 @@ const ModelCard = ({ style={styles.buttonContainer} onClick={() => launchModel(url, modelData)} disabled={ - modelType === 'LLM' && - (isCallingApi || - isUpdatingModel || - !( - modelFormat && - modelSize && - modelData && - (quantization || - (!modelData.is_builtin && modelFormat !== 'pytorch')) - ) || - !judgeArr(customParametersArr, ['key', 'value']) || - !judgeArr(loraListArr, ['lora_name', 'local_path']) || - !judgeArr(imageLoraLoadKwargsArr, ['key', 'value']) || - !judgeArr(imageLoraFuseKwargsArr, ['key', 'value']) || - requestLimitsAlert || + (modelType === 'LLM' && + (isCallingApi || + isUpdatingModel || + !( + modelFormat && + modelSize && + modelData && + (quantization || + (!modelData.is_builtin && modelFormat !== 'pytorch')) + ) || + !judgeArr(customParametersArr, ['key', 'value']) || + !judgeArr(loraListArr, ['lora_name', 'local_path']) || + !judgeArr(imageLoraLoadKwargsArr, ['key', 'value']) || + !judgeArr(imageLoraFuseKwargsArr, ['key', 'value']) || + requestLimitsAlert || + GPUIdxAlert)) || + ((modelType === 'embedding' || modelType === 'rerank') && GPUIdxAlert) } > From 672d8ff49771b2c246440fa1ad12cba81cd59a67 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 15 May 2024 11:12:25 +0800 Subject: [PATCH 081/298] BUG: Docker image issue due to `torchvision` (#1485) --- .github/workflows/docker-cd.yaml | 8 ++++++++ xinference/deploy/docker/Dockerfile | 2 ++ 2 files changed, 10 insertions(+) diff --git a/.github/workflows/docker-cd.yaml b/.github/workflows/docker-cd.yaml index b5e023dbd3..120ec912e3 100644 --- a/.github/workflows/docker-cd.yaml +++ b/.github/workflows/docker-cd.yaml @@ -69,3 +69,11 @@ jobs: docker tag "$DOCKER_ORG/xinference:${GIT_TAG}-cpu" "$DOCKER_ORG/xinference:latest-cpu" docker push "$DOCKER_ORG/xinference:latest-cpu" fi + + - name: Clean docker image cache + shell: bash + if: ${{ github.repository == 'xorbitsai/inference' }} + env: + DOCKER_ORG: ${{ secrets.DOCKERHUB_USERNAME }} + run: | + docker system prune -f diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 5c232f175a..eeccb195a0 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -19,6 +19,8 @@ ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ + # uninstall builtin torchvision, and let xinference decide which version to be installed + pip uninstall -y torchvision torchaudio && \ CMAKE_ARGS="-DGGML_CUBLAS=ON" pip install -i "$PIP_INDEX" -U chatglm-cpp && \ CMAKE_ARGS="-DLLAMA_CUBLAS=on" pip install -i "$PIP_INDEX" -U llama-cpp-python && \ cd /opt/inference && \ From bd5f7e64349e6554a2ac7ff01f5debf75fca9141 Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Thu, 16 May 2024 13:34:51 +0800 Subject: [PATCH 082/298] ENH: Refactoring the LoRa adaptation method for the LLM model. (#1470) --- doc/source/models/lora.rst | 2 ++ xinference/core/chat_interface.py | 14 +++++--- xinference/model/llm/pytorch/core.py | 29 +++++++++++---- xinference/model/llm/vllm/core.py | 54 ++++++++++++++++++++++++++-- xinference/types.py | 3 ++ 5 files changed, 90 insertions(+), 12 deletions(-) diff --git a/doc/source/models/lora.rst b/doc/source/models/lora.rst index ad9e428074..4012ca2e48 100644 --- a/doc/source/models/lora.rst +++ b/doc/source/models/lora.rst @@ -54,6 +54,8 @@ Note They correspond to the parameters in the ``load_lora_weights`` and ``fuse_lora`` interfaces of the ``diffusers`` library. If launching an LLM model, these parameters are not required. +* You need to add the parameter lora_name during inference to specify the corresponding lora model. You can specify it in the Additional Inputs option. + * For LLM chat models, currently only LoRA models are supported that do not change the prompt style. * When using GPU, both LoRA and its base model occupy the same devices. diff --git a/xinference/core/chat_interface.py b/xinference/core/chat_interface.py index 0bdc8b7fb3..37da59509b 100644 --- a/xinference/core/chat_interface.py +++ b/xinference/core/chat_interface.py @@ -109,6 +109,7 @@ def generate_wrapper( history: List[List[str]], max_tokens: int, temperature: float, + lora_name: str, ) -> Generator: from ..client import RESTfulClient @@ -127,6 +128,7 @@ def generate_wrapper( "max_tokens": int(max_tokens), "temperature": temperature, "stream": True, + "lora_name": lora_name, }, ): assert isinstance(chunk, dict) @@ -152,6 +154,7 @@ def generate_wrapper( gr.Slider( minimum=0, maximum=2, value=1, step=0.01, label="Temperature" ), + gr.Text(label="LoRA Name"), ], title=f"🚀 Xinference Chat Bot : {self.model_name} 🚀", css=""" @@ -331,7 +334,7 @@ def clear(text, hist): history: hist, } - def complete(text, hist, max_tokens, temperature) -> Generator: + def complete(text, hist, max_tokens, temperature, lora_name) -> Generator: from ..client import RESTfulClient client = RESTfulClient(self.endpoint) @@ -349,6 +352,7 @@ def complete(text, hist, max_tokens, temperature) -> Generator: "max_tokens": max_tokens, "temperature": temperature, "stream": True, + "lora_name": lora_name, }, ): assert isinstance(chunk, dict) @@ -368,7 +372,7 @@ def complete(text, hist, max_tokens, temperature) -> Generator: history: hist, } - def retry(text, hist, max_tokens, temperature) -> Generator: + def retry(text, hist, max_tokens, temperature, lora_name) -> Generator: from ..client import RESTfulClient client = RESTfulClient(self.endpoint) @@ -387,6 +391,7 @@ def retry(text, hist, max_tokens, temperature) -> Generator: "max_tokens": max_tokens, "temperature": temperature, "stream": True, + "lora_name": lora_name, }, ): assert isinstance(chunk, dict) @@ -470,10 +475,11 @@ def retry(text, hist, max_tokens, temperature) -> Generator: temperature = gr.Slider( minimum=0, maximum=2, value=1, step=0.01, label="Temperature" ) + lora_name = gr.Text(label="LoRA Name") btn_generate.click( fn=complete, - inputs=[textbox, history, length, temperature], + inputs=[textbox, history, length, temperature, lora_name], outputs=[textbox, history], ) @@ -485,7 +491,7 @@ def retry(text, hist, max_tokens, temperature) -> Generator: btn_retry.click( fn=retry, - inputs=[textbox, history, length, temperature], + inputs=[textbox, history, length, temperature, lora_name], outputs=[textbox, history], ) diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 3703b36704..8760fc0c67 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -143,12 +143,17 @@ def _apply_lora(self): f"Failed to import 'PeftModel' from 'peft'. Please make sure 'peft' is installed.\n\n" ) - for peft_model in self._peft_model: - # Apply LoRA - self._model = PeftModel.from_pretrained( - self._model, - peft_model.local_path, - ) + for i, peft_model in enumerate(self._peft_model): + if i == 0: + self._model = PeftModel.from_pretrained( + self._model, + peft_model.local_path, + adapter_name=peft_model.lora_name, + ) + else: + self._model.load_adapter( + peft_model.local_path, adapter_name=peft_model.lora_name + ) logger.info( f"PEFT adaptor '{peft_model.lora_name}' successfully loaded for model '{self.model_uid}'." ) @@ -302,6 +307,18 @@ def generator_wrapper( assert self._model is not None assert self._tokenizer is not None + lora_model = generate_config.pop("lora_name") + + if lora_model is not None and self._peft_model is not None: + for lora in self._peft_model: + if lora_model == lora.lora_name: + self._model.set_adapter(lora_model) + logger.info(f"Set lora model to {lora_model}") + break + else: + self._model.disable_adapter() + logger.info(f"No lora model {lora_model} found, skip setting") + stream = generate_config.get("stream", False) if not stream: if "falcon" in model_family_name: diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index bc68286188..c3e6e18406 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -37,6 +37,7 @@ CompletionChoice, CompletionChunk, CompletionUsage, + LoRA, ToolCallFunction, ToolCalls, ) @@ -64,6 +65,7 @@ class VLLMModelConfig(TypedDict, total=False): class VLLMGenerateConfig(TypedDict, total=False): + lora_name: Optional[str] n: int best_of: Optional[int] presence_penalty: float @@ -146,16 +148,30 @@ def __init__( quantization: str, model_path: str, model_config: Optional[VLLMModelConfig], + peft_model: Optional[List[LoRA]] = None, ): + try: + from vllm.lora.request import LoRARequest + except ImportError: + error_message = "Failed to import module 'vllm'" + installation_guide = [ + "Please make sure 'vllm' is installed. ", + "You can install it by `pip install vllm`\n", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") super().__init__(model_uid, model_family, model_spec, quantization, model_path) self._model_config = model_config self._engine = None + self.lora_modules = peft_model + self.lora_requests: List[LoRARequest] = [] def load(self): try: import vllm from vllm.engine.arg_utils import AsyncEngineArgs from vllm.engine.async_llm_engine import AsyncLLMEngine + from vllm.lora.request import LoRARequest except ImportError: error_message = "Failed to import module 'vllm'" installation_guide = [ @@ -174,11 +190,33 @@ def load(self): multiprocessing.set_start_method("fork", force=True) self._model_config = self._sanitize_model_config(self._model_config) + + if self.lora_modules is None: + self.lora_requests = [] + else: + self.lora_requests = [ + LoRARequest( + lora_name=lora.lora_name, + lora_int_id=i, + lora_local_path=lora.local_path, + ) + for i, lora in enumerate(self.lora_modules, start=1) + ] + + enable_lora = len(self.lora_requests) > 0 + max_loras = len(self.lora_requests) + logger.info( f"Loading {self.model_uid} with following model config: {self._model_config}" + f"Enable lora: {enable_lora}. Lora count: {max_loras}." ) - engine_args = AsyncEngineArgs(model=self.model_path, **self._model_config) + engine_args = AsyncEngineArgs( + model=self.model_path, + enable_lora=enable_lora, + max_loras=max_loras, + **self._model_config, + ) self._engine = AsyncLLMEngine.from_engine_args(engine_args) def _sanitize_model_config( @@ -209,6 +247,7 @@ def _sanitize_generate_config( generate_config = {} sanitized = VLLMGenerateConfig() + sanitized.setdefault("lora_name", generate_config.get("lora_name", None)) sanitized.setdefault("n", generate_config.get("n", 1)) sanitized.setdefault("best_of", generate_config.get("best_of", None)) sanitized.setdefault( @@ -342,12 +381,23 @@ async def async_generate( "Enter generate, prompt: %s, generate config: %s", prompt, generate_config ) + lora_model = sanitized_generate_config.pop("lora_name") + + lora_request = None + if lora_model is not None: + for lora in self.lora_requests: + if lora_model == lora.lora_name: + lora_request = lora + break + stream = sanitized_generate_config.pop("stream") sampling_params = SamplingParams(**sanitized_generate_config) request_id = str(uuid.uuid1()) assert self._engine is not None - results_generator = self._engine.generate(prompt, sampling_params, request_id) + results_generator = self._engine.generate( + prompt, sampling_params, request_id, lora_request=lora_request + ) async def stream_results() -> AsyncGenerator[CompletionChunk, None]: previous_texts = [""] * sanitized_generate_config["n"] diff --git a/xinference/types.py b/xinference/types.py index 53473f26f2..f9171701ac 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -187,6 +187,7 @@ class ChatglmCppGenerateConfig(TypedDict, total=False): top_p: float temperature: float stream: bool + lora_name: Optional[str] class QWenCppModelConfig(TypedDict, total=False): @@ -279,6 +280,7 @@ class PytorchGenerateConfig(TypedDict, total=False): stream_interval: int model: Optional[str] tools: Optional[List[Dict]] + lora_name: Optional[str] class PytorchModelConfig(TypedDict, total=False): @@ -354,6 +356,7 @@ class CreateCompletionTorch(BaseModel): temperature: float = temperature_field top_p: float = top_p_field top_k: int = top_k_field + lora_name: Optional[str] CreateCompletionLlamaCpp: BaseModel From 60f1dbf1641f1192091852f7b8e834b1d7de9197 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 16 May 2024 14:28:59 +0800 Subject: [PATCH 083/298] DOC: Lora usage (#1506) --- .../locale/zh_CN/LC_MESSAGES/models/lora.po | 59 ++++++++++++++----- doc/source/models/lora.rst | 28 ++++++++- 2 files changed, 70 insertions(+), 17 deletions(-) diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/lora.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/lora.po index 7d603622f8..5d2133c6c4 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/lora.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/lora.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-08 12:40+0800\n" +"POT-Creation-Date: 2024-05-16 14:18+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -25,27 +25,47 @@ msgstr "集成LoRA" msgid "" "Currently, Xinference supports launching ``LLM`` and ``image`` models " "with an attached LoRA fine-tuned model." -msgstr "当前,Xinference 可以在启动 ``LLM`` 和 ``image`` 模型时连带一个 LoRA 微调模型用以辅助基础模型。" +msgstr "" +"当前,Xinference 可以在启动 ``LLM`` 和 ``image`` 模型时连带一个 LoRA 微调" +"模型用以辅助基础模型。" #: ../../source/models/lora.rst:10 msgid "Usage" msgstr "使用方式" -#: ../../source/models/lora.rst:11 +#: ../../source/models/lora.rst:13 +msgid "Launch" +msgstr "启动" + +#: ../../source/models/lora.rst:14 msgid "" "Different from built-in models, xinference currently does not involve " "managing LoRA models. Users need to first download the LoRA model " "themselves and then provide the storage path of the model files to " "xinference." msgstr "" -"不同于内置模型,Xinference 目前不会涉及管理 LoRA 模型。用户需要首先下载对应的 LoRA 模型," -"然后将模型存储路径提供给 Xinference 。" +"不同于内置模型,Xinference 目前不会涉及管理 LoRA 模型。用户需要首先下载" +"对应的 LoRA 模型,然后将模型存储路径提供给 Xinference 。" + +#: ../../source/models/lora.rst:54 +msgid "Apply" +msgstr "应用" + +#: ../../source/models/lora.rst:55 +msgid "" +"For LLM models, you can only configure one lora model you want when you " +"use the model. Specifically, specify that the ``lora_name`` parameter be " +"configured in the ``generate_config``. ``lora_name`` corresponds to the " +"name of the lora in the LAUNCH procedure described above." +msgstr "" +"对于大语言模型,使用时指定其中一个 lora 。具体地,在 ``generate_config`` 参数中配置 ``lora_name`` 参数。" +"``lora_name`` 对应 launch 过程中你的配置。" -#: ../../source/models/lora.rst:38 +#: ../../source/models/lora.rst:75 msgid "Note" msgstr "注意事项" -#: ../../source/models/lora.rst:40 +#: ../../source/models/lora.rst:77 msgid "" "The options ``image_lora_load_kwargs`` and ``image_lora_fuse_kwargs`` are" " only applicable to models with model_type ``image``. They correspond to " @@ -53,18 +73,27 @@ msgid "" "of the ``diffusers`` library. If launching an LLM model, these parameters" " are not required." msgstr "" -"上述 ``image_lora_load_kwargs`` 和 ``image_lora_fuse_kwargs`` 选项只应用于 ``image`` 模型。它们对应" -"于 ``diffusers`` 库的 ``load_lora_weights`` 和 ``fuse_lora`` 接口中的额外参数。" -"如果启动的是 ``LLM`` 模型,则无需设置这些选项。" +"上述 ``image_lora_load_kwargs`` 和 ``image_lora_fuse_kwargs`` 选项只应用" +"于 ``image`` 模型。它们对应于 ``diffusers`` 库的 ``load_lora_weights`` 和" +" ``fuse_lora`` 接口中的额外参数。如果启动的是 ``LLM`` 模型,则无需设置" +"这些选项。" -#: ../../source/models/lora.rst:44 +#: ../../source/models/lora.rst:81 +msgid "" +"You need to add the parameter lora_name during inference to specify the " +"corresponding lora model. You can specify it in the Additional Inputs " +"option." +msgstr "" + +#: ../../source/models/lora.rst:83 msgid "" "For LLM chat models, currently only LoRA models are supported that do not" " change the prompt style." msgstr "" -"对于 ``LLM`` 聊天模型,当前仅支持那些微调后不更改原始基础模型的提示词模版的 LoRA 模型。" +"对于 ``LLM`` 聊天模型,当前仅支持那些微调后不更改原始基础模型的提示词模版" +"的 LoRA 模型。" -#: ../../source/models/lora.rst:46 +#: ../../source/models/lora.rst:85 msgid "When using GPU, both LoRA and its base model occupy the same devices." -msgstr "" -"使用 GPU 时,LoRA 模型与其基础模型在同样的设备上,不会对其他模型造成影响。" +msgstr "使用 GPU 时,LoRA 模型与其基础模型在同样的设备上,不会对其他模型造成影响。" + diff --git a/doc/source/models/lora.rst b/doc/source/models/lora.rst index 4012ca2e48..a82a7717da 100644 --- a/doc/source/models/lora.rst +++ b/doc/source/models/lora.rst @@ -7,7 +7,10 @@ LoRA Integration Currently, Xinference supports launching ``LLM`` and ``image`` models with an attached LoRA fine-tuned model. Usage -^^^^^ +##### + +Launch +====== Different from built-in models, xinference currently does not involve managing LoRA models. Users need to first download the LoRA model themselves and then provide the storage path of the model files to xinference. @@ -47,8 +50,29 @@ Users need to first download the LoRA model themselves and then provide the stor ) +Apply +===== +For LLM models, you can only configure one lora model you want when you use the model. +Specifically, specify that the ``lora_name`` parameter be configured in the ``generate_config``. +``lora_name`` corresponds to the name of the lora in the LAUNCH procedure described above. + +.. tabs:: + + .. code-tab:: python + + from xinference.client import Client + + client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") + model = client.get_model("<model_uid>") + model.chat( + "<prompt>", + <other_options>, + generate_config={"lora_name": "<your_lora_name>"} + ) + + Note -^^^^ +#### * The options ``image_lora_load_kwargs`` and ``image_lora_fuse_kwargs`` are only applicable to models with model_type ``image``. They correspond to the parameters in the ``load_lora_weights`` and ``fuse_lora`` interfaces of the ``diffusers`` library. From 2e330b6aefe443e8ba676ff4aefb9a65ea58710d Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 17 May 2024 10:33:59 +0800 Subject: [PATCH 084/298] BUG: Docker image crash during startup due to `llama-cpp-python` (#1507) --- xinference/deploy/docker/Dockerfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index eeccb195a0..8b2f288551 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -22,10 +22,14 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ # uninstall builtin torchvision, and let xinference decide which version to be installed pip uninstall -y torchvision torchaudio && \ CMAKE_ARGS="-DGGML_CUBLAS=ON" pip install -i "$PIP_INDEX" -U chatglm-cpp && \ - CMAKE_ARGS="-DLLAMA_CUBLAS=on" pip install -i "$PIP_INDEX" -U llama-cpp-python && \ + # use pre-built whl package for llama-cpp-python, otherwise may core dump when init llama in some envs + pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121 && \ cd /opt/inference && \ python setup.py build_web && \ git restore . && \ pip install -i "$PIP_INDEX" ".[all]" && \ pip uninstall -y opencv-contrib-python && \ - pip install -i "$PIP_INDEX" opencv-contrib-python-headless + pip install -i "$PIP_INDEX" opencv-contrib-python-headless && \ + # clean packages + pip cache purge && \ + conda clean --force-pkgs-dirs From 556149bcf9b5c50a8f5ff9bcf76fdfe70f1e2467 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 17 May 2024 11:02:19 +0800 Subject: [PATCH 085/298] BUG: Fix prompt is needed when docker image builds (#1512) --- xinference/deploy/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 8b2f288551..72342d89b7 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -32,4 +32,4 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ pip install -i "$PIP_INDEX" opencv-contrib-python-headless && \ # clean packages pip cache purge && \ - conda clean --force-pkgs-dirs + conda clean --force-pkgs-dirs -y From 0b3e13d21499cd08631fcff61035126306b5a14d Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 17 May 2024 13:36:37 +0800 Subject: [PATCH 086/298] ENH: Add stream_options support (#1508) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/core/model.py | 4 +- xinference/fields.py | 4 +- xinference/model/llm/ggml/chatglm.py | 111 ++- xinference/model/llm/ggml/llamacpp.py | 49 +- .../model/llm/ggml/tests/test_chatglm.py | 19 + xinference/model/llm/pytorch/chatglm.py | 48 + xinference/model/llm/pytorch/deepseek_vl.py | 44 +- xinference/model/llm/pytorch/internlm2.py | 33 +- xinference/model/llm/pytorch/qwen_vl.py | 49 +- xinference/model/llm/pytorch/utils.py | 39 +- xinference/model/llm/pytorch/yi_vl.py | 56 +- xinference/model/llm/sglang/core.py | 40 +- .../model/llm/tests/test_stream_options.py | 920 ++++++++++++++++++ xinference/model/llm/utils.py | 30 +- xinference/model/llm/vllm/core.py | 27 +- xinference/types.py | 7 +- 16 files changed, 1410 insertions(+), 70 deletions(-) create mode 100644 xinference/model/llm/tests/test_stream_options.py diff --git a/xinference/core/model.py b/xinference/core/model.py index f31989a9c4..f8734a8ba7 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -257,7 +257,7 @@ def _to_json_generator(self, gen: types.GeneratorType): for v in gen: if time_to_first_token is None: time_to_first_token = (time.time() - start_time) * 1000 - final_usage = v.pop("usage", None) + final_usage = v.get("usage", None) v = dict(data=json.dumps(v)) yield sse_starlette.sse.ensure_bytes(v, None) except OutOfMemoryError: @@ -289,7 +289,7 @@ async def _to_json_async_gen(self, gen: types.AsyncGeneratorType): async for v in gen: if time_to_first_token is None: time_to_first_token = (time.time() - start_time) * 1000 - final_usage = v.pop("usage", None) + final_usage = v.get("usage", None) v = await asyncio.to_thread(json.dumps, v) v = dict(data=v) # noqa: F821 yield await asyncio.to_thread(sse_starlette.sse.ensure_bytes, v, None) diff --git a/xinference/fields.py b/xinference/fields.py index ce6611e559..84f36ce587 100644 --- a/xinference/fields.py +++ b/xinference/fields.py @@ -75,7 +75,9 @@ ) stream_option_field = Field( - default={}, + default={ + "include_usage": False, + }, description="If set, an additional chunk will be streamed before the `data: [DONE]` message.", ) diff --git a/xinference/model/llm/ggml/chatglm.py b/xinference/model/llm/ggml/chatglm.py index a90c771a80..a7d39014dd 100644 --- a/xinference/model/llm/ggml/chatglm.py +++ b/xinference/model/llm/ggml/chatglm.py @@ -108,10 +108,11 @@ def match( @staticmethod def _convert_raw_text_chunks_to_chat( - tokens: Iterator[Any], model_name: str + tokens: Iterator[Any], model_name: str, include_usage: bool, input_ids ) -> Iterator[ChatCompletionChunk]: + request_id = str(uuid.uuid4()) yield { - "id": "chat" + f"cmpl-{str(uuid.uuid4())}", + "id": "chat" + f"cmpl-{request_id}", "model": model_name, "object": "chat.completion.chunk", "created": int(time.time()), @@ -125,9 +126,13 @@ def _convert_raw_text_chunks_to_chat( } ], } + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 for token in tokens: + prompt_tokens = len(input_ids) + completion_tokens = completion_tokens + 1 + total_tokens = prompt_tokens + completion_tokens yield { - "id": "chat" + f"cmpl-{str(uuid.uuid4())}", + "id": "chat" + f"cmpl-{request_id}", "model": model_name, "object": "chat.completion.chunk", "created": int(time.time()), @@ -143,6 +148,35 @@ def _convert_raw_text_chunks_to_chat( } ], } + # stop + yield { + "id": "chat" + f"cmpl-{request_id}", + "model": model_name, + "object": "chat.completion.chunk", + "created": int(time.time()), + "choices": [ + { + "index": 0, + "delta": { + "content": "", + }, + "finish_reason": "stop", + } + ], + } + if include_usage: + yield { + "id": "chat" + f"cmpl-{request_id}", + "model": model_name, + "object": "chat.completion.chunk", + "created": int(time.time()), + "choices": [], + "usage": { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": total_tokens, + }, + } @classmethod def _convert_raw_text_completion_to_chat( @@ -273,7 +307,7 @@ def chat( params = { "max_length": generate_config.get("max_tokens"), - "max_context_length": generate_config.get("max_tokens"), + "max_context_length": generate_config.get("max_tokens", 1024), "top_k": generate_config.get("top_k"), "top_p": generate_config.get("top_p"), "temperature": generate_config.get("temperature"), @@ -286,13 +320,27 @@ def chat( assert self._llm is not None chat_history_messages = self._to_chatglm_chat_messages(chat_history_list) - if generate_config["stream"]: + stream = generate_config.get("stream") + stream_options = generate_config.get("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) + + if stream: it = self._llm.chat( chat_history_messages, **params, ) assert not isinstance(it, str) - return self._convert_raw_text_chunks_to_chat(it, self.model_uid) + input_ids = self._llm.tokenizer.encode_messages( + chat_history_messages, params["max_context_length"] + ) + return self._convert_raw_text_chunks_to_chat( + it, self.model_uid, include_usage, input_ids + ) + else: c = self._llm.chat( chat_history_messages, @@ -320,11 +368,13 @@ def _convert_str_to_completion(data: str, model_name: str) -> Completion: @staticmethod def _convert_str_to_completion_chunk( - tokens: Iterator[str], model_name: str + tokens: Iterator[str], model_name: str, include_usage: bool, input_ids ) -> Iterator[CompletionChunk]: - for token in tokens: + request_id = str(uuid.uuid4()) + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 + for i, token in enumerate(tokens): yield { - "id": "generate" + f"-{str(uuid.uuid4())}", + "id": "generate" + f"-{request_id}", "model": model_name, "object": "text_completion", "created": int(time.time()), @@ -332,6 +382,32 @@ def _convert_str_to_completion_chunk( {"index": 0, "text": token, "finish_reason": None, "logprobs": None} ], } + prompt_tokens = len(input_ids) + completion_tokens = i + total_tokens = prompt_tokens + completion_tokens + # stop + yield { + "id": "chat" + f"cmpl-{request_id}", + "model": model_name, + "object": "text_completion", + "created": int(time.time()), + "choices": [ + {"index": 0, "text": "", "finish_reason": "stop", "logprobs": None} + ], + } + if include_usage: + yield { + "id": "chat" + f"cmpl-{request_id}", + "model": model_name, + "object": "text_completion", + "created": int(time.time()), + "choices": [], + "usage": { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": total_tokens, + }, + } def generate( self, @@ -344,7 +420,7 @@ def generate( params = { "max_length": generate_config.get("max_tokens"), - "max_context_length": generate_config.get("max_tokens"), + "max_context_length": generate_config.get("max_tokens", 1024), "top_k": generate_config.get("top_k"), "top_p": generate_config.get("top_p"), "temperature": generate_config.get("temperature"), @@ -355,14 +431,23 @@ def generate( params = {k: v for k, v in params.items() if v is not None} assert self._llm is not None - - if generate_config["stream"]: + stream = generate_config.get("stream") + stream_options = generate_config.get("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) + if stream: it = self._llm.generate( prompt, **params, ) assert not isinstance(it, str) - return self._convert_str_to_completion_chunk(it, self.model_uid) + input_ids = self._llm.tokenizer.encode(prompt, params["max_context_length"]) + return self._convert_str_to_completion_chunk( + it, self.model_uid, include_usage, input_ids + ) else: c = self._llm.generate( prompt, diff --git a/xinference/model/llm/ggml/llamacpp.py b/xinference/model/llm/ggml/llamacpp.py index 3725c7fdbd..429afa24c8 100644 --- a/xinference/model/llm/ggml/llamacpp.py +++ b/xinference/model/llm/ggml/llamacpp.py @@ -14,6 +14,7 @@ import datetime import logging import os +import time from typing import Iterable, Iterator, List, Optional, Union from ....types import ( @@ -22,6 +23,7 @@ ChatCompletionMessage, Completion, CompletionChunk, + CompletionUsage, CreateCompletionLlamaCpp, Embedding, LlamaCppGenerateConfig, @@ -195,16 +197,59 @@ def generator_wrapper( _generate_config: LlamaCppGenerateConfig, ) -> Iterator[CompletionChunk]: assert self._llm is not None - for _completion_chunk in self._llm(prompt=_prompt, **_generate_config): + prompt_token_ids: List[int] = ( + ( + self._llm.tokenize(prompt.encode("utf-8"), special=True) + if prompt != "" + else [self._llm.token_bos()] + ) + if isinstance(prompt, str) + else prompt + ) + prompt_tokens = len(prompt_token_ids) + completion_tokens, total_tokens = 0, 0 + request_id = 0 + for index, _completion_chunk in enumerate( + self._llm(prompt=_prompt, **_generate_config) + ): + request_id = _completion_chunk["id"] + choice = _completion_chunk["choices"][0] + if choice["finish_reason"] is not None: + completion_tokens = index + total_tokens = prompt_tokens + completion_tokens + _completion_chunk["usage"] = CompletionUsage( + prompt_tokens=total_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) yield _completion_chunk + if include_usage: + chunk = CompletionChunk( + id=request_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + yield chunk logger.debug( "Enter generate, prompt: %s, generate config: %s", prompt, generate_config ) generate_config = self._sanitize_generate_config(generate_config) - stream = generate_config.get("stream", False) + stream_options = generate_config.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) if not stream: assert self._llm is not None diff --git a/xinference/model/llm/ggml/tests/test_chatglm.py b/xinference/model/llm/ggml/tests/test_chatglm.py index 1019124cde..c64f4bc391 100644 --- a/xinference/model/llm/ggml/tests/test_chatglm.py +++ b/xinference/model/llm/ggml/tests/test_chatglm.py @@ -22,10 +22,29 @@ from ...llm_family import GgmlLLMSpecV1, LLMFamilyV1 +class MockTokenizer: + def __init__(self): + pass + + def encode_messages( + self, text, max_length + ): # real signature unknown; NOTE: unreliably restored from __doc__ + """encode_messages(self: chatglm_cpp._C.BaseTokenizer, messages: List[chatglm_cpp._C.ChatMessage], max_length: int) -> List[int]""" + return [] + + def encode(self, text, max_length): # real signature unknown; restored from __doc__ + """encode(self: chatglm_cpp._C.BaseTokenizer, text: str, max_length: int) -> List[int]""" + return [] + + class MockPipeline: def __init__(self) -> None: pass + tokenizer = property( + lambda self: MockTokenizer(), lambda self, v: None, lambda self: None + ) # default + def chat(self, *args, **kwargs) -> Union[str, Iterator[str]]: stream = kwargs.get("stream", False) return ( diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index e8d7c7de4a..b8366fe888 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -147,14 +147,26 @@ def chat( ) else: stream = generate_config.get("stream", False) + stream_options = generate_config.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) if stream: def _stream_generator(): last_chunk_text_length = 0 chunk_id = "chat-" + str(uuid.uuid1()) + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 + inputs = self._tokenizer([prompt], return_tensors="pt") + inputs = inputs.to(self._model.device) + prompt_tokens = len(inputs["input_ids"][0]) for chunk_text, _ in self._model.stream_chat( self._tokenizer, prompt, chat_history, **kwargs ): + completion_tokens = completion_tokens + 1 + total_tokens = prompt_tokens + completion_tokens chunk_text = chunk_text[last_chunk_text_length:] last_chunk_text_length += len(chunk_text) completion_choice = CompletionChoice( @@ -166,7 +178,43 @@ def _stream_generator(): created=int(time.time()), model=self.model_uid, choices=[completion_choice], + usage=CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ), + ) + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=chunk_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + chunk["usage"] = completion_usage + yield chunk + if include_usage: + chunk = CompletionChunk( + id=chunk_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, ) + yield chunk return self._to_chat_completion_chunks(_stream_generator()) else: diff --git a/xinference/model/llm/pytorch/deepseek_vl.py b/xinference/model/llm/pytorch/deepseek_vl.py index bbe98a97e0..74a9abce93 100644 --- a/xinference/model/llm/pytorch/deepseek_vl.py +++ b/xinference/model/llm/pytorch/deepseek_vl.py @@ -155,7 +155,12 @@ def chat( generate_config = {} stream = generate_config.get("stream", False) - + stream_options = generate_config.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) prompt, images = self._message_content_to_deepseek(prompt) prompt_messages: List[Dict[str, Any]] = [ { @@ -217,7 +222,7 @@ def chat( ) if stream: - it = self._generate_stream(streamer, stop_str) + it = self._generate_stream(streamer, stop_str, include_usage, prompt) return self._to_chat_completion_chunks(it) else: c = self._generate(streamer, stop_str) @@ -246,8 +251,13 @@ def _generate(self, streamer, stop_str) -> Completion: ) return c - def _generate_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: + def _generate_stream( + self, streamer, stop_str, include_usage, prompt + ) -> Iterator[CompletionChunk]: completion_id = str(uuid.uuid1()) + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 + input_ids = self._tokenizer(prompt).input_ids + prompt_tokens = len(input_ids) for i, new_text in enumerate(streamer): if new_text.endswith(stop_str): new_text = new_text[: -len(stop_str)] @@ -261,10 +271,12 @@ def _generate_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: model=self.model_uid, choices=[completion_choice], ) + completion_tokens = i + total_tokens = prompt_tokens + completion_tokens completion_usage = CompletionUsage( - prompt_tokens=-1, - completion_tokens=-1, - total_tokens=-1, + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, ) chunk["usage"] = completion_usage yield chunk @@ -280,9 +292,23 @@ def _generate_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: choices=[completion_choice], ) completion_usage = CompletionUsage( - prompt_tokens=-1, - completion_tokens=-1, - total_tokens=-1, + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, ) chunk["usage"] = completion_usage yield chunk + if include_usage: + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + yield chunk diff --git a/xinference/model/llm/pytorch/internlm2.py b/xinference/model/llm/pytorch/internlm2.py index c970f17816..9d82663d39 100644 --- a/xinference/model/llm/pytorch/internlm2.py +++ b/xinference/model/llm/pytorch/internlm2.py @@ -108,6 +108,12 @@ def chat( kwargs["max_length"] = int(max_new_tokens) stream = generate_config.get("stream", False) + stream_options = generate_config.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) if chat_history: input_history = [ (chat_history[i]["content"], (chat_history[i + 1]["content"])) @@ -122,9 +128,15 @@ def chat( def _stream_generator(): last_chunk_text_length = 0 chunk_id = "chat-" + str(uuid.uuid1()) + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 + inputs = self._tokenizer([prompt], return_tensors="pt") + inputs = inputs.to(self._model.device) + prompt_tokens = len(inputs["input_ids"][0]) for chunk_text, _ in self._model.stream_chat( - self._tokenizer, prompt, input_history, **kwargs + self._tokenizer, prompt, chat_history, **kwargs ): + completion_tokens = completion_tokens + 1 + total_tokens = prompt_tokens + completion_tokens chunk_text = chunk_text[last_chunk_text_length:] last_chunk_text_length += len(chunk_text) completion_choice = CompletionChoice( @@ -136,7 +148,26 @@ def _stream_generator(): created=int(time.time()), model=self.model_uid, choices=[completion_choice], + usage=CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ), + ) + if include_usage: + chunk = CompletionChunk( + id=chunk_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, ) + yield chunk return self._to_chat_completion_chunks(_stream_generator()) else: diff --git a/xinference/model/llm/pytorch/qwen_vl.py b/xinference/model/llm/pytorch/qwen_vl.py index b13aa9f24c..778738426a 100644 --- a/xinference/model/llm/pytorch/qwen_vl.py +++ b/xinference/model/llm/pytorch/qwen_vl.py @@ -134,9 +134,16 @@ def chat( query_to_response = [] stream = generate_config.get("stream", False) if generate_config else False - + stream_options = ( + generate_config.pop("stream_options", None) if generate_config else None + ) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) if stream: - it = self._generate_stream(prompt, qwen_history) + it = self._generate_stream(prompt, qwen_history, include_usage) return self._to_chat_completion_chunks(it) else: c = self._generate(prompt, qwen_history) @@ -163,12 +170,16 @@ def _generate(self, prompt: str, qwen_history: List) -> Completion: return c def _generate_stream( - self, prompt: str, qwen_history: List + self, prompt: str, qwen_history: List, include_usage ) -> Iterator[CompletionChunk]: # response, history = model.chat(tokenizer, message, history=history) response_generator = self._model.chat_stream( self._tokenizer, query=prompt, history=qwen_history ) + completion_id = str(uuid.uuid1()) + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 + input_ids = self._tokenizer(prompt, allowed_special="all").input_ids + prompt_tokens = len(input_ids) full_response = "" for response in response_generator: inc_content = response[len(full_response) :] @@ -177,16 +188,18 @@ def _generate_stream( text=inc_content, index=0, logprobs=None, finish_reason=None ) completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=completion_id, object="text_completion", created=int(time.time()), model=self.model_uid, choices=[completion_choice], ) + completion_tokens = completion_tokens + 1 + total_tokens = prompt_tokens + completion_tokens completion_usage = CompletionUsage( - prompt_tokens=-1, - completion_tokens=-1, - total_tokens=-1, + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, ) completion_chunk["usage"] = completion_usage yield completion_chunk @@ -195,16 +208,30 @@ def _generate_stream( text="", index=0, logprobs=None, finish_reason="stop" ) completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=completion_id, object="text_completion", created=int(time.time()), model=self.model_uid, choices=[completion_choice], ) completion_usage = CompletionUsage( - prompt_tokens=-1, - completion_tokens=-1, - total_tokens=-1, + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, ) completion_chunk["usage"] = completion_usage yield completion_chunk + if include_usage: + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + yield chunk diff --git a/xinference/model/llm/pytorch/utils.py b/xinference/model/llm/pytorch/utils.py index 98c3c4a557..76d264cae9 100644 --- a/xinference/model/llm/pytorch/utils.py +++ b/xinference/model/llm/pytorch/utils.py @@ -106,6 +106,10 @@ def generate_stream( context_len = get_context_length(model.config) stream_interval = generate_config.get("stream_interval", 2) stream = generate_config.get("stream", False) + stream_options = generate_config.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] if isinstance(stream_options, dict) else False + ) len_prompt = len(prompt) @@ -333,6 +337,21 @@ def generate_stream( yield completion_chunk, completion_usage + if include_usage: + completion_chunk = CompletionChunk( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=model_uid, + choices=[], + ) + completion_usage = CompletionUsage( + prompt_tokens=input_echo_len, + completion_tokens=i, + total_tokens=(input_echo_len + i), + ) + yield completion_chunk, completion_usage + # clean del past_key_values, out gc.collect() @@ -352,7 +371,10 @@ def generate_stream_falcon( context_len = get_context_length(model.config) stream_interval = generate_config.get("stream_interval", 2) stream = generate_config.get("stream", False) - + stream_options = generate_config.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] if isinstance(stream_options, dict) else False + ) len_prompt = len(prompt) temperature = float(generate_config.get("temperature", 1.0)) @@ -488,6 +510,21 @@ def generate_stream_falcon( yield completion_chunk, completion_usage + if include_usage: + completion_chunk = CompletionChunk( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=model_uid, + choices=[], + ) + completion_usage = CompletionUsage( + prompt_tokens=input_echo_len, + completion_tokens=i, + total_tokens=(input_echo_len + i), + ) + yield completion_chunk, completion_usage + # clean gc.collect() empty_cache() diff --git a/xinference/model/llm/pytorch/yi_vl.py b/xinference/model/llm/pytorch/yi_vl.py index e7b802f6a1..712d0654df 100644 --- a/xinference/model/llm/pytorch/yi_vl.py +++ b/xinference/model/llm/pytorch/yi_vl.py @@ -139,6 +139,12 @@ def chat( generate_config = {} stream = generate_config.get("stream", False) + stream_options = generate_config.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) from ....thirdparty.llava.conversation import conv_templates from ....thirdparty.llava.mm_utils import ( @@ -166,11 +172,11 @@ def chat( ) images = state.get_images(return_pil=True) - image = images[0] - - image_tensor = self._image_processor.preprocess(image, return_tensors="pt")[ - "pixel_values" - ][0] + if images: + image = images[0] + image_tensor = self._image_processor.preprocess(image, return_tensors="pt")[ + "pixel_values" + ][0] stop_str = state.sep keywords = [stop_str] @@ -187,7 +193,9 @@ def chat( "input_ids": input_ids, "images": image_tensor.unsqueeze(0) .to(dtype=torch.bfloat16) - .to(self._model.device), + .to(self._model.device) + if images + else None, "streamer": streamer, "do_sample": True, "top_p": float(top_p), @@ -200,7 +208,7 @@ def chat( t.start() if stream: - it = self._generate_stream(streamer, stop_str) + it = self._generate_stream(streamer, stop_str, input_ids, include_usage) return self._to_chat_completion_chunks(it) else: c = self._generate(streamer, stop_str) @@ -229,8 +237,12 @@ def _generate(self, streamer, stop_str) -> Completion: ) return c - def _generate_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: + def _generate_stream( + self, streamer, stop_str, input_ids, include_usage + ) -> Iterator[CompletionChunk]: completion_id = str(uuid.uuid1()) + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 + prompt_tokens = len(input_ids[0]) for i, new_text in enumerate(streamer): if not new_text.endswith(stop_str): completion_choice = CompletionChoice( @@ -243,10 +255,12 @@ def _generate_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: model=self.model_uid, choices=[completion_choice], ) + completion_tokens = i + total_tokens = prompt_tokens + completion_tokens completion_usage = CompletionUsage( - prompt_tokens=-1, - completion_tokens=-1, - total_tokens=-1, + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, ) chunk["usage"] = completion_usage yield chunk @@ -262,9 +276,23 @@ def _generate_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: choices=[completion_choice], ) completion_usage = CompletionUsage( - prompt_tokens=-1, - completion_tokens=-1, - total_tokens=-1, + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, ) chunk["usage"] = completion_usage yield chunk + if include_usage: + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + yield chunk diff --git a/xinference/model/llm/sglang/core.py b/xinference/model/llm/sglang/core.py index 97cea3f68f..aa6c77cfc7 100644 --- a/xinference/model/llm/sglang/core.py +++ b/xinference/model/llm/sglang/core.py @@ -53,6 +53,7 @@ class SGLANGGenerateConfig(TypedDict, total=False): stop: Optional[Union[str, List[str]]] ignore_eos: bool stream: bool + stream_options: Optional[Union[dict, None]] try: @@ -157,6 +158,8 @@ def _sanitize_generate_config( ) generate_config.setdefault("stop", []) generate_config.setdefault("stream", False) + stream_options = generate_config.get("stream_options") + generate_config.setdefault("stream_options", stream_options) generate_config.setdefault("ignore_eos", False) return generate_config @@ -192,7 +195,7 @@ def match( @staticmethod def _convert_state_to_completion_chunk( - request_id: str, model: str, output_text: str, meta_info: Dict + request_id: str, model: str, output_text: str ) -> CompletionChunk: choices: List[CompletionChoice] = [ CompletionChoice( @@ -209,13 +212,6 @@ def _convert_state_to_completion_chunk( model=model, choices=choices, ) - prompt_tokens = meta_info["prompt_tokens"] - completion_tokens = meta_info["completion_tokens"] - chunk["usage"] = CompletionUsage( - prompt_tokens=prompt_tokens, - completion_tokens=completion_tokens, - total_tokens=prompt_tokens + completion_tokens, - ) return chunk @staticmethod @@ -272,6 +268,9 @@ def pipeline(s, question): "Enter generate, prompt: %s, generate config: %s", prompt, generate_config ) stream = sanitized_generate_config.pop("stream") + stream_options = sanitized_generate_config.pop("stream_options") + if isinstance(stream_options, dict): + include_usage = stream_options.pop("include_usage", False) request_id = str(uuid.uuid1()) state = pipeline.run( question=prompt, @@ -289,11 +288,34 @@ def pipeline(s, question): else: async def stream_results() -> AsyncGenerator[CompletionChunk, None]: + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 async for out, meta_info in state.text_async_iter( var_name="answer", return_meta_data=True ): chunk = self._convert_state_to_completion_chunk( - request_id, self.model_uid, output_text=out, meta_info=meta_info + request_id, self.model_uid, output_text=out + ) + prompt_tokens = meta_info["prompt_tokens"] + completion_tokens = meta_info["completion_tokens"] + total_tokens = prompt_tokens + completion_tokens + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + yield chunk + if include_usage: + chunk = CompletionChunk( + id=request_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, ) yield chunk diff --git a/xinference/model/llm/tests/test_stream_options.py b/xinference/model/llm/tests/test_stream_options.py new file mode 100644 index 0000000000..f675f66d59 --- /dev/null +++ b/xinference/model/llm/tests/test_stream_options.py @@ -0,0 +1,920 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import os +import os.path + +import openai +import pytest +import requests +from packaging import version + +from ....constants import XINFERENCE_ENV_MODEL_SRC + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_llamacpp_chatglm(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "llama.cpp", + "model_name": "chatglm3", + "model_size_in_billions": "6", + "quantization": "q4_0", + "model_format": "ggmlv3", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "法国的首都是哪里?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_llamacpp(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + # os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "llama.cpp", + "model_name": "qwen1.5-chat", + "model_size_in_billions": "0_5", + "model_format": "ggufv2", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "What is the capital of France?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_pytorch_chatglm(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "Transformers", + "model_name": "chatglm3", + "model_size_in_billions": "6", + "quantization": "none", + "model_format": "pytorch", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "法国的首都是哪里?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_pytorch(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "Transformers", + "model_name": "baichuan-2-chat", + "model_size_in_billions": "7", + "quantization": "none", + "model_format": "pytorch", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "法国的首都是哪里?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_pytorch_deepseek_vl(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "Transformers", + "model_name": "deepseek-vl-chat", + "model_size_in_billions": "1_3", + "quantization": "none", + "model_format": "pytorch", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "法国的首都是哪里?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_pytorch_internlm2(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "Transformers", + "model_name": "internlm2-chat", + "model_size_in_billions": "7", + "quantization": "none", + "model_format": "pytorch", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "法国的首都是哪里?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_pytorch_qwen_vl(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "Transformers", + "model_name": "qwen-vl-chat", + "model_size_in_billions": "7", + "quantization": "none", + "model_format": "pytorch", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "法国的首都是哪里?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_pytorch_yi_vl(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "Transformers", + "model_name": "yi-vl-chat", + "model_size_in_billions": "6", + "quantization": "none", + "model_format": "pytorch", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "法国的首都是哪里?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_sgalng(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "SGLang", + "model_name": "qwen-chat", + "model_size_in_billions": "7", + "quantization": "Int4", + "model_format": "gptq", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "法国的首都是哪里?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_options_vllm(setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "vLLM", + "model_name": "qwen-chat", + "model_size_in_billions": "7", + "quantization": "none", + "model_format": "pytorch", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + # chat + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Hello!"}, + {"role": "assistant", "content": "Hi what can I help you?"}, + {"role": "user", "content": "法国的首都是哪里?"}, + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + result1 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": False, + }, + ): + result1.append(chunk) + assert result1 + assert type(result1[0]).__name__ == stream_chunk_type_name + # stop + assert result1[-1].choices[0].finish_reason == "stop" + + result2 = await openai_chat_completion( + messages=messages, stream=False, model=model_uid_res + ) + + assert result2 + assert type(result2).__name__ == response_type_name + # stop + assert result2.choices[0].finish_reason == "stop" + + result3 = [] + async for chunk in await openai_chat_completion( + messages=messages, + stream=True, + model=model_uid_res, + max_tokens=None, + stream_options={ + "include_usage": True, + }, + ): + result3.append(chunk) + assert result3 + assert type(result3[0]).__name__ == stream_chunk_type_name + # usage + assert not result3[-1].choices + assert result3[-1].usage diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 51d8354570..2cb97ba2f1 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -482,9 +482,6 @@ def _to_chat_completion_chunk(cls, chunk: CompletionChunk) -> ChatCompletionChun for i, choice in enumerate(chunk["choices"]) ], } - usage = chunk.get("usage") - if usage is not None: - chat_chunk["usage"] = usage return cast(ChatCompletionChunk, chat_chunk) @classmethod @@ -508,6 +505,19 @@ def _get_first_chat_completion_chunk( for i, choice in enumerate(chunk["choices"]) ], } + return cast(ChatCompletionChunk, chat_chunk) + + @classmethod + def _get_final_chat_completion_chunk( + cls, chunk: CompletionChunk + ) -> ChatCompletionChunk: + chat_chunk = { + "id": "chat" + chunk["id"], + "model": chunk["model"], + "created": chunk["created"], + "object": "chat.completion.chunk", + "choices": [], + } usage = chunk.get("usage") if usage is not None: chat_chunk["usage"] = usage @@ -521,7 +531,12 @@ def _to_chat_completion_chunks( for i, chunk in enumerate(chunks): if i == 0: yield cls._get_first_chat_completion_chunk(chunk) - yield cls._to_chat_completion_chunk(chunk) + # usage + choices = chunk.get("choices") + if not choices: + yield cls._get_final_chat_completion_chunk(chunk) + else: + yield cls._to_chat_completion_chunk(chunk) @classmethod async def _async_to_chat_completion_chunks( @@ -532,7 +547,12 @@ async def _async_to_chat_completion_chunks( async for chunk in chunks: if i == 0: yield cls._get_first_chat_completion_chunk(chunk) - yield cls._to_chat_completion_chunk(chunk) + # usage + choices = chunk.get("choices") + if not choices: + yield cls._get_final_chat_completion_chunk(chunk) + else: + yield cls._to_chat_completion_chunk(chunk) i += 1 @staticmethod diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index c3e6e18406..99b7772a46 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -77,6 +77,7 @@ class VLLMGenerateConfig(TypedDict, total=False): stop_token_ids: Optional[List[int]] stop: Optional[Union[str, List[str]]] stream: bool # non-sampling param, should not be passed to the engine. + stream_options: Optional[Union[dict, None]] try: @@ -264,7 +265,10 @@ def _sanitize_generate_config( sanitized.setdefault( "stop_token_ids", generate_config.get("stop_token_ids", None) ) - sanitized.setdefault("stream", generate_config.get("stream", None)) + sanitized.setdefault("stream", generate_config.get("stream", False)) + sanitized.setdefault( + "stream_options", generate_config.get("stream_options", None) + ) return sanitized @@ -391,6 +395,12 @@ async def async_generate( break stream = sanitized_generate_config.pop("stream") + stream_options = sanitized_generate_config.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) sampling_params = SamplingParams(**sanitized_generate_config) request_id = str(uuid.uuid1()) @@ -402,6 +412,7 @@ async def async_generate( async def stream_results() -> AsyncGenerator[CompletionChunk, None]: previous_texts = [""] * sanitized_generate_config["n"] tools_token_filter = ChatModelMixin._tools_token_filter(self.model_family) + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 async for _request_output in results_generator: chunk = self._convert_request_output_to_completion_chunk( request_id=request_id, @@ -452,6 +463,20 @@ async def stream_results() -> AsyncGenerator[CompletionChunk, None]: total_tokens=total_tokens, ) yield chunk + if include_usage: + chunk = CompletionChunk( + id=request_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + yield chunk if stream: return stream_results() diff --git a/xinference/types.py b/xinference/types.py index f9171701ac..d75dd58efc 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -188,6 +188,7 @@ class ChatglmCppGenerateConfig(TypedDict, total=False): temperature: float stream: bool lora_name: Optional[str] + stream_options: Optional[Union[dict, None]] class QWenCppModelConfig(TypedDict, total=False): @@ -232,6 +233,7 @@ class LlamaCppGenerateConfig(TypedDict, total=False): repetition_penalty: float top_k: int stream: bool + stream_options: Optional[Union[dict, None]] tfs_z: float mirostat_mode: int mirostat_tau: float @@ -281,6 +283,7 @@ class PytorchGenerateConfig(TypedDict, total=False): model: Optional[str] tools: Optional[List[Dict]] lora_name: Optional[str] + stream_options: Optional[Union[dict, None]] class PytorchModelConfig(TypedDict, total=False): @@ -352,6 +355,7 @@ class CreateCompletionTorch(BaseModel): stop: Optional[Union[str, List[str]]] = stop_field stop_token_ids: Optional[Union[int, List[int]]] = none_field stream: bool = stream_field + stream_options: Optional[Union[dict, None]] = stream_option_field stream_interval: int = stream_interval_field temperature: float = temperature_field top_p: float = top_p_field @@ -369,6 +373,7 @@ class CreateCompletionTorch(BaseModel): include_fields={ "grammar": (Optional[Any], None), "max_tokens": (Optional[int], max_tokens_field), + "stream_options": (Optional[Union[dict, None]], None), }, ) except ImportError: @@ -396,7 +401,7 @@ class _CreateCompletionOpenAIFallback(BaseModel): seed: Optional[int] = none_field stop: Optional[Union[str, List[str]]] = stop_field stream: bool = stream_field - stream_options: Optional[dict] = stream_option_field + stream_options: Optional[Union[dict, None]] = stream_option_field suffix: Optional[str] = none_field temperature: float = temperature_field top_p: float = top_p_field From 55a0200079eacf4fd6ee10c5868f0eaba244db29 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 17 May 2024 14:10:09 +0800 Subject: [PATCH 087/298] BUG: `llama.cpp` model failed when chat due to `lora` (#1513) --- xinference/model/llm/ggml/llamacpp.py | 2 ++ xinference/types.py | 1 + 2 files changed, 3 insertions(+) diff --git a/xinference/model/llm/ggml/llamacpp.py b/xinference/model/llm/ggml/llamacpp.py index 429afa24c8..4136184fb1 100644 --- a/xinference/model/llm/ggml/llamacpp.py +++ b/xinference/model/llm/ggml/llamacpp.py @@ -102,6 +102,8 @@ def _sanitize_generate_config( generate_config = LlamaCppGenerateConfig( **CreateCompletionLlamaCpp(**generate_config).dict() ) + # Currently, llama.cpp does not support lora + generate_config.pop("lora_name", None) # type: ignore return generate_config def _convert_ggml_to_gguf(self, model_path: str) -> str: diff --git a/xinference/types.py b/xinference/types.py index d75dd58efc..923ae1ca70 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -373,6 +373,7 @@ class CreateCompletionTorch(BaseModel): include_fields={ "grammar": (Optional[Any], None), "max_tokens": (Optional[int], max_tokens_field), + "lora_name": (Optional[str], None), "stream_options": (Optional[Union[dict, None]], None), }, ) From f9b0e7a95405f052e1d475a698c1ccc0bef65e1a Mon Sep 17 00:00:00 2001 From: Mike Shi <shihui@hyron.com> Date: Tue, 21 May 2024 11:12:55 +0800 Subject: [PATCH 088/298] BLD: adapt to langchain 0.2.x, which has breaking changes (#1521) --- setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.cfg b/setup.cfg index fa05d9a0ba..437b9e59b4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -77,6 +77,7 @@ dev = openai>1 opencv-contrib-python langchain + langchain-community orjson sphinx-tabs sphinx-design From e0ac4ef021b7427912356bc5ed982a801ac47072 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Tue, 21 May 2024 05:23:00 +0200 Subject: [PATCH 089/298] CHORE: Basic benchmark/benchmark_rerank.py (#1479) --- benchmark/benchmark_rerank.py | 165 ++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 benchmark/benchmark_rerank.py diff --git a/benchmark/benchmark_rerank.py b/benchmark/benchmark_rerank.py new file mode 100644 index 0000000000..0b7a2438e6 --- /dev/null +++ b/benchmark/benchmark_rerank.py @@ -0,0 +1,165 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +import logging +import random +import time +import aiohttp +from typing import List, Dict +from datasets import load_dataset + + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +REQUEST_LATENCY: List[float] = [] + + +class BenchmarkRunner: + def __init__( + self, + api_url: str, + model_uid: str, + input_requests: List[Dict], + top_n: int, + concurrency: int, + ): + self.api_url = api_url + self.model_uid = model_uid + self.input_requests = input_requests + self.top_n = top_n + self.concurrency = concurrency + self.sent = 0 + self.left = len(input_requests) + + async def run(self): + tasks = [] + for i in range(0, self.concurrency): + tasks.append(asyncio.create_task(self.worker(i))) + await asyncio.gather(*tasks) + + async def worker(self, i: int): + r = random.Random(i) + index = r.randint(0, len(self.input_requests) - 1) + while self.sent < len(self.input_requests): + item = self.input_requests[index] + prompt, documents = item["query"], item["positive"] + index += 1 + self.sent += 1 + index = index % len(self.input_requests) + await self.send_request( + self.api_url, + self.model_uid, + prompt, + documents, + ) + self.left -= 1 + # pring longer space to overwrite the previous when left decrease + print("\rdone_request, left %d " % (self.left), end="") + # The last one + print("") + + async def send_request( + self, api_url: str, model_uid: str, prompt: str, documents: List[str] + ): + request_start_time = time.time() + + pload = { + "model": model_uid, + "top_n": self.top_n, + "query": prompt, + "documents": documents, + } + + headers = {"User-Agent": "Benchmark Client"} + + timeout = aiohttp.ClientTimeout(total=3 * 3600) + async with aiohttp.ClientSession(timeout=timeout) as session: + async with session.post(api_url, headers=headers, json=pload) as response: + resp = await response.json() + if response.status == 200: + request_end_time = time.time() + request_latency = request_end_time - request_start_time + REQUEST_LATENCY.append(request_latency) + else: + logger.error(f"Failed to create chat completion: {resp}") + + +def main(args: argparse.Namespace): + print(args) + + api_url = f"http://{args.host}:{args.port}/v1/rerank" + model_uid = args.model_uid + + logger.info("Preparing for benchmark.") + dataset = load_dataset("mteb/scidocs-reranking") + input_requests = dataset["test"].remove_columns("negative").to_list() + if args.num_query > 0: + input_requests = input_requests[: args.num_query] + else: + args.num_query = len(input_requests) + + logger.info("Benchmark starts.") + benchmark_start_time = time.time() + + benchmark = BenchmarkRunner( + api_url, + model_uid, + input_requests, + top_n=args.top_n, + concurrency=args.concurrency, + ) + asyncio.run(benchmark.run()) + benchmark_end_time = time.time() + benchmark_time = benchmark_end_time - benchmark_start_time + print(f"Total time: {benchmark_time:.2f} s") + print(f"Throughput: {args.num_query / benchmark_time:.2f} requests/s") + # TODO(codingl2k1): We should calculate the tokens / s in the future. + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Stress test the rerank model.") + parser.add_argument("--host", type=str, default="localhost") + parser.add_argument("--port", type=int, default=9997) + parser.add_argument( + "--concurrency", + "-c", + type=int, + default=16, + help="Set the concurrency of request to send", + ) + parser.add_argument( + "--top-n", + "-n", + type=int, + default=5, + help="Set the top n to the rerank", + ) + parser.add_argument( + "--num-query", + "-q", + type=int, + default=-1, + help="Set the query dataset count, default is all", + ) + parser.add_argument( + "--trust-remote-code", + action="store_true", + help="Trust remote code from huggingface.", + ) + parser.add_argument("--model-uid", type=str, help="Xinference model UID.") + args = parser.parse_args() + main(args) From 8464b41b58cbfe1c1fab842385bfbed8b82b16f5 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Tue, 21 May 2024 15:33:10 +0800 Subject: [PATCH 090/298] FEAT: Add command cal-model-mem (#1460) --- .gitignore | 5 +- xinference/deploy/cmdline.py | 88 +++++ xinference/model/llm/llm_family.py | 69 ++++ xinference/model/llm/memory.py | 332 ++++++++++++++++++ xinference/model/llm/tests/test_llm_family.py | 8 + .../model/llm/tests/test_memory_estimate.py | 55 +++ 6 files changed, 556 insertions(+), 1 deletion(-) create mode 100644 xinference/model/llm/memory.py create mode 100644 xinference/model/llm/tests/test_memory_estimate.py diff --git a/.gitignore b/.gitignore index 5940628faa..648fa3a462 100644 --- a/.gitignore +++ b/.gitignore @@ -132,6 +132,9 @@ dmypy.json .vscode *.iml +# VIM +*.sw* + # web staff node_modules/ static/ @@ -141,4 +144,4 @@ doc/source/savefig/ asv/results -.DS_Store \ No newline at end of file +.DS_Store diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index a2a11cb071..2744af1e41 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -1368,5 +1368,93 @@ def handle_user_passed_parameters() -> List[str]: ) +@cli.command( + "cal-model-mem", + help="calculate gpu mem usage with specified model size and context_length", +) +@click.option( + "--model-name", + "-n", + type=str, + help="The model name is optional.\ + If provided, fetch model config from huggingface/modelscope;\ + If not specified, use default model layer to estimate.", +) +@click.option( + "--size-in-billions", + "-s", + type=str, + required=True, + help="Specify the model size in billions of parameters. Format accept 1_8 and 1.8", +) +@click.option( + "--model-format", + "-f", + type=str, + required=True, + help="Specify the format of the model, e.g. pytorch, ggmlv3, etc.", +) +@click.option( + "--quantization", + "-q", + type=str, + default=None, + help="Define the quantization settings for the model.", +) +@click.option( + "--context-length", + "-c", + type=int, + required=True, + help="Specify the context length", +) +@click.option( + "--kv-cache-dtype", + type=int, + default=16, + help="Specified the kv_cache_dtype, one of: 8, 16, 32", +) +def cal_model_mem( + model_name: Optional[str], + size_in_billions: str, + model_format: str, + quantization: Optional[str], + context_length: int, + kv_cache_dtype: int, +): + if kv_cache_dtype not in [8, 16, 32]: + print("Invalid kv_cache_dtype:", kv_cache_dtype) + os._exit(1) + + import math + + from ..model.llm.llm_family import convert_model_size_to_float + from ..model.llm.memory import estimate_llm_gpu_memory + + mem_info = estimate_llm_gpu_memory( + model_size_in_billions=size_in_billions, + quantization=quantization, + context_length=context_length, + model_format=model_format, + model_name=model_name, + kv_cache_dtype=kv_cache_dtype, + ) + if mem_info is None: + print("The Specified model parameters is not match: `%s`" % model_name) + os._exit(1) + total_mem_g = math.ceil(mem_info.total / 1024.0) + print("model_name:", model_name) + print("kv_cache_dtype:", kv_cache_dtype) + print("model size: %.1f B" % (convert_model_size_to_float(size_in_billions))) + print("quant: %s" % (quantization)) + print("context: %d" % (context_length)) + print("gpu mem usage:") + print(" model mem: %d MB" % (mem_info.model_mem)) + print(" kv_cache: %d MB" % (mem_info.kv_cache_mem)) + print(" overhead: %d MB" % (mem_info.overhead)) + print(" active: %d MB" % (mem_info.activation_mem)) + print(" total: %d MB (%d GB)" % (mem_info.total, total_mem_g)) + + if __name__ == "__main__": cli() diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index c8a9ab685a..19be5fe1aa 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -447,6 +447,61 @@ def cache_from_uri( raise ValueError(f"Unsupported URL scheme: {src_scheme}") +def cache_model_config( + llm_family: LLMFamilyV1, + llm_spec: "LLMSpecV1", +): + """Download model config.json into cache_dir, + returns local filepath + """ + cache_dir = _get_cache_dir_for_model_mem(llm_family, llm_spec) + config_file = os.path.join(cache_dir, "config.json") + if not os.path.islink(config_file) and not os.path.exists(config_file): + os.makedirs(cache_dir, exist_ok=True) + if llm_spec.model_hub == "huggingface": + from huggingface_hub import hf_hub_download + + hf_hub_download( + repo_id=llm_spec.model_id, filename="config.json", local_dir=cache_dir + ) + else: + from modelscope.hub.file_download import model_file_download + + download_path = model_file_download( + model_id=llm_spec.model_id, file_path="config.json" + ) + os.symlink(download_path, config_file) + return config_file + + +def _get_cache_dir_for_model_mem( + llm_family: LLMFamilyV1, + llm_spec: "LLMSpecV1", + create_if_not_exist=True, +): + """ + For cal-model-mem only. (might called from supervisor / cli) + Temporary use separate dir from worker's cache_dir, due to issue of different style of symlink. + """ + quant_suffix = "" + for q in llm_spec.quantizations: + if llm_spec.model_id and q in llm_spec.model_id: + quant_suffix = q + break + cache_dir_name = ( + f"{llm_family.model_name}-{llm_spec.model_format}" + f"-{llm_spec.model_size_in_billions}b" + ) + if quant_suffix: + cache_dir_name += f"-{quant_suffix}" + cache_dir = os.path.realpath( + os.path.join(XINFERENCE_CACHE_DIR, "model_mem", cache_dir_name) + ) + if create_if_not_exist and not os.path.exists(cache_dir): + os.makedirs(cache_dir, exist_ok=True) + return cache_dir + + def _get_cache_dir( llm_family: LLMFamilyV1, llm_spec: "LLMSpecV1", @@ -823,6 +878,20 @@ def match_model_size( return False +def convert_model_size_to_float( + model_size_in_billions: Union[float, int, str] +) -> float: + if isinstance(model_size_in_billions, str): + if "_" in model_size_in_billions: + ms = model_size_in_billions.replace("_", ".") + return float(ms) + elif "." in model_size_in_billions: + return float(model_size_in_billions) + else: + return int(model_size_in_billions) + return model_size_in_billions + + def match_llm( model_name: str, model_format: Optional[str] = None, diff --git a/xinference/model/llm/memory.py b/xinference/model/llm/memory.py new file mode 100644 index 0000000000..6b98ced5bc --- /dev/null +++ b/xinference/model/llm/memory.py @@ -0,0 +1,332 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# NOTE: +# +# The algorithum is ported from https://github.com/RahulSChand/gpu_poor +# +# Improvement: +# +# The original js code only calculate kv_cache_dtype by float32, instead of most case we run model with float16. +# +# Known Issue: +# +# * On vllm, some MHA model use smaller memory than calculation (qwen1.5-7B-chat-gptq-int4, +# qwen1.5-14B-chat-gptq-int4 with large activation_mem). +# +# * On vllm, gemma-it-7B pytorch format model use larger gpu mem than calculation + +import json +import math +from dataclasses import dataclass +from logging import getLogger +from math import ceil +from typing import Any, Optional, Union + +from .llm_family import convert_model_size_to_float + +logger = getLogger(__name__) + + +@dataclass +class ModelLayersInfo: + vocab_size: int + heads: int # num_attention_heads, num_heads or n_head + hidden_dim: int # hidden_size, d_model, or n_embd + inter_dim: int # intermediate_size, n_inner or d_ff + num_layers: int # num_layers, num_hidden_layers or n_layer + + +@dataclass +class ModelMemInfo: + """Memory required by model, unit in MB""" + + model_mem: int + kv_cache_mem: int + activation_mem: int + overhead: int + total: int + + +QUANT_NORMALIZE = {"int4": "4-bit", "int8": "8-bit", "4-bit": "4-bit", "8-bit": "8-bit"} + +GGML_MULTI_FACTOR_DICT = { + "q4_0": 18, + "q4_1": 20, + "q5_0": 22, + "q5_1": 24, + "q8_0": 34, + "q8_1": 40, +} + +GGML_MULTI_FACTOR_DICT_64 = { + "q6_K": 54.0, + "q3": 26.0, + "q4": 38.0, + "q5": 46.0, +} + +GGML_MULTI_FACTOR_DICT_COMBINE = { + "q3_K_L": [38.0, 26.0], + "q3_K_M": [46.0, 26.0], + "q4_K_S": [46.0, 38.0], + "q4_K_M": [54.0, 38.0], + "q5_K_M": [54.0, 46.0], + "q2_K": [26.0, 22.0], +} + + +# Return gpu memory in MB +def estimate_llm_gpu_memory( + model_size_in_billions: Union[str, int], + quantization: Optional[str], + context_length: int, # input+output + model_format: str, + model_name: Optional[str] = None, + kv_cache_dtype: int = 16, +) -> Optional[ModelMemInfo]: + """ + model_size_in_billions: must be str like 1_8 or 46_7, to match llm. + """ + info = get_model_layers_info( + model_size_in_billions, + model_name, + model_format, + quantization, + ) + if info is None: + return None + size_in_billions = convert_model_size_to_float(model_size_in_billions) + return estimate_llm_gpu_memory_details( + info, + size_in_billions, + quantization, + context_length, + model_format, + kv_cache_dtype, + ) + + +def estimate_llm_gpu_memory_details( + info: ModelLayersInfo, + size_in_billions: float, + quantization: Optional[str], + context_length: int, # input+output + model_format: str, + kv_cache_dtype: int = 16, +) -> ModelMemInfo: + """return model_mem, kv_cache, overhead, activation_mem""" + if kv_cache_dtype not in [8, 16, 32]: + raise ValueError(f"Invalid kv_cache_dtype {kv_cache_dtype}") + if kv_cache_dtype == 8: + kv_dtype_size = 1 + elif kv_cache_dtype == 16: + kv_dtype_size = 2 + else: + kv_dtype_size = 4 + overhead = 650.0 + if model_format == "ggmlv3": + assert quantization is not None and quantization != "none" + model_size_in_mb = _compute_model_size_ggml(info, quantization) + inference_mem = float( + context_length * kv_dtype_size * info.hidden_dim * info.num_layers + ) + inference_mem = inference_mem / 1024.0 / 1024.0 + activation_mem = _compute_inference_only_activation_memory(context_length, info) + overhead = overhead + context_length * 0.1 + else: + if quantization is not None: + assert isinstance(quantization, str) + quantization = QUANT_NORMALIZE[quantization.lower()] + assert quantization is not None + + model_size = size_in_billions * 1000000000.0 + model_size_in_mb = _convert_to_mb_model_size(model_size, quantization) + # KV cache + inference_mem = float( + context_length * 2 * kv_dtype_size * info.hidden_dim * info.num_layers + ) + inference_mem = inference_mem / 1024.0 / 1024.0 + activation_mem = _compute_inference_only_activation_memory(context_length, info) + + total_mem = ceil(inference_mem + model_size_in_mb + overhead + activation_mem) + return ModelMemInfo( + model_mem=ceil(model_size_in_mb), + kv_cache_mem=ceil(inference_mem), + activation_mem=ceil(activation_mem), + overhead=ceil(overhead), + total=total_mem, + ) + + +def _load_item_from_json(config_data: Any, *keys: str) -> str: + assert len(keys) > 0 + for key in keys: + v = config_data.get(key) + if v is not None: + return v + raise ValueError("load ModelLayersInfo: missing %s" % (keys[0])) + + +def load_model_config_json(config_path: str) -> ModelLayersInfo: + with open(config_path, "r") as f: + config_data = json.load(f) + return ModelLayersInfo( + vocab_size=int(_load_item_from_json(config_data, "vocab_size")), + heads=int( + _load_item_from_json( + config_data, "num_key_value_heads", "num_attention_heads" + ) + ), + hidden_dim=int( + _load_item_from_json(config_data, "hidden_size", "d_model", "n_embd") + ), + inter_dim=int(_load_item_from_json(config_data, "intermediate_size")), + num_layers=int( + _load_item_from_json( + config_data, "num_hidden_layers", "num_layers", "n_layer" + ) + ), + ) + + +def get_model_layers_info( + model_size_in_billions: Union[str, int], + model_name: Optional[str], + model_format: Optional[str], + quantization: Optional[str], +) -> Optional[ModelLayersInfo]: + from . import match_llm + from .llm_family import cache_model_config + + if not model_name: + logger.debug("get_model_layers_info by default size=%s", model_size_in_billions) + size_in_billions = convert_model_size_to_float(model_size_in_billions) + return _get_default_layers_from_size(size_in_billions) + match_result = match_llm( + model_name=model_name, + model_format=model_format, + model_size_in_billions=model_size_in_billions, + quantization=quantization, + ) + if not match_result: + return None + llm_family, llm_spec, _quant = match_result + config_path = cache_model_config(llm_family, llm_spec) + return load_model_config_json(config_path) + + +def _get_default_layers_from_size(size_in_billion: float) -> ModelLayersInfo: + if size_in_billion < 5: + vocab_size = 32000 + heads = 32 + num_layers = 24 + elif size_in_billion < 10: + vocab_size = 32000 + heads = 32 + num_layers = 32 + elif size_in_billion < 24: + vocab_size = 32000 + heads = 40 + num_layers = 40 + elif size_in_billion < 55: + vocab_size = 32000 + heads = 60 + num_layers = 48 + else: + vocab_size = 32000 + heads = 64 + num_layers = 80 + + model_size = int(size_in_billion * 1000000000) + A = num_layers * 4 + 3 * 4 * num_layers + B = 2 * vocab_size + C = -1 * model_size + h = (-B + math.sqrt(B**2 - 4 * A * C)) / (2 * A) + h = math.ceil(h) + return ModelLayersInfo( + vocab_size=vocab_size, + heads=heads, + hidden_dim=h, + inter_dim=4 * h, + num_layers=num_layers, + ) + + +def _convert_to_mb_model_size(model_size: float, quantization: Optional[str]) -> float: + extra = 0.0 + fB = 2.0 + size = (model_size * fB) / (1024.0 * 1024.0) + # bnb_q4 == 4-bit ? + if quantization == "8-bit" or quantization == "4-bit": + extra = 0.06 * size + if quantization == "8-bit": + size = size / 2 + if quantization == "4-bit": + size = size / 4 + return size + extra + + +def _compute_inference_only_activation_memory( + context_length: int, info: ModelLayersInfo +) -> float: + hidden_dim = info.hidden_dim + heads = info.heads + ret = ( + (context_length * hidden_dim * 5 * 2 + (context_length**2) * heads * 2) + / 1024 + / 1024 + ) + return ret + + +def _compute_model_size_ggml(info: ModelLayersInfo, quantization: str) -> float: + assert quantization is not None + vocab_size = info.vocab_size + num_layers = info.num_layers + hidden_dim = info.hidden_dim + inter_dim = info.inter_dim + total_params = int( + vocab_size * hidden_dim * 2 + + num_layers * 4 * (hidden_dim**2) + + num_layers * 3 * inter_dim * hidden_dim + ) + other_v_down_params = ( + num_layers * (hidden_dim**2) + num_layers * hidden_dim * inter_dim + ) + other_param_q2k = ( + total_params - (hidden_dim**2) * num_layers * 2 + 2 * vocab_size * hidden_dim + ) + + total = 0.0 + v1 = GGML_MULTI_FACTOR_DICT.get(quantization) + if v1 is not None: + total = (v1 * total_params) / (32 * 1024 * 1024) + v2 = GGML_MULTI_FACTOR_DICT_64.get(quantization) + if v2 is not None: + total = (v2 * total_params) / (64 * 1024 * 1024) + v3 = GGML_MULTI_FACTOR_DICT_COMBINE.get(quantization) + if v3 is not None: + factors = v3 + if quantization == "q2_K": + total = ( + (total_params - other_param_q2k) * factors[1] + + other_param_q2k * factors[0] + ) / (64 * 1024 * 1024) + else: + total = ( + (total_params - other_v_down_params) * factors[1] + + other_v_down_params * factors[0] + ) / (64 * 1024 * 1024) + return total diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index ddd0274321..5fce195d8e 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -33,6 +33,7 @@ _get_cache_dir, _get_meta_path, _skip_download, + convert_model_size_to_float, is_self_hosted, is_valid_model_uri, match_llm, @@ -1066,6 +1067,13 @@ def test_match_model_size(): assert match_model_size("001", 1) +def test_convert_model_size_to_float(): + assert convert_model_size_to_float("1_8") == 1.8 + assert convert_model_size_to_float("1.8") == 1.8 + assert convert_model_size_to_float(7) == float(7) + assert convert_model_size_to_float(1.8) == 1.8 + + @pytest.mark.skipif( True, reason="Current system does not support vLLM", diff --git a/xinference/model/llm/tests/test_memory_estimate.py b/xinference/model/llm/tests/test_memory_estimate.py new file mode 100644 index 0000000000..6981b237db --- /dev/null +++ b/xinference/model/llm/tests/test_memory_estimate.py @@ -0,0 +1,55 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ..memory import estimate_llm_gpu_memory + + +def test_llm_estimate_memory(): + # TODO GGML is not tested yet + + # without model_name, use default ModelLayersInfo + mem_info = estimate_llm_gpu_memory(1.8, None, 2048, "pytorch", kv_cache_dtype=32) + assert mem_info.total == 5162 + mem_info = estimate_llm_gpu_memory( + 72, "8-bit", 1024 + 2048, "pytorch", kv_cache_dtype=32 + ) + assert mem_info.total == 92943 + mem_info = estimate_llm_gpu_memory( + 72, "4-bit", 1024 + 2048, "pytorch", kv_cache_dtype=32 + ) + assert mem_info.total == 58611 + mem_info = estimate_llm_gpu_memory(7, "Int4", 32768, "gptq", kv_cache_dtype=32) + assert mem_info.total == 100550 + + # with model_name to match_llm + mem_info = estimate_llm_gpu_memory( + 72, "Int4", 32768, "gptq", kv_cache_dtype=16, model_name="qwen1.5-chat" + ) + assert mem_info.total == 258775 + + # model_size_in_billions use int + mem_info = estimate_llm_gpu_memory( + 32, "Int4", 32768, "gptq", kv_cache_dtype=8, model_name="qwen1.5-chat" + ) + # model_size_in_billions use str + mem_info = estimate_llm_gpu_memory( + "32", "Int4", 32768, "gptq", kv_cache_dtype=8, model_name="qwen1.5-chat" + ) + assert mem_info.total == 58035 + + # model_size_in_billions use float + mem_info = estimate_llm_gpu_memory( + "1.8", None, 2048, "pytorch", kv_cache_dtype=32, model_name="qwen1.5-chat" + ) + assert mem_info.total == 5020 From 5f7e99447f374d745dfb94c60e5d0ff6d2a34947 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 22 May 2024 09:59:46 +0800 Subject: [PATCH 091/298] ENH: Compatible with `huggingface-hub` `v0.23.0` (#1514) --- setup.cfg | 2 +- xinference/deploy/docker/cpu.Dockerfile | 2 +- .../embedding/tests/test_embedding_models.py | 1 + xinference/model/llm/llm_family.py | 25 +++++++++++-------- .../model/llm/pytorch/tests/test_opt.py | 14 +++++------ xinference/model/utils.py | 24 ++++++++++++------ 6 files changed, 42 insertions(+), 26 deletions(-) diff --git a/setup.cfg b/setup.cfg index 437b9e59b4..824e7b5316 100644 --- a/setup.cfg +++ b/setup.cfg @@ -36,7 +36,7 @@ install_requires = pydantic fastapi uvicorn - huggingface-hub>=0.19.4,<0.23.0 + huggingface-hub>=0.19.4 typing_extensions fsspec>=2023.1.0,<=2023.10.0 s3fs diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index a5cbdd3583..94d6cdac8d 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -32,7 +32,7 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ pydantic \ fastapi \ uvicorn \ - "huggingface-hub>=0.19.4,<0.23.0" \ + "huggingface-hub>=0.19.4" \ typing_extensions \ "fsspec>=2023.1.0,<=2023.10.0" \ s3fs \ diff --git a/xinference/model/embedding/tests/test_embedding_models.py b/xinference/model/embedding/tests/test_embedding_models.py index 6b7dfeb7bf..da49a07604 100644 --- a/xinference/model/embedding/tests/test_embedding_models.py +++ b/xinference/model/embedding/tests/test_embedding_models.py @@ -91,6 +91,7 @@ def test_model_from_modelscope(): assert len(r["data"]) == 1 for d in r["data"]: assert len(d["embedding"]) == 512 + shutil.rmtree(model_path, ignore_errors=True) def test_meta_file(): diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 19be5fe1aa..b23a88a030 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -34,6 +34,8 @@ ) from ...constants import XINFERENCE_CACHE_DIR, XINFERENCE_MODEL_DIR from ..utils import ( + IS_NEW_HUGGINGFACE_HUB, + create_symlink, download_from_modelscope, is_valid_model_uri, parse_uri, @@ -680,10 +682,7 @@ def cache_from_modelscope( llm_spec.model_id, revision=llm_spec.model_revision, ) - for subdir, dirs, files in os.walk(download_dir): - for file in files: - relpath = os.path.relpath(os.path.join(subdir, file), download_dir) - symlink_local_file(os.path.join(subdir, file), cache_dir, relpath) + create_symlink(download_dir, cache_dir) elif llm_spec.model_format in ["ggmlv3", "ggufv2"]: file_names, final_file_name, need_merge = _generate_model_file_names( @@ -737,9 +736,13 @@ def cache_from_huggingface( ): return cache_dir + use_symlinks = {} + if not IS_NEW_HUGGINGFACE_HUB: + use_symlinks = {"local_dir_use_symlinks": True, "local_dir": cache_dir} + if llm_spec.model_format in ["pytorch", "gptq", "awq"]: assert isinstance(llm_spec, PytorchLLMSpecV1) - retry_download( + download_dir = retry_download( huggingface_hub.snapshot_download, llm_family.model_name, { @@ -748,9 +751,10 @@ def cache_from_huggingface( }, llm_spec.model_id, revision=llm_spec.model_revision, - local_dir=cache_dir, - local_dir_use_symlinks=True, + **use_symlinks, ) + if IS_NEW_HUGGINGFACE_HUB: + create_symlink(download_dir, cache_dir) elif llm_spec.model_format in ["ggmlv3", "ggufv2"]: assert isinstance(llm_spec, GgmlLLMSpecV1) @@ -759,7 +763,7 @@ def cache_from_huggingface( ) for file_name in file_names: - retry_download( + download_file_path = retry_download( huggingface_hub.hf_hub_download, llm_family.model_name, { @@ -769,9 +773,10 @@ def cache_from_huggingface( llm_spec.model_id, revision=llm_spec.model_revision, filename=file_name, - local_dir=cache_dir, - local_dir_use_symlinks=True, + **use_symlinks, ) + if IS_NEW_HUGGINGFACE_HUB: + symlink_local_file(download_file_path, cache_dir, file_name) if need_merge: _merge_cached_files(cache_dir, file_names, final_file_name) diff --git a/xinference/model/llm/pytorch/tests/test_opt.py b/xinference/model/llm/pytorch/tests/test_opt.py index 020aa72d45..d7dd30a512 100644 --- a/xinference/model/llm/pytorch/tests/test_opt.py +++ b/xinference/model/llm/pytorch/tests/test_opt.py @@ -17,7 +17,6 @@ import threading import time from concurrent.futures import ThreadPoolExecutor -from pathlib import Path from typing import Union import pytest @@ -49,6 +48,8 @@ class MockPytorchModel(MockNonPytorchModel, PytorchModel): @pytest.mark.asyncio @pytest.mark.parametrize("quantization", ["none"]) async def test_opt_pytorch_model(setup, quantization): + from .....constants import XINFERENCE_CACHE_DIR + endpoint, _ = setup client = Client(endpoint) assert len(client.list_models()) == 0 @@ -97,12 +98,11 @@ def _check(): assert len(client.list_models()) == 0 # check for cached revision - home_address = str(Path.home()) - snapshot_address = ( - home_address - + "/.cache/huggingface/hub/models--facebook--opt-125m/snapshots" + valid_file = os.path.join( + XINFERENCE_CACHE_DIR, "opt-pytorch-1b", "__valid_download" ) - actual_revision = os.listdir(snapshot_address) + with open(valid_file, "r") as f: + actual_revision = json.load(f)["revision"] model_name = "opt" expected_revision: Union[str, None] = "" # type: ignore @@ -112,7 +112,7 @@ def _check(): for spec in family.model_specs: expected_revision = spec.model_revision - assert [expected_revision] == actual_revision + assert expected_revision == actual_revision @pytest.mark.asyncio diff --git a/xinference/model/utils.py b/xinference/model/utils.py index e1c71290c3..278d33e3ae 100644 --- a/xinference/model/utils.py +++ b/xinference/model/utils.py @@ -19,6 +19,7 @@ from pathlib import Path from typing import Any, Callable, Dict, Optional, Tuple, Union +import huggingface_hub from fsspec import AbstractFileSystem from ..constants import XINFERENCE_CACHE_DIR, XINFERENCE_ENV_MODEL_SRC @@ -27,6 +28,7 @@ logger = logging.getLogger(__name__) MAX_ATTEMPTS = 3 +IS_NEW_HUGGINGFACE_HUB: bool = huggingface_hub.__version__ >= "0.23.0" def is_locale_chinese_simplified() -> bool: @@ -76,6 +78,13 @@ def symlink_local_file(path: str, local_dir: str, relpath: str) -> str: return local_dir_filepath +def create_symlink(download_dir: str, cache_dir: str): + for subdir, dirs, files in os.walk(download_dir): + for file in files: + relpath = os.path.relpath(os.path.join(subdir, file), download_dir) + symlink_local_file(os.path.join(subdir, file), cache_dir, relpath) + + def retry_download( download_func: Callable, model_name: str, @@ -306,22 +315,23 @@ def cache(model_spec: CacheableModelSpec, model_description_type: type): model_spec.model_id, revision=model_spec.model_revision, ) - for subdir, dirs, files in os.walk(download_dir): - for file in files: - relpath = os.path.relpath(os.path.join(subdir, file), download_dir) - symlink_local_file(os.path.join(subdir, file), cache_dir, relpath) + create_symlink(download_dir, cache_dir) else: from huggingface_hub import snapshot_download as hf_download - retry_download( + use_symlinks = {} + if not IS_NEW_HUGGINGFACE_HUB: + use_symlinks = {"local_dir_use_symlinks": True, "local_dir": cache_dir} + download_dir = retry_download( hf_download, model_spec.model_name, None, model_spec.model_id, revision=model_spec.model_revision, - local_dir=cache_dir, - local_dir_use_symlinks=True, + **use_symlinks, ) + if IS_NEW_HUGGINGFACE_HUB: + create_symlink(download_dir, cache_dir) with open(meta_path, "w") as f: import json From bf88e9b7fd1c430e60fcb53d7872192321f15180 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Wed, 22 May 2024 12:00:11 +0800 Subject: [PATCH 092/298] BLD: Fix pre commit (#1527) --- .../development/xinference_internals.rst | 70 +++++++++---------- .../development/xinference_internals.po | 1 - .../deepseek_vl/models/processing_vlm.py | 2 +- .../deepseek_vl/models/siglip_vit.py | 4 +- .../deepseek_vl/serve/app_deepseek.py | 6 +- .../deepseek_vl/serve/app_modules/utils.py | 3 +- .../deepseek_vl/serve/assets/custom.css | 2 +- xinference/thirdparty/llava/mm_utils.py | 5 +- .../thirdparty/llava/model/llava_arch.py | 2 +- 9 files changed, 46 insertions(+), 49 deletions(-) diff --git a/doc/source/development/xinference_internals.rst b/doc/source/development/xinference_internals.rst index 5fbe0f3e21..4bdb8fc57a 100644 --- a/doc/source/development/xinference_internals.rst +++ b/doc/source/development/xinference_internals.rst @@ -7,9 +7,9 @@ The internals of Xinference Overview ======== -Xinference leverages `Xoscar <https://github.com/xorbitsai/xoscar>`_, an actor programming framework we designed, +Xinference leverages `Xoscar <https://github.com/xorbitsai/xoscar>`_, an actor programming framework we designed, as its core component to manage machines, devices, and model inference processes. Each actor serves as a basic -unit for model inference and various inference backends can be integrate into the actor, enabling us to support +unit for model inference and various inference backends can be integrate into the actor, enabling us to support multiple inference engines and hardware. These actors are hosted and scheduled within actor pools, which are designed to be asynchronous and non-blocking and function as resource pools. @@ -46,7 +46,7 @@ Entry Points Take the command-lines we implemented as examples: - ``xinference``: Provides commands for model management, including registering/unregistering models, listing all - registered/running models, and launching or terminating specific models. + registered/running models, and launching or terminating specific models. It also features interactive commands like generate and chat for testing and interacting with deployed models in real-time. - ``xinference-local``: Starts a local Xinference service. @@ -69,11 +69,11 @@ Python projects define command-line console entry points in `setup.cfg` or `setu xinference-supervisor = xinference.deploy.cmdline:supervisor xinference-worker = xinference.deploy.cmdline:worker -The command-line ``xinference`` can be refered to code in ``xinference.deploy.cmdline:cli``. +The command-line ``xinference`` can be referred to code in ``xinference.deploy.cmdline:cli``. Click ----- -We use Click to implement a specific command-line: +We use Click to implement a specific command-line: :: @@ -96,7 +96,7 @@ For example, the ``xinference-local`` command allows you to define the host addr Actor ===== -Xinference is fundamentally based on `Xoscar <https://github.com/xorbitsai/xoscar>`_, our actor framework, +Xinference is fundamentally based on `Xoscar <https://github.com/xorbitsai/xoscar>`_, our actor framework, which can manage computational resources and Python processes to support scalable and concurrent programming. The following is a pseudocode demonstrating how our Worker Actor works, the actual Worker Actor is more complex than this. @@ -106,14 +106,14 @@ The following is a pseudocode demonstrating how our Worker Actor works, the actu class WorkerActor(xo.Actor): def __init__(self, *args, **kwargs): - ... - async def launch_model(self, model_id, n_gpu, ...): + ... + async def launch_model(self, model_id, n_gpu, ...): # launch an inference engine, use specific model class to load model checkpoints ... - async def list_models(self): + async def list_models(self): # list models on this actor ... - async def terminate_model(self, model_id): + async def terminate_model(self, model_id): # terminate the model ... async def __post_create__(self): @@ -121,7 +121,7 @@ The following is a pseudocode demonstrating how our Worker Actor works, the actu ... async def __pre_destroy__(self): # called before the actor instance is destroyed - ... + ... We use the ``WorkerActor`` as an example to illustrate how we build the Xinference. Each actor class is a standard Python class that inherits from ``xoscar.Actor``. An instance of this class is a specific actor @@ -131,13 +131,13 @@ within the actor pool. For instance, the model inference ``WorkerActor`` needs to launch the model (``launch_model``), list the models in this actor (``list_models``), terminate a model (``terminate_model``). There are two special methods worth noting. The ``__post_create__`` is invoked before the actor is created, allowing for necessary initializations. - The ``__pre_destroy__`` is called after the actor is destroyed, allowing for cleanup or finalization tasks. + The ``__pre_destroy__`` is called after the actor is destroyed, allowing for cleanup or finalization tasks. - **Reference Actor and Invoke Methods**: When an actor is created, it yields a reference variable so that other actors can reference it. The actor reference can also be referenced with the address. Suppose the ``WorkerActor`` is created and the reference variable is ``worker_ref``, the ``launch_model`` method of this actor class can - be invoked by calling ``worker_ref.launch_model()``. - Even if the actor's method is originally a synchronized method, when called with an actor reference, it will + be invoked by calling ``worker_ref.launch_model()``. + Even if the actor's method is originally a synchronized method, when called with an actor reference, it will become as an asynchronous method. - **Inference Engine**: The actor can manage the process, and the inference engine is also a process. In the launch @@ -152,12 +152,12 @@ Asynchronous Programming Both Xinference and Xoscar highly utilize asynchronous programming of ``asyncio``. Asynchronous programming is a programming paradigm that does not block. -Instead, requests and function calls are issued and executed in the background -and results are returned in the future. This enables us to perform +Instead, requests and function calls are issued and executed in the background +and results are returned in the future. This enables us to perform activities concurrently. -If you're not familiar with Pythons's ``asyncio``, you can see more tutorials for help: - +If you're not familiar with Pythons's ``asyncio``, you can see more tutorials for help: + - `Python Asyncio Tutorial <https://bbc.github.io/cloudfit-public-docs/asyncio/asyncio-part-1.html>`__ - `Real Python's asyncio Tutorial <https://realpython.com/async-io-python/>`__ @@ -168,7 +168,7 @@ If you're not familiar with Pythons's ``asyncio``, you can see more tutorials fo Model ===== -Xinference supports different types of models including large language models (LLMs), image models, audio models, embedding models, etc. +Xinference supports different types of models including large language models (LLMs), image models, audio models, embedding models, etc. All models are implemented in `model/ <https://github.com/xorbitsai/inference/tree/main/xinference/model>`_. LLM @@ -216,46 +216,46 @@ usually comes with various sizes, quantization methods, and file formats. For instance, the ``model_format`` could be ``pytorch`` (using Hugging Face Transformers or vLLM as backend), ``ggmlv3`` (a tensor library associated with llama.cpp), or ``gptq`` (a post-training quantization framework). The ``model_id`` defines the repository of the model hub from which Xinference downloads the checkpoint files. -Furthermore, due to distinct instruction-tuning processes, different model families have varying prompt styles. +Furthermore, due to distinct instruction-tuning processes, different model families have varying prompt styles. The ``prompt_style`` in the JSON file specifies how to format prompts for this particular model. For example, ``system_prompt`` and ``roles`` are used to specify the instructions and personality of the model. Code Walkthrough ================ -The main code is located in the `xinference/ <https://github.com/xorbitsai/inference/tree/main/xinference>`_: +The main code is located in the `xinference/ <https://github.com/xorbitsai/inference/tree/main/xinference>`_: -- `api/ <https://github.com/xorbitsai/inference/tree/main/xinference/api>`_: `restful_api.py <https://github.com/xorbitsai/inference/tree/main/xinference/api/restful_api.py>`_ +- `api/ <https://github.com/xorbitsai/inference/tree/main/xinference/api>`_: `restful_api.py <https://github.com/xorbitsai/inference/tree/main/xinference/api/restful_api.py>`_ is the core part that sets up and runs the RESTful APIs. It integrates an authentication service (the specific code is located in `oauth2/ <https://github.com/xorbitsai/inference/tree/main/xinference/api/oauth2>`_), as some or all endpointsrequire user authentication. -- `client/ <https://github.com/xorbitsai/inference/tree/main/xinference/client>`_: This is the client of Xinference. - +- `client/ <https://github.com/xorbitsai/inference/tree/main/xinference/client>`_: This is the client of Xinference. + - `oscar/ <https://github.com/xorbitsai/inference/tree/main/xinference/client/oscar>`_ defines the Actor Client which acts as a client interface for interacting with models deployed in a Xinference cluster. - + - `restful/ <https://github.com/xorbitsai/inference/tree/main/xinference/client/restful>`_ implements a RESTful client for interacting with a Xinference service. -- `core/ <https://github.com/xorbitsai/inference/tree/main/xinference/core>`_: This is the core part of Xinference. - +- `core/ <https://github.com/xorbitsai/inference/tree/main/xinference/core>`_: This is the core part of Xinference. + - `metrics.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/metrics.py>`_ and `resource.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/resource.py>`_ defines a set of tools for collecting and reporting metrics and the status of node resources, including model throughput, latency, the usage of CPU and GPU, memory usage, and more. - + - `image_interface.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/image_interface.py>`_ and - `chat_interface.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/chat_interface.py>`_ - implement `Gradio <https://github.com/gradio-app/gradio>`_ interfaces for image and chat models, respectively. - These interfaces allow users to interact with models through a Web UI, such as generating images or engaging in chat. + `chat_interface.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/chat_interface.py>`_ + implement `Gradio <https://github.com/gradio-app/gradio>`_ interfaces for image and chat models, respectively. + These interfaces allow users to interact with models through a Web UI, such as generating images or engaging in chat. They build user interfaces using the gradio package and communicate with backend models through our RESTful APIs. - + - `worker.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/worker.py>`_ and - `supervisor.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/supervisor.py>`_ + `supervisor.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/supervisor.py>`_ respectively define the logic for worker actors and supervisor actor. Worker actors are responsible for carrying out specific model computation tasks, while supervisor actors manage the lifecycle of worker nodes, schedule tasks, and monitor system states. - + - `status_guard.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/status_guard.py>`_ implements a status monitor to track the status of models (like creating, updating, terminating, etc.). It allows querying status information of model instances and managing these statuses based on the model's UID. @@ -265,7 +265,7 @@ The main code is located in the `xinference/ <https://github.com/xorbitsai/infer versions and querying model version information based on model names. - `event.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/event.py>`_ defines an event collector for gathering and - reporting various runtime events of models, such as information, warnings, and errors. + reporting various runtime events of models, such as information, warnings, and errors. `model.py <https://github.com/xorbitsai/inference/tree/main/xinference/core/model.py>`_ defines a Model Actor, the core component for direct model interactions. The Model Actor is responsible for executing model inference requests, handling input and output data streams, and supports various types of model operations. diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/development/xinference_internals.po b/doc/source/locale/zh_CN/LC_MESSAGES/development/xinference_internals.po index 186aeba521..bfad82ba0a 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/development/xinference_internals.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/development/xinference_internals.po @@ -732,4 +732,3 @@ msgstr "" #~ "Both Xinference and Xoscar highly " #~ "utilize coroutine programming of ``asyncio``." #~ msgstr "Xinference 和 Xoscar 都高度利用了 ``asyncio`` 进行协程编程。" - diff --git a/xinference/thirdparty/deepseek_vl/models/processing_vlm.py b/xinference/thirdparty/deepseek_vl/models/processing_vlm.py index 380a944828..22d074c700 100644 --- a/xinference/thirdparty/deepseek_vl/models/processing_vlm.py +++ b/xinference/thirdparty/deepseek_vl/models/processing_vlm.py @@ -25,8 +25,8 @@ from transformers import LlamaTokenizerFast from transformers.processing_utils import ProcessorMixin -from .image_processing_vlm import VLMImageProcessor from ..utils.conversation import get_conv_template +from .image_processing_vlm import VLMImageProcessor class DictOutput(object): diff --git a/xinference/thirdparty/deepseek_vl/models/siglip_vit.py b/xinference/thirdparty/deepseek_vl/models/siglip_vit.py index 663783f9a8..5caca73558 100644 --- a/xinference/thirdparty/deepseek_vl/models/siglip_vit.py +++ b/xinference/thirdparty/deepseek_vl/models/siglip_vit.py @@ -92,7 +92,7 @@ def norm_cdf(x): def trunc_normal_(tensor, mean=0.0, std=1.0, a=-2.0, b=2.0): # type: (torch.Tensor, float, float, float, float) -> torch.Tensor r"""The original timm.models.layers.weight_init.trunc_normal_ can not handle bfloat16 yet, here we first - convert the tensor to float32, apply the trunc_normal_() in float32, and then convert it back to its orignal dtype. + convert the tensor to float32, apply the trunc_normal_() in float32, and then convert it back to its original dtype. Fills the input Tensor with values drawn from a truncated normal distribution. The values are effectively drawn from the normal distribution :math:`\mathcal{N}(\text{mean}, \text{std}^2)` with values outside :math:`[a, b]` redrawn until they are within @@ -305,7 +305,7 @@ def __init__( img_size: Input image size. patch_size: Patch size. in_chans: Number of image input channels. - num_classes: Mumber of classes for classification head. + num_classes: Number of classes for classification head. global_pool: Type of global pooling for final sequence (default: 'token'). embed_dim: Transformer embedding dimension. depth: Depth of transformer. diff --git a/xinference/thirdparty/deepseek_vl/serve/app_deepseek.py b/xinference/thirdparty/deepseek_vl/serve/app_deepseek.py index 424dc47af1..6face003a2 100755 --- a/xinference/thirdparty/deepseek_vl/serve/app_deepseek.py +++ b/xinference/thirdparty/deepseek_vl/serve/app_deepseek.py @@ -36,12 +36,8 @@ from app_modules.presets import CONCURRENT_COUNT, description, description_top, title from app_modules.utils import configure_logger, is_variable_assigned, strip_stop_words -from .inference import ( - convert_conversation_to_prompts, - deepseek_generate, - load_model, -) from ..utils.conversation import SeparatorStyle +from .inference import convert_conversation_to_prompts, deepseek_generate, load_model def load_models(): diff --git a/xinference/thirdparty/deepseek_vl/serve/app_modules/utils.py b/xinference/thirdparty/deepseek_vl/serve/app_modules/utils.py index bb66e44161..35707fe81f 100755 --- a/xinference/thirdparty/deepseek_vl/serve/app_modules/utils.py +++ b/xinference/thirdparty/deepseek_vl/serve/app_modules/utils.py @@ -27,12 +27,13 @@ import time import mdtex2html -from .presets import ALREADY_CONVERTED_MARK from markdown import markdown from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexers import ClassNotFound, get_lexer_by_name, guess_lexer +from .presets import ALREADY_CONVERTED_MARK + logger = logging.getLogger("gradio_logger") diff --git a/xinference/thirdparty/deepseek_vl/serve/assets/custom.css b/xinference/thirdparty/deepseek_vl/serve/assets/custom.css index adb6344430..7402e0578a 100755 --- a/xinference/thirdparty/deepseek_vl/serve/assets/custom.css +++ b/xinference/thirdparty/deepseek_vl/serve/assets/custom.css @@ -141,7 +141,7 @@ thead th { color: #fdf8f8; box-shadow: 6px 6px 16px hsla(0, 0%, 0%, 0.2); } -/* Hightlight */ +/* Highlight */ #deepseek_chatbot .highlight { background-color: transparent; } diff --git a/xinference/thirdparty/llava/mm_utils.py b/xinference/thirdparty/llava/mm_utils.py index 0a9783b665..9882a955d5 100644 --- a/xinference/thirdparty/llava/mm_utils.py +++ b/xinference/thirdparty/llava/mm_utils.py @@ -2,11 +2,12 @@ from io import BytesIO import torch -from .model import LlavaLlamaForCausalLM -from .model.constants import IMAGE_TOKEN_INDEX from PIL import Image from transformers import AutoTokenizer, StoppingCriteria +from .model import LlavaLlamaForCausalLM +from .model.constants import IMAGE_TOKEN_INDEX + def load_image_from_base64(image): return Image.open(BytesIO(base64.b64decode(image))) diff --git a/xinference/thirdparty/llava/model/llava_arch.py b/xinference/thirdparty/llava/model/llava_arch.py index 7dc3325fa1..c1b3e04d42 100644 --- a/xinference/thirdparty/llava/model/llava_arch.py +++ b/xinference/thirdparty/llava/model/llava_arch.py @@ -17,9 +17,9 @@ from abc import ABC, abstractmethod import torch -from .constants import IGNORE_INDEX, IMAGE_TOKEN_INDEX, key_info from .clip_encoder.builder import build_vision_tower +from .constants import IGNORE_INDEX, IMAGE_TOKEN_INDEX, key_info from .multimodal_projector.builder import build_vision_projector From 6cc4680dece756a41b9ed98ba0168e4859ba0188 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 23 May 2024 09:58:47 +0800 Subject: [PATCH 093/298] FEAT: add deepseek llm and coder base (#1533) --- doc/source/getting_started/installation.rst | 2 +- .../builtin/llm/deepseek-coder-instruct.rst | 130 ++++++- .../models/builtin/llm/deepseek-coder.rst | 225 +++++++++++ doc/source/models/builtin/llm/deepseek.rst | 75 ++++ doc/source/models/builtin/llm/index.rst | 16 +- doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 355 +++++++++++++++++- .../model/llm/llm_family_modelscope.json | 87 ++++- xinference/model/llm/vllm/core.py | 2 + 9 files changed, 884 insertions(+), 10 deletions(-) create mode 100644 doc/source/models/builtin/llm/deepseek-coder.rst create mode 100644 doc/source/models/builtin/llm/deepseek.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 2b51e27bba..94dc3b731c 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -45,13 +45,13 @@ Currently, supported models include: - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` +- ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` - ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` - ``qwen-chat`` - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` -- ``deepseek-chat``, ``deepseek-coder-instruct`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``codeqwen1.5-chat`` - ``gemma-it`` diff --git a/doc/source/models/builtin/llm/deepseek-coder-instruct.rst b/doc/source/models/builtin/llm/deepseek-coder-instruct.rst index d80377faea..a4f4a993b1 100644 --- a/doc/source/models/builtin/llm/deepseek-coder-instruct.rst +++ b/doc/source/models/builtin/llm/deepseek-coder-instruct.rst @@ -4,7 +4,7 @@ deepseek-coder-instruct ======================================== -- **Context Length:** 4096 +- **Context Length:** 16384 - **Model Name:** deepseek-coder-instruct - **Languages:** en, zh - **Abilities:** chat @@ -44,7 +44,22 @@ chosen quantization method from the options listed above:: xinference launch --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format pytorch --quantization ${quantization} -Model Spec 3 (pytorch, 33 Billion) +Model Spec 3 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** deepseek-ai/deepseek-coder-7b-instruct-v1.5 +- **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-7b-instruct-v1.5>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder-instruct --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 4 (pytorch, 33 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch @@ -59,7 +74,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name deepseek-coder-instruct --size-in-billions 33 --model-format pytorch --quantization ${quantization} -Model Spec 4 (ggufv2, 1_3 Billion) +Model Spec 5 (ggufv2, 1_3 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -74,7 +89,7 @@ chosen quantization method from the options listed above:: xinference launch --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format ggufv2 --quantization ${quantization} -Model Spec 5 (ggufv2, 6_7 Billion) +Model Spec 6 (ggufv2, 6_7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -89,7 +104,22 @@ chosen quantization method from the options listed above:: xinference launch --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format ggufv2 --quantization ${quantization} -Model Spec 6 (ggufv2, 33 Billion) +Model Spec 7 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Model ID:** LoneStriker/deepseek-coder-7b-instruct-v1.5-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/LoneStriker/deepseek-coder-7b-instruct-v1.5-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder-instruct --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 8 (ggufv2, 33 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -103,3 +133,93 @@ chosen quantization method from the options listed above:: xinference launch --model-name deepseek-coder-instruct --size-in-billions 33 --model-format ggufv2 --quantization ${quantization} + +Model Spec 9 (gptq, 1_3 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 1_3 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-1.3b-instruct-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-instruct-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format gptq --quantization ${quantization} + + +Model Spec 10 (gptq, 6_7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 6_7 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-6.7B-instruct-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-instruct-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format gptq --quantization ${quantization} + + +Model Spec 11 (gptq, 33 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 33 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-33B-instruct-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder-instruct --size-in-billions 33 --model-format gptq --quantization ${quantization} + + +Model Spec 12 (awq, 1_3 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 1_3 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-1.3b-instruct-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-instruct-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format awq --quantization ${quantization} + + +Model Spec 13 (awq, 6_7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 6_7 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-6.7B-instruct-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-instruct-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format awq --quantization ${quantization} + + +Model Spec 14 (awq, 33 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 33 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-33B-instruct-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder-instruct --size-in-billions 33 --model-format awq --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/deepseek-coder.rst b/doc/source/models/builtin/llm/deepseek-coder.rst new file mode 100644 index 0000000000..45dc6470f9 --- /dev/null +++ b/doc/source/models/builtin/llm/deepseek-coder.rst @@ -0,0 +1,225 @@ +.. _models_llm_deepseek-coder: + +======================================== +deepseek-coder +======================================== + +- **Context Length:** 16384 +- **Model Name:** deepseek-coder +- **Languages:** en, zh +- **Abilities:** generate +- **Description:** Deepseek Coder is composed of a series of code language models, each trained from scratch on 2T tokens, with a composition of 87% code and 13% natural language in both English and Chinese. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 1_3 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 1_3 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** deepseek-ai/deepseek-coder-1.3b-base +- **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-1.3b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-coder-1.3b-base>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 1_3 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 6_7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 6_7 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** deepseek-ai/deepseek-coder-6.7b-base +- **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-coder-6.7b-base>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 6_7 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** deepseek-ai/deepseek-coder-7b-base-v1.5 +- **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-7b-base-v1.5>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 4 (pytorch, 33 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 33 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** deepseek-ai/deepseek-coder-33b-base +- **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-33b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-coder-33b-base>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 33 --model-format pytorch --quantization ${quantization} + + +Model Spec 5 (ggufv2, 1_3 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 1_3 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Model ID:** TheBloke/deepseek-coder-1.3b-base-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-base-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 1_3 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 6 (ggufv2, 6_7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 6_7 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Model ID:** TheBloke/deepseek-coder-6.7B-base-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-base-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 6_7 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 7 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Model ID:** dagbs/deepseek-coder-7b-base-v1.5-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/dagbs/deepseek-coder-7b-base-v1.5-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 8 (ggufv2, 33 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 33 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Model ID:** TheBloke/deepseek-coder-33B-base-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-base-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 33 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 9 (gptq, 1_3 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 1_3 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-1.3b-base-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-base-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 1_3 --model-format gptq --quantization ${quantization} + + +Model Spec 10 (gptq, 6_7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 6_7 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-6.7B-base-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-base-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 6_7 --model-format gptq --quantization ${quantization} + + +Model Spec 11 (gptq, 33 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 33 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-33B-base-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-base-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 33 --model-format gptq --quantization ${quantization} + + +Model Spec 12 (awq, 1_3 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 1_3 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-1.3b-base-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-base-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 1_3 --model-format awq --quantization ${quantization} + + +Model Spec 13 (awq, 6_7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 6_7 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-6.7B-base-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-base-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 6_7 --model-format awq --quantization ${quantization} + + +Model Spec 14 (awq, 33 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 33 +- **Quantizations:** Int4 +- **Model ID:** TheBloke/deepseek-coder-33B-base-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-base-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek-coder --size-in-billions 33 --model-format awq --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/deepseek.rst b/doc/source/models/builtin/llm/deepseek.rst new file mode 100644 index 0000000000..7a4bb8bbd3 --- /dev/null +++ b/doc/source/models/builtin/llm/deepseek.rst @@ -0,0 +1,75 @@ +.. _models_llm_deepseek: + +======================================== +deepseek +======================================== + +- **Context Length:** 4096 +- **Model Name:** deepseek +- **Languages:** en, zh +- **Abilities:** generate +- **Description:** DeepSeek LLM, trained from scratch on a vast dataset of 2 trillion tokens in both English and Chinese. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** deepseek-ai/deepseek-llm-7b-base +- **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-llm-7b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-llm-7b-base>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 67 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 67 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** deepseek-ai/deepseek-llm-67b-base +- **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-llm-67b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-llm-67b-base>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek --size-in-billions 67 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Model ID:** TheBloke/deepseek-llm-7B-chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-llm-7B-chat-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 4 (ggufv2, 67 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 67 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Model ID:** TheBloke/deepseek-llm-67b-chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-llm-67b-chat-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name deepseek --size-in-billions 67 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 030eb69797..4a3b58fb06 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -121,14 +121,24 @@ The following is a list of built-in LLM in Xinference: - 8194 - CodeShell is a multi-language code LLM developed by the Knowledge Computing Lab of Peking University. + * - :ref:`deepseek <models_llm_deepseek>` + - generate + - 4096 + - DeepSeek LLM, trained from scratch on a vast dataset of 2 trillion tokens in both English and Chinese. + * - :ref:`deepseek-chat <models_llm_deepseek-chat>` - chat - 4096 - DeepSeek LLM is an advanced language model comprising 67 billion parameters. It has been trained from scratch on a vast dataset of 2 trillion tokens in both English and Chinese. + * - :ref:`deepseek-coder <models_llm_deepseek-coder>` + - generate + - 16384 + - Deepseek Coder is composed of a series of code language models, each trained from scratch on 2T tokens, with a composition of 87% code and 13% natural language in both English and Chinese. + * - :ref:`deepseek-coder-instruct <models_llm_deepseek-coder-instruct>` - chat - - 4096 + - 16384 - deepseek-coder-instruct is a model initialized from deepseek-coder-base and fine-tuned on 2B tokens of instruction data. * - :ref:`deepseek-vl-chat <models_llm_deepseek-vl-chat>` @@ -518,8 +528,12 @@ The following is a list of built-in LLM in Xinference: codeshell-chat + deepseek + deepseek-chat + deepseek-coder + deepseek-coder-instruct deepseek-vl-chat diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 477e6f4e2f..764dfaba56 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -52,13 +52,13 @@ Currently, supported model includes: - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` +- ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` - ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` - ``qwen-chat`` - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` -- ``deepseek-chat``, ``deepseek-coder-instruct`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``codeqwen1.5-chat`` - ``gemma-it`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 02981c3838..2246b6cd37 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -4335,6 +4335,83 @@ ] } }, + { + "version": 1, + "context_length": 4096, + "model_name": "deepseek", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "generate" + ], + "model_description": "DeepSeek LLM, trained from scratch on a vast dataset of 2 trillion tokens in both English and Chinese. ", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-llm-7b-base", + "model_revision": "7683fea62db869066ddaff6a41d032262c490d4f" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 67, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-llm-67b-base", + "model_revision": "c3f813a1121c95488a20132d3a4da89f4a46452f" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "TheBloke/deepseek-llm-7B-chat-GGUF", + "model_file_name_template": "deepseek-llm-7b-chat.{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 67, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "TheBloke/deepseek-llm-67b-chat-GGUF", + "model_file_name_template": "deepseek-llm-67b-chat.{quantization}.gguf" + } + ] + }, { "version": 1, "context_length": 4096, @@ -4427,7 +4504,199 @@ }, { "version": 1, - "context_length": 4096, + "context_length": 16384, + "model_name": "deepseek-coder", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "generate" + ], + "model_description": "Deepseek Coder is composed of a series of code language models, each trained from scratch on 2T tokens, with a composition of 87% code and 13% natural language in both English and Chinese. ", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "1_3", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-coder-1.3b-base", + "model_revision": "c919139c3a9b4070729c8b2cca4847ab29ca8d94" + }, + { + "model_format": "pytorch", + "model_size_in_billions": "6_7", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-coder-6.7b-base", + "model_revision": "ce2207a8bfef3ee92bd7dd4cc31c52cfa0046912" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-coder-7b-base-v1.5", + "model_revision": "98f0904cee2237e235f10408ae12292037b21dac" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 33, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-coder-33b-base", + "model_revision": "45c85cadf3720ef3e85a492e24fd4b8c5d21d8ac" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": "1_3", + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "TheBloke/deepseek-coder-1.3b-base-GGUF", + "model_file_name_template": "deepseek-coder-1.3b-base.{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": "6_7", + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "TheBloke/deepseek-coder-6.7B-base-GGUF", + "model_file_name_template": "deepseek-coder-6.7b-base.{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "dagbs/deepseek-coder-7b-base-v1.5-GGUF", + "model_file_name_template": "deepseek-coder-7b-base-v1.5.{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 33, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "TheBloke/deepseek-coder-33B-base-GGUF", + "model_file_name_template": "deepseek-coder-33b-base.{quantization}.gguf" + }, + { + "model_format": "gptq", + "model_size_in_billions": "1_3", + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-1.3b-base-GPTQ", + "model_revision": "a5bf3b76d70cda53327311a631b1003024d5de29" + }, + { + "model_format": "gptq", + "model_size_in_billions": "6_7", + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-6.7B-base-GPTQ", + "model_revision": "6476ea3d6e623a1313d363dbc6e172773e031bb1" + }, + { + "model_format": "gptq", + "model_size_in_billions": 33, + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-33B-base-GPTQ", + "model_revision": "f527d7325e463a5cb091d044e4f2b15902674a70" + }, + { + "model_format": "awq", + "model_size_in_billions": "1_3", + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-1.3b-base-AWQ", + "model_revision": "ffb66f1a2a194401b4f29025edcd261d7f0a08a7" + }, + { + "model_format": "awq", + "model_size_in_billions": "6_7", + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-6.7B-base-AWQ", + "model_revision": "e3d4bdf39712665f5e9d5c05c9df6f20fe1e2d5a" + }, + { + "model_format": "awq", + "model_size_in_billions": 33, + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-33B-base-AWQ", + "model_revision": "c7edb2d5868d61a5dcf2591933a8992c8cbe3ef4" + } + ] + }, + { + "version": 1, + "context_length": 16384, "model_name": "deepseek-coder-instruct", "model_lang": [ "en", @@ -4460,6 +4729,17 @@ "model_id": "deepseek-ai/deepseek-coder-6.7b-instruct", "model_revision": "cbb77d7448ea3168d884758817e7f895e3828d1c" }, + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-coder-7b-instruct-v1.5", + "model_revision": "2a050a4c59d687a85324d32e147517992117ed30" + }, { "model_format": "pytorch", "model_size_in_billions": 33, @@ -4511,6 +4791,25 @@ "model_id": "TheBloke/deepseek-coder-6.7B-instruct-GGUF", "model_file_name_template": "deepseek-coder-6.7b-instruct.{quantization}.gguf" }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "LoneStriker/deepseek-coder-7b-instruct-v1.5-GGUF", + "model_file_name_template": "deepseek-coder-7b-instruct-v1.5-{quantization}.gguf" + }, { "model_format": "ggufv2", "model_size_in_billions": 33, @@ -4530,6 +4829,60 @@ ], "model_id": "TheBloke/deepseek-coder-33B-instruct-GGUF", "model_file_name_template": "deepseek-coder-33b-instruct.{quantization}.gguf" + }, + { + "model_format": "gptq", + "model_size_in_billions": "1_3", + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-1.3b-instruct-GPTQ", + "model_revision": "9c002e9af6cbdf3bd9244e2d7264b6a35d1dcacf" + }, + { + "model_format": "gptq", + "model_size_in_billions": "6_7", + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-6.7B-instruct-GPTQ", + "model_revision": "13ccea6e3a43dcfdcb655d92097610018b431a17" + }, + { + "model_format": "gptq", + "model_size_in_billions": 33, + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-33B-instruct-GPTQ", + "model_revision": "08372729d98dfc248f9531a412fe69e14e607027" + }, + { + "model_format": "awq", + "model_size_in_billions": "1_3", + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-1.3b-instruct-AWQ", + "model_revision": "a2a484da6e4146d055316a9a63cf5b13955715a4" + }, + { + "model_format": "awq", + "model_size_in_billions": "6_7", + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-6.7B-instruct-AWQ", + "model_revision": "502ae3e19e57ae78dc30a791ba33c565da72dc62" + }, + { + "model_format": "awq", + "model_size_in_billions": 33, + "quantizations": [ + "Int4" + ], + "model_id": "TheBloke/deepseek-coder-33B-instruct-AWQ", + "model_revision": "c40b499bac2712cd3c445cf1b05d2c6558ab0d29" } ], "prompt_style": { diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 149391d717..be0925f4ef 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2548,6 +2548,43 @@ ] } }, + { + "version": 1, + "context_length": 4096, + "model_name": "deepseek", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "generate" + ], + "model_description": "DDeepSeek LLM, trained from scratch on a vast dataset of 2 trillion tokens in both English and Chinese. ", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-llm-7b-base", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 67, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-llm-67b-base", + "model_hub": "modelscope" + } + ] + }, { "version": 1, "context_length": 4096, @@ -2600,7 +2637,55 @@ }, { "version": 1, - "context_length": 4096, + "context_length": 16384, + "model_name": "deepseek-coder", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "generate" + ], + "model_description": "Deepseek Coder is composed of a series of code language models, each trained from scratch on 2T tokens, with a composition of 87% code and 13% natural language in both English and Chinese.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "1_3", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-coder-1.3b-base", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": "6_7", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-coder-6.7b-base", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 33, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "deepseek-ai/deepseek-coder-33b-base", + "model_hub": "modelscope" + } + ] + }, + { + "version": 1, + "context_length": 16384, "model_name": "deepseek-coder-instruct", "model_lang": [ "en", diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 99b7772a46..9e7814d518 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -97,6 +97,8 @@ class VLLMGenerateConfig(TypedDict, total=False): "Yi-1.5", "code-llama", "code-llama-python", + "deepseek", + "deepseek-coder", ] VLLM_SUPPORTED_CHAT_MODELS = [ "llama-2-chat", From aa6a60d58ac0dbc2c39dd2f55dfa0a360fcf0003 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 23 May 2024 12:08:22 +0800 Subject: [PATCH 094/298] FEAT: add codeqwen1.5 (#1535) --- doc/source/getting_started/installation.rst | 2 +- doc/source/models/builtin/llm/codeqwen1.5.rst | 30 +++++++++++++++++++ doc/source/models/builtin/llm/index.rst | 7 +++++ doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 25 ++++++++++++++++ .../model/llm/llm_family_modelscope.json | 26 ++++++++++++++++ xinference/model/llm/vllm/core.py | 1 + 7 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 doc/source/models/builtin/llm/codeqwen1.5.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 94dc3b731c..348fdf54b4 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -46,6 +46,7 @@ Currently, supported models include: - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` +- ``codeqwen1.5``, ``codeqwen1.5-chat`` - ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` @@ -53,7 +54,6 @@ Currently, supported models include: - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` -- ``codeqwen1.5-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` .. vllm_end diff --git a/doc/source/models/builtin/llm/codeqwen1.5.rst b/doc/source/models/builtin/llm/codeqwen1.5.rst new file mode 100644 index 0000000000..04e42f0afc --- /dev/null +++ b/doc/source/models/builtin/llm/codeqwen1.5.rst @@ -0,0 +1,30 @@ +.. _models_llm_codeqwen1.5: + +======================================== +codeqwen1.5 +======================================== + +- **Context Length:** 65536 +- **Model Name:** codeqwen1.5 +- **Languages:** en, zh +- **Abilities:** generate +- **Description:** CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit, 8-bit, none +- **Model ID:** Qwen/CodeQwen1.5-7B +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/CodeQwen1.5-7B>`__, `ModelScope <https://modelscope.cn/models/qwen/CodeQwen1.5-7B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name codeqwen1.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 4a3b58fb06..de5d967897 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -106,6 +106,11 @@ The following is a list of built-in LLM in Xinference: - 100000 - Code-Llama-Python is a fine-tuned version of the Code-Llama LLM, specializing in Python. + * - :ref:`codeqwen1.5 <models_llm_codeqwen1.5>` + - generate + - 65536 + - CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes. + * - :ref:`codeqwen1.5-chat <models_llm_codeqwen1.5-chat>` - chat - 65536 @@ -522,6 +527,8 @@ The following is a list of built-in LLM in Xinference: code-llama-python + codeqwen1.5 + codeqwen1.5-chat codeshell diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 764dfaba56..0754b44903 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -53,6 +53,7 @@ Currently, supported model includes: - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` +- ``codeqwen1.5``, ``codeqwen1.5-chat`` - ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` @@ -60,7 +61,6 @@ Currently, supported model includes: - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` -- ``codeqwen1.5-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` .. vllm_end diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 2246b6cd37..ee0b56aaa9 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -2198,6 +2198,31 @@ ] } }, + { + "version": 1, + "context_length": 65536, + "model_name": "codeqwen1.5", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "generate" + ], + "model_description": "CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/CodeQwen1.5-7B" + } + ] + }, { "version": 1, "context_length": 65536, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index be0925f4ef..141a710a10 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2430,6 +2430,32 @@ ] } }, + { + "version": 1, + "context_length": 65536, + "model_name": "codeqwen1.5", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "generate" + ], + "model_description": "CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "qwen/CodeQwen1.5-7B", + "model_hub": "modelscope" + } + ] + }, { "version": 1, "context_length": 65536, diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 9e7814d518..39a9d6449b 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -127,6 +127,7 @@ class VLLMGenerateConfig(TypedDict, total=False): ] if VLLM_INSTALLED and vllm.__version__ >= "0.3.0": VLLM_SUPPORTED_CHAT_MODELS.append("qwen1.5-chat") + VLLM_SUPPORTED_MODELS.append("codeqwen1.5") VLLM_SUPPORTED_CHAT_MODELS.append("codeqwen1.5-chat") if VLLM_INSTALLED and vllm.__version__ >= "0.3.2": From 263a1152d243d873ec52ef60e7fda02a1cb83293 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 23 May 2024 12:09:01 +0800 Subject: [PATCH 095/298] BLD: compatible with torch 2.3.0 (#1534) --- setup.cfg | 10 +++++----- xinference/deploy/docker/cpu.Dockerfile | 2 +- xinference/thirdparty/omnilmm/chat.py | 11 ++++++----- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/setup.cfg b/setup.cfg index 824e7b5316..aec7b6dd0b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -25,7 +25,7 @@ include_package_data = True packages = find: install_requires = xoscar>=0.3.0 - torch<2.3.0 + torch gradio>=3.39.0 typer[all]<0.12.0 # fix typer required by gradio pillow @@ -85,7 +85,7 @@ all = chatglm-cpp>=0.3.0 llama-cpp-python>=0.2.25,!=0.2.58 transformers>=4.34.1 - torch<2.3.0 + torch accelerate>=0.27.2 sentencepiece transformers_stream_generator @@ -94,7 +94,7 @@ all = einops tiktoken sentence-transformers>=2.3.1 - vllm>=0.2.6,<0.4.2 ; sys_platform=='linux' + vllm>=0.2.6 ; sys_platform=='linux' diffusers controlnet_aux orjson @@ -115,7 +115,7 @@ ggml = chatglm-cpp>=0.3.0 transformers = transformers>=4.34.1 - torch<2.3.0 + torch accelerate>=0.27.2 sentencepiece transformers_stream_generator @@ -131,7 +131,7 @@ transformers = torchvision # For deepseek VL peft vllm = - vllm>=0.2.6,<0.4.2 + vllm>=0.2.6 sglang = sglang[all] embedding = diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index 94d6cdac8d..5185781910 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -19,7 +19,7 @@ ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ - pip install "torch<2.3.0" torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ pip install -i "$PIP_INDEX" \ "xoscar>=0.3.0" \ "gradio>=3.39.0" \ diff --git a/xinference/thirdparty/omnilmm/chat.py b/xinference/thirdparty/omnilmm/chat.py index 7676ccb637..1505debaf5 100644 --- a/xinference/thirdparty/omnilmm/chat.py +++ b/xinference/thirdparty/omnilmm/chat.py @@ -7,11 +7,6 @@ from PIL import Image from transformers import AutoModel, AutoTokenizer -from .model.omnilmm import OmniLMMForCausalLM -from .model.utils import build_transform -from .train.train_utils import omni_preprocess -from .utils import disable_torch_init - DEFAULT_IMAGE_TOKEN = "<image>" DEFAULT_IMAGE_PATCH_TOKEN = "<im_patch>" DEFAULT_IM_START_TOKEN = "<im_start>" @@ -21,6 +16,10 @@ def init_omni_lmm(model_path, device_map): from accelerate import init_empty_weights, load_checkpoint_and_dispatch + from .model.omnilmm import OmniLMMForCausalLM + from .model.utils import build_transform + from .utils import disable_torch_init + torch.backends.cuda.matmul.allow_tf32 = True disable_torch_init() model_name = os.path.expanduser(model_path) @@ -98,6 +97,8 @@ def expand_question_into_multimodal( def wrap_question_for_omni_lmm(question, image_token_len, tokenizer): + from .train.train_utils import omni_preprocess + question = expand_question_into_multimodal( question, image_token_len, From 7c6465cbffcf238d03d587791f4adad10996f849 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 24 May 2024 05:54:53 +0200 Subject: [PATCH 096/298] BUG: Fix start worker failed due to None device name (#1539) Co-authored-by: qinxuye <qinxuye@gmail.com> --- .github/workflows/python.yaml | 2 +- xinference/core/worker.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index d81597406e..6380c9457a 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -47,7 +47,7 @@ jobs: - name: mypy run: pip install mypy && mypy --install-types --non-interactive xinference - name: codespell - run: pip install codespell && codespell xinference + run: pip install codespell && codespell --ignore-words-list thirdparty xinference - name: Set up Node.js uses: actions/setup-node@v1 with: diff --git a/xinference/core/worker.py b/xinference/core/worker.py index dc623f43f4..7d316a25e8 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -456,7 +456,7 @@ async def _create_subpool( ) -> Tuple[str, List[str]]: env = {} devices = [] - env_name = get_available_device_env_name() + env_name = get_available_device_env_name() or "CUDA_VISIBLE_DEVICES" if gpu_idx is None: if isinstance(n_gpu, int) or (n_gpu == "auto" and gpu_count() > 0): # Currently, n_gpu=auto means using 1 GPU From d4c4fa91c0da662c731cc620b0ead75d8686f0a4 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 24 May 2024 08:09:58 +0200 Subject: [PATCH 097/298] FEAT: Auto detect rerank type for unknown rerank type (#1538) Co-authored-by: qinxuye <qinxuye@gmail.com> --- xinference/model/rerank/core.py | 24 +++++++++++++++++++- xinference/model/rerank/tests/test_rerank.py | 15 ++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index 4069918e51..b9b4b3c4b8 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -46,7 +46,7 @@ def get_rerank_model_descriptions(): class RerankModelSpec(CacheableModelSpec): model_name: str language: List[str] - type: Optional[str] = "normal" + type: Optional[str] = "unknown" model_id: str model_revision: Optional[str] model_hub: str = "huggingface" @@ -118,6 +118,28 @@ def __init__( self._use_fp16 = use_fp16 self._model = None self._counter = 0 + if model_spec.type == "unknown": + model_spec.type = self._auto_detect_type(model_path) + + @staticmethod + def _auto_detect_type(model_path): + """This method may not be stable due to the fact that the tokenizer name may be changed. + Therefore, we only use this method for unknown model types.""" + from transformers import AutoTokenizer + + type_mapper = { + "LlamaTokenizerFast": "LLM-based layerwise", + "GemmaTokenizerFast": "LLM-based", + "XLMRobertaTokenizerFast": "normal", + } + + tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) + rerank_type = type_mapper.get(type(tokenizer).__name__) + if rerank_type is None: + raise Exception( + f"Can't determine the rerank type based on the tokenizer {tokenizer}" + ) + return rerank_type def load(self): if self._model_spec.type == "normal": diff --git a/xinference/model/rerank/tests/test_rerank.py b/xinference/model/rerank/tests/test_rerank.py index dc06624421..aa6ac848bd 100644 --- a/xinference/model/rerank/tests/test_rerank.py +++ b/xinference/model/rerank/tests/test_rerank.py @@ -11,6 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import json import os import shutil import tempfile @@ -126,3 +127,17 @@ def test_register_custom_rerank(): unregister_rerank("custom_test_d") shutil.rmtree(tmp_dir, ignore_errors=True) + + +def test_auto_detect_type(): + from ..core import RerankModel + + rerank_model_json = os.path.join(os.path.dirname(__file__), "../model_spec.json") + with open(rerank_model_json, "r") as f: + rerank_models = json.load(f) + for m in rerank_models: + try: + assert m["type"] == RerankModel._auto_detect_type(m["model_id"]) + except EnvironmentError: + # gated repo, ignore + continue From c3925ace5d0f9c9976b2fa62a2844576c9f442ff Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 24 May 2024 15:08:01 +0800 Subject: [PATCH 098/298] ENH: convert command-r to chat (#1537) --- doc/source/getting_started/installation.rst | 2 +- .../models/builtin/llm/c4ai-command-r-v01.rst | 4 +- doc/source/models/builtin/llm/index.rst | 4 +- doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 36 +++++++++++++++-- .../model/llm/llm_family_modelscope.json | 39 ++++++++++++++++--- xinference/model/llm/utils.py | 13 +++++++ xinference/model/llm/vllm/core.py | 4 +- 8 files changed, 87 insertions(+), 17 deletions(-) diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 348fdf54b4..701765f03f 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -47,7 +47,6 @@ Currently, supported models include: - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` - ``codeqwen1.5``, ``codeqwen1.5-chat`` -- ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` - ``qwen-chat`` @@ -56,6 +55,7 @@ Currently, supported models include: - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` +- ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` .. vllm_end To install Xinference and vLLM:: diff --git a/doc/source/models/builtin/llm/c4ai-command-r-v01.rst b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst index 6855cce193..5b5d82979a 100644 --- a/doc/source/models/builtin/llm/c4ai-command-r-v01.rst +++ b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst @@ -7,8 +7,8 @@ c4ai-command-r-v01 - **Context Length:** 131072 - **Model Name:** c4ai-command-r-v01 - **Languages:** en, fr, de, es, it, pt, ja, ko, zh, ar -- **Abilities:** generate -- **Description:** C4AI Command-R is a research release of a 35 billion parameter highly performant generative model. +- **Abilities:** chat +- **Description:** C4AI Command-R(+) is a research release of a 35 and 104 billion parameter highly performant generative model. Specifications ^^^^^^^^^^^^^^ diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index de5d967897..834550a2c3 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -52,9 +52,9 @@ The following is a list of built-in LLM in Xinference: - Baichuan-chat is a fine-tuned version of the Baichuan LLM, specializing in chatting. * - :ref:`c4ai-command-r-v01 <models_llm_c4ai-command-r-v01>` - - generate + - chat - 131072 - - C4AI Command-R is a research release of a 35 billion parameter highly performant generative model. + - C4AI Command-R(+) is a research release of a 35 and 104 billion parameter highly performant generative model. * - :ref:`c4ai-command-r-v01-4bit <models_llm_c4ai-command-r-v01-4bit>` - generate diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 0754b44903..afa09a939f 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -54,7 +54,6 @@ Currently, supported model includes: - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` - ``codeqwen1.5``, ``codeqwen1.5-chat`` -- ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` - ``qwen-chat`` @@ -63,6 +62,7 @@ Currently, supported model includes: - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` +- ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` .. vllm_end SGLang diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index ee0b56aaa9..7fe56efc27 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -5833,9 +5833,9 @@ "ar" ], "model_ability": [ - "generate" + "chat" ], - "model_description": "C4AI Command-R is a research release of a 35 billion parameter highly performant generative model.", + "model_description": "C4AI Command-R(+) is a research release of a 35 and 104 billion parameter highly performant generative model.", "model_specs": [ { "model_format": "pytorch", @@ -5884,7 +5884,21 @@ "model_id": "alpindale/c4ai-command-r-plus-GPTQ", "model_revision": "35febfc08f723ac0df32480eb4af349a7d08656e" } - ] + ], + "prompt_style": { + "style_name": "c4ai-command-r", + "system_prompt": "You are Command-R, a brilliant, sophisticated, AI-assistant trained to assist human users by providing thorough responses. You are trained by Cohere.", + "roles": [ + "<|USER_TOKEN|>", + "<|CHATBOT_TOKEN|>" + ], + "intra_message_sep": "", + "inter_message_sep": "<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|>", + "stop_token_ids": [ + 6, + 255001 + ] + } }, { "version": 1, @@ -5925,7 +5939,21 @@ "model_id": "CohereForAI/c4ai-command-r-plus-4bit", "model_revision": "bb63b5b7005ecedb30b0cfd0d5953b02a5817f7b" } - ] + ], + "prompt_style": { + "style_name": "c4ai-command-r", + "system_prompt": "You are Command-R, a brilliant, sophisticated, AI-assistant trained to assist human users by providing thorough responses. You are trained by Cohere.", + "roles": [ + "<|USER_TOKEN|>", + "<|CHATBOT_TOKEN|>" + ], + "intra_message_sep": "", + "inter_message_sep": "<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|>", + "stop_token_ids": [ + 6, + 255001 + ] + } }, { "version": 1, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 141a710a10..0996824f00 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3500,7 +3500,7 @@ "ar" ], "model_ability": [ - "generate" + "chat" ], "model_description": "C4AI Command-R is a research release of a 35 billion parameter highly performant generative model.", "model_specs": [ @@ -3519,11 +3519,12 @@ "model_size_in_billions": 35, "quantizations": [ "Q2_K", + "Q3_K_M", "Q4_K_M", "Q5_K_M" ], "model_id": "mirror013/C4AI-Command-R-v01-GGUF", - "model_file_name_template": "c4ai-command-r-v01.{quantization}.gguf", + "model_file_name_template": "c4ai-command-r-v01-{quantization}.gguf", "model_hub": "modelscope", "model_revision": "master" }, @@ -3537,7 +3538,21 @@ "model_id": "AI-ModelScope/c4ai-command-r-plus", "model_revision": "master" } - ] + ], + "prompt_style": { + "style_name": "c4ai-command-r", + "system_prompt": "You are Command-R, a brilliant, sophisticated, AI-assistant trained to assist human users by providing thorough responses. You are trained by Cohere.", + "roles": [ + "<|USER_TOKEN|>", + "<|CHATBOT_TOKEN|>" + ], + "intra_message_sep": "", + "inter_message_sep": "<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|>", + "stop_token_ids": [ + 6, + 255001 + ] + } }, { "version": 1, @@ -3556,7 +3571,7 @@ "ar" ], "model_ability": [ - "generate" + "chat" ], "model_description": "This model is 4bit quantized version of C4AI Command-R using bitsandbytes.", "model_specs": [ @@ -3570,7 +3585,21 @@ "model_id": "mirror013/c4ai-command-r-v01-4bit", "model_revision": "master" } - ] + ], + "prompt_style": { + "style_name": "c4ai-command-r", + "system_prompt": "You are Command-R, a brilliant, sophisticated, AI-assistant trained to assist human users by providing thorough responses. You are trained by Cohere.", + "roles": [ + "<|USER_TOKEN|>", + "<|CHATBOT_TOKEN|>" + ], + "intra_message_sep": "", + "inter_message_sep": "<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|>", + "stop_token_ids": [ + 6, + 255001 + ] + } }, { "version": 1, diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 2cb97ba2f1..636c3fc973 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -456,6 +456,19 @@ def get_role(role_name: str): ret += f"<|{role}|>{prompt_style.intra_message_sep}" ret += "<|assistant|>\n" return ret + elif prompt_style.style_name == "c4ai-command-r": + ret = ( + f"<BOS_TOKEN><|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>" + f"{prompt_style.system_prompt}{prompt_style.inter_message_sep}" + ) + for i, message in enumerate(chat_history): + role = get_role(message["role"]) + content = message["content"] + if content: + ret += f"{role}{content}{prompt_style.inter_message_sep}" + else: + ret += role + return ret else: raise ValueError(f"Invalid prompt style: {prompt_style.style_name}") diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 39a9d6449b..2e657d0d4d 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -139,8 +139,8 @@ class VLLMGenerateConfig(TypedDict, total=False): if VLLM_INSTALLED and vllm.__version__ >= "0.4.0": VLLM_SUPPORTED_CHAT_MODELS.append("qwen1.5-moe-chat") - VLLM_SUPPORTED_MODELS.append("c4ai-command-r-v01") - VLLM_SUPPORTED_MODELS.append("c4ai-command-r-v01-4bit") + VLLM_SUPPORTED_CHAT_MODELS.append("c4ai-command-r-v01") + VLLM_SUPPORTED_CHAT_MODELS.append("c4ai-command-r-v01-4bit") class VLLMModel(LLM): From 9d818a41e72721a0c2e6977ad0ea3bcee76e1308 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 24 May 2024 15:10:34 +0800 Subject: [PATCH 099/298] BUG: Fix gpu_idx allocate error when set replica > 1 (#1528) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/api/restful_api.py | 9 +++++++++ xinference/core/supervisor.py | 5 +++-- xinference/core/utils.py | 12 ++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index aa779ae63f..de56f7cc18 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -688,6 +688,15 @@ async def launch_model( detail="Invalid input. Please specify the `model_engine` field.", ) + if isinstance(gpu_idx, int): + gpu_idx = [gpu_idx] + if gpu_idx: + if len(gpu_idx) % replica: + raise HTTPException( + status_code=400, + detail="Invalid input. Allocated gpu must be a multiple of replica.", + ) + if peft_model_config is not None: peft_model_config = PeftModelConfig.from_dict(peft_model_config) else: diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 6352e0aee2..420b8e8da3 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -34,6 +34,7 @@ from .metrics import record_metrics from .resource import GPUStatus, ResourceStatus from .utils import ( + assign_replica_gpu, build_replica_model_uid, gen_random_string, is_valid_model_uid, @@ -769,7 +770,7 @@ async def _launch_one_model(_replica_model_uid): raise ValueError( f"Model is already in the model list, uid: {_replica_model_uid}" ) - + replica_gpu_idx = assign_replica_gpu(_replica_model_uid, gpu_idx) nonlocal model_type worker_ref = ( target_ip_worker_ref @@ -789,7 +790,7 @@ async def _launch_one_model(_replica_model_uid): n_gpu=n_gpu, request_limits=request_limits, peft_model_config=peft_model_config, - gpu_idx=gpu_idx, + gpu_idx=replica_gpu_idx, **kwargs, ) self._replica_model_uid_to_worker[_replica_model_uid] = worker_ref diff --git a/xinference/core/utils.py b/xinference/core/utils.py index 0a121f4769..a110278aea 100644 --- a/xinference/core/utils.py +++ b/xinference/core/utils.py @@ -191,3 +191,15 @@ def get_nvidia_gpu_info() -> Dict: nvmlShutdown() except: pass + + +def assign_replica_gpu( + _replica_model_uid: str, gpu_idx: Union[int, List[int]] +) -> List[int]: + model_uid, replica, rep_id = parse_replica_model_uid(_replica_model_uid) + rep_id, replica = int(rep_id), int(replica) + if isinstance(gpu_idx, int): + gpu_idx = [gpu_idx] + if isinstance(gpu_idx, list) and gpu_idx: + return gpu_idx[rep_id::replica] + return gpu_idx From 27643def98ad7bfec8fcdff9d26925f1514b4ef4 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 24 May 2024 16:45:03 +0800 Subject: [PATCH 100/298] ENH: Support Intern-VL-Chat model (#1536) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/model/llm/__init__.py | 2 + xinference/model/llm/llm_family.json | 91 +++- .../model/llm/llm_family_modelscope.json | 53 ++- xinference/model/llm/pytorch/core.py | 2 + xinference/model/llm/pytorch/intern_vl.py | 387 ++++++++++++++++++ 5 files changed, 533 insertions(+), 2 deletions(-) create mode 100644 xinference/model/llm/pytorch/intern_vl.py diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 944311a0e8..196d7fd686 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -116,6 +116,7 @@ def _install(): from .pytorch.core import PytorchChatModel, PytorchModel from .pytorch.deepseek_vl import DeepSeekVLChatModel from .pytorch.falcon import FalconPytorchChatModel, FalconPytorchModel + from .pytorch.intern_vl import InternVLChatModel from .pytorch.internlm2 import Internlm2PytorchChatModel from .pytorch.llama_2 import LlamaPytorchChatModel, LlamaPytorchModel from .pytorch.qwen_vl import QwenVLChatModel @@ -156,6 +157,7 @@ def _install(): QwenVLChatModel, YiVLChatModel, DeepSeekVLChatModel, + InternVLChatModel, PytorchModel, ] ) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 7fe56efc27..110d7c3fe4 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -5994,5 +5994,94 @@ 32000 ] } - } + }, + { + "version": 1, + "context_length": 32768, + "model_name": "internvl-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. ", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 26, + "quantizations": [ + "none" + ], + "model_id": "OpenGVLab/InternVL-Chat-V1-5", + "model_revision": "e822119e5806946ce128043023a73d715ecabf8d" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 26, + "quantizations": [ + "Int8" + ], + "model_id": "OpenGVLab/InternVL-Chat-V1-5-{quantization}", + "model_revision": "acaaed06937c603ab04f084216ecb0268160f538" + } + ], + "prompt_style": { + "style_name": "INTERNLM2", + "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "stop_token_ids": [ + 92542 + ], + "stop": [ + "<|im_end|>" + ] + } +}, + { + "version": 1, + "context_length": 32768, + "model_name": "mini-internvl-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. ", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 2, + "quantizations": [ + "none" + ], + "model_id": "OpenGVLab/Mini-InternVL-Chat-2B-V1-5", + "model_revision": "ce3f67acff17281bacbf4b156f402a0580fb9605" + } + ], + "prompt_style": { + "style_name": "INTERNLM2", + "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "stop_token_ids": [ + 92542 + ], + "stop": [ + "<|im_end|>" + ] + } +} ] diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 0996824f00..3bae8fe5e0 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3688,5 +3688,56 @@ "<|end|>" ] } - } + }, + { + "version": 1, + "context_length": 32768, + "model_name": "internvl-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. ", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 26, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + "model_id": "AI-ModelScope/InternVL-Chat-V1-5", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 26, + "quantizations": [ + "Int8" + ], + "model_hub": "modelscope", + "model_id": "AI-ModelScope/InternVL-Chat-V1-5-{quantization}", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "INTERNLM2", + "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "stop_token_ids": [ + 92542 + ], + "stop": [ + "<|im_end|>" + ] + } +} ] diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 8760fc0c67..fb43d65c9f 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -60,6 +60,8 @@ "OmniLMM", "yi-vl-chat", "deepseek-vl-chat", + "internvl-chat", + "mini-internvl-chat", ] diff --git a/xinference/model/llm/pytorch/intern_vl.py b/xinference/model/llm/pytorch/intern_vl.py new file mode 100644 index 0000000000..b76899b0be --- /dev/null +++ b/xinference/model/llm/pytorch/intern_vl.py @@ -0,0 +1,387 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import base64 +import logging +import time +import uuid +from concurrent.futures import ThreadPoolExecutor +from io import BytesIO +from typing import Dict, Iterator, List, Optional, Tuple, Union + +import requests +import torch +import torchvision.transforms as T +from PIL import Image +from torchvision.transforms.functional import InterpolationMode + +from ....model.utils import select_device +from ....types import ( + ChatCompletion, + ChatCompletionChunk, + ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionUsage, +) +from ..llm_family import LLMFamilyV1, LLMSpecV1 +from .core import PytorchChatModel, PytorchGenerateConfig + +logger = logging.getLogger(__name__) + +IMAGENET_MEAN = (0.485, 0.456, 0.406) +IMAGENET_STD = (0.229, 0.224, 0.225) + + +class InternVLChatModel(PytorchChatModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._tokenizer = None + self._model = None + + @classmethod + def match( + cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str + ) -> bool: + family = model_family.model_family or model_family.model_name + if "internvl" in family.lower(): + return True + return False + + def load(self, **kwargs): + from transformers import AutoModel, AutoTokenizer + from transformers.generation import GenerationConfig + + device = self._pytorch_model_config.get("device", "auto") + device = select_device(device) + # for multiple GPU, set back to auto to make multiple devices work + device = "auto" if device == "cuda" else device + + self._tokenizer = AutoTokenizer.from_pretrained( + self.model_path, + trust_remote_code=True, + ) + + kwargs = { + "torch_dtype": torch.bfloat16, + "low_cpu_mem_usage": True, + "trust_remote_code": True, + "device_map": device, + } + + if "Int8" in self.model_spec.quantizations: + kwargs.update( + { + "load_in_8bit": True, + "device_map": device, + } + ) + elif "mini" in self.model_family.model_name: + kwargs.pop("device_map") + + self._model = AutoModel.from_pretrained(self.model_path, **kwargs).eval() + + if "Int8" not in self.model_spec.quantizations: + self._model.cuda() + + # Specify hyperparameters for generation + self._model.generation_config = GenerationConfig.from_pretrained( + self.model_path, + trust_remote_code=True, + ) + + def _message_content_to_intern(self, content): + def _load_image(_url): + if _url.startswith("data:"): + logging.info("Parse url by base64 decoder.") + # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images + # e.g. f"data:image/jpeg;base64,{base64_image}" + _type, data = _url.split(";") + _, ext = _type.split("/") + data = data[len("base64,") :] + data = base64.b64decode(data.encode("utf-8")) + return Image.open(BytesIO(data)).convert("RGB") + else: + try: + response = requests.get(_url) + except requests.exceptions.MissingSchema: + return Image.open(_url).convert("RGB") + else: + return Image.open(BytesIO(response.content)).convert("RGB") + + if not isinstance(content, str): + texts = [] + image_urls = [] + for c in content: + c_type = c.get("type") + if c_type == "text": + texts.append(c["text"]) + elif c_type == "image_url": + image_urls.append(c["image_url"]["url"]) + image_futures = [] + with ThreadPoolExecutor() as executor: + for image_url in image_urls: + fut = executor.submit(_load_image, image_url) + image_futures.append(fut) + images = [fut.result() for fut in image_futures] + text = " ".join(texts) + if len(images) == 0: + return text, None + else: + return text, images + return content, None + + def _history_content_to_intern( + self, + chat_history: List[ChatCompletionMessage], + IMG_START_TOKEN="<img>", + IMG_END_TOKEN="</img>", + IMG_CONTEXT_TOKEN="<IMG_CONTEXT>", + ): + def _image_to_piexl_values(images): + load_images = [] + for image in images: + if image.startswith("data:"): + logging.info("Parse url by base64 decoder.") + # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images + # e.g. f"data:image/jpeg;base64,{base64_image}" + _type, data = image.split(";") + _, ext = _type.split("/") + data = data[len("base64,") :] + data = base64.b64decode(data.encode("utf-8")) + img = Image.open(BytesIO(data)).convert("RGB") + pixel_value = ( + self._load_image(img, max_num=6).to(torch.bfloat16).cuda() + ) + load_images.append(pixel_value) + else: + try: + response = requests.get(image) + except requests.exceptions.MissingSchema: + img = Image.open(image).convert("RGB") + else: + img = Image.open(BytesIO(response.content)).convert("RGB") + pixel_value = ( + self._load_image(img, max_num=6).to(torch.bfloat16).cuda() + ) + load_images.append(pixel_value) + return torch.cat(tuple(load_images), dim=0) + + history: List[Tuple] = [] + pixel_values = None + for i in range(0, len(chat_history), 2): + tmp = [] + images: List[str] = [] + user = chat_history[i]["content"] + if isinstance(user, List): + for content in user: + c_type = content.get("type") + if c_type == "text": + tmp.append(content["text"]) + elif c_type == "image_url" and not history: + images.append(content["image_url"]["url"]) + if not history: + pixel_values = _image_to_piexl_values(images) + image_bs = pixel_values.shape[0] + image_tokens = ( + IMG_START_TOKEN + + IMG_CONTEXT_TOKEN * self._model.num_image_token * image_bs + + IMG_END_TOKEN + ) + tmp[0] = image_tokens + "\n" + tmp[0] + else: + tmp.append(user) + tmp.append(chat_history[i + 1]["content"]) + history.append(tuple(tmp)) + return history, pixel_values + + def _load_image(_url): + if _url.startswith("data:"): + logging.info("Parse url by base64 decoder.") + # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images + # e.g. f"data:image/jpeg;base64,{base64_image}" + _type, data = _url.split(";") + _, ext = _type.split("/") + data = data[len("base64,") :] + data = base64.b64decode(data.encode("utf-8")) + + return Image.open(BytesIO(data)).convert("RGB") + else: + try: + response = requests.get(_url) + except requests.exceptions.MissingSchema: + return Image.open(_url).convert("RGB") + else: + return Image.open(BytesIO(response.content)).convert("RGB") + + if not isinstance(content, str): + texts = [] + image_urls = [] + for c in content: + c_type = c.get("type") + if c_type == "text": + texts.append(c["text"]) + elif c_type == "image_url": + image_urls.append(c["image_url"]["url"]) + image_futures = [] + with ThreadPoolExecutor() as executor: + for image_url in image_urls: + fut = executor.submit(_load_image, image_url) + image_futures.append(fut) + images = [fut.result() for fut in image_futures] + text = " ".join(texts) + if len(images) == 0: + return text + else: + return text, images + return content + + def _find_closest_aspect_ratio( + self, aspect_ratio, target_ratios, width, height, image_size + ): + best_ratio_diff = float("inf") + best_ratio = (1, 1) + area = width * height + for ratio in target_ratios: + target_aspect_ratio = ratio[0] / ratio[1] + ratio_diff = abs(aspect_ratio - target_aspect_ratio) + if ratio_diff < best_ratio_diff: + best_ratio_diff = ratio_diff + best_ratio = ratio + elif ratio_diff == best_ratio_diff: + if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]: + best_ratio = ratio + return best_ratio + + def _dynamic_preprocess( + self, image, min_num=1, max_num=6, image_size=448, use_thumbnail=False + ): + orig_width, orig_height = image.size + aspect_ratio = orig_width / orig_height + + # calculate the existing image aspect ratio + target_ratios = set( + (i, j) + for n in range(min_num, max_num + 1) + for i in range(1, n + 1) + for j in range(1, n + 1) + if i * j <= max_num and i * j >= min_num + ) + target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1]) + + # find the closest aspect ratio to the target + target_aspect_ratio = self._find_closest_aspect_ratio( + aspect_ratio, target_ratios, orig_width, orig_height, image_size + ) + + # calculate the target width and height + target_width = image_size * target_aspect_ratio[0] + target_height = image_size * target_aspect_ratio[1] + blocks = target_aspect_ratio[0] * target_aspect_ratio[1] + + # resize the image + resized_img = image.resize((target_width, target_height)) + processed_images = [] + for i in range(blocks): + box = ( + (i % (target_width // image_size)) * image_size, + (i // (target_width // image_size)) * image_size, + ((i % (target_width // image_size)) + 1) * image_size, + ((i // (target_width // image_size)) + 1) * image_size, + ) + # split the image + split_img = resized_img.crop(box) + processed_images.append(split_img) + assert len(processed_images) == blocks + if use_thumbnail and len(processed_images) != 1: + thumbnail_img = image.resize((image_size, image_size)) + processed_images.append(thumbnail_img) + return processed_images + + def _build_transform(self, input_size): + MEAN, STD = IMAGENET_MEAN, IMAGENET_STD + transform = T.Compose( + [ + T.Lambda(lambda img: img.convert("RGB") if img.mode != "RGB" else img), + T.Resize( + (input_size, input_size), interpolation=InterpolationMode.BICUBIC + ), + T.ToTensor(), + T.Normalize(mean=MEAN, std=STD), + ] + ) + return transform + + def _load_image(self, image_file, input_size=448, max_num=6): + transform = self._build_transform(input_size=input_size) + images = self._dynamic_preprocess( + image_file, image_size=input_size, use_thumbnail=True, max_num=max_num + ) + pixel_values = [transform(image) for image in images] + pixel_values = torch.stack(pixel_values) + return pixel_values + + def chat( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[PytorchGenerateConfig] = None, + ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + if generate_config and generate_config.pop("stream"): + raise Exception( + f"Chat with model {self.model_family.model_name} does not support stream." + ) + sanitized_config = { + "num_beams": 1, + "max_new_tokens": generate_config.get("max_tokens", 512) + if generate_config + else 512, + "do_sample": False, + } + + content, image = self._message_content_to_intern(prompt) + + history = None + if chat_history: + history, pixel_values = self._history_content_to_intern(chat_history) + else: + load_images = [] + for img in image: + pixel_value = self._load_image(img, max_num=6).to(torch.bfloat16).cuda() + load_images.append(pixel_value) + pixel_values = torch.cat(tuple(load_images), dim=0) + + response, history = self._model.chat( + self._tokenizer, + pixel_values, + content, + sanitized_config, + history=history, + return_history=True, + ) + chunk = Completion( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=response, finish_reason="stop", logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + return self._to_chat_completion(chunk) From 77e79f863daf9aa0bc6b9e8bf5e6d74e14bd5367 Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Fri, 24 May 2024 16:46:11 +0800 Subject: [PATCH 101/298] FEAT: Provide the functionality to query information on various cached models hosted on the query node. (#1522) --- xinference/api/restful_api.py | 21 ++++++++++++ xinference/client/restful/restful_client.py | 29 ++++++++++++++++ xinference/client/tests/test_client.py | 8 +++++ xinference/core/cache_tracker.py | 13 ++++++- xinference/core/supervisor.py | 27 +++++++++++++++ xinference/core/worker.py | 3 ++ xinference/deploy/cmdline.py | 38 +++++++++++++++++++++ xinference/deploy/test/test_cmdline.py | 24 +++++++++++++ 8 files changed, 162 insertions(+), 1 deletion(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index de56f7cc18..4452237fa1 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -493,6 +493,16 @@ def serve(self, logging_conf: Optional[dict] = None): else None ), ) + self._router.add_api_route( + "/v1/cached/list_cached_models", + self.list_cached_models, + methods=["GET"], + dependencies=( + [Security(self._auth_service, scopes=["models:list"])] + if self.is_authenticated() + else None + ), + ) # Clear the global Registry for the MetricsMiddleware, or # the MetricsMiddleware will register duplicated metrics if the port @@ -1479,6 +1489,17 @@ async def get_model_registrations( logger.error(e, exc_info=True) raise HTTPException(status_code=500, detail=str(e)) + async def list_cached_models(self) -> JSONResponse: + try: + data = await (await self._get_supervisor_ref()).list_cached_models() + return JSONResponse(content=data) + except ValueError as re: + logger.error(re, exc_info=True) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + async def get_model_events(self, model_uid: str) -> JSONResponse: try: event_collector_ref = await self._get_event_collector_ref() diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 87241ae4ff..cb64a77ffa 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -1102,6 +1102,35 @@ def list_model_registrations(self, model_type: str) -> List[Dict[str, Any]]: response_data = response.json() return response_data + def list_cached_models(self) -> List[Dict[Any, Any]]: + """ + Get a list of cached models. + + Parameters + ---------- + None + + Returns + ------- + List[Dict[Any, Any]] + The collection of cached models on the server. + + Raises + ------ + RuntimeError + Raised when the request fails, including the reason for the failure. + """ + + url = f"{self.base_url}/v1/cached/list_cached_models" + response = requests.get(url, headers=self._headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to list cached model, detail: {_get_error_string(response)}" + ) + + response_data = response.json() + return response_data + def get_model_registration( self, model_type: str, model_name: str ) -> Dict[str, Any]: diff --git a/xinference/client/tests/test_client.py b/xinference/client/tests/test_client.py index 1b3c919124..2fce98ae04 100644 --- a/xinference/client/tests/test_client.py +++ b/xinference/client/tests/test_client.py @@ -167,6 +167,14 @@ def _check(stream=False): assert len(client.list_models()) == 0 +@pytest.mark.skipif(os.name == "nt", reason="Skip windows") +def test_list_cached_models(setup): + endpoint, _ = setup + client = RESTfulClient(endpoint) + + assert len(client.list_cached_models()) == 2 + + def test_RESTful_client_for_embedding(setup): endpoint, _ = setup client = RESTfulClient(endpoint) diff --git a/xinference/core/cache_tracker.py b/xinference/core/cache_tracker.py index 42c3115960..9eeb01bade 100644 --- a/xinference/core/cache_tracker.py +++ b/xinference/core/cache_tracker.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. from logging import getLogger -from typing import Dict, List, Optional +from typing import Any, Dict, List, Optional import xoscar as xo @@ -100,3 +100,14 @@ def get_model_versions(self, model_name: str) -> List[Dict]: def get_model_version_count(self, model_name: str) -> int: return len(self.get_model_versions(model_name)) + + def list_cached_models(self) -> List[Dict[Any, Any]]: + cached_models = [] + for model_name, model_versions in self._model_name_to_version_info.items(): + for version_info in model_versions: + if version_info["cache_status"]: + ret = version_info.copy() + ret["model_name"] = model_name + cached_models.append(ret) + cached_models = sorted(cached_models, key=lambda x: x["model_name"]) + return cached_models diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 420b8e8da3..dd9ee7e525 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -981,6 +981,33 @@ def is_local_deployment(self) -> bool: and list(self._worker_address_to_worker)[0] == self.address ) + @log_async(logger=logger) + async def list_cached_models(self) -> List[Dict[str, Any]]: + cached_models = [] + for worker in self._worker_address_to_worker.values(): + ret = await worker.list_cached_models() + for model_version in ret: + model_name = model_version.get("model_name", None) + model_format = model_version.get("model_format", None) + model_size_in_billions = model_version.get( + "model_size_in_billions", None + ) + quantizations = model_version.get("quantization", None) + re_dict = model_version.get("model_file_location", None) + actor_ip_address, path = next(iter(re_dict.items())) + + cache_entry = { + "model_name": model_name, + "model_format": model_format, + "model_size_in_billions": model_size_in_billions, + "quantizations": quantizations, + "path": path, + "Actor IP Address": actor_ip_address, + } + + cached_models.append(cache_entry) + return cached_models + @log_async(logger=logger) async def add_worker(self, worker_address: str): from .worker import WorkerActor diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 7d316a25e8..164fff7aa5 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -781,6 +781,9 @@ async def _periodical_report_status(self): except asyncio.CancelledError: # pragma: no cover break + async def list_cached_models(self) -> List[Dict[Any, Any]]: + return self._cache_tracker_ref.list_cached_models() + @staticmethod def record_metrics(name, op, kwargs): record_metrics(name, op, kwargs) diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 2744af1e41..0b6fc4b3b7 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -570,6 +570,44 @@ def list_model_registrations( raise NotImplementedError(f"List {model_type} is not implemented.") +@cli.command("cached", help="List all cached models in Xinference.") +@click.option( + "--endpoint", + "-e", + type=str, + help="Xinference endpoint.", +) +@click.option( + "--api-key", + "-ak", + default=None, + type=str, + help="Api-Key for access xinference api with authorization.", +) +def list_cached_models( + endpoint: Optional[str], + api_key: Optional[str], +): + from tabulate import tabulate + + endpoint = get_endpoint(endpoint) + client = RESTfulClient(base_url=endpoint, api_key=api_key) + if api_key is None: + client._set_token(get_stored_token(endpoint, client)) + + cached_models = client.list_cached_models() + + print("cached_model: ") + headers = list(cached_models[0].keys()) + table_data = [] + for model in cached_models: + row_data = [ + str(value) if value is not None else "-" for value in model.values() + ] + table_data.append(row_data) + print(tabulate(table_data, headers=headers, tablefmt="pretty")) + + @cli.command( "launch", help="Launch a model with the Xinference framework with the given parameters.", diff --git a/xinference/deploy/test/test_cmdline.py b/xinference/deploy/test/test_cmdline.py index 5d4c4de8f2..0af9805626 100644 --- a/xinference/deploy/test/test_cmdline.py +++ b/xinference/deploy/test/test_cmdline.py @@ -19,6 +19,7 @@ from ...client import Client from ..cmdline import ( + list_cached_models, list_model_registrations, model_chat, model_generate, @@ -278,3 +279,26 @@ def test_rotate_logs(setup_with_file_logging): with open(log_file, "r") as f: content = f.read() assert len(content) > 0 + + +def test_list_cached_models(setup): + endpoint, _ = setup + runner = CliRunner() + + result = runner.invoke( + list_cached_models, + [ + "--endpoint", + endpoint, + ], + ) + assert result.exit_code == 0 + assert "cached_model: " in result.stdout + + # check if the output is in tabular format + assert "model_name" in result.stdout + assert "model_format" in result.stdout + assert "model_size_in_billions" in result.stdout + assert "quantizations" in result.stdout + assert "path" in result.stdout + assert "Actor IP Address" in result.stdout From ac8f33439c25e6fb05eba79e7932cbbadd068174 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 24 May 2024 19:39:58 +0800 Subject: [PATCH 102/298] BUG: fix launch model error when use torch 2.3.0 (#1543) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/model/llm/pytorch/intern_vl.py | 46 ++--------------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/xinference/model/llm/pytorch/intern_vl.py b/xinference/model/llm/pytorch/intern_vl.py index b76899b0be..661987df3a 100644 --- a/xinference/model/llm/pytorch/intern_vl.py +++ b/xinference/model/llm/pytorch/intern_vl.py @@ -21,9 +21,7 @@ import requests import torch -import torchvision.transforms as T from PIL import Image -from torchvision.transforms.functional import InterpolationMode from ....model.utils import select_device from ....types import ( @@ -205,47 +203,6 @@ def _image_to_piexl_values(images): history.append(tuple(tmp)) return history, pixel_values - def _load_image(_url): - if _url.startswith("data:"): - logging.info("Parse url by base64 decoder.") - # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images - # e.g. f"data:image/jpeg;base64,{base64_image}" - _type, data = _url.split(";") - _, ext = _type.split("/") - data = data[len("base64,") :] - data = base64.b64decode(data.encode("utf-8")) - - return Image.open(BytesIO(data)).convert("RGB") - else: - try: - response = requests.get(_url) - except requests.exceptions.MissingSchema: - return Image.open(_url).convert("RGB") - else: - return Image.open(BytesIO(response.content)).convert("RGB") - - if not isinstance(content, str): - texts = [] - image_urls = [] - for c in content: - c_type = c.get("type") - if c_type == "text": - texts.append(c["text"]) - elif c_type == "image_url": - image_urls.append(c["image_url"]["url"]) - image_futures = [] - with ThreadPoolExecutor() as executor: - for image_url in image_urls: - fut = executor.submit(_load_image, image_url) - image_futures.append(fut) - images = [fut.result() for fut in image_futures] - text = " ".join(texts) - if len(images) == 0: - return text - else: - return text, images - return content - def _find_closest_aspect_ratio( self, aspect_ratio, target_ratios, width, height, image_size ): @@ -309,6 +266,9 @@ def _dynamic_preprocess( return processed_images def _build_transform(self, input_size): + import torchvision.transforms as T + from torchvision.transforms.functional import InterpolationMode + MEAN, STD = IMAGENET_MEAN, IMAGENET_STD transform = T.Compose( [ From 568f722a38a6ac8fa0119c92d56086caddd51d34 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 28 May 2024 10:28:39 +0800 Subject: [PATCH 103/298] ENH: added engines options to model launch details (#1546) --- doc/source/gen_docs.py | 17 ++++ doc/source/getting_started/installation.rst | 2 +- .../models/builtin/llm/aquila2-chat-16k.rst | 15 ++- .../models/builtin/llm/aquila2-chat.rst | 18 ++-- doc/source/models/builtin/llm/aquila2.rst | 9 +- .../models/builtin/llm/baichuan-2-chat.rst | 6 +- doc/source/models/builtin/llm/baichuan-2.rst | 6 +- .../models/builtin/llm/baichuan-chat.rst | 3 +- doc/source/models/builtin/llm/baichuan.rst | 9 +- .../builtin/llm/c4ai-command-r-v01-4bit.rst | 6 +- .../models/builtin/llm/c4ai-command-r-v01.rst | 12 ++- doc/source/models/builtin/llm/chatglm.rst | 6 +- .../models/builtin/llm/chatglm2-32k.rst | 3 +- doc/source/models/builtin/llm/chatglm2.rst | 6 +- .../models/builtin/llm/chatglm3-128k.rst | 3 +- .../models/builtin/llm/chatglm3-32k.rst | 3 +- doc/source/models/builtin/llm/chatglm3.rst | 6 +- .../builtin/llm/code-llama-instruct.rst | 18 ++-- .../models/builtin/llm/code-llama-python.rst | 18 ++-- doc/source/models/builtin/llm/code-llama.rst | 18 ++-- .../models/builtin/llm/codeqwen1.5-chat.rst | 9 +- doc/source/models/builtin/llm/codeqwen1.5.rst | 3 +- .../models/builtin/llm/codeshell-chat.rst | 3 +- doc/source/models/builtin/llm/codeshell.rst | 3 +- .../models/builtin/llm/deepseek-chat.rst | 12 ++- .../builtin/llm/deepseek-coder-instruct.rst | 42 ++++++--- .../models/builtin/llm/deepseek-coder.rst | 42 ++++++--- .../models/builtin/llm/deepseek-vl-chat.rst | 6 +- doc/source/models/builtin/llm/deepseek.rst | 12 ++- .../models/builtin/llm/falcon-instruct.rst | 6 +- doc/source/models/builtin/llm/falcon.rst | 6 +- doc/source/models/builtin/llm/gemma-it.rst | 6 +- .../models/builtin/llm/glaive-coder.rst | 3 +- .../builtin/llm/gorilla-openfunctions-v1.rst | 6 +- .../builtin/llm/gorilla-openfunctions-v2.rst | 6 +- doc/source/models/builtin/llm/gpt-2.rst | 3 +- doc/source/models/builtin/llm/index.rst | 14 +++ .../models/builtin/llm/internlm-20b.rst | 3 +- doc/source/models/builtin/llm/internlm-7b.rst | 3 +- .../models/builtin/llm/internlm-chat-20b.rst | 3 +- .../models/builtin/llm/internlm-chat-7b.rst | 3 +- .../models/builtin/llm/internlm2-chat.rst | 6 +- .../models/builtin/llm/llama-2-chat.rst | 45 ++++++--- doc/source/models/builtin/llm/llama-2.rst | 36 ++++--- .../models/builtin/llm/llama-3-instruct.rst | 12 ++- doc/source/models/builtin/llm/llama-3.rst | 12 ++- .../builtin/llm/minicpm-2b-dpo-bf16.rst | 3 +- .../builtin/llm/minicpm-2b-dpo-fp16.rst | 3 +- .../builtin/llm/minicpm-2b-dpo-fp32.rst | 3 +- .../builtin/llm/minicpm-2b-sft-bf16.rst | 3 +- .../builtin/llm/minicpm-2b-sft-fp32.rst | 3 +- .../builtin/llm/mistral-instruct-v0.1.rst | 12 ++- .../builtin/llm/mistral-instruct-v0.2.rst | 12 ++- .../models/builtin/llm/mistral-v0.1.rst | 6 +- .../llm/mixtral-8x22b-instruct-v0.1.rst | 12 ++- .../builtin/llm/mixtral-instruct-v0.1.rst | 12 ++- .../models/builtin/llm/mixtral-v0.1.rst | 9 +- doc/source/models/builtin/llm/omnilmm.rst | 6 +- doc/source/models/builtin/llm/openbuddy.rst | 3 +- .../models/builtin/llm/openhermes-2.5.rst | 6 +- doc/source/models/builtin/llm/opt.rst | 3 +- doc/source/models/builtin/llm/orca.rst | 9 +- .../models/builtin/llm/orion-chat-rag.rst | 3 +- doc/source/models/builtin/llm/orion-chat.rst | 6 +- doc/source/models/builtin/llm/phi-2.rst | 6 +- .../builtin/llm/phi-3-mini-128k-instruct.rst | 3 +- .../builtin/llm/phi-3-mini-4k-instruct.rst | 6 +- .../builtin/llm/platypus2-70b-instruct.rst | 3 +- doc/source/models/builtin/llm/qwen-chat.rst | 30 ++++-- .../models/builtin/llm/qwen-vl-chat.rst | 6 +- .../models/builtin/llm/qwen1.5-chat.rst | 93 ++++++++++++------- .../models/builtin/llm/qwen1.5-moe-chat.rst | 6 +- doc/source/models/builtin/llm/seallm_v2.5.rst | 6 +- doc/source/models/builtin/llm/seallm_v2.rst | 6 +- .../models/builtin/llm/skywork-math.rst | 3 +- doc/source/models/builtin/llm/skywork.rst | 3 +- .../models/builtin/llm/starchat-beta.rst | 3 +- doc/source/models/builtin/llm/starcoder.rst | 3 +- .../models/builtin/llm/starcoderplus.rst | 3 +- doc/source/models/builtin/llm/tiny-llama.rst | 3 +- doc/source/models/builtin/llm/vicuna-v1.3.rst | 18 ++-- .../models/builtin/llm/vicuna-v1.5-16k.rst | 6 +- doc/source/models/builtin/llm/vicuna-v1.5.rst | 6 +- .../builtin/llm/wizardcoder-python-v1.0.rst | 18 ++-- .../models/builtin/llm/wizardlm-v1.0.rst | 6 +- .../models/builtin/llm/wizardmath-v1.0.rst | 9 +- doc/source/models/builtin/llm/xverse-chat.rst | 6 +- doc/source/models/builtin/llm/xverse.rst | 9 +- doc/source/models/builtin/llm/yi-1.5-chat.rst | 9 +- doc/source/models/builtin/llm/yi-1.5.rst | 9 +- doc/source/models/builtin/llm/yi-200k.rst | 6 +- doc/source/models/builtin/llm/yi-chat.rst | 12 ++- doc/source/models/builtin/llm/yi-vl-chat.rst | 6 +- doc/source/models/builtin/llm/yi.rst | 12 ++- .../models/builtin/llm/zephyr-7b-alpha.rst | 3 +- .../models/builtin/llm/zephyr-7b-beta.rst | 3 +- doc/source/user_guide/backends.rst | 2 +- doc/templates/llm.rst.jinja | 3 +- xinference/model/llm/vllm/core.py | 1 - 99 files changed, 629 insertions(+), 301 deletions(-) diff --git a/doc/source/gen_docs.py b/doc/source/gen_docs.py index 5537560802..2a572bd9ec 100644 --- a/doc/source/gen_docs.py +++ b/doc/source/gen_docs.py @@ -17,6 +17,7 @@ from collections import defaultdict from jinja2 import Environment, FileSystemLoader +from xinference.model.llm.llm_family import SUPPORTED_ENGINES, check_engine_by_spec_parameters from xinference.model.llm.vllm.core import VLLM_INSTALLED, VLLM_SUPPORTED_MODELS, VLLM_SUPPORTED_CHAT_MODELS MODEL_HUB_HUGGING_FACE = "Hugging Face" @@ -72,6 +73,22 @@ def main(): 'url': f"https://huggingface.co/{model_spec['model_id']}" }] + # model engines + engines = [] + for engine in SUPPORTED_ENGINES: + for quantization in model_spec['quantizations']: + size = model_spec['model_size_in_billions'] + if isinstance(size, str) and '_' not in size: + size = int(size) + try: + check_engine_by_spec_parameters(engine, model_name, model_spec['model_format'], + size, quantization) + except ValueError: + continue + else: + engines.append(engine) + model_spec['engines'] = list(set(engines)) + # manual merge if model_name in model_by_names_modelscope.keys(): diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 701765f03f..c7f7067701 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -55,7 +55,7 @@ Currently, supported models include: - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` -- ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` +- ``c4ai-command-r-v01`` .. vllm_end To install Xinference and vLLM:: diff --git a/doc/source/models/builtin/llm/aquila2-chat-16k.rst b/doc/source/models/builtin/llm/aquila2-chat-16k.rst index 866bd03f9e..c47aa13a7d 100644 --- a/doc/source/models/builtin/llm/aquila2-chat-16k.rst +++ b/doc/source/models/builtin/llm/aquila2-chat-16k.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** BAAI/AquilaChat2-7B-16K - **Model Hubs**: `Hugging Face <https://huggingface.co/BAAI/AquilaChat2-7B-16K>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat-16k --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat-16k --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 34 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (ggufv2, 34 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 34 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/AquilaChat2-34B-16K-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/AquilaChat2-34B-16K-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat-16k --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat-16k --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} Model Spec 3 (gptq, 34 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (gptq, 34 Billion) - **Model Format:** gptq - **Model Size (in billions):** 34 - **Quantizations:** Int4 +- **Engines**: Transformers - **Model ID:** TheBloke/AquilaChat2-34B-16K-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/AquilaChat2-34B-16K-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat-16k --size-in-billions 34 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat-16k --size-in-billions 34 --model-format gptq --quantization ${quantization} Model Spec 4 (awq, 34 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (awq, 34 Billion) - **Model Format:** awq - **Model Size (in billions):** 34 - **Quantizations:** Int4 +- **Engines**: Transformers - **Model ID:** TheBloke/AquilaChat2-34B-16K-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/AquilaChat2-34B-16K-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat-16k --size-in-billions 34 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat-16k --size-in-billions 34 --model-format awq --quantization ${quantization} Model Spec 5 (pytorch, 34 Billion) @@ -80,11 +84,12 @@ Model Spec 5 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** BAAI/AquilaChat2-34B-16K - **Model Hubs**: `Hugging Face <https://huggingface.co/BAAI/AquilaChat2-34B-16K>`__, `ModelScope <https://modelscope.cn/models/BAAI/AquilaChat2-34B-16K>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat-16k --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat-16k --size-in-billions 34 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/aquila2-chat.rst b/doc/source/models/builtin/llm/aquila2-chat.rst index c81747450e..a90bd80c64 100644 --- a/doc/source/models/builtin/llm/aquila2-chat.rst +++ b/doc/source/models/builtin/llm/aquila2-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** BAAI/AquilaChat2-7B - **Model Hubs**: `Hugging Face <https://huggingface.co/BAAI/AquilaChat2-7B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 34 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (ggufv2, 34 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 34 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/AquilaChat2-34B-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/AquilaChat2-34B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} Model Spec 3 (gptq, 34 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (gptq, 34 Billion) - **Model Format:** gptq - **Model Size (in billions):** 34 - **Quantizations:** Int4 +- **Engines**: Transformers - **Model ID:** TheBloke/AquilaChat2-34B-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/AquilaChat2-34B-GPTQ>`__, `ModelScope <https://modelscope.cn/models/BAAI/AquilaChat2-34B-Int4-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat --size-in-billions 34 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat --size-in-billions 34 --model-format gptq --quantization ${quantization} Model Spec 4 (awq, 34 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (awq, 34 Billion) - **Model Format:** awq - **Model Size (in billions):** 34 - **Quantizations:** Int4 +- **Engines**: Transformers - **Model ID:** TheBloke/AquilaChat2-34B-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/AquilaChat2-34B-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat --size-in-billions 34 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat --size-in-billions 34 --model-format awq --quantization ${quantization} Model Spec 5 (pytorch, 34 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** BAAI/AquilaChat2-34B - **Model Hubs**: `Hugging Face <https://huggingface.co/BAAI/AquilaChat2-34B>`__, `ModelScope <https://modelscope.cn/models/BAAI/AquilaChat2-34B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} Model Spec 6 (pytorch, 70 Billion) @@ -95,11 +100,12 @@ Model Spec 6 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** BAAI/AquilaChat2-70B-Expr - **Model Hubs**: `Hugging Face <https://huggingface.co/BAAI/AquilaChat2-70B-Expr>`__, `ModelScope <https://modelscope.cn/models/BAAI/AquilaChat2-70B-Expr>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2-chat --size-in-billions 70 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2-chat --size-in-billions 70 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/aquila2.rst b/doc/source/models/builtin/llm/aquila2.rst index 96397e324a..6fb702310b 100644 --- a/doc/source/models/builtin/llm/aquila2.rst +++ b/doc/source/models/builtin/llm/aquila2.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** BAAI/Aquila2-7B - **Model Hubs**: `Hugging Face <https://huggingface.co/BAAI/Aquila2-7B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 34 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** BAAI/Aquila2-34B - **Model Hubs**: `Hugging Face <https://huggingface.co/BAAI/Aquila2-34B>`__, `ModelScope <https://modelscope.cn/models/BAAI/Aquila2-34B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2 --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2 --size-in-billions 34 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 70 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** BAAI/Aquila2-70B-Expr - **Model Hubs**: `Hugging Face <https://huggingface.co/BAAI/Aquila2-70B-Expr>`__, `ModelScope <https://modelscope.cn/models/BAAI/Aquila2-70B-Expr>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name aquila2 --size-in-billions 70 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name aquila2 --size-in-billions 70 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/baichuan-2-chat.rst b/doc/source/models/builtin/llm/baichuan-2-chat.rst index 6ee587706c..03716a7e75 100644 --- a/doc/source/models/builtin/llm/baichuan-2-chat.rst +++ b/doc/source/models/builtin/llm/baichuan-2-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** baichuan-inc/Baichuan2-7B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat>`__, `ModelScope <https://modelscope.cn/models/baichuan-inc/Baichuan2-7B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name baichuan-2-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name baichuan-2-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** baichuan-inc/Baichuan2-13B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat>`__, `ModelScope <https://modelscope.cn/models/baichuan-inc/Baichuan2-13B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name baichuan-2-chat --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name baichuan-2-chat --size-in-billions 13 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/baichuan-2.rst b/doc/source/models/builtin/llm/baichuan-2.rst index 72359b3bb7..631e99dc05 100644 --- a/doc/source/models/builtin/llm/baichuan-2.rst +++ b/doc/source/models/builtin/llm/baichuan-2.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** baichuan-inc/Baichuan2-7B-Base - **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan2-7B-Base>`__, `ModelScope <https://modelscope.cn/models/baichuan-inc/Baichuan2-7B-Base>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name baichuan-2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name baichuan-2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** baichuan-inc/Baichuan2-13B-Base - **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan2-13B-Base>`__, `ModelScope <https://modelscope.cn/models/baichuan-inc/Baichuan2-13B-Base>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name baichuan-2 --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name baichuan-2 --size-in-billions 13 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/baichuan-chat.rst b/doc/source/models/builtin/llm/baichuan-chat.rst index 85c66655ca..c4aed11314 100644 --- a/doc/source/models/builtin/llm/baichuan-chat.rst +++ b/doc/source/models/builtin/llm/baichuan-chat.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** baichuan-inc/Baichuan-13B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan-13B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name baichuan-chat --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name baichuan-chat --size-in-billions 13 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/baichuan.rst b/doc/source/models/builtin/llm/baichuan.rst index 5347cb97e1..5d72a7c12e 100644 --- a/doc/source/models/builtin/llm/baichuan.rst +++ b/doc/source/models/builtin/llm/baichuan.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggmlv3, 7 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 7 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/baichuan-llama-7B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/baichuan-llama-7B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name baichuan --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name baichuan --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} Model Spec 2 (pytorch, 7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** baichuan-inc/Baichuan-7B - **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan-7B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name baichuan --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name baichuan --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 13 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** baichuan-inc/Baichuan-13B-Base - **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan-13B-Base>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name baichuan --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name baichuan --size-in-billions 13 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst b/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst index 94f103e024..6148737477 100644 --- a/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst +++ b/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 35 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 35 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** CohereForAI/c4ai-command-r-v01-4bit - **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-v01-4bit>`__, `ModelScope <https://modelscope.cn/models/mirror013/c4ai-command-r-v01-4bit>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name c4ai-command-r-v01-4bit --size-in-billions 35 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01-4bit --size-in-billions 35 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 104 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 104 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 104 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** CohereForAI/c4ai-command-r-plus-4bit - **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-plus-4bit>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name c4ai-command-r-v01-4bit --size-in-billions 104 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01-4bit --size-in-billions 104 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/c4ai-command-r-v01.rst b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst index 5b5d82979a..468699eadc 100644 --- a/doc/source/models/builtin/llm/c4ai-command-r-v01.rst +++ b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 35 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 35 - **Quantizations:** none +- **Engines**: vLLM, Transformers - **Model ID:** CohereForAI/c4ai-command-r-v01 - **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-v01>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-v01>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name c4ai-command-r-v01 --size-in-billions 35 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01 --size-in-billions 35 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 35 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (ggufv2, 35 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 35 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** andrewcanis/c4ai-command-r-v01-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/andrewcanis/c4ai-command-r-v01-GGUF>`__, `ModelScope <https://modelscope.cn/models/mirror013/C4AI-Command-R-v01-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name c4ai-command-r-v01 --size-in-billions 35 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01 --size-in-billions 35 --model-format ggufv2 --quantization ${quantization} Model Spec 3 (pytorch, 104 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 104 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 104 - **Quantizations:** none +- **Engines**: vLLM, Transformers - **Model ID:** CohereForAI/c4ai-command-r-plus - **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-plus>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-plus>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name c4ai-command-r-v01 --size-in-billions 104 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01 --size-in-billions 104 --model-format pytorch --quantization ${quantization} Model Spec 4 (gptq, 104 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (gptq, 104 Billion) - **Model Format:** gptq - **Model Size (in billions):** 104 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** alpindale/c4ai-command-r-plus-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/alpindale/c4ai-command-r-plus-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name c4ai-command-r-v01 --size-in-billions 104 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01 --size-in-billions 104 --model-format gptq --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/chatglm.rst b/doc/source/models/builtin/llm/chatglm.rst index a79c1a1637..87f5acea87 100644 --- a/doc/source/models/builtin/llm/chatglm.rst +++ b/doc/source/models/builtin/llm/chatglm.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggmlv3, 6 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 6 - **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 +- **Engines**: llama.cpp - **Model ID:** Xorbits/chatglm-6B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/Xorbits/chatglm-6B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name chatglm --size-in-billions 6 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name chatglm --size-in-billions 6 --model-format ggmlv3 --quantization ${quantization} Model Spec 2 (pytorch, 6 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** THUDM/chatglm-6b - **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/chatglm-6b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name chatglm --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name chatglm --size-in-billions 6 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/chatglm2-32k.rst b/doc/source/models/builtin/llm/chatglm2-32k.rst index f14e8b93b4..b4de49b62a 100644 --- a/doc/source/models/builtin/llm/chatglm2-32k.rst +++ b/doc/source/models/builtin/llm/chatglm2-32k.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** THUDM/chatglm2-6b-32k - **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/chatglm2-6b-32k>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/chatglm2-6b-32k>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name chatglm2-32k --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name chatglm2-32k --size-in-billions 6 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/chatglm2.rst b/doc/source/models/builtin/llm/chatglm2.rst index ed730f9423..b4f81bf992 100644 --- a/doc/source/models/builtin/llm/chatglm2.rst +++ b/doc/source/models/builtin/llm/chatglm2.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggmlv3, 6 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 6 - **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 +- **Engines**: llama.cpp - **Model ID:** Xorbits/chatglm2-6B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/Xorbits/chatglm2-6B-GGML>`__, `ModelScope <https://modelscope.cn/models/Xorbits/chatglm2-6B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name chatglm2 --size-in-billions 6 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name chatglm2 --size-in-billions 6 --model-format ggmlv3 --quantization ${quantization} Model Spec 2 (pytorch, 6 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** THUDM/chatglm2-6b - **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/chatglm2-6b>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/chatglm2-6b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name chatglm2 --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name chatglm2 --size-in-billions 6 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/chatglm3-128k.rst b/doc/source/models/builtin/llm/chatglm3-128k.rst index 94a2fcd29f..410669fd83 100644 --- a/doc/source/models/builtin/llm/chatglm3-128k.rst +++ b/doc/source/models/builtin/llm/chatglm3-128k.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** THUDM/chatglm3-6b-128k - **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/chatglm3-6b-128k>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/chatglm3-6b-128k>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name chatglm3-128k --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name chatglm3-128k --size-in-billions 6 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/chatglm3-32k.rst b/doc/source/models/builtin/llm/chatglm3-32k.rst index f9c724ec94..b728ce3fad 100644 --- a/doc/source/models/builtin/llm/chatglm3-32k.rst +++ b/doc/source/models/builtin/llm/chatglm3-32k.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** THUDM/chatglm3-6b-32k - **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/chatglm3-6b-32k>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/chatglm3-6b-32k>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name chatglm3-32k --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name chatglm3-32k --size-in-billions 6 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/chatglm3.rst b/doc/source/models/builtin/llm/chatglm3.rst index 9212f0b488..5154158392 100644 --- a/doc/source/models/builtin/llm/chatglm3.rst +++ b/doc/source/models/builtin/llm/chatglm3.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggmlv3, 6 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 6 - **Quantizations:** q4_0 +- **Engines**: llama.cpp - **Model ID:** Xorbits/chatglm3-6B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/Xorbits/chatglm3-6B-GGML>`__, `ModelScope <https://modelscope.cn/models/Xorbits/chatglm3-ggml>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name chatglm3 --size-in-billions 6 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name chatglm3 --size-in-billions 6 --model-format ggmlv3 --quantization ${quantization} Model Spec 2 (pytorch, 6 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** THUDM/chatglm3-6b - **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/chatglm3-6b>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/chatglm3-6b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name chatglm3 --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name chatglm3 --size-in-billions 6 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/code-llama-instruct.rst b/doc/source/models/builtin/llm/code-llama-instruct.rst index 6265741c5d..7a67e6f0d8 100644 --- a/doc/source/models/builtin/llm/code-llama-instruct.rst +++ b/doc/source/models/builtin/llm/code-llama-instruct.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** codellama/CodeLlama-7b-Instruct-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/codellama/CodeLlama-7b-Instruct-hf>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/CodeLlama-7b-Instruct-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-instruct --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-instruct --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** codellama/CodeLlama-13b-Instruct-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/codellama/CodeLlama-13b-Instruct-hf>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/CodeLlama-13b-Instruct-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-instruct --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-instruct --size-in-billions 13 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 34 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** codellama/CodeLlama-34b-Instruct-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/codellama/CodeLlama-34b-Instruct-hf>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/CodeLlama-34b-Instruct-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-instruct --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-instruct --size-in-billions 34 --model-format pytorch --quantization ${quantization} Model Spec 4 (ggufv2, 7 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/CodeLlama-7B-Instruct-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-7B-Instruct-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/CodeLlama-7B-Instruct-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-instruct --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-instruct --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 5 (ggufv2, 13 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (ggufv2, 13 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 13 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/CodeLlama-13B-Instruct-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-13B-Instruct-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/CodeLlama-13B-Instruct-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-instruct --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-instruct --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} Model Spec 6 (ggufv2, 34 Billion) @@ -95,11 +100,12 @@ Model Spec 6 (ggufv2, 34 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 34 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/CodeLlama-34B-Instruct-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-34B-Instruct-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/CodeLlama-34B-Instruct-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-instruct --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-instruct --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/code-llama-python.rst b/doc/source/models/builtin/llm/code-llama-python.rst index 4512a6884e..cc21cdf8f8 100644 --- a/doc/source/models/builtin/llm/code-llama-python.rst +++ b/doc/source/models/builtin/llm/code-llama-python.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** TheBloke/CodeLlama-7B-Python-fp16 - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-7B-Python-fp16>`__, `ModelScope <https://modelscope.cn/models/Xorbits/CodeLlama-7B-Python-fp16>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-python --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-python --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** TheBloke/CodeLlama-13B-Python-fp16 - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-13B-Python-fp16>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/CodeLlama-13b-Python-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-python --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-python --size-in-billions 13 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 34 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** TheBloke/CodeLlama-34B-Python-fp16 - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-34B-Python-fp16>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-python --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-python --size-in-billions 34 --model-format pytorch --quantization ${quantization} Model Spec 4 (ggufv2, 7 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/CodeLlama-7B-Python-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-7B-Python-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/CodeLlama-7B-Python-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-python --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-python --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 5 (ggufv2, 13 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (ggufv2, 13 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 13 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/CodeLlama-13B-Python-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-13B-Python-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/CodeLlama-13B-Python-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-python --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-python --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} Model Spec 6 (ggufv2, 34 Billion) @@ -95,11 +100,12 @@ Model Spec 6 (ggufv2, 34 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 34 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/CodeLlama-34B-Python-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-34B-Python-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama-python --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama-python --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/code-llama.rst b/doc/source/models/builtin/llm/code-llama.rst index 2842f41733..731df906db 100644 --- a/doc/source/models/builtin/llm/code-llama.rst +++ b/doc/source/models/builtin/llm/code-llama.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** TheBloke/CodeLlama-7B-fp16 - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-7B-fp16>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/CodeLlama-7b-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** TheBloke/CodeLlama-13B-fp16 - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-13B-fp16>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/CodeLlama-13b-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama --size-in-billions 13 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 34 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** TheBloke/CodeLlama-34B-fp16 - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-34B-fp16>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/CodeLlama-34b-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama --size-in-billions 34 --model-format pytorch --quantization ${quantization} Model Spec 4 (ggufv2, 7 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/CodeLlama-7B-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-7B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 5 (ggufv2, 13 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (ggufv2, 13 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 13 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/CodeLlama-13B-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-13B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} Model Spec 6 (ggufv2, 34 Billion) @@ -95,11 +100,12 @@ Model Spec 6 (ggufv2, 34 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 34 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/CodeLlama-34B-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/CodeLlama-34B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name code-llama --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name code-llama --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/codeqwen1.5-chat.rst b/doc/source/models/builtin/llm/codeqwen1.5-chat.rst index 2a5ef3cf32..ea1b832bb4 100644 --- a/doc/source/models/builtin/llm/codeqwen1.5-chat.rst +++ b/doc/source/models/builtin/llm/codeqwen1.5-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0 +- **Engines**: llama.cpp - **Model ID:** Qwen/CodeQwen1.5-7B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name codeqwen1.5-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name codeqwen1.5-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 2 (pytorch, 7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/CodeQwen1.5-7B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name codeqwen1.5-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name codeqwen1.5-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 3 (awq, 7 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/CodeQwen1.5-7B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/CodeQwen1.5-7B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name codeqwen1.5-chat --size-in-billions 7 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name codeqwen1.5-chat --size-in-billions 7 --model-format awq --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/codeqwen1.5.rst b/doc/source/models/builtin/llm/codeqwen1.5.rst index 04e42f0afc..7b22268ca3 100644 --- a/doc/source/models/builtin/llm/codeqwen1.5.rst +++ b/doc/source/models/builtin/llm/codeqwen1.5.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/CodeQwen1.5-7B - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/CodeQwen1.5-7B>`__, `ModelScope <https://modelscope.cn/models/qwen/CodeQwen1.5-7B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name codeqwen1.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name codeqwen1.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/codeshell-chat.rst b/doc/source/models/builtin/llm/codeshell-chat.rst index 0d70d74a61..0cb4394bbd 100644 --- a/doc/source/models/builtin/llm/codeshell-chat.rst +++ b/doc/source/models/builtin/llm/codeshell-chat.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** WisdomShell/CodeShell-7B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/WisdomShell/CodeShell-7B-Chat>`__, `ModelScope <https://modelscope.cn/models/WisdomShell/CodeShell-7B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name codeshell-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name codeshell-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/codeshell.rst b/doc/source/models/builtin/llm/codeshell.rst index e3c0e4dffb..8a9d7a5059 100644 --- a/doc/source/models/builtin/llm/codeshell.rst +++ b/doc/source/models/builtin/llm/codeshell.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** WisdomShell/CodeShell-7B - **Model Hubs**: `Hugging Face <https://huggingface.co/WisdomShell/CodeShell-7B>`__, `ModelScope <https://modelscope.cn/models/WisdomShell/CodeShell-7B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name codeshell --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name codeshell --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/deepseek-chat.rst b/doc/source/models/builtin/llm/deepseek-chat.rst index 1e75ce8357..a33986c7b4 100644 --- a/doc/source/models/builtin/llm/deepseek-chat.rst +++ b/doc/source/models/builtin/llm/deepseek-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-llm-7b-chat - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-llm-7b-chat>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-llm-7b-chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 67 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 67 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 67 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-llm-67b-chat - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-llm-67b-chat>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-llm-67b-chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-chat --size-in-billions 67 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-chat --size-in-billions 67 --model-format pytorch --quantization ${quantization} Model Spec 3 (ggufv2, 7 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-llm-7B-chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-llm-7B-chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 4 (ggufv2, 67 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (ggufv2, 67 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 67 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-llm-67b-chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-llm-67b-chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-chat --size-in-billions 67 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-chat --size-in-billions 67 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/deepseek-coder-instruct.rst b/doc/source/models/builtin/llm/deepseek-coder-instruct.rst index a4f4a993b1..f4a14477b0 100644 --- a/doc/source/models/builtin/llm/deepseek-coder-instruct.rst +++ b/doc/source/models/builtin/llm/deepseek-coder-instruct.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 1_3 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1_3 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-coder-1.3b-instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-1.3b-instruct>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-coder-1.3b-instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 6_7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 6_7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6_7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-coder-6.7b-instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-instruct>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-coder-6.7b-instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 7 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-coder-7b-instruct-v1.5 - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-7b-instruct-v1.5>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 4 (pytorch, 33 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (pytorch, 33 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 33 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-coder-33b-instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-33b-instruct>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-coder-33b-instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 33 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 33 --model-format pytorch --quantization ${quantization} Model Spec 5 (ggufv2, 1_3 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (ggufv2, 1_3 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 1_3 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-coder-1.3b-instruct-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-instruct-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format ggufv2 --quantization ${quantization} Model Spec 6 (ggufv2, 6_7 Billion) @@ -95,13 +100,14 @@ Model Spec 6 (ggufv2, 6_7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 6_7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-coder-6.7B-instruct-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-instruct-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format ggufv2 --quantization ${quantization} Model Spec 7 (ggufv2, 7 Billion) @@ -110,13 +116,14 @@ Model Spec 7 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** LoneStriker/deepseek-coder-7b-instruct-v1.5-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/LoneStriker/deepseek-coder-7b-instruct-v1.5-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 8 (ggufv2, 33 Billion) @@ -125,13 +132,14 @@ Model Spec 8 (ggufv2, 33 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 33 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-coder-33B-instruct-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 33 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 33 --model-format ggufv2 --quantization ${quantization} Model Spec 9 (gptq, 1_3 Billion) @@ -140,13 +148,14 @@ Model Spec 9 (gptq, 1_3 Billion) - **Model Format:** gptq - **Model Size (in billions):** 1_3 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-1.3b-instruct-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-instruct-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format gptq --quantization ${quantization} Model Spec 10 (gptq, 6_7 Billion) @@ -155,13 +164,14 @@ Model Spec 10 (gptq, 6_7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 6_7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-6.7B-instruct-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-instruct-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format gptq --quantization ${quantization} Model Spec 11 (gptq, 33 Billion) @@ -170,13 +180,14 @@ Model Spec 11 (gptq, 33 Billion) - **Model Format:** gptq - **Model Size (in billions):** 33 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-33B-instruct-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 33 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 33 --model-format gptq --quantization ${quantization} Model Spec 12 (awq, 1_3 Billion) @@ -185,13 +196,14 @@ Model Spec 12 (awq, 1_3 Billion) - **Model Format:** awq - **Model Size (in billions):** 1_3 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-1.3b-instruct-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-instruct-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 1_3 --model-format awq --quantization ${quantization} Model Spec 13 (awq, 6_7 Billion) @@ -200,13 +212,14 @@ Model Spec 13 (awq, 6_7 Billion) - **Model Format:** awq - **Model Size (in billions):** 6_7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-6.7B-instruct-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-instruct-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 6_7 --model-format awq --quantization ${quantization} Model Spec 14 (awq, 33 Billion) @@ -215,11 +228,12 @@ Model Spec 14 (awq, 33 Billion) - **Model Format:** awq - **Model Size (in billions):** 33 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-33B-instruct-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder-instruct --size-in-billions 33 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder-instruct --size-in-billions 33 --model-format awq --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/deepseek-coder.rst b/doc/source/models/builtin/llm/deepseek-coder.rst index 45dc6470f9..84a3edc1b8 100644 --- a/doc/source/models/builtin/llm/deepseek-coder.rst +++ b/doc/source/models/builtin/llm/deepseek-coder.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 1_3 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1_3 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-coder-1.3b-base - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-1.3b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-coder-1.3b-base>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 1_3 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 1_3 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 6_7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 6_7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6_7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-coder-6.7b-base - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-coder-6.7b-base>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 6_7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 6_7 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 7 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-coder-7b-base-v1.5 - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-7b-base-v1.5>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 4 (pytorch, 33 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (pytorch, 33 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 33 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-coder-33b-base - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-coder-33b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-coder-33b-base>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 33 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 33 --model-format pytorch --quantization ${quantization} Model Spec 5 (ggufv2, 1_3 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (ggufv2, 1_3 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 1_3 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-coder-1.3b-base-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-base-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 1_3 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 1_3 --model-format ggufv2 --quantization ${quantization} Model Spec 6 (ggufv2, 6_7 Billion) @@ -95,13 +100,14 @@ Model Spec 6 (ggufv2, 6_7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 6_7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-coder-6.7B-base-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-base-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 6_7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 6_7 --model-format ggufv2 --quantization ${quantization} Model Spec 7 (ggufv2, 7 Billion) @@ -110,13 +116,14 @@ Model Spec 7 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** dagbs/deepseek-coder-7b-base-v1.5-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/dagbs/deepseek-coder-7b-base-v1.5-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 8 (ggufv2, 33 Billion) @@ -125,13 +132,14 @@ Model Spec 8 (ggufv2, 33 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 33 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-coder-33B-base-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-base-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 33 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 33 --model-format ggufv2 --quantization ${quantization} Model Spec 9 (gptq, 1_3 Billion) @@ -140,13 +148,14 @@ Model Spec 9 (gptq, 1_3 Billion) - **Model Format:** gptq - **Model Size (in billions):** 1_3 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-1.3b-base-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-base-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 1_3 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 1_3 --model-format gptq --quantization ${quantization} Model Spec 10 (gptq, 6_7 Billion) @@ -155,13 +164,14 @@ Model Spec 10 (gptq, 6_7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 6_7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-6.7B-base-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-base-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 6_7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 6_7 --model-format gptq --quantization ${quantization} Model Spec 11 (gptq, 33 Billion) @@ -170,13 +180,14 @@ Model Spec 11 (gptq, 33 Billion) - **Model Format:** gptq - **Model Size (in billions):** 33 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-33B-base-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-base-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 33 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 33 --model-format gptq --quantization ${quantization} Model Spec 12 (awq, 1_3 Billion) @@ -185,13 +196,14 @@ Model Spec 12 (awq, 1_3 Billion) - **Model Format:** awq - **Model Size (in billions):** 1_3 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-1.3b-base-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-1.3b-base-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 1_3 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 1_3 --model-format awq --quantization ${quantization} Model Spec 13 (awq, 6_7 Billion) @@ -200,13 +212,14 @@ Model Spec 13 (awq, 6_7 Billion) - **Model Format:** awq - **Model Size (in billions):** 6_7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-6.7B-base-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-6.7B-base-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 6_7 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 6_7 --model-format awq --quantization ${quantization} Model Spec 14 (awq, 33 Billion) @@ -215,11 +228,12 @@ Model Spec 14 (awq, 33 Billion) - **Model Format:** awq - **Model Size (in billions):** 33 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/deepseek-coder-33B-base-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-coder-33B-base-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-coder --size-in-billions 33 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-coder --size-in-billions 33 --model-format awq --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/deepseek-vl-chat.rst b/doc/source/models/builtin/llm/deepseek-vl-chat.rst index b6507b921e..ae00c384eb 100644 --- a/doc/source/models/builtin/llm/deepseek-vl-chat.rst +++ b/doc/source/models/builtin/llm/deepseek-vl-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 1_3 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1_3 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** deepseek-ai/deepseek-vl-1.3b-chat - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-vl-1.3b-chat>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-vl-1.3b-chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-vl-chat --size-in-billions 1_3 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-vl-chat --size-in-billions 1_3 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** deepseek-ai/deepseek-vl-7b-chat - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-vl-7b-chat>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-vl-7b-chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek-vl-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek-vl-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/deepseek.rst b/doc/source/models/builtin/llm/deepseek.rst index 7a4bb8bbd3..d961c97eeb 100644 --- a/doc/source/models/builtin/llm/deepseek.rst +++ b/doc/source/models/builtin/llm/deepseek.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-llm-7b-base - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-llm-7b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-llm-7b-base>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 67 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 67 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 67 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** deepseek-ai/deepseek-llm-67b-base - **Model Hubs**: `Hugging Face <https://huggingface.co/deepseek-ai/deepseek-llm-67b-base>`__, `ModelScope <https://modelscope.cn/models/deepseek-ai/deepseek-llm-67b-base>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek --size-in-billions 67 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek --size-in-billions 67 --model-format pytorch --quantization ${quantization} Model Spec 3 (ggufv2, 7 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-llm-7B-chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-llm-7B-chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 4 (ggufv2, 67 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (ggufv2, 67 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 67 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/deepseek-llm-67b-chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/deepseek-llm-67b-chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name deepseek --size-in-billions 67 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name deepseek --size-in-billions 67 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/falcon-instruct.rst b/doc/source/models/builtin/llm/falcon-instruct.rst index d473a283c9..3a3b754920 100644 --- a/doc/source/models/builtin/llm/falcon-instruct.rst +++ b/doc/source/models/builtin/llm/falcon-instruct.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** tiiuae/falcon-7b-instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/tiiuae/falcon-7b-instruct>`__, `ModelScope <https://modelscope.cn/models/Xorbits/falcon-7b-instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name falcon-instruct --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name falcon-instruct --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 40 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 40 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 40 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** tiiuae/falcon-40b-instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/tiiuae/falcon-40b-instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name falcon-instruct --size-in-billions 40 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name falcon-instruct --size-in-billions 40 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/falcon.rst b/doc/source/models/builtin/llm/falcon.rst index 77264c6d9b..cb0f66fa7d 100644 --- a/doc/source/models/builtin/llm/falcon.rst +++ b/doc/source/models/builtin/llm/falcon.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 40 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 40 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** tiiuae/falcon-40b - **Model Hubs**: `Hugging Face <https://huggingface.co/tiiuae/falcon-40b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name falcon --size-in-billions 40 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name falcon --size-in-billions 40 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** tiiuae/falcon-7b - **Model Hubs**: `Hugging Face <https://huggingface.co/tiiuae/falcon-7b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name falcon --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name falcon --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/gemma-it.rst b/doc/source/models/builtin/llm/gemma-it.rst index d67493ffdc..cee7c7eb1f 100644 --- a/doc/source/models/builtin/llm/gemma-it.rst +++ b/doc/source/models/builtin/llm/gemma-it.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 - **Quantizations:** none, 4-bit, 8-bit +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** google/gemma-2b-it - **Model Hubs**: `Hugging Face <https://huggingface.co/google/gemma-2b-it>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/gemma-2b-it>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name gemma-it --size-in-billions 2 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name gemma-it --size-in-billions 2 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none, 4-bit, 8-bit +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** google/gemma-7b-it - **Model Hubs**: `Hugging Face <https://huggingface.co/google/gemma-7b-it>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/gemma-7b-it>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name gemma-it --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name gemma-it --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/glaive-coder.rst b/doc/source/models/builtin/llm/glaive-coder.rst index a1ee441440..a4fc98f7cc 100644 --- a/doc/source/models/builtin/llm/glaive-coder.rst +++ b/doc/source/models/builtin/llm/glaive-coder.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** glaiveai/glaive-coder-7b - **Model Hubs**: `Hugging Face <https://huggingface.co/glaiveai/glaive-coder-7b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name glaive-coder --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name glaive-coder --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/gorilla-openfunctions-v1.rst b/doc/source/models/builtin/llm/gorilla-openfunctions-v1.rst index 1c22a5f220..d7ea21418d 100644 --- a/doc/source/models/builtin/llm/gorilla-openfunctions-v1.rst +++ b/doc/source/models/builtin/llm/gorilla-openfunctions-v1.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** gorilla-llm/gorilla-openfunctions-v1 - **Model Hubs**: `Hugging Face <https://huggingface.co/gorilla-llm/gorilla-openfunctions-v1>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name gorilla-openfunctions-v1 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name gorilla-openfunctions-v1 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/gorilla-openfunctions-v1-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/gorilla-openfunctions-v1-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name gorilla-openfunctions-v1 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name gorilla-openfunctions-v1 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/gorilla-openfunctions-v2.rst b/doc/source/models/builtin/llm/gorilla-openfunctions-v2.rst index 471e85d3a1..a4b7aacace 100644 --- a/doc/source/models/builtin/llm/gorilla-openfunctions-v2.rst +++ b/doc/source/models/builtin/llm/gorilla-openfunctions-v2.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** gorilla-llm/gorilla-openfunctions-v2 - **Model Hubs**: `Hugging Face <https://huggingface.co/gorilla-llm/gorilla-openfunctions-v2>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name gorilla-openfunctions-v2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name gorilla-openfunctions-v2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_K_M, Q5_K_S, Q6_K +- **Engines**: llama.cpp - **Model ID:** gorilla-llm//gorilla-openfunctions-v2-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/gorilla-llm//gorilla-openfunctions-v2-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name gorilla-openfunctions-v2 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name gorilla-openfunctions-v2 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/gpt-2.rst b/doc/source/models/builtin/llm/gpt-2.rst index 56c4663178..c314ae9c99 100644 --- a/doc/source/models/builtin/llm/gpt-2.rst +++ b/doc/source/models/builtin/llm/gpt-2.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 1_5 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1_5 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** openai-community/gpt2 - **Model Hubs**: `Hugging Face <https://huggingface.co/openai-community/gpt2>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name gpt-2 --size-in-billions 1_5 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name gpt-2 --size-in-billions 1_5 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 834550a2c3..29c272ca96 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -211,6 +211,11 @@ The following is a list of built-in LLM in Xinference: - 204800 - The second generation of the InternLM model, InternLM2. + * - :ref:`internvl-chat <models_llm_internvl-chat>` + - chat, vision + - 32768 + - InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. + * - :ref:`llama-2 <models_llm_llama-2>` - generate - 4096 @@ -231,6 +236,11 @@ The following is a list of built-in LLM in Xinference: - 8192 - The Llama 3 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks.. + * - :ref:`mini-internvl-chat <models_llm_mini-internvl-chat>` + - chat, vision + - 32768 + - InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. + * - :ref:`minicpm-2b-dpo-bf16 <models_llm_minicpm-2b-dpo-bf16>` - chat - 4096 @@ -569,6 +579,8 @@ The following is a list of built-in LLM in Xinference: internlm2-chat + internvl-chat + llama-2 llama-2-chat @@ -577,6 +589,8 @@ The following is a list of built-in LLM in Xinference: llama-3-instruct + mini-internvl-chat + minicpm-2b-dpo-bf16 minicpm-2b-dpo-fp16 diff --git a/doc/source/models/builtin/llm/internlm-20b.rst b/doc/source/models/builtin/llm/internlm-20b.rst index 8743800c7f..a05f91bf2e 100644 --- a/doc/source/models/builtin/llm/internlm-20b.rst +++ b/doc/source/models/builtin/llm/internlm-20b.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 20 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 20 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** internlm/internlm-20b - **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm-20b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-20b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name internlm-20b --size-in-billions 20 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internlm-20b --size-in-billions 20 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/internlm-7b.rst b/doc/source/models/builtin/llm/internlm-7b.rst index df6712ca40..54b6e170be 100644 --- a/doc/source/models/builtin/llm/internlm-7b.rst +++ b/doc/source/models/builtin/llm/internlm-7b.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** internlm/internlm-7b - **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm-7b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-7b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name internlm-7b --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internlm-7b --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/internlm-chat-20b.rst b/doc/source/models/builtin/llm/internlm-chat-20b.rst index 028153d6e0..b318ea60c1 100644 --- a/doc/source/models/builtin/llm/internlm-chat-20b.rst +++ b/doc/source/models/builtin/llm/internlm-chat-20b.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 20 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 20 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** internlm/internlm-chat-20b - **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm-chat-20b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-20b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name internlm-chat-20b --size-in-billions 20 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internlm-chat-20b --size-in-billions 20 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/internlm-chat-7b.rst b/doc/source/models/builtin/llm/internlm-chat-7b.rst index 889a6af885..37e1c7a3b3 100644 --- a/doc/source/models/builtin/llm/internlm-chat-7b.rst +++ b/doc/source/models/builtin/llm/internlm-chat-7b.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** internlm/internlm-chat-7b - **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm-chat-7b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-7b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name internlm-chat-7b --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internlm-chat-7b --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/internlm2-chat.rst b/doc/source/models/builtin/llm/internlm2-chat.rst index 87150cc205..d3cca8afa5 100644 --- a/doc/source/models/builtin/llm/internlm2-chat.rst +++ b/doc/source/models/builtin/llm/internlm2-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: vLLM, Transformers - **Model ID:** internlm/internlm2-chat-7b - **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2-chat-7b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-7b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name internlm2-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internlm2-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 20 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 20 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 20 - **Quantizations:** none +- **Engines**: vLLM, Transformers - **Model ID:** internlm/internlm2-chat-20b - **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2-chat-20b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-chat-20b>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name internlm2-chat --size-in-billions 20 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internlm2-chat --size-in-billions 20 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/llama-2-chat.rst b/doc/source/models/builtin/llm/llama-2-chat.rst index e7a340cba6..4669cf0618 100644 --- a/doc/source/models/builtin/llm/llama-2-chat.rst +++ b/doc/source/models/builtin/llm/llama-2-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggmlv3, 7 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 7 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Llama-2-7B-Chat-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} Model Spec 2 (ggmlv3, 13 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (ggmlv3, 13 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 13 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Llama-2-13B-chat-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-chat-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} Model Spec 3 (ggmlv3, 70 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (ggmlv3, 70 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 70 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Llama-2-70B-Chat-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-Chat-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 70 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 70 --model-format ggmlv3 --quantization ${quantization} Model Spec 4 (pytorch, 7 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Llama-2-7b-chat-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-7b-chat-hf>`__, `ModelScope <https://modelscope.cn/models/modelscope/Llama-2-7b-chat-ms>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 5 (gptq, 7 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-7B-Chat-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-Chat-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} Model Spec 6 (gptq, 70 Billion) @@ -95,13 +100,14 @@ Model Spec 6 (gptq, 70 Billion) - **Model Format:** gptq - **Model Size (in billions):** 70 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-70B-Chat-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-Chat-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 70 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 70 --model-format gptq --quantization ${quantization} Model Spec 7 (awq, 70 Billion) @@ -110,13 +116,14 @@ Model Spec 7 (awq, 70 Billion) - **Model Format:** awq - **Model Size (in billions):** 70 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-70B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 70 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 70 --model-format awq --quantization ${quantization} Model Spec 8 (awq, 7 Billion) @@ -125,13 +132,14 @@ Model Spec 8 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-7B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 7 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 7 --model-format awq --quantization ${quantization} Model Spec 9 (pytorch, 13 Billion) @@ -140,13 +148,14 @@ Model Spec 9 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Llama-2-13b-chat-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-13b-chat-hf>`__, `ModelScope <https://modelscope.cn/models/modelscope/Llama-2-13b-chat-ms>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 13 --model-format pytorch --quantization ${quantization} Model Spec 10 (gptq, 13 Billion) @@ -155,13 +164,14 @@ Model Spec 10 (gptq, 13 Billion) - **Model Format:** gptq - **Model Size (in billions):** 13 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-13B-chat-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-chat-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 13 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 13 --model-format gptq --quantization ${quantization} Model Spec 11 (awq, 13 Billion) @@ -170,13 +180,14 @@ Model Spec 11 (awq, 13 Billion) - **Model Format:** awq - **Model Size (in billions):** 13 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-13B-chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 13 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 13 --model-format awq --quantization ${quantization} Model Spec 12 (pytorch, 70 Billion) @@ -185,13 +196,14 @@ Model Spec 12 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Llama-2-70b-chat-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-70b-chat-hf>`__, `ModelScope <https://modelscope.cn/models/modelscope/Llama-2-70b-chat-ms>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 70 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 70 --model-format pytorch --quantization ${quantization} Model Spec 13 (ggufv2, 7 Billion) @@ -200,13 +212,14 @@ Model Spec 13 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Llama-2-7B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Llama-2-7b-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 14 (ggufv2, 13 Billion) @@ -215,13 +228,14 @@ Model Spec 14 (ggufv2, 13 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 13 - **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Llama-2-13B-chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Llama-2-13b-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} Model Spec 15 (ggufv2, 70 Billion) @@ -230,11 +244,12 @@ Model Spec 15 (ggufv2, 70 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 70 - **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M +- **Engines**: llama.cpp - **Model ID:** TheBloke/Llama-2-70B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2-chat --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/llama-2.rst b/doc/source/models/builtin/llm/llama-2.rst index 9cfb367661..018212d27b 100644 --- a/doc/source/models/builtin/llm/llama-2.rst +++ b/doc/source/models/builtin/llm/llama-2.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggmlv3, 7 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 7 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Llama-2-7B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} Model Spec 2 (gptq, 7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-7B-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 7 --model-format gptq --quantization ${quantization} Model Spec 3 (awq, 7 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-7B-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 7 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 7 --model-format awq --quantization ${quantization} Model Spec 4 (ggmlv3, 13 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (ggmlv3, 13 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 13 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Llama-2-13B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} Model Spec 5 (ggmlv3, 70 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (ggmlv3, 70 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 70 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Llama-2-70B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 70 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 70 --model-format ggmlv3 --quantization ${quantization} Model Spec 6 (pytorch, 7 Billion) @@ -95,13 +100,14 @@ Model Spec 6 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Llama-2-7b-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-7b-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 7 (pytorch, 13 Billion) @@ -110,13 +116,14 @@ Model Spec 7 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Llama-2-13b-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-13b-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 13 --model-format pytorch --quantization ${quantization} Model Spec 8 (gptq, 13 Billion) @@ -125,13 +132,14 @@ Model Spec 8 (gptq, 13 Billion) - **Model Format:** gptq - **Model Size (in billions):** 13 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-13B-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 13 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 13 --model-format gptq --quantization ${quantization} Model Spec 9 (awq, 13 Billion) @@ -140,13 +148,14 @@ Model Spec 9 (awq, 13 Billion) - **Model Format:** awq - **Model Size (in billions):** 13 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-13B-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 13 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 13 --model-format awq --quantization ${quantization} Model Spec 10 (pytorch, 70 Billion) @@ -155,13 +164,14 @@ Model Spec 10 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Llama-2-70b-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-70b-hf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 70 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 70 --model-format pytorch --quantization ${quantization} Model Spec 11 (gptq, 70 Billion) @@ -170,13 +180,14 @@ Model Spec 11 (gptq, 70 Billion) - **Model Format:** gptq - **Model Size (in billions):** 70 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-70B-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 70 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 70 --model-format gptq --quantization ${quantization} Model Spec 12 (awq, 70 Billion) @@ -185,11 +196,12 @@ Model Spec 12 (awq, 70 Billion) - **Model Format:** awq - **Model Size (in billions):** 70 - **Quantizations:** Int4 +- **Engines**: vLLM - **Model ID:** TheBloke/Llama-2-70B-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-2 --size-in-billions 70 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 70 --model-format awq --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/llama-3-instruct.rst b/doc/source/models/builtin/llm/llama-3-instruct.rst index 7a8bffb7fe..ef2ea9f435 100644 --- a/doc/source/models/builtin/llm/llama-3-instruct.rst +++ b/doc/source/models/builtin/llm/llama-3-instruct.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggufv2, 8 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 8 - **Quantizations:** IQ3_M, Q4_K_M, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-3-instruct --size-in-billions 8 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 8 --model-format ggufv2 --quantization ${quantization} Model Spec 2 (pytorch, 8 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 8 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3-8B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B-Instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-3-instruct --size-in-billions 8 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 8 --model-format pytorch --quantization ${quantization} Model Spec 3 (ggufv2, 70 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (ggufv2, 70 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 70 - **Quantizations:** IQ1_M, IQ2_XS, Q4_K_M +- **Engines**: llama.cpp - **Model ID:** lmstudio-community/Meta-Llama-3-70B-Instruct-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/lmstudio-community/Meta-Llama-3-70B-Instruct-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-3-instruct --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} Model Spec 4 (pytorch, 70 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3-70B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B-Instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-3-instruct --size-in-billions 70 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 70 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/llama-3.rst b/doc/source/models/builtin/llm/llama-3.rst index c5e70cca93..d3d76cada8 100644 --- a/doc/source/models/builtin/llm/llama-3.rst +++ b/doc/source/models/builtin/llm/llama-3.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 8 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3-8B - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-8B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-3 --size-in-billions 8 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-3 --size-in-billions 8 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 8 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (ggufv2, 8 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 8 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_1, Q4_K_M, Q4_K_S, Q5_0, Q5_1, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** QuantFactory/Meta-Llama-3-8B-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/QuantFactory/Meta-Llama-3-8B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-3 --size-in-billions 8 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-3 --size-in-billions 8 --model-format ggufv2 --quantization ${quantization} Model Spec 3 (pytorch, 70 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3-70B - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-70B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-3 --size-in-billions 70 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-3 --size-in-billions 70 --model-format pytorch --quantization ${quantization} Model Spec 4 (ggufv2, 70 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (ggufv2, 70 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 70 - **Quantizations:** Q4_K_M, Q5_K_M +- **Engines**: llama.cpp - **Model ID:** NousResearch/Meta-Llama-3-70B-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/NousResearch/Meta-Llama-3-70B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name llama-3 --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-3 --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/minicpm-2b-dpo-bf16.rst b/doc/source/models/builtin/llm/minicpm-2b-dpo-bf16.rst index 166dab4d7a..390fd7c902 100644 --- a/doc/source/models/builtin/llm/minicpm-2b-dpo-bf16.rst +++ b/doc/source/models/builtin/llm/minicpm-2b-dpo-bf16.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** openbmb/MiniCPM-2B-dpo-bf16 - **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-2B-dpo-bf16>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/MiniCPM-2B-dpo-bf16>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name minicpm-2b-dpo-bf16 --size-in-billions 2 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name minicpm-2b-dpo-bf16 --size-in-billions 2 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/minicpm-2b-dpo-fp16.rst b/doc/source/models/builtin/llm/minicpm-2b-dpo-fp16.rst index 197bd80eb3..fcefa268d5 100644 --- a/doc/source/models/builtin/llm/minicpm-2b-dpo-fp16.rst +++ b/doc/source/models/builtin/llm/minicpm-2b-dpo-fp16.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** openbmb/MiniCPM-2B-dpo-fp16 - **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-2B-dpo-fp16>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/MiniCPM-2B-dpo-fp16>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name minicpm-2b-dpo-fp16 --size-in-billions 2 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name minicpm-2b-dpo-fp16 --size-in-billions 2 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/minicpm-2b-dpo-fp32.rst b/doc/source/models/builtin/llm/minicpm-2b-dpo-fp32.rst index e93ebb55d4..26390514b1 100644 --- a/doc/source/models/builtin/llm/minicpm-2b-dpo-fp32.rst +++ b/doc/source/models/builtin/llm/minicpm-2b-dpo-fp32.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** openbmb/MiniCPM-2B-dpo-fp32 - **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-2B-dpo-fp32>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/MiniCPM-2B-dpo-fp32>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name minicpm-2b-dpo-fp32 --size-in-billions 2 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name minicpm-2b-dpo-fp32 --size-in-billions 2 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/minicpm-2b-sft-bf16.rst b/doc/source/models/builtin/llm/minicpm-2b-sft-bf16.rst index 84c74c5081..b3a37ec1c7 100644 --- a/doc/source/models/builtin/llm/minicpm-2b-sft-bf16.rst +++ b/doc/source/models/builtin/llm/minicpm-2b-sft-bf16.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** openbmb/MiniCPM-2B-sft-bf16 - **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-2B-sft-bf16>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/miniCPM-bf16>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name minicpm-2b-sft-bf16 --size-in-billions 2 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name minicpm-2b-sft-bf16 --size-in-billions 2 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/minicpm-2b-sft-fp32.rst b/doc/source/models/builtin/llm/minicpm-2b-sft-fp32.rst index 18ba3b1f1a..a3fefa2dbc 100644 --- a/doc/source/models/builtin/llm/minicpm-2b-sft-fp32.rst +++ b/doc/source/models/builtin/llm/minicpm-2b-sft-fp32.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** openbmb/MiniCPM-2B-sft-fp32 - **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-2B-sft-fp32>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/MiniCPM-2B-sft-fp32>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name minicpm-2b-sft-fp32 --size-in-billions 2 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name minicpm-2b-sft-fp32 --size-in-billions 2 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/mistral-instruct-v0.1.rst b/doc/source/models/builtin/llm/mistral-instruct-v0.1.rst index dd507a4fb6..331b263008 100644 --- a/doc/source/models/builtin/llm/mistral-instruct-v0.1.rst +++ b/doc/source/models/builtin/llm/mistral-instruct-v0.1.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** mistralai/Mistral-7B-Instruct-v0.1 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Mistral-7B-Instruct-v0.1>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-instruct-v0.1 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.1 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (awq, 7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.1-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.1-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-instruct-v0.1 --size-in-billions 7 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.1 --size-in-billions 7 --model-format awq --quantization ${quantization} Model Spec 3 (gptq, 7 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.1-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.1-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-instruct-v0.1 --size-in-billions 7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.1 --size-in-billions 7 --model-format gptq --quantization ${quantization} Model Spec 4 (ggufv2, 7 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.1-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.1-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-instruct-v0.1 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.1 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/mistral-instruct-v0.2.rst b/doc/source/models/builtin/llm/mistral-instruct-v0.2.rst index d68a285ecb..582a7e975f 100644 --- a/doc/source/models/builtin/llm/mistral-instruct-v0.2.rst +++ b/doc/source/models/builtin/llm/mistral-instruct-v0.2.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** mistralai/Mistral-7B-Instruct-v0.2 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Mistral-7B-Instruct-v0.2>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-instruct-v0.2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (gptq, 7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.2-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-instruct-v0.2 --size-in-billions 7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.2 --size-in-billions 7 --model-format gptq --quantization ${quantization} Model Spec 3 (awq, 7 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.2-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-instruct-v0.2 --size-in-billions 7 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.2 --size-in-billions 7 --model-format awq --quantization ${quantization} Model Spec 4 (ggufv2, 7 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.2-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Mistral-7B-Instruct-v0.2-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-instruct-v0.2 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.2 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/mistral-v0.1.rst b/doc/source/models/builtin/llm/mistral-v0.1.rst index 68b4464176..28eec28141 100644 --- a/doc/source/models/builtin/llm/mistral-v0.1.rst +++ b/doc/source/models/builtin/llm/mistral-v0.1.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** mistralai/Mistral-7B-v0.1 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-7B-v0.1>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Mistral-7B-v0.1>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-v0.1 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-v0.1 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Mistral-7B-v0.1-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-v0.1-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Mistral-7B-v0.1-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mistral-v0.1 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mistral-v0.1 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/mixtral-8x22b-instruct-v0.1.rst b/doc/source/models/builtin/llm/mixtral-8x22b-instruct-v0.1.rst index 05bb73c76b..9c6baf73c3 100644 --- a/doc/source/models/builtin/llm/mixtral-8x22b-instruct-v0.1.rst +++ b/doc/source/models/builtin/llm/mixtral-8x22b-instruct-v0.1.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 141 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 141 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** mistralai/Mixtral-8x22B-Instruct-v0.1 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format pytorch --quantization ${quantization} Model Spec 2 (awq, 141 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (awq, 141 Billion) - **Model Format:** awq - **Model Size (in billions):** 141 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format awq --quantization ${quantization} Model Spec 3 (gptq, 141 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (gptq, 141 Billion) - **Model Format:** gptq - **Model Size (in billions):** 141 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** jarrelscy/Mixtral-8x22B-Instruct-v0.1-GPTQ-4bit - **Model Hubs**: `Hugging Face <https://huggingface.co/jarrelscy/Mixtral-8x22B-Instruct-v0.1-GPTQ-4bit>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format gptq --quantization ${quantization} Model Spec 4 (ggufv2, 141 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (ggufv2, 141 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 141 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_K_M, Q4_K_S, Q5_K_M, Q5_K_S, Q6, Q8_0, fp16 +- **Engines**: llama.cpp - **Model ID:** MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/MaziyarPanahi/Mixtral-8x22B-Instruct-v0.1-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-8x22B-instruct-v0.1 --size-in-billions 141 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/mixtral-instruct-v0.1.rst b/doc/source/models/builtin/llm/mixtral-instruct-v0.1.rst index 268608ef3a..6dfaf7ef1f 100644 --- a/doc/source/models/builtin/llm/mixtral-instruct-v0.1.rst +++ b/doc/source/models/builtin/llm/mixtral-instruct-v0.1.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 46_7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 46_7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** mistralai/Mixtral-8x7B-Instruct-v0.1 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7B-Instruct-v0.1>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-instruct-v0.1 --size-in-billions 46_7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-instruct-v0.1 --size-in-billions 46_7 --model-format pytorch --quantization ${quantization} Model Spec 2 (awq, 46_7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (awq, 46_7 Billion) - **Model Format:** awq - **Model Size (in billions):** 46_7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/Mixtral-8x7B-Instruct-v0.1-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mixtral-8x7B-Instruct-v0.1-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-instruct-v0.1 --size-in-billions 46_7 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-instruct-v0.1 --size-in-billions 46_7 --model-format awq --quantization ${quantization} Model Spec 3 (gptq, 46_7 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (gptq, 46_7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 46_7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** TheBloke/Mixtral-8x7B-Instruct-v0.1-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mixtral-8x7B-Instruct-v0.1-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-instruct-v0.1 --size-in-billions 46_7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-instruct-v0.1 --size-in-billions 46_7 --model-format gptq --quantization ${quantization} Model Spec 4 (ggufv2, 46_7 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (ggufv2, 46_7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 46_7 - **Quantizations:** Q2_K, Q3_K_M, Q4_0, Q4_K_M, Q5_0, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Mixtral-8x7B-Instruct-v0.1-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mixtral-8x7B-Instruct-v0.1-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-instruct-v0.1 --size-in-billions 46_7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-instruct-v0.1 --size-in-billions 46_7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/mixtral-v0.1.rst b/doc/source/models/builtin/llm/mixtral-v0.1.rst index f3bc861538..4ce8cd9401 100644 --- a/doc/source/models/builtin/llm/mixtral-v0.1.rst +++ b/doc/source/models/builtin/llm/mixtral-v0.1.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 46_7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 46_7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** mistralai/Mixtral-8x7B-v0.1 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mixtral-8x7B-v0.1>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7B-v0.1>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-v0.1 --size-in-billions 46_7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-v0.1 --size-in-billions 46_7 --model-format pytorch --quantization ${quantization} Model Spec 2 (gptq, 46_7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (gptq, 46_7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 46_7 - **Quantizations:** Int4 +- **Engines**: Transformers - **Model ID:** TheBloke/Mixtral-8x7B-v0.1-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mixtral-8x7B-v0.1-GPTQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-v0.1 --size-in-billions 46_7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-v0.1 --size-in-billions 46_7 --model-format gptq --quantization ${quantization} Model Spec 3 (ggufv2, 46_7 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (ggufv2, 46_7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 46_7 - **Quantizations:** Q2_K, Q3_K_M, Q4_0, Q4_K_M, Q5_0, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Mixtral-8x7B-v0.1-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mixtral-8x7B-v0.1-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name mixtral-v0.1 --size-in-billions 46_7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name mixtral-v0.1 --size-in-billions 46_7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/omnilmm.rst b/doc/source/models/builtin/llm/omnilmm.rst index 10fd4fee4b..c8a0a32226 100644 --- a/doc/source/models/builtin/llm/omnilmm.rst +++ b/doc/source/models/builtin/llm/omnilmm.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 3 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 3 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** openbmb/MiniCPM-V - **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-V>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/MiniCPM-V>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name OmniLMM --size-in-billions 3 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name OmniLMM --size-in-billions 3 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 12 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 12 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 12 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** openbmb/OmniLMM-12B - **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/OmniLMM-12B>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/OmniLMM-12B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name OmniLMM --size-in-billions 12 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name OmniLMM --size-in-billions 12 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/openbuddy.rst b/doc/source/models/builtin/llm/openbuddy.rst index 756626c7bb..5d05048101 100644 --- a/doc/source/models/builtin/llm/openbuddy.rst +++ b/doc/source/models/builtin/llm/openbuddy.rst @@ -20,11 +20,12 @@ Model Spec 1 (ggmlv3, 13 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 13 - **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_1, Q4_K_S, Q4_K_M, Q5_0, Q5_1, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/OpenBuddy-Llama2-13B-v11.1-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/OpenBuddy-Llama2-13B-v11.1-GGML>`__, `ModelScope <https://modelscope.cn/models/Xorbits/OpenBuddy-Llama2-13B-v11.1-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name OpenBuddy --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name OpenBuddy --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/openhermes-2.5.rst b/doc/source/models/builtin/llm/openhermes-2.5.rst index 793090c34a..aad11355fc 100644 --- a/doc/source/models/builtin/llm/openhermes-2.5.rst +++ b/doc/source/models/builtin/llm/openhermes-2.5.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** teknium/OpenHermes-2.5-Mistral-7B - **Model Hubs**: `Hugging Face <https://huggingface.co/teknium/OpenHermes-2.5-Mistral-7B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name openhermes-2.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name openhermes-2.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/OpenHermes-2.5-Mistral-7B-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/OpenHermes-2.5-Mistral-7B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name openhermes-2.5 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name openhermes-2.5 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/opt.rst b/doc/source/models/builtin/llm/opt.rst index dfb0346e9c..4c416c69a8 100644 --- a/doc/source/models/builtin/llm/opt.rst +++ b/doc/source/models/builtin/llm/opt.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 1 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** facebook/opt-125m - **Model Hubs**: `Hugging Face <https://huggingface.co/facebook/opt-125m>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name opt --size-in-billions 1 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name opt --size-in-billions 1 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/orca.rst b/doc/source/models/builtin/llm/orca.rst index 20ace63c75..566f89bbfd 100644 --- a/doc/source/models/builtin/llm/orca.rst +++ b/doc/source/models/builtin/llm/orca.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggmlv3, 3 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 3 - **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/orca_mini_3B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/orca_mini_3B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name orca --size-in-billions 3 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name orca --size-in-billions 3 --model-format ggmlv3 --quantization ${quantization} Model Spec 2 (ggmlv3, 7 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (ggmlv3, 7 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 7 - **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/orca_mini_7B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/orca_mini_7B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name orca --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name orca --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} Model Spec 3 (ggmlv3, 13 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (ggmlv3, 13 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 13 - **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/orca_mini_13B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/orca_mini_13B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name orca --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name orca --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/orion-chat-rag.rst b/doc/source/models/builtin/llm/orion-chat-rag.rst index 41de461c3c..7a4d3dcc79 100644 --- a/doc/source/models/builtin/llm/orion-chat-rag.rst +++ b/doc/source/models/builtin/llm/orion-chat-rag.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 14 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 14 - **Quantizations:** none, 4-bit, 8-bit +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** OrionStarAI/Orion-14B-Chat-RAG - **Model Hubs**: `Hugging Face <https://huggingface.co/OrionStarAI/Orion-14B-Chat-RAG>`__, `ModelScope <https://modelscope.cn/models/OrionStarAI/Orion-14B-Chat-RAG>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name orion-chat-rag --size-in-billions 14 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name orion-chat-rag --size-in-billions 14 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/orion-chat.rst b/doc/source/models/builtin/llm/orion-chat.rst index fa2cbbe46c..7ddee48d68 100644 --- a/doc/source/models/builtin/llm/orion-chat.rst +++ b/doc/source/models/builtin/llm/orion-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 14 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 14 - **Quantizations:** none, 4-bit, 8-bit +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** OrionStarAI/Orion-14B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/OrionStarAI/Orion-14B-Chat>`__, `ModelScope <https://modelscope.cn/models/OrionStarAI/Orion-14B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name orion-chat --size-in-billions 14 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name orion-chat --size-in-billions 14 --model-format pytorch --quantization ${quantization} Model Spec 2 (awq, 14 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (awq, 14 Billion) - **Model Format:** awq - **Model Size (in billions):** 14 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** OrionStarAI/Orion-14B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/OrionStarAI/Orion-14B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/OrionStarAI/Orion-14B-Chat-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name orion-chat --size-in-billions 14 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name orion-chat --size-in-billions 14 --model-format awq --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/phi-2.rst b/doc/source/models/builtin/llm/phi-2.rst index 09d0e9236e..347ef2da55 100644 --- a/doc/source/models/builtin/llm/phi-2.rst +++ b/doc/source/models/builtin/llm/phi-2.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggufv2, 2 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 2 - **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/phi-2-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/phi-2-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name phi-2 --size-in-billions 2 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name phi-2 --size-in-billions 2 --model-format ggufv2 --quantization ${quantization} Model Spec 2 (pytorch, 2 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** microsoft/phi-2 - **Model Hubs**: `Hugging Face <https://huggingface.co/microsoft/phi-2>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name phi-2 --size-in-billions 2 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name phi-2 --size-in-billions 2 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/phi-3-mini-128k-instruct.rst b/doc/source/models/builtin/llm/phi-3-mini-128k-instruct.rst index ce875fa8a1..7cd49226cf 100644 --- a/doc/source/models/builtin/llm/phi-3-mini-128k-instruct.rst +++ b/doc/source/models/builtin/llm/phi-3-mini-128k-instruct.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 4 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 4 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** microsoft/Phi-3-mini-128k-instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/microsoft/Phi-3-mini-128k-instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Phi-3-mini-128k-instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name phi-3-mini-128k-instruct --size-in-billions 4 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name phi-3-mini-128k-instruct --size-in-billions 4 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/phi-3-mini-4k-instruct.rst b/doc/source/models/builtin/llm/phi-3-mini-4k-instruct.rst index f8db3902a7..583af0a7ed 100644 --- a/doc/source/models/builtin/llm/phi-3-mini-4k-instruct.rst +++ b/doc/source/models/builtin/llm/phi-3-mini-4k-instruct.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggufv2, 4 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 4 - **Quantizations:** fp16, q4 +- **Engines**: llama.cpp - **Model ID:** microsoft/Phi-3-mini-4k-instruct-gguf - **Model Hubs**: `Hugging Face <https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-gguf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name phi-3-mini-4k-instruct --size-in-billions 4 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name phi-3-mini-4k-instruct --size-in-billions 4 --model-format ggufv2 --quantization ${quantization} Model Spec 2 (pytorch, 4 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 4 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 4 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** microsoft/Phi-3-mini-4k-instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/microsoft/Phi-3-mini-4k-instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Phi-3-mini-4k-instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name phi-3-mini-4k-instruct --size-in-billions 4 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name phi-3-mini-4k-instruct --size-in-billions 4 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/platypus2-70b-instruct.rst b/doc/source/models/builtin/llm/platypus2-70b-instruct.rst index b4859ade8a..742ca56a08 100644 --- a/doc/source/models/builtin/llm/platypus2-70b-instruct.rst +++ b/doc/source/models/builtin/llm/platypus2-70b-instruct.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** garage-bAInd/Platypus2-70B-instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/garage-bAInd/Platypus2-70B-instruct>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name platypus2-70b-instruct --size-in-billions 70 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name platypus2-70b-instruct --size-in-billions 70 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/qwen-chat.rst b/doc/source/models/builtin/llm/qwen-chat.rst index 526b4ef3fd..149804d04e 100644 --- a/doc/source/models/builtin/llm/qwen-chat.rst +++ b/doc/source/models/builtin/llm/qwen-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q4_K_M +- **Engines**: llama.cpp - **Model ID:** Xorbits/Qwen-7B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Xorbits/Qwen-7B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Qwen-7B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 2 (ggufv2, 14 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (ggufv2, 14 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 14 - **Quantizations:** Q4_K_M +- **Engines**: llama.cpp - **Model ID:** Xorbits/Qwen-14B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Xorbits/Qwen-14B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Qwen-14B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 14 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 14 --model-format ggufv2 --quantization ${quantization} Model Spec 3 (pytorch, 1_8 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 1_8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1_8 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen-1_8B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-1_8B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-1_8B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 1_8 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 1_8 --model-format pytorch --quantization ${quantization} Model Spec 4 (pytorch, 7 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen-7B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-7B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-7B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 5 (pytorch, 14 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (pytorch, 14 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 14 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen-14B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-14B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-14B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 14 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 14 --model-format pytorch --quantization ${quantization} Model Spec 6 (pytorch, 72 Billion) @@ -95,13 +100,14 @@ Model Spec 6 (pytorch, 72 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 72 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen-72B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-72B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-72B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 72 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 72 --model-format pytorch --quantization ${quantization} Model Spec 7 (gptq, 7 Billion) @@ -110,13 +116,14 @@ Model Spec 7 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen-7B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-7B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-7B-Chat-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} Model Spec 8 (gptq, 1_8 Billion) @@ -125,13 +132,14 @@ Model Spec 8 (gptq, 1_8 Billion) - **Model Format:** gptq - **Model Size (in billions):** 1_8 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen-1_8B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-1_8B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-1_8B-Chat-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 1_8 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 1_8 --model-format gptq --quantization ${quantization} Model Spec 9 (gptq, 14 Billion) @@ -140,13 +148,14 @@ Model Spec 9 (gptq, 14 Billion) - **Model Format:** gptq - **Model Size (in billions):** 14 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen-14B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-14B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-14B-Chat-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 14 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 14 --model-format gptq --quantization ${quantization} Model Spec 10 (gptq, 72 Billion) @@ -155,11 +164,12 @@ Model Spec 10 (gptq, 72 Billion) - **Model Format:** gptq - **Model Size (in billions):** 72 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen-72B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-72B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-72B-Chat-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-chat --size-in-billions 72 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-chat --size-in-billions 72 --model-format gptq --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/qwen-vl-chat.rst b/doc/source/models/builtin/llm/qwen-vl-chat.rst index 6a676318f7..4abfe1c954 100644 --- a/doc/source/models/builtin/llm/qwen-vl-chat.rst +++ b/doc/source/models/builtin/llm/qwen-vl-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** Qwen/Qwen-VL-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-VL-Chat>`__, `ModelScope <https://modelscope.cn/models/Qwen/Qwen-VL-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-vl-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-vl-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (gptq, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: Transformers - **Model ID:** Qwen/Qwen-VL-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-VL-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/Qwen/Qwen-VL-Chat-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen-vl-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen-vl-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/qwen1.5-chat.rst b/doc/source/models/builtin/llm/qwen1.5-chat.rst index 1f9228ffb5..a8ad821809 100644 --- a/doc/source/models/builtin/llm/qwen1.5-chat.rst +++ b/doc/source/models/builtin/llm/qwen1.5-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 0_5 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 0_5 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen1.5-0.5B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 0_5 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 0_5 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 1_8 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 1_8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1_8 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen1.5-1.8B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 1_8 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 1_8 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 4 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 4 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 4 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen1.5-4B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-4B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 4 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 4 --model-format pytorch --quantization ${quantization} Model Spec 4 (pytorch, 7 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen1.5-7B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-7B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 5 (pytorch, 14 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (pytorch, 14 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 14 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen1.5-14B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-14B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 14 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 14 --model-format pytorch --quantization ${quantization} Model Spec 6 (pytorch, 32 Billion) @@ -95,13 +100,14 @@ Model Spec 6 (pytorch, 32 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 32 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen1.5-32B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-32B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 32 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 32 --model-format pytorch --quantization ${quantization} Model Spec 7 (pytorch, 72 Billion) @@ -110,13 +116,14 @@ Model Spec 7 (pytorch, 72 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 72 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen1.5-72B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-72B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 72 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 72 --model-format pytorch --quantization ${quantization} Model Spec 8 (pytorch, 110 Billion) @@ -125,13 +132,14 @@ Model Spec 8 (pytorch, 110 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 110 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen1.5-110B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-110B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 110 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 110 --model-format pytorch --quantization ${quantization} Model Spec 9 (gptq, 0_5 Billion) @@ -140,13 +148,14 @@ Model Spec 9 (gptq, 0_5 Billion) - **Model Format:** gptq - **Model Size (in billions):** 0_5 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-0.5B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-GPTQ-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 0_5 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 0_5 --model-format gptq --quantization ${quantization} Model Spec 10 (gptq, 1_8 Billion) @@ -155,13 +164,14 @@ Model Spec 10 (gptq, 1_8 Billion) - **Model Format:** gptq - **Model Size (in billions):** 1_8 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-1.8B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-GPTQ-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 1_8 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 1_8 --model-format gptq --quantization ${quantization} Model Spec 11 (gptq, 4 Billion) @@ -170,13 +180,14 @@ Model Spec 11 (gptq, 4 Billion) - **Model Format:** gptq - **Model Size (in billions):** 4 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-4B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-4B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-GPTQ-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 4 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 4 --model-format gptq --quantization ${quantization} Model Spec 12 (gptq, 7 Billion) @@ -185,13 +196,14 @@ Model Spec 12 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-7B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-GPTQ-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} Model Spec 13 (gptq, 14 Billion) @@ -200,13 +212,14 @@ Model Spec 13 (gptq, 14 Billion) - **Model Format:** gptq - **Model Size (in billions):** 14 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-14B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-14B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-GPTQ-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 14 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 14 --model-format gptq --quantization ${quantization} Model Spec 14 (gptq, 32 Billion) @@ -215,13 +228,14 @@ Model Spec 14 (gptq, 32 Billion) - **Model Format:** gptq - **Model Size (in billions):** 32 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-32B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-32B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-GPTQ-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 32 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 32 --model-format gptq --quantization ${quantization} Model Spec 15 (gptq, 72 Billion) @@ -230,13 +244,14 @@ Model Spec 15 (gptq, 72 Billion) - **Model Format:** gptq - **Model Size (in billions):** 72 - **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-72B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-72B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-GPTQ-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 72 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 72 --model-format gptq --quantization ${quantization} Model Spec 16 (gptq, 110 Billion) @@ -245,13 +260,14 @@ Model Spec 16 (gptq, 110 Billion) - **Model Format:** gptq - **Model Size (in billions):** 110 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-110B-Chat-GPTQ-Int4 - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-110B-Chat-GPTQ-Int4>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-GPTQ-Int4>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 110 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 110 --model-format gptq --quantization ${quantization} Model Spec 17 (awq, 0_5 Billion) @@ -260,13 +276,14 @@ Model Spec 17 (awq, 0_5 Billion) - **Model Format:** awq - **Model Size (in billions):** 0_5 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-0.5B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 0_5 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 0_5 --model-format awq --quantization ${quantization} Model Spec 18 (awq, 1_8 Billion) @@ -275,13 +292,14 @@ Model Spec 18 (awq, 1_8 Billion) - **Model Format:** awq - **Model Size (in billions):** 1_8 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-1.8B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 1_8 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 1_8 --model-format awq --quantization ${quantization} Model Spec 19 (awq, 4 Billion) @@ -290,13 +308,14 @@ Model Spec 19 (awq, 4 Billion) - **Model Format:** awq - **Model Size (in billions):** 4 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-4B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-4B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 4 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 4 --model-format awq --quantization ${quantization} Model Spec 20 (awq, 7 Billion) @@ -305,13 +324,14 @@ Model Spec 20 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-7B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-7B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 7 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 7 --model-format awq --quantization ${quantization} Model Spec 21 (awq, 14 Billion) @@ -320,13 +340,14 @@ Model Spec 21 (awq, 14 Billion) - **Model Format:** awq - **Model Size (in billions):** 14 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-14B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-14B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 14 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 14 --model-format awq --quantization ${quantization} Model Spec 22 (awq, 32 Billion) @@ -335,13 +356,14 @@ Model Spec 22 (awq, 32 Billion) - **Model Format:** awq - **Model Size (in billions):** 32 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-32B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-32B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 32 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 32 --model-format awq --quantization ${quantization} Model Spec 23 (awq, 72 Billion) @@ -350,13 +372,14 @@ Model Spec 23 (awq, 72 Billion) - **Model Format:** awq - **Model Size (in billions):** 72 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-72B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-72B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 72 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 72 --model-format awq --quantization ${quantization} Model Spec 24 (awq, 110 Billion) @@ -365,13 +388,14 @@ Model Spec 24 (awq, 110 Billion) - **Model Format:** awq - **Model Size (in billions):** 110 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-110B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-110B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-AWQ>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 110 --model-format awq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 110 --model-format awq --quantization ${quantization} Model Spec 25 (ggufv2, 0_5 Billion) @@ -380,13 +404,14 @@ Model Spec 25 (ggufv2, 0_5 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 0_5 - **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0 +- **Engines**: llama.cpp - **Model ID:** Qwen/Qwen1.5-0.5B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 0_5 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 0_5 --model-format ggufv2 --quantization ${quantization} Model Spec 26 (ggufv2, 1_8 Billion) @@ -395,13 +420,14 @@ Model Spec 26 (ggufv2, 1_8 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 1_8 - **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0 +- **Engines**: llama.cpp - **Model ID:** Qwen/Qwen1.5-1.8B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 1_8 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 1_8 --model-format ggufv2 --quantization ${quantization} Model Spec 27 (ggufv2, 4 Billion) @@ -410,13 +436,14 @@ Model Spec 27 (ggufv2, 4 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 4 - **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0 +- **Engines**: llama.cpp - **Model ID:** Qwen/Qwen1.5-4B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-4B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 4 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 4 --model-format ggufv2 --quantization ${quantization} Model Spec 28 (ggufv2, 7 Billion) @@ -425,13 +452,14 @@ Model Spec 28 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0 +- **Engines**: llama.cpp - **Model ID:** Qwen/Qwen1.5-7B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 29 (ggufv2, 14 Billion) @@ -440,13 +468,14 @@ Model Spec 29 (ggufv2, 14 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 14 - **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0 +- **Engines**: llama.cpp - **Model ID:** Qwen/Qwen1.5-14B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-14B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 14 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 14 --model-format ggufv2 --quantization ${quantization} Model Spec 30 (ggufv2, 32 Billion) @@ -455,13 +484,14 @@ Model Spec 30 (ggufv2, 32 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 32 - **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0 +- **Engines**: llama.cpp - **Model ID:** Qwen/Qwen1.5-32B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-32B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 32 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 32 --model-format ggufv2 --quantization ${quantization} Model Spec 31 (ggufv2, 72 Billion) @@ -470,11 +500,12 @@ Model Spec 31 (ggufv2, 72 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 72 - **Quantizations:** q2_k, q3_k_m, q4_k_m +- **Engines**: llama.cpp - **Model ID:** Qwen/Qwen1.5-72B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-72B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-chat --size-in-billions 72 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-chat --size-in-billions 72 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst b/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst index 24c3e8e9b9..c371dfbb69 100644 --- a/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst +++ b/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 2_7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2_7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** Qwen/Qwen1.5-MoE-A2.7B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-moe-chat --size-in-billions 2_7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-moe-chat --size-in-billions 2_7 --model-format pytorch --quantization ${quantization} Model Spec 2 (gptq, 2_7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (gptq, 2_7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 2_7 - **Quantizations:** Int4 +- **Engines**: vLLM, Transformers - **Model ID:** Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4 - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name qwen1.5-moe-chat --size-in-billions 2_7 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name qwen1.5-moe-chat --size-in-billions 2_7 --model-format gptq --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/seallm_v2.5.rst b/doc/source/models/builtin/llm/seallm_v2.5.rst index 50d055de45..32c4b6453b 100644 --- a/doc/source/models/builtin/llm/seallm_v2.5.rst +++ b/doc/source/models/builtin/llm/seallm_v2.5.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** SeaLLMs/SeaLLM-7B-v2.5 - **Model Hubs**: `Hugging Face <https://huggingface.co/SeaLLMs/SeaLLM-7B-v2.5>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name seallm_v2.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name seallm_v2.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q4_K_M, Q8_0 +- **Engines**: llama.cpp - **Model ID:** SeaLLMs/SeaLLM-7B-v2.5-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/SeaLLMs/SeaLLM-7B-v2.5-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name seallm_v2.5 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name seallm_v2.5 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/seallm_v2.rst b/doc/source/models/builtin/llm/seallm_v2.rst index 5de2a0990c..261349270d 100644 --- a/doc/source/models/builtin/llm/seallm_v2.rst +++ b/doc/source/models/builtin/llm/seallm_v2.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** SeaLLMs/SeaLLM-7B-v2 - **Model Hubs**: `Hugging Face <https://huggingface.co/SeaLLMs/SeaLLM-7B-v2>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name seallm_v2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name seallm_v2 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (ggufv2, 7 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q4_0, Q8_0 +- **Engines**: llama.cpp - **Model ID:** SeaLLMs/SeaLLM-7B-v2-gguf - **Model Hubs**: `Hugging Face <https://huggingface.co/SeaLLMs/SeaLLM-7B-v2-gguf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name seallm_v2 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name seallm_v2 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/skywork-math.rst b/doc/source/models/builtin/llm/skywork-math.rst index 8c52a153a6..a4699e5281 100644 --- a/doc/source/models/builtin/llm/skywork-math.rst +++ b/doc/source/models/builtin/llm/skywork-math.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 8-bit, none +- **Engines**: Transformers - **Model ID:** skywork/Skywork-13B-Math - **Model Hubs**: `Hugging Face <https://huggingface.co/skywork/Skywork-13B-Math>`__, `ModelScope <https://modelscope.cn/models/skywork/Skywork-13B-Math>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Skywork-Math --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Skywork-Math --size-in-billions 13 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/skywork.rst b/doc/source/models/builtin/llm/skywork.rst index e21c3180dd..6f0208f10b 100644 --- a/doc/source/models/builtin/llm/skywork.rst +++ b/doc/source/models/builtin/llm/skywork.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 8-bit, none +- **Engines**: Transformers - **Model ID:** skywork/Skywork-13B-base - **Model Hubs**: `Hugging Face <https://huggingface.co/skywork/Skywork-13B-base>`__, `ModelScope <https://modelscope.cn/models/skywork/Skywork-13B-base>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Skywork --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Skywork --size-in-billions 13 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/starchat-beta.rst b/doc/source/models/builtin/llm/starchat-beta.rst index 982afcd0bd..bbcc40b226 100644 --- a/doc/source/models/builtin/llm/starchat-beta.rst +++ b/doc/source/models/builtin/llm/starchat-beta.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 16 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 16 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** HuggingFaceH4/starchat-beta - **Model Hubs**: `Hugging Face <https://huggingface.co/HuggingFaceH4/starchat-beta>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name starchat-beta --size-in-billions 16 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name starchat-beta --size-in-billions 16 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/starcoder.rst b/doc/source/models/builtin/llm/starcoder.rst index 17f66c3c53..b80050e61b 100644 --- a/doc/source/models/builtin/llm/starcoder.rst +++ b/doc/source/models/builtin/llm/starcoder.rst @@ -20,11 +20,12 @@ Model Spec 1 (ggmlv3, 16 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 16 - **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/starcoder-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/starcoder-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name starcoder --size-in-billions 16 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name starcoder --size-in-billions 16 --model-format ggmlv3 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/starcoderplus.rst b/doc/source/models/builtin/llm/starcoderplus.rst index 8cb3bbb604..5b6e87199e 100644 --- a/doc/source/models/builtin/llm/starcoderplus.rst +++ b/doc/source/models/builtin/llm/starcoderplus.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 16 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 16 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** bigcode/starcoderplus - **Model Hubs**: `Hugging Face <https://huggingface.co/bigcode/starcoderplus>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name starcoderplus --size-in-billions 16 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name starcoderplus --size-in-billions 16 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/tiny-llama.rst b/doc/source/models/builtin/llm/tiny-llama.rst index b5788ce5c9..5bcfb5edb9 100644 --- a/doc/source/models/builtin/llm/tiny-llama.rst +++ b/doc/source/models/builtin/llm/tiny-llama.rst @@ -20,11 +20,12 @@ Model Spec 1 (ggufv2, 1 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 1 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/TinyLlama-1.1B-Chat-v0.3-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v0.3-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/TinyLlama-1.1B-step-50K-105b-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name tiny-llama --size-in-billions 1 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name tiny-llama --size-in-billions 1 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/vicuna-v1.3.rst b/doc/source/models/builtin/llm/vicuna-v1.3.rst index 1d0be5c824..23b0cd01cf 100644 --- a/doc/source/models/builtin/llm/vicuna-v1.3.rst +++ b/doc/source/models/builtin/llm/vicuna-v1.3.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggmlv3, 7 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 7 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/vicuna-7B-v1.3-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/vicuna-7B-v1.3-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.3 --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} Model Spec 2 (ggmlv3, 13 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (ggmlv3, 13 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 13 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/vicuna-13b-v1.3.0-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/vicuna-13b-v1.3.0-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.3 --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} Model Spec 3 (ggmlv3, 33 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (ggmlv3, 33 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 33 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/vicuna-33B-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/vicuna-33B-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.3 --size-in-billions 33 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 33 --model-format ggmlv3 --quantization ${quantization} Model Spec 4 (pytorch, 33 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (pytorch, 33 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 33 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** lmsys/vicuna-33b-v1.3 - **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-33b-v1.3>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.3 --size-in-billions 33 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 33 --model-format pytorch --quantization ${quantization} Model Spec 5 (pytorch, 13 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** lmsys/vicuna-13b-v1.3 - **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-13b-v1.3>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.3 --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 13 --model-format pytorch --quantization ${quantization} Model Spec 6 (pytorch, 7 Billion) @@ -95,11 +100,12 @@ Model Spec 6 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** lmsys/vicuna-7b-v1.3 - **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-7b-v1.3>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.3 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/vicuna-v1.5-16k.rst b/doc/source/models/builtin/llm/vicuna-v1.5-16k.rst index a4b2632192..88adc9a0ba 100644 --- a/doc/source/models/builtin/llm/vicuna-v1.5-16k.rst +++ b/doc/source/models/builtin/llm/vicuna-v1.5-16k.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** lmsys/vicuna-7b-v1.5-16k - **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-7b-v1.5-16k>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.5-16k --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.5-16k --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** lmsys/vicuna-13b-v1.5-16k - **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-13b-v1.5-16k>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.5-16k --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.5-16k --size-in-billions 13 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/vicuna-v1.5.rst b/doc/source/models/builtin/llm/vicuna-v1.5.rst index 84cea1146d..fa6a6b8860 100644 --- a/doc/source/models/builtin/llm/vicuna-v1.5.rst +++ b/doc/source/models/builtin/llm/vicuna-v1.5.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** lmsys/vicuna-7b-v1.5 - **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-7b-v1.5>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** lmsys/vicuna-13b-v1.5 - **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-13b-v1.5>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name vicuna-v1.5 --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name vicuna-v1.5 --size-in-billions 13 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/wizardcoder-python-v1.0.rst b/doc/source/models/builtin/llm/wizardcoder-python-v1.0.rst index 669429c188..4bcf89bfab 100644 --- a/doc/source/models/builtin/llm/wizardcoder-python-v1.0.rst +++ b/doc/source/models/builtin/llm/wizardcoder-python-v1.0.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** WizardLM/WizardCoder-Python-7B-V1.0 - **Model Hubs**: `Hugging Face <https://huggingface.co/WizardLM/WizardCoder-Python-7B-V1.0>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardcoder-python-v1.0 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardcoder-python-v1.0 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** WizardLM/WizardCoder-Python-13B-V1.0 - **Model Hubs**: `Hugging Face <https://huggingface.co/WizardLM/WizardCoder-Python-13B-V1.0>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/WizardCoder-Python-13B-V1.0>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardcoder-python-v1.0 --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardcoder-python-v1.0 --size-in-billions 13 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 34 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** WizardLM/WizardCoder-Python-34B-V1.0 - **Model Hubs**: `Hugging Face <https://huggingface.co/WizardLM/WizardCoder-Python-34B-V1.0>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/WizardCoder-Python-34B-V1.0>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardcoder-python-v1.0 --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardcoder-python-v1.0 --size-in-billions 34 --model-format pytorch --quantization ${quantization} Model Spec 4 (ggufv2, 7 Billion) @@ -65,13 +68,14 @@ Model Spec 4 (ggufv2, 7 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 7 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/WizardCoder-Python-7B-V1.0-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/WizardCoder-Python-7B-V1.0-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardcoder-python-v1.0 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardcoder-python-v1.0 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 5 (ggufv2, 13 Billion) @@ -80,13 +84,14 @@ Model Spec 5 (ggufv2, 13 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 13 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/WizardCoder-Python-13B-V1.0-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/WizardCoder-Python-13B-V1.0-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardcoder-python-v1.0 --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardcoder-python-v1.0 --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} Model Spec 6 (ggufv2, 34 Billion) @@ -95,11 +100,12 @@ Model Spec 6 (ggufv2, 34 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 34 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/WizardCoder-Python-34B-V1.0-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/WizardCoder-Python-34B-V1.0-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardcoder-python-v1.0 --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardcoder-python-v1.0 --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/wizardlm-v1.0.rst b/doc/source/models/builtin/llm/wizardlm-v1.0.rst index c243e1e9b6..d298860fb4 100644 --- a/doc/source/models/builtin/llm/wizardlm-v1.0.rst +++ b/doc/source/models/builtin/llm/wizardlm-v1.0.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggmlv3, 7 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 7 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/WizardLM-7B-V1.0-Uncensored-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/WizardLM-7B-V1.0-Uncensored-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardlm-v1.0 --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardlm-v1.0 --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} Model Spec 2 (ggmlv3, 13 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (ggmlv3, 13 Billion) - **Model Format:** ggmlv3 - **Model Size (in billions):** 13 - **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/WizardLM-13B-V1.0-Uncensored-GGML - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/WizardLM-13B-V1.0-Uncensored-GGML>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardlm-v1.0 --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardlm-v1.0 --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/wizardmath-v1.0.rst b/doc/source/models/builtin/llm/wizardmath-v1.0.rst index 3e883e1d7f..8de1960716 100644 --- a/doc/source/models/builtin/llm/wizardmath-v1.0.rst +++ b/doc/source/models/builtin/llm/wizardmath-v1.0.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** WizardLM/WizardMath-7B-V1.0 - **Model Hubs**: `Hugging Face <https://huggingface.co/WizardLM/WizardMath-7B-V1.0>`__, `ModelScope <https://modelscope.cn/models/Xorbits/WizardMath-7B-V1.0>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardmath-v1.0 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardmath-v1.0 --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** WizardLM/WizardMath-13B-V1.0 - **Model Hubs**: `Hugging Face <https://huggingface.co/WizardLM/WizardMath-13B-V1.0>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardmath-v1.0 --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardmath-v1.0 --size-in-billions 13 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 70 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** WizardLM/WizardMath-70B-V1.0 - **Model Hubs**: `Hugging Face <https://huggingface.co/WizardLM/WizardMath-70B-V1.0>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name wizardmath-v1.0 --size-in-billions 70 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name wizardmath-v1.0 --size-in-billions 70 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/xverse-chat.rst b/doc/source/models/builtin/llm/xverse-chat.rst index eaf4c06616..07a9606e13 100644 --- a/doc/source/models/builtin/llm/xverse-chat.rst +++ b/doc/source/models/builtin/llm/xverse-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** xverse/XVERSE-7B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/xverse/XVERSE-7B-Chat>`__, `ModelScope <https://modelscope.cn/models/xverse/XVERSE-7B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name xverse-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name xverse-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** xverse/XVERSE-13B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/xverse/XVERSE-13B-Chat>`__, `ModelScope <https://modelscope.cn/models/xverse/XVERSE-13B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name xverse-chat --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name xverse-chat --size-in-billions 13 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/xverse.rst b/doc/source/models/builtin/llm/xverse.rst index 6be7dbaccc..dd37bac478 100644 --- a/doc/source/models/builtin/llm/xverse.rst +++ b/doc/source/models/builtin/llm/xverse.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** xverse/XVERSE-7B - **Model Hubs**: `Hugging Face <https://huggingface.co/xverse/XVERSE-7B>`__, `ModelScope <https://modelscope.cn/models/xverse/XVERSE-7B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name xverse --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name xverse --size-in-billions 7 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 13 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** xverse/XVERSE-13B - **Model Hubs**: `Hugging Face <https://huggingface.co/xverse/XVERSE-13B>`__, `ModelScope <https://modelscope.cn/models/xverse/XVERSE-13B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name xverse --size-in-billions 13 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name xverse --size-in-billions 13 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 65 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (pytorch, 65 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 65 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** xverse/XVERSE-65B - **Model Hubs**: `Hugging Face <https://huggingface.co/xverse/XVERSE-65B>`__, `ModelScope <https://modelscope.cn/models/xverse/XVERSE-65B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name xverse --size-in-billions 65 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name xverse --size-in-billions 65 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/yi-1.5-chat.rst b/doc/source/models/builtin/llm/yi-1.5-chat.rst index df77f84b9a..260c294d05 100644 --- a/doc/source/models/builtin/llm/yi-1.5-chat.rst +++ b/doc/source/models/builtin/llm/yi-1.5-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-1.5-6B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-6B-Chat>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-6B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-1.5-chat --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 6 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 9 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 9 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 9 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-1.5-9B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-9B-Chat>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-9B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-1.5-chat --size-in-billions 9 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 9 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 34 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-1.5-34B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-34B-Chat>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-34B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-1.5-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/yi-1.5.rst b/doc/source/models/builtin/llm/yi-1.5.rst index a0b3727e53..aee30a1bff 100644 --- a/doc/source/models/builtin/llm/yi-1.5.rst +++ b/doc/source/models/builtin/llm/yi-1.5.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-1.5-6B - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-6B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-6B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-1.5 --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-1.5 --size-in-billions 6 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 9 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 9 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 9 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-1.5-9B - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-9B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-9B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-1.5 --size-in-billions 9 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-1.5 --size-in-billions 9 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 34 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-1.5-34B - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-34B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-34B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-1.5 --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-1.5 --size-in-billions 34 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/yi-200k.rst b/doc/source/models/builtin/llm/yi-200k.rst index acb8aa1750..aa6c84d654 100644 --- a/doc/source/models/builtin/llm/yi-200k.rst +++ b/doc/source/models/builtin/llm/yi-200k.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** 01-ai/Yi-6B-200K - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-6B-200K>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-6B-200K>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-200k --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-200k --size-in-billions 6 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 34 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** 01-ai/Yi-34B-200K - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-34B-200K>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-34B-200K>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-200k --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-200k --size-in-billions 34 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/yi-chat.rst b/doc/source/models/builtin/llm/yi-chat.rst index 4d5df8065b..3027c58d65 100644 --- a/doc/source/models/builtin/llm/yi-chat.rst +++ b/doc/source/models/builtin/llm/yi-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (gptq, 34 Billion) - **Model Format:** gptq - **Model Size (in billions):** 34 - **Quantizations:** 8bits +- **Engines**: vLLM, Transformers - **Model ID:** 01-ai/Yi-34B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-34B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-34B-Chat-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-chat --size-in-billions 34 --model-format gptq --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-chat --size-in-billions 34 --model-format gptq --quantization ${quantization} Model Spec 2 (pytorch, 6 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-6B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-6B-Chat>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-6B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-chat --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-chat --size-in-billions 6 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 34 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-34B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-34B-Chat>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-34B-Chat>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} Model Spec 4 (ggufv2, 34 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (ggufv2, 34 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 34 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Yi-34B-Chat-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Yi-34B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi-chat --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi-chat --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/yi-vl-chat.rst b/doc/source/models/builtin/llm/yi-vl-chat.rst index 96fa6c64d1..fb9f24ff95 100644 --- a/doc/source/models/builtin/llm/yi-vl-chat.rst +++ b/doc/source/models/builtin/llm/yi-vl-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** 01-ai/Yi-VL-6B - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-VL-6B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-VL-6B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name yi-vl-chat --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name yi-vl-chat --size-in-billions 6 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 34 Billion) @@ -35,11 +36,12 @@ Model Spec 2 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** 01-ai/Yi-VL-34B - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-VL-34B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-VL-34B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name yi-vl-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name yi-vl-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/yi.rst b/doc/source/models/builtin/llm/yi.rst index 56d0e24f3f..c20ea3f49f 100644 --- a/doc/source/models/builtin/llm/yi.rst +++ b/doc/source/models/builtin/llm/yi.rst @@ -20,13 +20,14 @@ Model Spec 1 (ggufv2, 34 Billion) - **Model Format:** ggufv2 - **Model Size (in billions):** 34 - **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp - **Model ID:** TheBloke/Yi-34B-GGUF - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Yi-34B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} Model Spec 2 (pytorch, 6 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 6 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 6 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-6B - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-6B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-6B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi --size-in-billions 6 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi --size-in-billions 6 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 9 Billion) @@ -50,13 +52,14 @@ Model Spec 3 (pytorch, 9 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 9 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-9B - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-9B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-9B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi --size-in-billions 9 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi --size-in-billions 9 --model-format pytorch --quantization ${quantization} Model Spec 4 (pytorch, 34 Billion) @@ -65,11 +68,12 @@ Model Spec 4 (pytorch, 34 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 34 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) - **Model ID:** 01-ai/Yi-34B - **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-34B>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-34B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name Yi --size-in-billions 34 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name Yi --size-in-billions 34 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/zephyr-7b-alpha.rst b/doc/source/models/builtin/llm/zephyr-7b-alpha.rst index 23df488df1..3b48a0f40a 100644 --- a/doc/source/models/builtin/llm/zephyr-7b-alpha.rst +++ b/doc/source/models/builtin/llm/zephyr-7b-alpha.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** HuggingFaceH4/zephyr-7b-alpha - **Model Hubs**: `Hugging Face <https://huggingface.co/HuggingFaceH4/zephyr-7b-alpha>`__, `ModelScope <https://modelscope.cn/models/keepitsimple/zephyr-7b-alpha>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name zephyr-7b-alpha --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name zephyr-7b-alpha --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/zephyr-7b-beta.rst b/doc/source/models/builtin/llm/zephyr-7b-beta.rst index 8b6500b50c..40048e2c55 100644 --- a/doc/source/models/builtin/llm/zephyr-7b-beta.rst +++ b/doc/source/models/builtin/llm/zephyr-7b-beta.rst @@ -20,11 +20,12 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers - **Model ID:** HuggingFaceH4/zephyr-7b-beta - **Model Hubs**: `Hugging Face <https://huggingface.co/HuggingFaceH4/zephyr-7b-beta>`__, `ModelScope <https://modelscope.cn/models/modelscope/zephyr-7b-beta>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name zephyr-7b-beta --size-in-billions 7 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name zephyr-7b-beta --size-in-billions 7 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index afa09a939f..b2fbb36ce2 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -62,7 +62,7 @@ Currently, supported model includes: - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` -- ``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit`` +- ``c4ai-command-r-v01`` .. vllm_end SGLang diff --git a/doc/templates/llm.rst.jinja b/doc/templates/llm.rst.jinja index 3df3d2c839..67b0464cfb 100644 --- a/doc/templates/llm.rst.jinja +++ b/doc/templates/llm.rst.jinja @@ -20,12 +20,13 @@ Model Spec {{ loop.index }} ({{ spec.model_format }}, {{ spec.model_size_in_bill - **Model Format:** {{ spec.model_format }} - **Model Size (in billions):** {{ spec.model_size_in_billions }} - **Quantizations:** {{ spec.quantizations | join(', ') }} +{% if spec.model_format == 'pytorch' and 'vLLM' in spec.engines and '4-bit' in spec.quantizations %}- **Engines**: {{ spec.engines | join(', ') }} (vLLM only available for quantization none){% else %}- **Engines**: {{ spec.engines | join(', ') }}{% endif %} - **Model ID:** {{ spec.model_id }} - **Model Hubs**: {% for hub in spec.model_hubs -%}`{{ hub.name }} <{{ hub.url }}>`__{% if not loop.last %}, {% endif %} {%- endfor %} Execute the following command to launch the model, remember to replace ``${{ '{' }}quantization{{ '}' }}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name {{ model_name }} --size-in-billions {{ spec.model_size_in_billions }} --model-format {{ spec.model_format }} --quantization ${{ '{' }}quantization{{ '}' }} + xinference launch --model-engine ${{ '{' }}engine{{ '}' }} --model-name {{ model_name }} --size-in-billions {{ spec.model_size_in_billions }} --model-format {{ spec.model_format }} --quantization ${{ '{' }}quantization{{ '}' }} {% endfor %} \ No newline at end of file diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 2e657d0d4d..e5a9afddfc 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -140,7 +140,6 @@ class VLLMGenerateConfig(TypedDict, total=False): if VLLM_INSTALLED and vllm.__version__ >= "0.4.0": VLLM_SUPPORTED_CHAT_MODELS.append("qwen1.5-moe-chat") VLLM_SUPPORTED_CHAT_MODELS.append("c4ai-command-r-v01") - VLLM_SUPPORTED_CHAT_MODELS.append("c4ai-command-r-v01-4bit") class VLLMModel(LLM): From f7e088dde46c641a0323e619954c385966af176f Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 28 May 2024 11:52:14 +0800 Subject: [PATCH 104/298] FEAT: support Yi-1.5-chat-16k (#1544) --- README.md | 4 +- README_zh_CN.md | 4 +- doc/source/gen_docs.py | 2 +- doc/source/getting_started/installation.rst | 2 +- doc/source/models/builtin/llm/index.rst | 7 + doc/source/models/builtin/llm/starling-lm.rst | 31 +++ .../models/builtin/llm/yi-1.5-chat-16k.rst | 79 +++++++ doc/source/models/builtin/llm/yi-1.5-chat.rst | 144 +++++++++++++ doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 195 ++++++++++++++++++ .../model/llm/llm_family_modelscope.json | 121 +++++++++++ xinference/model/llm/vllm/core.py | 1 + 12 files changed, 585 insertions(+), 7 deletions(-) create mode 100644 doc/source/models/builtin/llm/starling-lm.rst create mode 100644 doc/source/models/builtin/llm/yi-1.5-chat-16k.rst diff --git a/README.md b/README.md index 4dc6f0e2f7..2a50db6362 100644 --- a/README.md +++ b/README.md @@ -34,12 +34,12 @@ potential of cutting-edge AI models. - Docker image: [#855](https://github.com/xorbitsai/inference/pull/855) - Support multimodal: [#829](https://github.com/xorbitsai/inference/pull/829) ### New Models +- Built-in support for [InternVL-Chat-V1-5](https://github.com/OpenGVLab/InternVL): [#1536](https://github.com/xorbitsai/inference/pull/1536) +- Built-in support for [Yi-1.5](https://github.com/01-ai/Yi-1.5): [#1489](https://github.com/xorbitsai/inference/pull/1489) - Built-in support for [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) - Built-in support for [Qwen1.5 110B](https://huggingface.co/Qwen/Qwen1.5-110B-Chat): [#1388](https://github.com/xorbitsai/inference/pull/1388) - Built-in support for [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) - Built-in support for [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) -- Built-in support for [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) -- Built-in support for [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) ### Integrations - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. diff --git a/README_zh_CN.md b/README_zh_CN.md index 6e0fef4edc..ca95bb1928 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -31,12 +31,12 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - Docker 镜像支持: [#855](https://github.com/xorbitsai/inference/pull/855) - 支持多模态模型:[#829](https://github.com/xorbitsai/inference/pull/829) ### 新模型 +- 内置 [InternVL-Chat-V1-5](https://github.com/OpenGVLab/InternVL): [#1536](https://github.com/xorbitsai/inference/pull/1536) +- 内置 [Yi-1.5](https://github.com/01-ai/Yi-1.5): [#1489](https://github.com/xorbitsai/inference/pull/1489) - 内置 [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) - 内置 [Qwen1.5 110B](https://huggingface.co/Qwen/Qwen1.5-110B-Chat): [#1388](https://github.com/xorbitsai/inference/pull/1388) - 内置 [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) - 内置 [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) -- 内置 [Qwen1.5 MOE](https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat): [#1263](https://github.com/xorbitsai/inference/pull/1263) -- 内置 [Qwen1.5 32B](https://huggingface.co/Qwen/Qwen1.5-32B-Chat): [#1249](https://github.com/xorbitsai/inference/pull/1249) ### 集成 - [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 diff --git a/doc/source/gen_docs.py b/doc/source/gen_docs.py index 2a572bd9ec..881e3be6ac 100644 --- a/doc/source/gen_docs.py +++ b/doc/source/gen_docs.py @@ -87,7 +87,7 @@ def main(): continue else: engines.append(engine) - model_spec['engines'] = list(set(engines)) + model_spec['engines'] = sorted(list(set(engines)), reverse=True) # manual merge if model_name in model_by_names_modelscope.keys(): diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index c7f7067701..0b5fc61d95 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -43,7 +43,7 @@ Currently, supported models include: - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` -- ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat`` +- ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` - ``codeqwen1.5``, ``codeqwen1.5-chat`` diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 29c272ca96..b14e7b4609 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -471,6 +471,11 @@ The following is a list of built-in LLM in Xinference: - 4096 - Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples. + * - :ref:`yi-1.5-chat-16k <models_llm_yi-1.5-chat-16k>` + - chat + - 16384 + - Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples. + * - :ref:`yi-200k <models_llm_yi-200k>` - generate - 262144 @@ -683,6 +688,8 @@ The following is a list of built-in LLM in Xinference: yi-1.5-chat + yi-1.5-chat-16k + yi-200k yi-chat diff --git a/doc/source/models/builtin/llm/starling-lm.rst b/doc/source/models/builtin/llm/starling-lm.rst new file mode 100644 index 0000000000..eb362b9a5c --- /dev/null +++ b/doc/source/models/builtin/llm/starling-lm.rst @@ -0,0 +1,31 @@ +.. _models_llm_starling-lm: + +======================================== +Starling-LM +======================================== + +- **Context Length:** 4096 +- **Model Name:** Starling-LM +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** We introduce Starling-7B, an open large language model (LLM) trained by Reinforcement Learning from AI Feedback (RLAIF). The model harnesses the power of our new GPT-4 labeled ranking dataset + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers +- **Model ID:** berkeley-nest/Starling-LM-7B-alpha +- **Model Hubs**: `Hugging Face <https://huggingface.co/berkeley-nest/Starling-LM-7B-alpha>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Starling-LM --size-in-billions 7 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/yi-1.5-chat-16k.rst b/doc/source/models/builtin/llm/yi-1.5-chat-16k.rst new file mode 100644 index 0000000000..cf872a7f05 --- /dev/null +++ b/doc/source/models/builtin/llm/yi-1.5-chat-16k.rst @@ -0,0 +1,79 @@ +.. _models_llm_yi-1.5-chat-16k: + +======================================== +Yi-1.5-chat-16k +======================================== + +- **Context Length:** 16384 +- **Model Name:** Yi-1.5-chat-16k +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 9 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** 01-ai/Yi-1.5-9B-Chat-16K +- **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-9B-Chat-16K>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-9B-Chat-16K>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat-16k --size-in-billions 9 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 34 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 34 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** 01-ai/Yi-1.5-34B-Chat-16K +- **Model Hubs**: `Hugging Face <https://huggingface.co/01-ai/Yi-1.5-34B-Chat-16K>`__, `ModelScope <https://modelscope.cn/models/01ai/Yi-1.5-34B-Chat-16K>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat-16k --size-in-billions 34 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (ggufv2, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 9 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_1, Q4_K_M, Q4_K_S, Q5_0, Q5_1, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp +- **Model ID:** QuantFactory/Yi-1.5-9B-Chat-16K-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/QuantFactory/Yi-1.5-9B-Chat-16K-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat-16k --size-in-billions 9 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 4 (ggufv2, 34 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 34 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_K_M, Q4_K_S, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp +- **Model ID:** bartowski/Yi-1.5-34B-Chat-16K-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/bartowski/Yi-1.5-34B-Chat-16K-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat-16k --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/yi-1.5-chat.rst b/doc/source/models/builtin/llm/yi-1.5-chat.rst index 260c294d05..0fa6aa4294 100644 --- a/doc/source/models/builtin/llm/yi-1.5-chat.rst +++ b/doc/source/models/builtin/llm/yi-1.5-chat.rst @@ -61,3 +61,147 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 34 --model-format pytorch --quantization ${quantization} + +Model Spec 4 (ggufv2, 6 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 6 +- **Quantizations:** Q3_K_L, Q4_K_M, Q5_K_M, Q6_K, Q8_0, f32 +- **Engines**: llama.cpp +- **Model ID:** lmstudio-community/Yi-1.5-6B-Chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/lmstudio-community/Yi-1.5-6B-Chat-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 6 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 5 (ggufv2, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 9 +- **Quantizations:** Q3_K_L, Q4_K_M, Q5_K_M, Q6_K, Q8_0, f32 +- **Engines**: llama.cpp +- **Model ID:** lmstudio-community/Yi-1.5-9B-Chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/lmstudio-community/Yi-1.5-9B-Chat-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 9 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 6 (ggufv2, 34 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 34 +- **Quantizations:** Q2_K, Q3_K_L, Q4_K_M, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp +- **Model ID:** lmstudio-community/Yi-1.5-34B-Chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/lmstudio-community/Yi-1.5-34B-Chat-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 34 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 7 (gptq, 6 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 6 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** modelscope/Yi-1.5-6B-Chat-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/modelscope/Yi-1.5-6B-Chat-GPTQ>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Yi-1.5-6B-Chat-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 6 --model-format gptq --quantization ${quantization} + + +Model Spec 8 (gptq, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 9 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** modelscope/Yi-1.5-9B-Chat-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/modelscope/Yi-1.5-9B-Chat-GPTQ>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Yi-1.5-9B-Chat-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 9 --model-format gptq --quantization ${quantization} + + +Model Spec 9 (gptq, 34 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 34 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** modelscope/Yi-1.5-34B-Chat-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/modelscope/Yi-1.5-34B-Chat-GPTQ>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Yi-1.5-34B-Chat-GPTQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 34 --model-format gptq --quantization ${quantization} + + +Model Spec 10 (awq, 6 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 6 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** modelscope/Yi-1.5-6B-Chat-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/modelscope/Yi-1.5-6B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Yi-1.5-6B-Chat-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 6 --model-format awq --quantization ${quantization} + + +Model Spec 11 (awq, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 9 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** modelscope/Yi-1.5-9B-Chat-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/modelscope/Yi-1.5-9B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Yi-1.5-9B-Chat-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 9 --model-format awq --quantization ${quantization} + + +Model Spec 12 (awq, 34 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 34 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** modelscope/Yi-1.5-34B-Chat-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/modelscope/Yi-1.5-34B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Yi-1.5-34B-Chat-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 34 --model-format awq --quantization ${quantization} + diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index b2fbb36ce2..8acb2c2311 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -50,7 +50,7 @@ Currently, supported model includes: - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` -- ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat`` +- ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` - ``codeqwen1.5``, ``codeqwen1.5-chat`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 110d7c3fe4..4871ed30b5 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -3891,6 +3891,201 @@ ], "model_id": "01-ai/Yi-1.5-34B-Chat", "model_revision": "fa695ee438bfcd0ec2b378fa1c7e0dea1b40393e" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 6, + "quantizations": [ + "Q3_K_L", + "Q4_K_M", + "Q5_K_M", + "Q6_K", + "Q8_0", + "f32" + ], + "model_id": "lmstudio-community/Yi-1.5-6B-Chat-GGUF", + "model_file_name_template": "Yi-1.5-6B-Chat-{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "Q3_K_L", + "Q4_K_M", + "Q5_K_M", + "Q6_K", + "Q8_0", + "f32" + ], + "model_id": "lmstudio-community/Yi-1.5-9B-Chat-GGUF", + "model_file_name_template": "Yi-1.5-9B-Chat-{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 34, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q4_K_M", + "Q5_K_M", + "Q6_K", + "Q8_0" + ], + "model_id": "lmstudio-community/Yi-1.5-34B-Chat-GGUF", + "model_file_name_template": "Yi-1.5-34B-Chat-{quantization}.gguf" + }, + { + "model_format": "gptq", + "model_size_in_billions": 6, + "quantizations": [ + "Int4" + ], + "model_id": "modelscope/Yi-1.5-6B-Chat-GPTQ", + "model_revision": "2ad3a602e64d1c79e28e6e92beced2935047367c" + }, + { + "model_format": "gptq", + "model_size_in_billions": 9, + "quantizations": [ + "Int4" + ], + "model_id": "modelscope/Yi-1.5-9B-Chat-GPTQ", + "model_revision": "76f47d16982923f7b6674c4e23ddac7c3b1d2e03" + }, + { + "model_format": "gptq", + "model_size_in_billions": 34, + "quantizations": [ + "Int4" + ], + "model_id": "modelscope/Yi-1.5-34B-Chat-GPTQ", + "model_revision": "173fb4036265b2dac1d6296a8e2fd2f652c19968" + }, + { + "model_format": "awq", + "model_size_in_billions": 6, + "quantizations": [ + "Int4" + ], + "model_id": "modelscope/Yi-1.5-6B-Chat-AWQ", + "model_revision": "23bf37f1666874e15e239422de0d3948d8735fa9" + }, + { + "model_format": "awq", + "model_size_in_billions": 9, + "quantizations": [ + "Int4" + ], + "model_id": "modelscope/Yi-1.5-9B-Chat-AWQ", + "model_revision": "2605f388332672789eae1f422644add2901b433f" + }, + { + "model_format": "awq", + "model_size_in_billions": 34, + "quantizations": [ + "Int4" + ], + "model_id": "modelscope/Yi-1.5-34B-Chat-AWQ", + "model_revision": "26234fea6ac49d456f32f8017289021fb1087a04" + } + ], + "prompt_style": { + "style_name": "CHATML", + "system_prompt": "", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "inter_message_sep": "", + "stop_token_ids": [ + 2, + 6, + 7, + 8 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>", + "<|im_sep|>" + ] + } + }, + { + "version": 1, + "context_length": 16384, + "model_name": "Yi-1.5-chat-16k", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "01-ai/Yi-1.5-9B-Chat-16K", + "model_revision": "551220fb24d69b6bfec5defceeb160395ce5da8d" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 34, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "01-ai/Yi-1.5-34B-Chat-16K", + "model_revision": "dfdbc67be750972bfcc1ac7ffd7fe48689c856fd" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_1", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_1", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "QuantFactory/Yi-1.5-9B-Chat-16K-GGUF", + "model_file_name_template": "Yi-1.5-9B-Chat-16K.{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 34, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_K_M", + "Q4_K_S", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "bartowski/Yi-1.5-34B-Chat-16K-GGUF", + "model_file_name_template": "Yi-1.5-34B-Chat-16K-{quantization}.gguf" } ], "prompt_style": { diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 3bae8fe5e0..88ce61e5e3 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -1496,6 +1496,127 @@ "model_hub": "modelscope", "model_id": "01ai/Yi-1.5-34B-Chat", "model_revision": "master" + }, + { + "model_format": "gptq", + "model_size_in_billions": 6, + "quantizations": [ + "Int4" + ], + "model_id": "AI-ModelScope/Yi-1.5-6B-Chat-GPTQ", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "gptq", + "model_size_in_billions": 9, + "quantizations": [ + "Int4" + ], + "model_id": "AI-ModelScope/Yi-1.5-9B-Chat-GPTQ", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "gptq", + "model_size_in_billions": 34, + "quantizations": [ + "Int4" + ], + "model_id": "AI-ModelScope/Yi-1.5-34B-Chat-GPTQ", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "awq", + "model_size_in_billions": 6, + "quantizations": [ + "Int4" + ], + "model_id": "AI-ModelScope/Yi-1.5-6B-Chat-AWQ", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "awq", + "model_size_in_billions": 9, + "quantizations": [ + "Int4" + ], + "model_id": "AI-ModelScope/Yi-1.5-9B-Chat-AWQ", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "awq", + "model_size_in_billions": 34, + "quantizations": [ + "Int4" + ], + "model_id": "AI-ModelScope/Yi-1.5-34B-Chat-AWQ", + "model_hub": "modelscope", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "CHATML", + "system_prompt": "", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "inter_message_sep": "", + "stop_token_ids": [ + 2, + 6, + 7, + 8 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>", + "<|im_sep|>" + ] + } + }, + { + "version": 1, + "context_length": 16384, + "model_name": "Yi-1.5-chat-16k", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "Yi-1.5 is an upgraded version of Yi. It is continuously pre-trained on Yi with a high-quality corpus of 500B tokens and fine-tuned on 3M diverse fine-tuning samples.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "01ai/Yi-1.5-9B-Chat-16K", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 34, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "01ai/Yi-1.5-34B-Chat-16K", + "model_revision": "master" } ], "prompt_style": { diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index e5a9afddfc..e71c01da9a 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -114,6 +114,7 @@ class VLLMGenerateConfig(TypedDict, total=False): "qwen-chat", "Yi-chat", "Yi-1.5-chat", + "Yi-1.5-chat-16k", "code-llama-instruct", "mistral-instruct-v0.1", "mistral-instruct-v0.2", From 18e3d2401451aca3bb4595d3b9795bd9e1324493 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Thu, 30 May 2024 13:05:45 +0800 Subject: [PATCH 105/298] Correct ModelActor import path in worker & supervisor (#1550) --- xinference/core/__init__.py | 2 -- xinference/core/supervisor.py | 2 +- xinference/core/worker.py | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/xinference/core/__init__.py b/xinference/core/__init__.py index d3f48dd6fc..37f6558d95 100644 --- a/xinference/core/__init__.py +++ b/xinference/core/__init__.py @@ -11,5 +11,3 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - -from .model import ModelActor diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index dd9ee7e525..c1331a25e9 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -28,7 +28,7 @@ XINFERENCE_HEALTH_CHECK_INTERVAL, XINFERENCE_HEALTH_CHECK_TIMEOUT, ) -from ..core import ModelActor +from ..core.model import ModelActor from ..core.status_guard import InstanceInfo, LaunchStatus from ..types import PeftModelConfig from .metrics import record_metrics diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 164fff7aa5..439b0c584e 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -32,7 +32,7 @@ XINFERENCE_DISABLE_HEALTH_CHECK, XINFERENCE_HEALTH_CHECK_INTERVAL, ) -from ..core import ModelActor +from ..core.model import ModelActor from ..core.status_guard import LaunchStatus from ..device_utils import get_available_device_env_name, gpu_count from ..model.core import ModelDescription, create_model_instance From f7e33a3485615a2ca6636575c10ff336b77fd781 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Thu, 30 May 2024 16:09:24 +0800 Subject: [PATCH 106/298] BUG: fix vl-model img path error (#1559) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/core/chat_interface.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/xinference/core/chat_interface.py b/xinference/core/chat_interface.py index 37da59509b..ba622ff2c0 100644 --- a/xinference/core/chat_interface.py +++ b/xinference/core/chat_interface.py @@ -217,7 +217,12 @@ def add_text(history, bot, text, image): "role": "user", "content": [ {"type": "text", "text": text}, - {"type": "image_url", "image_url": {"url": image}}, + { + "type": "image_url", + "image_url": { + "url": f"data:image/png;base64,{img_b64_str}" + }, + }, ], } else: From 5b7b5b66c919d26df3668c9da9293d2adb855cab Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Thu, 30 May 2024 19:32:27 +0800 Subject: [PATCH 107/298] ENH: rm mini-internvl (#1563) Co-authored-by: wuzhaoxin <15667065080@162.com> --- .../models/builtin/llm/internvl-chat.rst | 60 +++++++++++++++++++ xinference/model/llm/llm_family.json | 49 +++------------ xinference/model/llm/pytorch/intern_vl.py | 13 ++-- 3 files changed, 73 insertions(+), 49 deletions(-) create mode 100644 doc/source/models/builtin/llm/internvl-chat.rst diff --git a/doc/source/models/builtin/llm/internvl-chat.rst b/doc/source/models/builtin/llm/internvl-chat.rst new file mode 100644 index 0000000000..ad0421a8e4 --- /dev/null +++ b/doc/source/models/builtin/llm/internvl-chat.rst @@ -0,0 +1,60 @@ +.. _models_llm_internvl-chat: + +======================================== +internvl-chat +======================================== + +- **Context Length:** 32768 +- **Model Name:** internvl-chat +- **Languages:** en, zh +- **Abilities:** chat, vision +- **Description:** InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 2 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 2 +- **Quantizations:** none +- **Model ID:** OpenGVLab/Mini-InternVL-Chat-2B-V1-5 +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/Mini-InternVL-Chat-2B-V1-5>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name internvl-chat --size-in-billions 2 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 26 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 26 +- **Quantizations:** none +- **Model ID:** OpenGVLab/InternVL-Chat-V1-5 +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name internvl-chat --size-in-billions 26 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (pytorch, 26 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 26 +- **Quantizations:** Int8 +- **Model ID:** OpenGVLab/InternVL-Chat-V1-5-{quantization} +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5-{quantization}>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-name internvl-chat --size-in-billions 26 --model-format pytorch --quantization ${quantization} + diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 4871ed30b5..17380549e2 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -6204,6 +6204,15 @@ ], "model_description": "InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. ", "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 2, + "quantizations": [ + "none" + ], + "model_id": "OpenGVLab/Mini-InternVL-Chat-2B-V1-5", + "model_revision": "ce3f67acff17281bacbf4b156f402a0580fb9605" + }, { "model_format": "pytorch", "model_size_in_billions": 26, @@ -6238,45 +6247,5 @@ "<|im_end|>" ] } -}, - { - "version": 1, - "context_length": 32768, - "model_name": "mini-internvl-chat", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat", - "vision" - ], - "model_description": "InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. ", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 2, - "quantizations": [ - "none" - ], - "model_id": "OpenGVLab/Mini-InternVL-Chat-2B-V1-5", - "model_revision": "ce3f67acff17281bacbf4b156f402a0580fb9605" - } - ], - "prompt_style": { - "style_name": "INTERNLM2", - "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", - "roles": [ - "<|im_start|>user", - "<|im_start|>assistant" - ], - "intra_message_sep": "<|im_end|>", - "stop_token_ids": [ - 92542 - ], - "stop": [ - "<|im_end|>" - ] - } } ] diff --git a/xinference/model/llm/pytorch/intern_vl.py b/xinference/model/llm/pytorch/intern_vl.py index 661987df3a..5fa3b041da 100644 --- a/xinference/model/llm/pytorch/intern_vl.py +++ b/xinference/model/llm/pytorch/intern_vl.py @@ -77,19 +77,14 @@ def load(self, **kwargs): "device_map": device, } - if "Int8" in self.model_spec.quantizations: - kwargs.update( - { - "load_in_8bit": True, - "device_map": device, - } - ) - elif "mini" in self.model_family.model_name: + if "int8" in self.quantization.lower(): + kwargs["load_in_8bit"] = True + elif 2 == self.model_spec.model_size_in_billions: kwargs.pop("device_map") self._model = AutoModel.from_pretrained(self.model_path, **kwargs).eval() - if "Int8" not in self.model_spec.quantizations: + if "int8" not in self.quantization.lower(): self._model.cuda() # Specify hyperparameters for generation From 992aa561e5104629ef3e113617aa102cf788055e Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Thu, 30 May 2024 13:45:30 +0200 Subject: [PATCH 108/298] FEAT: Support XINFERENCE_DISABLE_METRICS env (#1547) Co-authored-by: Xuye (Chris) Qin <qinxuye@gmail.com> --- doc/source/getting_started/environments.rst | 8 ++++- xinference/api/restful_api.py | 22 ++++++++----- xinference/constants.py | 4 +++ xinference/core/tests/test_metrics.py | 35 ++++++++++++++++++++- xinference/core/worker.py | 9 ++++-- 5 files changed, 66 insertions(+), 12 deletions(-) diff --git a/doc/source/getting_started/environments.rst b/doc/source/getting_started/environments.rst index 861921e9a2..a1766f5e9b 100644 --- a/doc/source/getting_started/environments.rst +++ b/doc/source/getting_started/environments.rst @@ -39,4 +39,10 @@ Setting this environment to 1 can disable health check. XINFERENCE_DISABLE_VLLM ~~~~~~~~~~~~~~~~~~~~~~~~ Xinference will automatically use vLLM as backend if conditions are met. -Setting this environment to 1 can disable the use of vLLM. \ No newline at end of file +Setting this environment to 1 can disable the use of vLLM. + +XINFERENCE_DISABLE_METRICS +~~~~~~~~~~~~~~~~~~~~~~~~~~ +Xinference will by default enable the metrics exporter on the supervisor and worker. +Setting this environment to 1 will disable the /metrics endpoint on the supervisor +and the HTTP service (only provide the /metrics endpoint) on the worker. diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 4452237fa1..df080d54c6 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -52,7 +52,7 @@ from .._compat import BaseModel, Field from .._version import get_versions -from ..constants import XINFERENCE_DEFAULT_ENDPOINT_PORT +from ..constants import XINFERENCE_DEFAULT_ENDPOINT_PORT, XINFERENCE_DISABLE_METRICS from ..core.event import Event, EventCollectorActor, EventType from ..core.supervisor import SupervisorActor from ..core.utils import json_dumps @@ -504,13 +504,19 @@ def serve(self, logging_conf: Optional[dict] = None): ), ) - # Clear the global Registry for the MetricsMiddleware, or - # the MetricsMiddleware will register duplicated metrics if the port - # conflict (This serve method run more than once). - REGISTRY.clear() - self._app.add_middleware(MetricsMiddleware) - self._app.include_router(self._router) - self._app.add_route("/metrics", metrics) + if XINFERENCE_DISABLE_METRICS: + logger.info( + "Supervisor metrics is disabled due to the environment XINFERENCE_DISABLE_METRICS=1" + ) + self._app.include_router(self._router) + else: + # Clear the global Registry for the MetricsMiddleware, or + # the MetricsMiddleware will register duplicated metrics if the port + # conflict (This serve method run more than once). + REGISTRY.clear() + self._app.add_middleware(MetricsMiddleware) + self._app.include_router(self._router) + self._app.add_route("/metrics", metrics) # Check all the routes returns Response. # This is to avoid `jsonable_encoder` performance issue: diff --git a/xinference/constants.py b/xinference/constants.py index b5be63057f..ba98f7f73f 100644 --- a/xinference/constants.py +++ b/xinference/constants.py @@ -26,6 +26,7 @@ XINFERENCE_ENV_DISABLE_HEALTH_CHECK = "XINFERENCE_DISABLE_HEALTH_CHECK" XINFERENCE_ENV_DISABLE_VLLM = "XINFERENCE_DISABLE_VLLM" XINFERENCE_ENV_ENABLE_SGLANG = "XINFERENCE_ENABLE_SGLANG" +XINFERENCE_ENV_DISABLE_METRICS = "XINFERENCE_DISABLE_METRICS" def get_xinference_home() -> str: @@ -66,3 +67,6 @@ def get_xinference_home() -> str: ) XINFERENCE_DISABLE_VLLM = bool(int(os.environ.get(XINFERENCE_ENV_DISABLE_VLLM, 0))) XINFERENCE_ENABLE_SGLANG = bool(int(os.environ.get(XINFERENCE_ENV_ENABLE_SGLANG, 0))) +XINFERENCE_DISABLE_METRICS = bool( + int(os.environ.get(XINFERENCE_ENV_DISABLE_METRICS, 0)) +) diff --git a/xinference/core/tests/test_metrics.py b/xinference/core/tests/test_metrics.py index e1960b9edc..028e9586be 100644 --- a/xinference/core/tests/test_metrics.py +++ b/xinference/core/tests/test_metrics.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - +import os import pytest import requests @@ -87,6 +87,39 @@ async def test_metrics_exporter_server(setup_cluster): assert 'xinference:input_tokens_total_counter{model="orca"} 1' in response.text +@pytest.fixture +def disable_metrics(): + try: + os.environ["XINFERENCE_DISABLE_METRICS"] = "1" + yield + finally: + os.environ.pop("XINFERENCE_DISABLE_METRICS", None) + + +@pytest.mark.asyncio +async def test_disable_metrics_exporter_server(disable_metrics, setup_cluster): + endpoint, metrics_exporter_address, supervisor_address = setup_cluster + + from ...client import Client + + client = Client(endpoint) + + client.launch_model( + model_name="orca", + model_engine="llama.cpp", + model_size_in_billions=3, + quantization="q4_0", + ) + + # Check the supervisor metrics collected the RESTful API. + response = requests.get(f"{endpoint}/metrics") + assert response.status_code == 404 + + # Check the worker metrics collected model metrics. + with pytest.raises(requests.exceptions.ConnectionError): + requests.get(metrics_exporter_address) + + async def test_metrics_exporter_data(setup_cluster): endpoint, metrics_exporter_address, supervisor_address = setup_cluster diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 439b0c584e..677e5ba535 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -30,6 +30,7 @@ from ..constants import ( XINFERENCE_CACHE_DIR, XINFERENCE_DISABLE_HEALTH_CHECK, + XINFERENCE_DISABLE_METRICS, XINFERENCE_HEALTH_CHECK_INTERVAL, ) from ..core.model import ModelActor @@ -83,8 +84,12 @@ def __init__( self._model_uid_to_recover_count: Dict[str, Optional[int]] = {} self._model_uid_to_launch_args: Dict[str, Dict] = {} - # metrics export server. - if metrics_exporter_host is not None or metrics_exporter_port is not None: + if XINFERENCE_DISABLE_METRICS: + logger.info( + "Worker metrics is disabled due to the environment XINFERENCE_DISABLE_METRICS=1" + ) + elif metrics_exporter_host is not None or metrics_exporter_port is not None: + # metrics export server. logger.info( f"Starting metrics export server at {metrics_exporter_host}:{metrics_exporter_port}" ) From b8658bc6ff70cd3b7801b4c287017bc12ef8cb08 Mon Sep 17 00:00:00 2001 From: buptzyf <buptzyf@users.noreply.github.com> Date: Thu, 30 May 2024 21:42:06 +0800 Subject: [PATCH 109/298] BUG: Fix validation errors when define a custom baichuan-chat LLM model (#1557) --- xinference/model/llm/pytorch/baichuan.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xinference/model/llm/pytorch/baichuan.py b/xinference/model/llm/pytorch/baichuan.py index ac45c53f6e..f640670a28 100644 --- a/xinference/model/llm/pytorch/baichuan.py +++ b/xinference/model/llm/pytorch/baichuan.py @@ -73,7 +73,8 @@ def match( ) -> bool: if llm_spec.model_format != "pytorch": return False - if llm_family.model_name not in ["baichuan-chat", "baichuan-2-chat"]: + model_family = llm_family.model_family or llm_family.model_name + if model_family not in ["baichuan-chat", "baichuan-2-chat"]: return False if "chat" not in llm_family.model_ability: return False From 18ab07140f88dd8e311309cb8140117a14853096 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 31 May 2024 10:37:54 +0800 Subject: [PATCH 110/298] ENH: add additional_option at vl gradio (#1561) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/core/chat_interface.py | 74 ++++++++++++++++++++--- xinference/model/llm/pytorch/intern_vl.py | 2 +- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/xinference/core/chat_interface.py b/xinference/core/chat_interface.py index ba622ff2c0..90bb8179bc 100644 --- a/xinference/core/chat_interface.py +++ b/xinference/core/chat_interface.py @@ -186,8 +186,7 @@ def generate_wrapper( def build_chat_vl_interface( self, ) -> "gr.Blocks": - def predict(history, bot): - logger.debug("Predict model: %s, history: %s", self.model_uid, history) + def predict(history, bot, max_tokens, temperature, stream): from ..client import RESTfulClient client = RESTfulClient(self.endpoint) @@ -199,10 +198,46 @@ def predict(history, bot): assert prompt["role"] == "user" prompt = prompt["content"] # multimodal chat does not support stream. - response = model.chat(prompt=prompt, chat_history=history[:-1]) - history.append(response["choices"][0]["message"]) - bot[-1][1] = history[-1]["content"] - return history, bot + if stream: + response_content = "" + for chunk in model.chat( + prompt=prompt, + chat_history=history[:-1], + generate_config={ + "max_tokens": max_tokens, + "temperature": temperature, + "stream": stream, + }, + ): + assert isinstance(chunk, dict) + delta = chunk["choices"][0]["delta"] + if "content" not in delta: + continue + else: + response_content += delta["content"] + bot[-1][1] = response_content + yield history, bot + history.append( + { + "content": response_content, + "role": "assistant", + } + ) + bot[-1][1] = response_content + yield history, bot + else: + response = model.chat( + prompt=prompt, + chat_history=history[:-1], + generate_config={ + "max_tokens": max_tokens, + "temperature": temperature, + "stream": stream, + }, + ) + history.append(response["choices"][0]["message"]) + bot[-1][1] = history[-1]["content"] + yield history, bot def add_text(history, bot, text, image): logger.debug("Add text, text: %s, image: %s", text, image) @@ -229,7 +264,7 @@ def add_text(history, bot, text, image): display_content = text message = {"role": "user", "content": text} history = history + [message] - bot = bot + [(display_content, None)] + bot = bot + [[display_content, None]] return history, bot, "", None def clear_history(): @@ -291,6 +326,19 @@ def update_button(text): ) clear_btn = gr.Button(value="Clear") + with gr.Accordion("Additional Inputs", open=False): + max_tokens = gr.Slider( + minimum=1, + maximum=self.context_length, + value=512, + step=1, + label="Max Tokens", + ) + temperature = gr.Slider( + minimum=0, maximum=2, value=1, step=0.01, label="Temperature" + ) + stream = gr.Checkbox(label="Stream", value=False) + textbox.change(update_button, [textbox], [submit_btn], queue=False) textbox.submit( @@ -298,14 +346,22 @@ def update_button(text): [state, chatbot, textbox, imagebox], [state, chatbot, textbox, imagebox], queue=False, - ).then(predict, [state, chatbot], [state, chatbot]) + ).then( + predict, + [state, chatbot, max_tokens, temperature, stream], + [state, chatbot], + ) submit_btn.click( add_text, [state, chatbot, textbox, imagebox], [state, chatbot, textbox, imagebox], queue=False, - ).then(predict, [state, chatbot], [state, chatbot]) + ).then( + predict, + [state, chatbot, max_tokens, temperature, stream], + [state, chatbot], + ) clear_btn.click( clear_history, None, [state, chatbot, textbox, imagebox], queue=False diff --git a/xinference/model/llm/pytorch/intern_vl.py b/xinference/model/llm/pytorch/intern_vl.py index 5fa3b041da..be6e1c35bb 100644 --- a/xinference/model/llm/pytorch/intern_vl.py +++ b/xinference/model/llm/pytorch/intern_vl.py @@ -293,7 +293,7 @@ def chat( chat_history: Optional[List[ChatCompletionMessage]] = None, generate_config: Optional[PytorchGenerateConfig] = None, ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: - if generate_config and generate_config.pop("stream"): + if generate_config and generate_config.get("stream"): raise Exception( f"Chat with model {self.model_family.model_name} does not support stream." ) From f8dd5bac18661a66d344e7b49b23309d14a5ec4c Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 31 May 2024 12:10:55 +0800 Subject: [PATCH 111/298] FEAT: Support new model CogVLM (#1551) Co-authored-by: wuzhaoxin <15667065080@162.com> --- doc/source/models/builtin/llm/cogvlm2.rst | 47 ++++ doc/source/models/builtin/llm/index.rst | 14 +- xinference/model/llm/__init__.py | 2 + xinference/model/llm/llm_family.json | 52 ++++ .../model/llm/llm_family_modelscope.json | 55 ++++ xinference/model/llm/pytorch/cogvlm2.py | 257 ++++++++++++++++++ xinference/model/llm/pytorch/core.py | 1 + 7 files changed, 421 insertions(+), 7 deletions(-) create mode 100644 doc/source/models/builtin/llm/cogvlm2.rst create mode 100644 xinference/model/llm/pytorch/cogvlm2.py diff --git a/doc/source/models/builtin/llm/cogvlm2.rst b/doc/source/models/builtin/llm/cogvlm2.rst new file mode 100644 index 0000000000..e907e1d157 --- /dev/null +++ b/doc/source/models/builtin/llm/cogvlm2.rst @@ -0,0 +1,47 @@ +.. _models_llm_cogvlm2: + +======================================== +cogvlm2 +======================================== + +- **Context Length:** 8192 +- **Model Name:** cogvlm2 +- **Languages:** en, zh +- **Abilities:** chat, vision +- **Description:** CogVLM2 have achieved good results in many lists compared to the previous generation of CogVLM open source models. Its excellent performance can compete with some non-open source models. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 20 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 20 +- **Quantizations:** none +- **Engines**: Transformers +- **Model ID:** THUDM/cogvlm2-llama3-chinese-chat-19B +- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name cogvlm2 --size-in-billions 20 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 20 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 20 +- **Quantizations:** int4 +- **Engines**: Transformers +- **Model ID:** THUDM/cogvlm2-llama3-chinese-chat-19B-{quantizations} +- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B-{quantizations}>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name cogvlm2 --size-in-billions 20 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index b14e7b4609..ce9c4b01c7 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -126,6 +126,11 @@ The following is a list of built-in LLM in Xinference: - 8194 - CodeShell is a multi-language code LLM developed by the Knowledge Computing Lab of Peking University. + * - :ref:`cogvlm2 <models_llm_cogvlm2>` + - chat, vision + - 8192 + - CogVLM2 have achieved good results in many lists compared to the previous generation of CogVLM open source models. Its excellent performance can compete with some non-open source models. + * - :ref:`deepseek <models_llm_deepseek>` - generate - 4096 @@ -236,11 +241,6 @@ The following is a list of built-in LLM in Xinference: - 8192 - The Llama 3 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks.. - * - :ref:`mini-internvl-chat <models_llm_mini-internvl-chat>` - - chat, vision - - 32768 - - InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. - * - :ref:`minicpm-2b-dpo-bf16 <models_llm_minicpm-2b-dpo-bf16>` - chat - 4096 @@ -550,6 +550,8 @@ The following is a list of built-in LLM in Xinference: codeshell-chat + cogvlm2 + deepseek deepseek-chat @@ -594,8 +596,6 @@ The following is a list of built-in LLM in Xinference: llama-3-instruct - mini-internvl-chat - minicpm-2b-dpo-bf16 minicpm-2b-dpo-fp16 diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 196d7fd686..d3674b3795 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -113,6 +113,7 @@ def _install(): from .ggml.llamacpp import LlamaCppChatModel, LlamaCppModel from .pytorch.baichuan import BaichuanPytorchChatModel from .pytorch.chatglm import ChatglmPytorchChatModel + from .pytorch.cogvlm2 import CogVLM2Model from .pytorch.core import PytorchChatModel, PytorchModel from .pytorch.deepseek_vl import DeepSeekVLChatModel from .pytorch.falcon import FalconPytorchChatModel, FalconPytorchModel @@ -159,6 +160,7 @@ def _install(): DeepSeekVLChatModel, InternVLChatModel, PytorchModel, + CogVLM2Model, ] ) if OmniLMMModel: # type: ignore diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 17380549e2..4d853dd220 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -6247,5 +6247,57 @@ "<|im_end|>" ] } +}, + { + "version": 1, + "context_length": 8192, + "model_name": "cogvlm2", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "CogVLM2 have achieved good results in many lists compared to the previous generation of CogVLM open source models. Its excellent performance can compete with some non-open source models.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "none" + ], + "model_id": "THUDM/cogvlm2-llama3-chinese-chat-19B", + "model_revision": "d88b352bce5ee58a289b1ac8328553eb31efa2ef" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "int4" + ], + "model_id": "THUDM/cogvlm2-llama3-chinese-chat-19B-{quantizations}", + "model_revision": "7863e362174f4718c2fe9cba4befd0b580a3194f" + } + ], + "prompt_style": { + "style_name": "LLAMA3", + "system_prompt": "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n\n", + "inter_message_sep": "<|eot_id|>", + "stop_token_ids": [ + 128001, + 128009 + ], + "stop": [ + "<|end_of_text|>", + "<|eot_id|>" + ] + } } ] diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 88ce61e5e3..97b63a2254 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3860,5 +3860,60 @@ "<|im_end|>" ] } +}, + { + "version": 1, + "context_length": 8192, + "model_name": "cogvlm2", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "CogVLM2 have achieved good results in many lists compared to the previous generation of CogVLM open source models. Its excellent performance can compete with some non-open source models.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + + "model_id": "ZhipuAI/cogvlm2-llama3-chinese-chat-19B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "int4" + ], + "model_hub": "modelscope", + "model_id": "ZhipuAI/cogvlm2-llama3-chinese-chat-19B-{quantization}", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "LLAMA3", + "system_prompt": "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n\n", + "inter_message_sep": "<|eot_id|>", + "stop_token_ids": [ + 128001, + 128009 + ], + "stop": [ + "<|end_of_text|>", + "<|eot_id|>" + ] + } } ] diff --git a/xinference/model/llm/pytorch/cogvlm2.py b/xinference/model/llm/pytorch/cogvlm2.py new file mode 100644 index 0000000000..c3cc31b23a --- /dev/null +++ b/xinference/model/llm/pytorch/cogvlm2.py @@ -0,0 +1,257 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import base64 +import logging +import time +import uuid +from concurrent.futures import ThreadPoolExecutor +from io import BytesIO +from typing import Dict, Iterator, List, Optional, Tuple, Union + +import requests +import torch +from PIL import Image + +from ....model.utils import select_device +from ....types import ( + ChatCompletion, + ChatCompletionChunk, + ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionUsage, +) +from ..llm_family import LLMFamilyV1, LLMSpecV1 +from .core import PytorchChatModel, PytorchGenerateConfig + +logger = logging.getLogger(__name__) + +IMAGENET_MEAN = (0.485, 0.456, 0.406) +IMAGENET_STD = (0.229, 0.224, 0.225) + + +class CogVLM2Model(PytorchChatModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._torch_type = None + self._device = None + self._tokenizer = None + self._model = None + + @classmethod + def match( + cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str + ) -> bool: + family = model_family.model_family or model_family.model_name + if "cogvlm" in family.lower(): + return True + return False + + def load(self, **kwargs): + from transformers import AutoModelForCausalLM, AutoTokenizer + from transformers.generation import GenerationConfig + + device = self._pytorch_model_config.get("device", "auto") + self._device = select_device(device) + self._torch_type = ( + torch.bfloat16 + if torch.cuda.is_available() and torch.cuda.get_device_capability()[0] >= 8 + else torch.float16 + ) + + self._tokenizer = AutoTokenizer.from_pretrained( + self.model_path, + trust_remote_code=True, + ) + + self._model = AutoModelForCausalLM.from_pretrained( + self.model_path, + torch_dtype=self._torch_type, + trust_remote_code=True, + low_cpu_mem_usage=True, + device_map="auto", + ).eval() + + # Specify hyperparameters for generation + self._model.generation_config = GenerationConfig.from_pretrained( + self.model_path, + trust_remote_code=True, + ) + + def _message_content_to_cogvlm2(self, content): + def _load_image(_url): + if _url.startswith("data:"): + logging.info("Parse url by base64 decoder.") + # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images + # e.g. f"data:image/jpeg;base64,{base64_image}" + _type, data = _url.split(";") + _, ext = _type.split("/") + data = data[len("base64,") :] + data = base64.b64decode(data.encode("utf-8")) + return Image.open(BytesIO(data)).convert("RGB") + else: + try: + response = requests.get(_url) + except requests.exceptions.MissingSchema: + return Image.open(_url).convert("RGB") + else: + return Image.open(BytesIO(response.content)).convert("RGB") + + if not isinstance(content, str): + texts = [] + image_urls = [] + for c in content: + c_type = c.get("type") + if c_type == "text": + texts.append(c["text"]) + elif c_type == "image_url": + image_urls.append(c["image_url"]["url"]) + image_futures = [] + with ThreadPoolExecutor() as executor: + for image_url in image_urls: + fut = executor.submit(_load_image, image_url) + image_futures.append(fut) + images = [fut.result() for fut in image_futures] + text = " ".join(texts) + if len(images) == 0: + return text, None + elif len(images) == 1: + return text, images + else: + raise RuntimeError( + "Only one image per message is supported by CogVLM2." + ) + return content, None + + def _history_content_to_cogvlm2( + self, system_prompt: str, chat_history: List[ChatCompletionMessage] + ): + def _image_to_piexl_values(image): + if image.startswith("data:"): + logging.info("Parse url by base64 decoder.") + # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images + # e.g. f"data:image/jpeg;base64,{base64_image}" + _type, data = image.split(";") + _, ext = _type.split("/") + data = data[len("base64,") :] + data = base64.b64decode(data.encode("utf-8")) + return Image.open(BytesIO(data)).convert("RGB") + else: + try: + response = requests.get(image) + except requests.exceptions.MissingSchema: + return Image.open(image).convert("RGB") + else: + return Image.open(BytesIO(response.content)).convert("RGB") + + query = system_prompt + history: List[Tuple] = [] + pixel_values = None + for i in range(0, len(chat_history), 2): + user = chat_history[i]["content"] + if isinstance(user, List): + for content in user: + c_type = content.get("type") + if c_type == "text": + user = content["text"] + elif c_type == "image_url" and not pixel_values: + pixel_values = _image_to_piexl_values( + content["image_url"]["url"] + ) + assistant = chat_history[i + 1]["content"] + query = query + f" USER: {user} ASSISTANT:" + history.append((query, assistant)) + query = query + f" {assistant}" + return query, history, [pixel_values] + + def chat( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[PytorchGenerateConfig] = None, + ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + system_prompt = system_prompt if system_prompt else "" + if generate_config and generate_config.get("stream"): + raise Exception( + f"Chat with model {self.model_family.model_name} does not support stream." + ) + + sanitized_config = { + "pad_token_id": 128002, + "max_new_tokens": generate_config.get("max_tokens", 512) + if generate_config + else 512, + } + + content, image = self._message_content_to_cogvlm2(prompt) + + history = [] + query = "" + history_image = None + if chat_history: + query, history, history_image = self._history_content_to_cogvlm2( + system_prompt, chat_history + ) + + if image and history_image: + history = [] + query = system_prompt + f" USER: {content} ASSISTANT:" + else: + image = image if image else history_image + query = query + f" USER: {content} ASSISTANT:" + + input_by_model = self._model.build_conversation_input_ids( + self._tokenizer, + query=query, + history=history, + images=image, + template_version="chat", + ) + + inputs = { + "input_ids": input_by_model["input_ids"].unsqueeze(0).to(self._device), + "token_type_ids": input_by_model["token_type_ids"] + .unsqueeze(0) + .to(self._device), + "attention_mask": input_by_model["attention_mask"] + .unsqueeze(0) + .to(self._device), + "images": [ + [input_by_model["images"][0].to(self._device).to(self._torch_type)] + ] + if image is not None + else None, + } + with torch.no_grad(): + outputs = self._model.generate(**inputs, **sanitized_config) + outputs = outputs[:, inputs["input_ids"].shape[1] :] + response = self._tokenizer.decode(outputs[0]) + response = response.split("<|end_of_text|>")[0] + + chunk = Completion( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=response, finish_reason="stop", logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + return self._to_chat_completion(chunk) diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index fb43d65c9f..f1598358ca 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -62,6 +62,7 @@ "deepseek-vl-chat", "internvl-chat", "mini-internvl-chat", + "cogvlm2", ] From cb9dbb2d9bf3f60c25917d74b53536bc93625ffb Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 31 May 2024 12:31:43 +0800 Subject: [PATCH 112/298] DOC: update readme and fix description about model engine (#1566) --- README.md | 2 +- README_zh_CN.md | 2 +- .../getting_started/environments.po | 21 ++++++-- .../getting_started/installation.po | 54 ++++++++++++------- .../locale/zh_CN/LC_MESSAGES/models/index.po | 50 ++++++++--------- .../models/model_abilities/vision.po | 47 +++++++++++----- doc/source/models/index.rst | 6 ++- doc/source/models/model_abilities/vision.rst | 7 ++- 8 files changed, 126 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 2a50db6362..e6a4badf3e 100644 --- a/README.md +++ b/README.md @@ -34,12 +34,12 @@ potential of cutting-edge AI models. - Docker image: [#855](https://github.com/xorbitsai/inference/pull/855) - Support multimodal: [#829](https://github.com/xorbitsai/inference/pull/829) ### New Models +- Built-in support for [CogVLM2](https://github.com/THUDM/CogVLM2): [#1551](https://github.com/xorbitsai/inference/pull/1551) - Built-in support for [InternVL-Chat-V1-5](https://github.com/OpenGVLab/InternVL): [#1536](https://github.com/xorbitsai/inference/pull/1536) - Built-in support for [Yi-1.5](https://github.com/01-ai/Yi-1.5): [#1489](https://github.com/xorbitsai/inference/pull/1489) - Built-in support for [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) - Built-in support for [Qwen1.5 110B](https://huggingface.co/Qwen/Qwen1.5-110B-Chat): [#1388](https://github.com/xorbitsai/inference/pull/1388) - Built-in support for [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) -- Built-in support for [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) ### Integrations - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. diff --git a/README_zh_CN.md b/README_zh_CN.md index ca95bb1928..afc23df8f6 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -31,12 +31,12 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - Docker 镜像支持: [#855](https://github.com/xorbitsai/inference/pull/855) - 支持多模态模型:[#829](https://github.com/xorbitsai/inference/pull/829) ### 新模型 +- 内置 [CogVLM2](https://github.com/THUDM/CogVLM2): [#1551](https://github.com/xorbitsai/inference/pull/1551) - 内置 [InternVL-Chat-V1-5](https://github.com/OpenGVLab/InternVL): [#1536](https://github.com/xorbitsai/inference/pull/1536) - 内置 [Yi-1.5](https://github.com/01-ai/Yi-1.5): [#1489](https://github.com/xorbitsai/inference/pull/1489) - 内置 [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) - 内置 [Qwen1.5 110B](https://huggingface.co/Qwen/Qwen1.5-110B-Chat): [#1388](https://github.com/xorbitsai/inference/pull/1388) - 内置 [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) -- 内置 [Command-R](https://huggingface.co/CohereForAI/c4ai-command-r-v01): [#1310](https://github.com/xorbitsai/inference/pull/1310) ### 集成 - [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/environments.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/environments.po index a912a8a7b7..aa258e8781 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/environments.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/environments.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-11 13:33+0800\n" +"POT-Creation-Date: 2024-05-31 11:46+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -96,8 +96,8 @@ msgid "" "Xinference will automatically report health check at Xinference startup. " "Setting this environment to 1 can disable health check." msgstr "" -"在满足条件时,Xinference 会自动汇报worker健康状况,设置改" -"环境变量为 1可以禁用健康检查。" +"在满足条件时,Xinference 会自动汇报worker健康状况,设置改环境变量为 1可以" +"禁用健康检查。" #: ../../source/getting_started/environments.rst:40 msgid "XINFERENCE_DISABLE_VLLM" @@ -111,3 +111,18 @@ msgstr "" "在满足条件时,Xinference 会自动使用 vLLM 作为推理引擎提供推理效率,设置改" "环境变量为 1可以禁用 vLLM。" +#: ../../source/getting_started/environments.rst:45 +#, fuzzy +msgid "XINFERENCE_DISABLE_METRICS" +msgstr "XINFERENCE_DISABLE_VLLM" + +#: ../../source/getting_started/environments.rst:46 +msgid "" +"Xinference will by default enable the metrics exporter on the supervisor " +"and worker. Setting this environment to 1 will disable the /metrics " +"endpoint on the supervisor and the HTTP service (only provide the " +"/metrics endpoint) on the worker." +msgstr "" +"Xinference 会默认在 supervisor 和 worker 上启用 metrics exporter。" +"设置环境变量为 1可以在 supervisor 上禁用 /metrics 端点," +"并在 worker 上禁用 HTTP 服务(仅提供 /metrics 端点)" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po index 9fadbf74c9..b655be777d 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-11 10:26+0800\n" +"POT-Creation-Date: 2024-05-31 11:46+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.11.0\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/getting_started/installation.rst:5 msgid "Installation" @@ -95,7 +95,9 @@ msgstr "当模型格式为 ``awq`` 时,量化选项需为 ``Int4`` 。" msgid "" "When the model format is ``gptq``, the quantization is ``Int3``, ``Int4``" " or ``Int8``." -msgstr "当模型格式为 ``gptq`` 时,量化选项需为 ``Int3`` 、 ``Int4`` 或者 ``Int8`` 。" +msgstr "" +"当模型格式为 ``gptq`` 时,量化选项需为 ``Int3`` 、 ``Int4`` 或者 ``Int8``" +" 。" #: ../../source/getting_started/installation.rst:35 msgid "The system is Linux and has at least one CUDA device" @@ -132,7 +134,7 @@ msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" msgstr "" #: ../../source/getting_started/installation.rst:46 -msgid "``Yi``, ``Yi-chat``" +msgid "``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k``" msgstr "" #: ../../source/getting_started/installation.rst:47 @@ -140,31 +142,33 @@ msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" msgstr "" #: ../../source/getting_started/installation.rst:48 -msgid "``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit``" +msgid "" +"``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-" +"instruct``" msgstr "" #: ../../source/getting_started/installation.rst:49 -msgid "``vicuna-v1.3``, ``vicuna-v1.5``" +msgid "``codeqwen1.5``, ``codeqwen1.5-chat``" msgstr "" #: ../../source/getting_started/installation.rst:50 -msgid "``internlm2-chat``" +msgid "``vicuna-v1.3``, ``vicuna-v1.5``" msgstr "" #: ../../source/getting_started/installation.rst:51 -msgid "``qwen-chat``" +msgid "``internlm2-chat``" msgstr "" #: ../../source/getting_started/installation.rst:52 -msgid "``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1``" +msgid "``qwen-chat``" msgstr "" #: ../../source/getting_started/installation.rst:53 -msgid "``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k``" +msgid "``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1``" msgstr "" #: ../../source/getting_started/installation.rst:54 -msgid "``deepseek-chat``, ``deepseek-coder-instruct``" +msgid "``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k``" msgstr "" #: ../../source/getting_started/installation.rst:55 @@ -172,15 +176,15 @@ msgid "``qwen1.5-chat``, ``qwen1.5-moe-chat``" msgstr "" #: ../../source/getting_started/installation.rst:56 -msgid "``codeqwen1.5-chat``" +msgid "``gemma-it``" msgstr "" #: ../../source/getting_started/installation.rst:57 -msgid "``gemma-it``" +msgid "``orion-chat``, ``orion-chat-rag``" msgstr "" #: ../../source/getting_started/installation.rst:58 -msgid "``orion-chat``, ``orion-chat-rag``" +msgid "``c4ai-command-r-v01``" msgstr "" #: ../../source/getting_started/installation.rst:61 @@ -197,8 +201,8 @@ msgid "" "cpp-python``. It's advised to install the llama.cpp-related dependencies " "manually based on your hardware specifications to enable acceleration." msgstr "" -"Xinference 通过 ``llama-cpp-python`` 支持 ``gguf`` 和 ``ggml`` 格式的模型。建议根据当前使用的硬件手动安装依赖,从而获得最佳的" -"加速效果。" +"Xinference 通过 ``llama-cpp-python`` 支持 ``gguf`` 和 ``ggml`` 格式的模型" +"。建议根据当前使用的硬件手动安装依赖,从而获得最佳的加速效果。" #: ../../source/getting_started/installation.rst:71 #: ../../source/getting_started/installation.rst:94 @@ -232,5 +236,19 @@ msgid "" "automatic KV cache reuse across multiple calls. And it also supports " "other common techniques like continuous batching and tensor parallelism." msgstr "" -"SGLang 具有基于 RadixAttention 的高性能推理运行时。它通过在多个调用之间自动重用KV缓存,显著加速了复杂 LLM 程序的执行。" -"它还支持其他常见推理技术,如连续批处理和张量并行处理。" +"SGLang 具有基于 RadixAttention 的高性能推理运行时。它通过在多个调用之间" +"自动重用KV缓存,显著加速了复杂 LLM 程序的执行。它还支持其他常见推理技术," +"如连续批处理和张量并行处理。" + +#~ msgid "``Yi``, ``Yi-chat``" +#~ msgstr "" + +#~ msgid "``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit``" +#~ msgstr "" + +#~ msgid "``deepseek-chat``, ``deepseek-coder-instruct``" +#~ msgstr "" + +#~ msgid "``codeqwen1.5-chat``" +#~ msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/index.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/index.po index 222ece7826..1993ec6576 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/index.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/index.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-07 17:52+0800\n" +"POT-Creation-Date: 2024-05-31 11:46+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/models/index.rst:5 msgid "Models" @@ -109,85 +109,85 @@ msgid "" "Xinference's Python client:" msgstr "你可以通过命令行或者 Xinference 的 Python 客户端来启动一个模型。" -#: ../../source/models/index.rst:105 +#: ../../source/models/index.rst:107 msgid "" "For model type ``LLM``, launching the model requires not only specifying " -"the model name, but also the size of the parameters and the model format." -" Please refer to the list of LLM :ref:`model families " -"<models_llm_index>`." +"the model name, but also the size of the parameters , the model format " +"and the model engine. Please refer to the list of LLM :ref:`model " +"families <models_llm_index>`." msgstr "" -"对于模型类型 ``LLM``,启动模型不仅需要指定模型名称,还需要参数的大小和" -"模型格式。请参考 :ref:`models_llm_index` 文档。" +"对于模型类型 ``LLM``,启动模型不仅需要指定模型名称,还需要参数的大小、" +"模型格式以及模型引擎。请参考 :ref:`models_llm_index` 文档。" -#: ../../source/models/index.rst:108 +#: ../../source/models/index.rst:110 msgid "" "The following command gives you the currently running models in " "Xinference:" msgstr "以下命令可以列出 Xinference 中正在运行的模型:" -#: ../../source/models/index.rst:129 +#: ../../source/models/index.rst:131 msgid "" "When you no longer need a model that is currently running, you can remove" " it in the following way to free up the resources it occupies:" msgstr "当你不再需要当前正在运行的模型时,以下列方式释放其占用的资源:" -#: ../../source/models/index.rst:153 +#: ../../source/models/index.rst:155 msgid "Model Usage" msgstr "模型使用" -#: ../../source/models/index.rst:158 +#: ../../source/models/index.rst:160 msgid "Chat & Generate" msgstr "聊天 & 生成" -#: ../../source/models/index.rst:162 +#: ../../source/models/index.rst:164 msgid "Learn how to chat with LLMs in Xinference." msgstr "学习如何在 Xinference 中与 LLM聊天。" -#: ../../source/models/index.rst:164 +#: ../../source/models/index.rst:166 msgid "Tools" msgstr "工具" -#: ../../source/models/index.rst:168 +#: ../../source/models/index.rst:170 msgid "Learn how to connect LLM with external tools." msgstr "学习如何将 LLM 与外部工具连接起来。" -#: ../../source/models/index.rst:173 +#: ../../source/models/index.rst:175 msgid "Embeddings" msgstr "嵌入" -#: ../../source/models/index.rst:177 +#: ../../source/models/index.rst:179 msgid "Learn how to create text embeddings in Xinference." msgstr "学习如何在 Xinference 中创建文本嵌入。" -#: ../../source/models/index.rst:179 +#: ../../source/models/index.rst:181 msgid "Rerank" msgstr "重排序" -#: ../../source/models/index.rst:183 +#: ../../source/models/index.rst:185 msgid "Learn how to use rerank models in Xinference." msgstr "学习如何在 Xinference 中使用重排序模型。" -#: ../../source/models/index.rst:188 +#: ../../source/models/index.rst:190 msgid "Images" msgstr "图像" -#: ../../source/models/index.rst:192 +#: ../../source/models/index.rst:194 msgid "Learn how to generate images with Xinference." msgstr "学习如何使用Xinference生成图像。" -#: ../../source/models/index.rst:194 +#: ../../source/models/index.rst:196 msgid "Vision" msgstr "视觉" -#: ../../source/models/index.rst:198 +#: ../../source/models/index.rst:200 msgid "Learn how to process image with LLMs." msgstr "学习如何使用 LLM 处理图像。" -#: ../../source/models/index.rst:203 +#: ../../source/models/index.rst:205 msgid "Audio" msgstr "音频" -#: ../../source/models/index.rst:207 +#: ../../source/models/index.rst:209 msgid "Learn how to turn audio into text or text into audio with Xinference." msgstr "学习如何使用 Xinference 将音频转换为文本或将文本转换为音频。" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po index 0ed3e0bb7e..6839a693c6 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-01 16:47+0800\n" +"POT-Creation-Date: 2024-05-31 11:46+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/models/model_abilities/vision.rst:5 msgid "Vision" @@ -37,8 +37,9 @@ msgid "" "answer questions about them. Within Xinference, this indicates that " "certain models are capable of processing image inputs when conducting " "dialogues via the Chat API." -msgstr "通过 ``vision`` 能力,您可以让模型接收图像并回答有关它们的问题。" -"在 Xinference 中,这表示某些模型在通过 Chat API 进行对话时能够处理图像输入。" +msgstr "" +"通过 ``vision`` 能力,您可以让模型接收图像并回答有关它们的问题。在 " +"Xinference 中,这表示某些模型在通过 Chat API 进行对话时能够处理图像输入。" #: ../../source/models/model_abilities/vision.rst:19 msgid "Supported models" @@ -51,37 +52,59 @@ msgid "" msgstr "在 Xinference 中支持 ``vision`` 功能的模型如下:" #: ../../source/models/model_abilities/vision.rst:23 -msgid "qwen-vl-chat" +msgid ":ref:`qwen-vl-chat <models_llm_qwen-vl-chat>`" +msgstr "" + +#: ../../source/models/model_abilities/vision.rst:24 +msgid ":ref:`deepseek-vl-chat <models_llm_deepseek-vl-chat>`" +msgstr "" + +#: ../../source/models/model_abilities/vision.rst:25 +msgid ":ref:`yi-vl-chat <models_llm_yi-vl-chat>`" +msgstr "" + +#: ../../source/models/model_abilities/vision.rst:26 +msgid ":ref:`omnilmm <models_llm_omnilmm>`" msgstr "" #: ../../source/models/model_abilities/vision.rst:27 +msgid ":ref:`internvl-chat <models_llm_internvl-chat>`" +msgstr "" + +#: ../../source/models/model_abilities/vision.rst:28 +msgid ":ref:`cogvlm2 <models_llm_cogvlm2>`" +msgstr "" + +#: ../../source/models/model_abilities/vision.rst:32 msgid "Quickstart" msgstr "快速入门" -#: ../../source/models/model_abilities/vision.rst:29 +#: ../../source/models/model_abilities/vision.rst:34 msgid "" "Images are made available to the model in two main ways: by passing a " "link to the image or by passing the base64 encoded image directly in the " "request." -msgstr "模型可以通过两种主要方式获取图像:通过传递图像的链接或直接在请求中传递 base64 编码的图像。" +msgstr "" +"模型可以通过两种主要方式获取图像:通过传递图像的链接或直接在请求中传递 " +"base64 编码的图像。" -#: ../../source/models/model_abilities/vision.rst:33 +#: ../../source/models/model_abilities/vision.rst:38 msgid "Example using OpenAI Client" msgstr "使用 OpenAI 客户端的示例" -#: ../../source/models/model_abilities/vision.rst:64 +#: ../../source/models/model_abilities/vision.rst:69 msgid "Uploading base 64 encoded images" msgstr "上传 Base64 编码的图片" -#: ../../source/models/model_abilities/vision.rst:106 +#: ../../source/models/model_abilities/vision.rst:111 msgid "You can find more examples of ``vision`` ability in the tutorial notebook:" msgstr "你可以在教程笔记本中找到更多关于 ``vision`` 能力的示例。" -#: ../../source/models/model_abilities/vision.rst:110 +#: ../../source/models/model_abilities/vision.rst:115 msgid "Qwen VL Chat" msgstr "" -#: ../../source/models/model_abilities/vision.rst:113 +#: ../../source/models/model_abilities/vision.rst:118 msgid "Learn vision ability from a example using qwen-vl-chat" msgstr "通过使用 qwen-vl-chat 的示例来学习使用 LLM 的视觉能力" diff --git a/doc/source/models/index.rst b/doc/source/models/index.rst index fb45dcd8c8..30a9778e96 100644 --- a/doc/source/models/index.rst +++ b/doc/source/models/index.rst @@ -84,6 +84,7 @@ You can launch a model in Xinference either via command line or Xinference's Pyt .. code-tab:: bash shell xinference launch --model-name <MODEL_NAME> \ + [--model-engine <MODEL_ENGINE>] \ [--model-type <MODEL_TYPE>] \ [--model-uid <MODEL_UID>] \ [--endpoint "http://<XINFERENCE_HOST>:<XINFERENCE_PORT>"] \ @@ -95,7 +96,8 @@ You can launch a model in Xinference either via command line or Xinference's Pyt client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") model_uid = client.launch_model( - model_name="<MODEL_NAME>", + model_name="<MODEL_NAME>", + model_engine="<MODEL_ENGINE>", model_type="<MODEL_TYPE>" model_uid="<MODEL_UID>" ) @@ -103,7 +105,7 @@ You can launch a model in Xinference either via command line or Xinference's Pyt For model type ``LLM``, launching the model requires not only specifying the model name, but also the size of the parameters -and the model format. Please refer to the list of LLM :ref:`model families <models_llm_index>`. +, the model format and the model engine. Please refer to the list of LLM :ref:`model families <models_llm_index>`. The following command gives you the currently running models in Xinference: diff --git a/doc/source/models/model_abilities/vision.rst b/doc/source/models/model_abilities/vision.rst index 3d3f8f7da7..7e2e8a05db 100644 --- a/doc/source/models/model_abilities/vision.rst +++ b/doc/source/models/model_abilities/vision.rst @@ -20,7 +20,12 @@ Supported models The ``vision`` ability is supported with the following models in Xinference: -* qwen-vl-chat +* :ref:`qwen-vl-chat <models_llm_qwen-vl-chat>` +* :ref:`deepseek-vl-chat <models_llm_deepseek-vl-chat>` +* :ref:`yi-vl-chat <models_llm_yi-vl-chat>` +* :ref:`omnilmm <models_llm_omnilmm>` +* :ref:`internvl-chat <models_llm_internvl-chat>` +* :ref:`cogvlm2 <models_llm_cogvlm2>` Quickstart From 488ef461f7ed77c0ee8c8ceda1efa067848e6577 Mon Sep 17 00:00:00 2001 From: LIKEGAKKI <35187654+LIKEGAKKI@users.noreply.github.com> Date: Fri, 31 May 2024 17:11:53 +0800 Subject: [PATCH 113/298] FEAT: telechat model (#1567) Co-authored-by: LIKEGAKKI <lovegakki_zhou@163.com> Co-authored-by: qinxuye <qinxuye@gmail.com> --- doc/source/models/builtin/llm/index.rst | 7 + doc/source/models/builtin/llm/telechat.rst | 95 +++++++++++ xinference/model/llm/llm_family.json | 161 +++++++++++++----- .../model/llm/llm_family_modelscope.json | 132 +++++++++++--- 4 files changed, 334 insertions(+), 61 deletions(-) create mode 100644 doc/source/models/builtin/llm/telechat.rst diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index ce9c4b01c7..d7667dcdaa 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -411,6 +411,11 @@ The following is a list of built-in LLM in Xinference: - 4096 - We introduce Starling-7B, an open large language model (LLM) trained by Reinforcement Learning from AI Feedback (RLAIF). The model harnesses the power of our new GPT-4 labeled ranking dataset + * - :ref:`telechat <models_llm_telechat>` + - chat + - 8192 + - The TeleChat is a large language model developed and trained by China Telecom Artificial Intelligence Technology Co., LTD. The 7B model base is trained with 1.5 trillion Tokens and 3 trillion Tokens and Chinese high-quality corpus. + * - :ref:`tiny-llama <models_llm_tiny-llama>` - generate - 2048 @@ -664,6 +669,8 @@ The following is a list of built-in LLM in Xinference: starling-lm + telechat + tiny-llama vicuna-v1.3 diff --git a/doc/source/models/builtin/llm/telechat.rst b/doc/source/models/builtin/llm/telechat.rst new file mode 100644 index 0000000000..a856b8be81 --- /dev/null +++ b/doc/source/models/builtin/llm/telechat.rst @@ -0,0 +1,95 @@ +.. _models_llm_telechat: + +======================================== +telechat +======================================== + +- **Context Length:** 8192 +- **Model Name:** telechat +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** The TeleChat is a large language model developed and trained by China Telecom Artificial Intelligence Technology Co., LTD. The 7B model base is trained with 1.5 trillion Tokens and 3 trillion Tokens and Chinese high-quality corpus. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers +- **Model ID:** Tele-AI/telechat-7B +- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/telechat-7B>`__, `ModelScope <https://modelscope.cn/models/TeleAI/telechat-7B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name telechat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (gptq, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 7 +- **Quantizations:** int4, int8 +- **Engines**: Transformers +- **Model ID:** Tele-AI/telechat-7B-{quantization} +- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/telechat-7B-{quantization}>`__, `ModelScope <https://modelscope.cn/models/TeleAI/telechat-7B-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name telechat --size-in-billions 7 --model-format gptq --quantization ${quantization} + + +Model Spec 3 (pytorch, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 12 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers +- **Model ID:** Tele-AI/TeleChat-12B +- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/TeleChat-12B>`__, `ModelScope <https://modelscope.cn/models/Tele-AI/TeleChat-12B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name telechat --size-in-billions 12 --model-format pytorch --quantization ${quantization} + + +Model Spec 4 (gptq, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 12 +- **Quantizations:** int4, int8 +- **Engines**: Transformers +- **Model ID:** Tele-AI/TeleChat-12B-{quantization} +- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/TeleChat-12B-{quantization}>`__, `ModelScope <https://modelscope.cn/models/Tele-AI/TeleChat-12B-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name telechat --size-in-billions 12 --model-format gptq --quantization ${quantization} + + +Model Spec 5 (pytorch, 52 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 52 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers +- **Model ID:** Tele-AI/TeleChat-52B +- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/TeleChat-52B>`__, `ModelScope <https://modelscope.cn/models/Tele-AI/TeleChat-52B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name telechat --size-in-billions 52 --model-format pytorch --quantization ${quantization} + diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 4d853dd220..a614b8453f 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -6205,31 +6205,31 @@ "model_description": "InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. ", "model_specs": [ { - "model_format": "pytorch", - "model_size_in_billions": 2, - "quantizations": [ - "none" - ], - "model_id": "OpenGVLab/Mini-InternVL-Chat-2B-V1-5", - "model_revision": "ce3f67acff17281bacbf4b156f402a0580fb9605" + "model_format": "pytorch", + "model_size_in_billions": 2, + "quantizations": [ + "none" + ], + "model_id": "OpenGVLab/Mini-InternVL-Chat-2B-V1-5", + "model_revision": "ce3f67acff17281bacbf4b156f402a0580fb9605" }, { - "model_format": "pytorch", - "model_size_in_billions": 26, - "quantizations": [ - "none" - ], - "model_id": "OpenGVLab/InternVL-Chat-V1-5", - "model_revision": "e822119e5806946ce128043023a73d715ecabf8d" + "model_format": "pytorch", + "model_size_in_billions": 26, + "quantizations": [ + "none" + ], + "model_id": "OpenGVLab/InternVL-Chat-V1-5", + "model_revision": "e822119e5806946ce128043023a73d715ecabf8d" }, { - "model_format": "pytorch", - "model_size_in_billions": 26, - "quantizations": [ - "Int8" - ], - "model_id": "OpenGVLab/InternVL-Chat-V1-5-{quantization}", - "model_revision": "acaaed06937c603ab04f084216ecb0268160f538" + "model_format": "pytorch", + "model_size_in_billions": 26, + "quantizations": [ + "Int8" + ], + "model_id": "OpenGVLab/InternVL-Chat-V1-5-{quantization}", + "model_revision": "acaaed06937c603ab04f084216ecb0268160f538" } ], "prompt_style": { @@ -6247,7 +6247,7 @@ "<|im_end|>" ] } -}, + }, { "version": 1, "context_length": 8192, @@ -6262,24 +6262,24 @@ ], "model_description": "CogVLM2 have achieved good results in many lists compared to the previous generation of CogVLM open source models. Its excellent performance can compete with some non-open source models.", "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 20, - "quantizations": [ - "none" - ], - "model_id": "THUDM/cogvlm2-llama3-chinese-chat-19B", - "model_revision": "d88b352bce5ee58a289b1ac8328553eb31efa2ef" - }, { - "model_format": "pytorch", - "model_size_in_billions": 20, - "quantizations": [ - "int4" - ], - "model_id": "THUDM/cogvlm2-llama3-chinese-chat-19B-{quantizations}", - "model_revision": "7863e362174f4718c2fe9cba4befd0b580a3194f" - } + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "none" + ], + "model_id": "THUDM/cogvlm2-llama3-chinese-chat-19B", + "model_revision": "d88b352bce5ee58a289b1ac8328553eb31efa2ef" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "int4" + ], + "model_id": "THUDM/cogvlm2-llama3-chinese-chat-19B-{quantizations}", + "model_revision": "7863e362174f4718c2fe9cba4befd0b580a3194f" + } ], "prompt_style": { "style_name": "LLAMA3", @@ -6299,5 +6299,86 @@ "<|eot_id|>" ] } -} + }, + { + "version": 1, + "context_length": 8192, + "model_name": "telechat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "The TeleChat is a large language model developed and trained by China Telecom Artificial Intelligence Technology Co., LTD. The 7B model base is trained with 1.5 trillion Tokens and 3 trillion Tokens and Chinese high-quality corpus.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Tele-AI/telechat-7B" + }, + { + "model_format": "gptq", + "model_size_in_billions": 7, + "quantizations": [ + "int4", + "int8" + ], + "model_id": "Tele-AI/telechat-7B-{quantization}" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 12, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Tele-AI/TeleChat-12B" + }, + { + "model_format": "gptq", + "model_size_in_billions": 12, + "quantizations": [ + "int4", + "int8" + ], + "model_id": "Tele-AI/TeleChat-12B-{quantization}" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 52, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Tele-AI/TeleChat-52B" + } + ], + "prompt_style": { + "style_name": "NO_COLON_TWO", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "<_user>", + "<_bot>" + ], + "intra_message_sep": "", + "inter_message_sep": "", + "stop": [ + "<_end>", + "<_start>" + ], + "stop_token_ids": [ + 160133, + 160132 + ] + } + } ] diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 97b63a2254..04c2fc6345 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3875,27 +3875,26 @@ ], "model_description": "CogVLM2 have achieved good results in many lists compared to the previous generation of CogVLM open source models. Its excellent performance can compete with some non-open source models.", "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 20, - "quantizations": [ - "none" - ], - "model_hub": "modelscope", - - "model_id": "ZhipuAI/cogvlm2-llama3-chinese-chat-19B", - "model_revision": "master" - }, { - "model_format": "pytorch", - "model_size_in_billions": 20, - "quantizations": [ - "int4" - ], - "model_hub": "modelscope", - "model_id": "ZhipuAI/cogvlm2-llama3-chinese-chat-19B-{quantization}", - "model_revision": "master" - } + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + "model_id": "ZhipuAI/cogvlm2-llama3-chinese-chat-19B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "int4" + ], + "model_hub": "modelscope", + "model_id": "ZhipuAI/cogvlm2-llama3-chinese-chat-19B-{quantization}", + "model_revision": "master" + } ], "prompt_style": { "style_name": "LLAMA3", @@ -3915,5 +3914,96 @@ "<|eot_id|>" ] } -} + }, + { + "version": 1, + "context_length": 8192, + "model_name": "telechat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "The TeleChat is a large language model developed and trained by China Telecom Artificial Intelligence Technology Co., LTD. The 7B model base is trained with 1.5 trillion Tokens and 3 trillion Tokens and Chinese high-quality corpus.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "TeleAI/telechat-7B", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "gptq", + "model_size_in_billions": 7, + "quantizations": [ + "int4", + "int8" + ], + "model_id": "TeleAI/telechat-7B-{quantization}", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 12, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "TeleAI/TeleChat-12B", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "gptq", + "model_size_in_billions": 12, + "quantizations": [ + "int4", + "int8" + ], + "model_id": "TeleAI/TeleChat-12B-{quantization}", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 52, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "TeleAI/TeleChat-52B", + "model_hub": "modelscope", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "NO_COLON_TWO", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "<_user>", + "<_bot>" + ], + "intra_message_sep": "", + "inter_message_sep": "", + "stop": [ + "<_end>", + "<_start>" + ], + "stop_token_ids": [ + 160133, + 160132 + ] + } + } ] From 69c09cd068a530cd2fdcac07e4e81f03d48f04f9 Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Fri, 31 May 2024 17:12:13 +0800 Subject: [PATCH 114/298] ENH: add real paths column (#1555) --- xinference/core/cache_tracker.py | 23 ++++++++++++++++++++++- xinference/core/supervisor.py | 6 ++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/xinference/core/cache_tracker.py b/xinference/core/cache_tracker.py index 9eeb01bade..ae2ab28352 100644 --- a/xinference/core/cache_tracker.py +++ b/xinference/core/cache_tracker.py @@ -11,6 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import os from logging import getLogger from typing import Any, Dict, List, Optional @@ -105,9 +106,29 @@ def list_cached_models(self) -> List[Dict[Any, Any]]: cached_models = [] for model_name, model_versions in self._model_name_to_version_info.items(): for version_info in model_versions: - if version_info["cache_status"]: + cache_status = version_info.get("cache_status", None) + if cache_status == True: ret = version_info.copy() ret["model_name"] = model_name + + re_dict = version_info.get("model_file_location", None) + if re_dict is not None and isinstance(re_dict, dict): + if re_dict: + actor_ip_address, path = next(iter(re_dict.items())) + else: + raise ValueError("The dictionary is empty.") + else: + raise ValueError("re_dict must be a non-empty dictionary.") + + ret["actor_ip_address"] = actor_ip_address + ret["path"] = path + if os.path.isdir(path): + files = os.listdir(path) + resolved_file = os.path.realpath(os.path.join(path, files[0])) + if resolved_file: + ret["real_path"] = os.path.dirname(resolved_file) + else: + ret["real_path"] = os.path.realpath(path) cached_models.append(ret) cached_models = sorted(cached_models, key=lambda x: x["model_name"]) return cached_models diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index c1331a25e9..414f0a1285 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -993,8 +993,9 @@ async def list_cached_models(self) -> List[Dict[str, Any]]: "model_size_in_billions", None ) quantizations = model_version.get("quantization", None) - re_dict = model_version.get("model_file_location", None) - actor_ip_address, path = next(iter(re_dict.items())) + actor_ip_address = model_version.get("actor_ip_address", None) + path = model_version.get("path", None) + real_path = model_version.get("real_path", None) cache_entry = { "model_name": model_name, @@ -1003,6 +1004,7 @@ async def list_cached_models(self) -> List[Dict[str, Any]]: "quantizations": quantizations, "path": path, "Actor IP Address": actor_ip_address, + "real_path": real_path, } cached_models.append(cache_entry) From 25fd15a75b5205571a9c2c23ebfe8f0f56804753 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Sat, 1 Jun 2024 14:14:28 +0800 Subject: [PATCH 115/298] BUG: Fix typo for cogvlm2 (#1573) --- doc/source/models/builtin/llm/cogvlm2.rst | 4 ++-- xinference/model/llm/llm_family.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/source/models/builtin/llm/cogvlm2.rst b/doc/source/models/builtin/llm/cogvlm2.rst index e907e1d157..58ba147c2a 100644 --- a/doc/source/models/builtin/llm/cogvlm2.rst +++ b/doc/source/models/builtin/llm/cogvlm2.rst @@ -37,8 +37,8 @@ Model Spec 2 (pytorch, 20 Billion) - **Model Size (in billions):** 20 - **Quantizations:** int4 - **Engines**: Transformers -- **Model ID:** THUDM/cogvlm2-llama3-chinese-chat-19B-{quantizations} -- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B-{quantizations}>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B-{quantization}>`__ +- **Model ID:** THUDM/cogvlm2-llama3-chinese-chat-19B-{quantization} +- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B-{quantization}>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index a614b8453f..04c9cb4343 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -6277,7 +6277,7 @@ "quantizations": [ "int4" ], - "model_id": "THUDM/cogvlm2-llama3-chinese-chat-19B-{quantizations}", + "model_id": "THUDM/cogvlm2-llama3-chinese-chat-19B-{quantization}", "model_revision": "7863e362174f4718c2fe9cba4befd0b580a3194f" } ], From d76549b7533a3ed20e225548e1bb2bf89e7296c8 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Sat, 1 Jun 2024 18:27:50 +0800 Subject: [PATCH 116/298] ENH: make CogVLM2 support stream output (#1572) --- .../model/llm/llm_family_modelscope.json | 2 +- xinference/model/llm/pytorch/cogvlm2.py | 93 +++++++++++++++---- 2 files changed, 77 insertions(+), 18 deletions(-) diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 04c2fc6345..5e567559fc 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3860,7 +3860,7 @@ "<|im_end|>" ] } -}, + }, { "version": 1, "context_length": 8192, diff --git a/xinference/model/llm/pytorch/cogvlm2.py b/xinference/model/llm/pytorch/cogvlm2.py index c3cc31b23a..6d696ae60f 100644 --- a/xinference/model/llm/pytorch/cogvlm2.py +++ b/xinference/model/llm/pytorch/cogvlm2.py @@ -30,6 +30,7 @@ ChatCompletionMessage, Completion, CompletionChoice, + CompletionChunk, CompletionUsage, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 @@ -183,10 +184,7 @@ def chat( generate_config: Optional[PytorchGenerateConfig] = None, ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: system_prompt = system_prompt if system_prompt else "" - if generate_config and generate_config.get("stream"): - raise Exception( - f"Chat with model {self.model_family.model_name} does not support stream." - ) + stream = generate_config.get("stream", False) if generate_config else False sanitized_config = { "pad_token_id": 128002, @@ -234,24 +232,85 @@ def chat( if image is not None else None, } - with torch.no_grad(): - outputs = self._model.generate(**inputs, **sanitized_config) - outputs = outputs[:, inputs["input_ids"].shape[1] :] - response = self._tokenizer.decode(outputs[0]) - response = response.split("<|end_of_text|>")[0] - chunk = Completion( - id=str(uuid.uuid1()), + if stream: + it = self._streaming_chat_response(inputs, sanitized_config) + return self._to_chat_completion_chunks(it) + else: + with torch.no_grad(): + outputs = self._model.generate(**inputs, **sanitized_config) + outputs = outputs[:, inputs["input_ids"].shape[1] :] + response = self._tokenizer.decode(outputs[0]) + response = response.split("<|end_of_text|>")[0] + + chunk = Completion( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=response, finish_reason="stop", logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + return self._to_chat_completion(chunk) + + def _streaming_chat_response( + self, inputs: Dict, config: Dict + ) -> Iterator[CompletionChunk]: + from threading import Thread + + from transformers import TextIteratorStreamer + + streamer = TextIteratorStreamer( + self._tokenizer, skip_prompt=True, skip_special_tokens=True + ) + generation_kwargs = { + "input_ids": inputs["input_ids"], + "attention_mask": inputs["attention_mask"], + "token_type_ids": inputs["token_type_ids"], + "images": inputs["images"], + "max_new_tokens": config["max_new_tokens"], + "pad_token_id": config["pad_token_id"], + "streamer": streamer, + } + + thread = Thread(target=self._model.generate, kwargs=generation_kwargs) + thread.start() + + completion_id = str(uuid.uuid1()) + for new_text in streamer: + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=new_text, finish_reason=None, logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + yield chunk + + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=completion_id, object="text_completion", created=int(time.time()), model=self.model_uid, - choices=[ - CompletionChoice( - index=0, text=response, finish_reason="stop", logprobs=None - ) - ], + choices=[completion_choice], usage=CompletionUsage( prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 ), ) - return self._to_chat_completion(chunk) + yield chunk From 9444e936d149f71a9cfbd283e93bf33c387325fa Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Wed, 5 Jun 2024 11:57:07 +0800 Subject: [PATCH 117/298] FEAT: new model: mini-cpm-llama3-v-2.5 (#1577) --- xinference/model/llm/__init__.py | 2 + xinference/model/llm/llm_family.json | 42 ++++ .../model/llm/llm_family_modelscope.json | 46 +++- xinference/model/llm/pytorch/core.py | 1 + xinference/model/llm/pytorch/minicpmv25.py | 232 ++++++++++++++++++ 5 files changed, 322 insertions(+), 1 deletion(-) create mode 100644 xinference/model/llm/pytorch/minicpmv25.py diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index d3674b3795..9d56307428 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -120,6 +120,7 @@ def _install(): from .pytorch.intern_vl import InternVLChatModel from .pytorch.internlm2 import Internlm2PytorchChatModel from .pytorch.llama_2 import LlamaPytorchChatModel, LlamaPytorchModel + from .pytorch.minicpmv25 import MiniCPMV25Model from .pytorch.qwen_vl import QwenVLChatModel from .pytorch.vicuna import VicunaPytorchChatModel from .pytorch.yi_vl import YiVLChatModel @@ -161,6 +162,7 @@ def _install(): InternVLChatModel, PytorchModel, CogVLM2Model, + MiniCPMV25Model, ] ) if OmniLMMModel: # type: ignore diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 04c9cb4343..9bd93adade 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -5258,6 +5258,48 @@ ] } }, + { + "version":1, + "context_length":2048, + "model_name":"MiniCPM-Llama3-V-2_5", + "model_lang":[ + "en", + "zh" + ], + "model_ability":[ + "chat", + "vision" + ], + "model_description":"MiniCPM-Llama3-V 2.5 is the latest model in the MiniCPM-V series. The model is built on SigLip-400M and Llama3-8B-Instruct with a total of 8B parameters.", + "model_specs":[ + { + "model_format":"pytorch", + "model_size_in_billions":8, + "quantizations":[ + "none" + ], + "model_id":"openbmb/MiniCPM-Llama3-V-2_5", + "model_revision":"285a637ba8a30a0660dfcccad16f9a864f75abfd" + }, + { + "model_format":"pytorch", + "model_size_in_billions":8, + "quantizations":[ + "int4" + ], + "model_id":"openbmb/MiniCPM-Llama3-V-2_5-{quantization}", + "model_revision":"f92aff28552de35de3be204e8fe292dd4824e544" + } + ], + "prompt_style":{ + "style_name":"OmniLMM", + "system_prompt":"The role of first msg should be user", + "roles":[ + "user", + "assistant" + ] + } + }, { "version": 1, "context_length": 4096, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 5e567559fc..a0abf94351 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3236,7 +3236,7 @@ "chat", "vision" ], - "model_description":"mniLMM is a family of open-source large multimodal models (LMMs) adept at vision & language modeling.", + "model_description":"OmniLMM is a family of open-source large multimodal models (LMMs) adept at vision & language modeling.", "model_specs":[ { "model_format":"pytorch", @@ -3468,6 +3468,50 @@ ] } }, + { + "version":1, + "context_length":2048, + "model_name":"MiniCPM-Llama3-V-2_5", + "model_lang":[ + "en", + "zh" + ], + "model_ability":[ + "chat", + "vision" + ], + "model_description":"MiniCPM-Llama3-V 2.5 is the latest model in the MiniCPM-V series. The model is built on SigLip-400M and Llama3-8B-Instruct with a total of 8B parameters.", + "model_specs":[ + { + "model_format":"pytorch", + "model_size_in_billions":8, + "quantizations":[ + "none" + ], + "model_hub": "modelscope", + "model_id":"OpenBMB/MiniCPM-Llama3-V-2_5", + "model_revision":"master" + }, + { + "model_format":"pytorch", + "model_size_in_billions":8, + "quantizations":[ + "int4" + ], + "model_hub": "modelscope", + "model_id":"OpenBMB/MiniCPM-Llama3-V-2_5-{quantization}", + "model_revision":"master" + } + ], + "prompt_style":{ + "style_name":"OmniLMM", + "system_prompt":"The role of first msg should be user", + "roles":[ + "user", + "assistant" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index f1598358ca..30ed8c8497 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -63,6 +63,7 @@ "internvl-chat", "mini-internvl-chat", "cogvlm2", + "MiniCPM-Llama3-V-2_5", ] diff --git a/xinference/model/llm/pytorch/minicpmv25.py b/xinference/model/llm/pytorch/minicpmv25.py new file mode 100644 index 0000000000..d0b9c47f9c --- /dev/null +++ b/xinference/model/llm/pytorch/minicpmv25.py @@ -0,0 +1,232 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import base64 +import json +import logging +import time +import uuid +from concurrent.futures import ThreadPoolExecutor +from io import BytesIO +from typing import Dict, Iterator, List, Optional, Union + +import requests +import torch +from PIL import Image + +from ....types import ( + ChatCompletion, + ChatCompletionChunk, + ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionChunk, + CompletionUsage, +) +from ...utils import select_device +from ..llm_family import LLMFamilyV1, LLMSpecV1 +from .core import PytorchChatModel, PytorchGenerateConfig + +logger = logging.getLogger(__name__) + + +class MiniCPMV25Model(PytorchChatModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._device = None + self._tokenizer = None + self._model = None + + @classmethod + def match( + cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str + ) -> bool: + family = model_family.model_family or model_family.model_name + if "MiniCPM-Llama3-V-2_5".lower() in family.lower(): + return True + return False + + def load(self, **kwargs): + from transformers import AutoModel, AutoTokenizer + from transformers.generation import GenerationConfig + + device = self._pytorch_model_config.get("device", "auto") + self._device = select_device(device) + self._device = "auto" if self._device == "cuda" else self._device + + if "int4" in self.model_path: + if device == "mps": + print( + "Error: running int4 model with bitsandbytes on Mac is not supported right now." + ) + exit() + model = AutoModel.from_pretrained(self.model_path, trust_remote_code=True) + else: + model = AutoModel.from_pretrained( + self.model_path, + trust_remote_code=True, + torch_dtype=torch.float16, + device_map=self._device, + ) + tokenizer = AutoTokenizer.from_pretrained( + self.model_path, trust_remote_code=True + ) + self._model = model.eval() + self._tokenizer = tokenizer + + # Specify hyperparameters for generation + self._model.generation_config = GenerationConfig.from_pretrained( + self.model_path, + trust_remote_code=True, + ) + + def _message_content_to_chat(self, content): + def _load_image(_url): + if _url.startswith("data:"): + logging.info("Parse url by base64 decoder.") + # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images + # e.g. f"data:image/jpeg;base64,{base64_image}" + _type, data = _url.split(";") + _, ext = _type.split("/") + data = data[len("base64,") :] + data = base64.b64decode(data.encode("utf-8")) + return Image.open(BytesIO(data)).convert("RGB") + else: + try: + response = requests.get(_url) + except requests.exceptions.MissingSchema: + return Image.open(_url).convert("RGB") + else: + return Image.open(BytesIO(response.content)).convert("RGB") + + if not isinstance(content, str): + texts = [] + image_urls = [] + for c in content: + c_type = c.get("type") + if c_type == "text": + texts.append(c["text"]) + elif c_type == "image_url": + image_urls.append(c["image_url"]["url"]) + image_futures = [] + with ThreadPoolExecutor() as executor: + for image_url in image_urls: + fut = executor.submit(_load_image, image_url) + image_futures.append(fut) + images = [fut.result() for fut in image_futures] + text = " ".join(texts) + if len(images) == 0: + return text, [] + elif len(images) == 1: + return text, images + else: + raise RuntimeError("Only one image per message is supported") + return content, [] + + def chat( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[PytorchGenerateConfig] = None, + ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + stream = generate_config.get("stream", False) if generate_config else False + content, images_chat = self._message_content_to_chat(prompt) + + msgs = [] + query_to_response: List[Dict] = [] + images_history = [] + for h in chat_history or []: + role = h["role"] + content_h, images_tmp = self._message_content_to_chat(h["content"]) + if images_tmp != []: + images_history = images_tmp + if len(query_to_response) == 0 and role == "user": + query_to_response.append({"role": "user", "content": content_h}) + if len(query_to_response) == 1 and role == "assistant": + query_to_response.append({"role": "assistant", "content": content_h}) + if len(query_to_response) == 2: + msgs.extend(query_to_response) + query_to_response = [] + image = None + if len(images_chat) > 0: + image = images_chat[0] + elif len(images_history) > 0: + image = images_history[0] + msgs.append({"role": "user", "content": content}) + + chat = self._model.chat( + image=image, + msgs=json.dumps(msgs, ensure_ascii=True), + tokenizer=self._tokenizer, + sampling=True, + **generate_config + ) + if stream: + it = self.chat_stream(chat) + return self._to_chat_completion_chunks(it) + else: + c = Completion( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=chat, finish_reason="stop", logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + return self._to_chat_completion(c) + + def chat_stream(self, chat) -> Iterator[CompletionChunk]: + completion_id = str(uuid.uuid1()) + for new_text in chat: + completion_choice = CompletionChoice( + text=new_text, index=0, logprobs=None, finish_reason=None + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk + + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk From d57eb3fdbc7e5a0b49d516986ccf8281a34a54fb Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 5 Jun 2024 14:01:38 +0800 Subject: [PATCH 118/298] FEAT: support glm4-chat & glm4-chat-1m (#1584) --- doc/source/getting_started/installation.rst | 1 + .../models/builtin/llm/glm4-chat-1m.rst | 31 +++++++ doc/source/models/builtin/llm/glm4-chat.rst | 31 +++++++ doc/source/models/builtin/llm/index.rst | 14 +++ doc/source/user_guide/backends.rst | 1 + xinference/model/llm/llm_family.json | 90 ++++++++++++++++++ .../model/llm/llm_family_modelscope.json | 92 +++++++++++++++++++ xinference/model/llm/pytorch/chatglm.py | 3 +- xinference/model/llm/vllm/core.py | 2 + 9 files changed, 264 insertions(+), 1 deletion(-) create mode 100644 doc/source/models/builtin/llm/glm4-chat-1m.rst create mode 100644 doc/source/models/builtin/llm/glm4-chat.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 0b5fc61d95..33554a4c98 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -52,6 +52,7 @@ Currently, supported models include: - ``qwen-chat`` - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` +- ``glm4-chat``, ``glm4-chat-1m`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` diff --git a/doc/source/models/builtin/llm/glm4-chat-1m.rst b/doc/source/models/builtin/llm/glm4-chat-1m.rst new file mode 100644 index 0000000000..28c823fb85 --- /dev/null +++ b/doc/source/models/builtin/llm/glm4-chat-1m.rst @@ -0,0 +1,31 @@ +.. _models_llm_glm4-chat-1m: + +======================================== +glm4-chat-1m +======================================== + +- **Context Length:** 1048576 +- **Model Name:** glm4-chat-1m +- **Languages:** en, zh +- **Abilities:** chat, tools +- **Description:** GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 9 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** THUDM/glm-4-9b-chat-1m +- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/glm-4-9b-chat-1m>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat-1m>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name glm4-chat-1m --size-in-billions 9 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/glm4-chat.rst b/doc/source/models/builtin/llm/glm4-chat.rst new file mode 100644 index 0000000000..13d8f911e8 --- /dev/null +++ b/doc/source/models/builtin/llm/glm4-chat.rst @@ -0,0 +1,31 @@ +.. _models_llm_glm4-chat: + +======================================== +glm4-chat +======================================== + +- **Context Length:** 131072 +- **Model Name:** glm4-chat +- **Languages:** en, zh +- **Abilities:** chat, tools +- **Description:** GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 9 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** THUDM/glm-4-9b-chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/glm-4-9b-chat>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name glm4-chat --size-in-billions 9 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index d7667dcdaa..f72593d811 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -176,6 +176,16 @@ The following is a list of built-in LLM in Xinference: - 16384 - A code model trained on a dataset of ~140k programming related problems and solutions generated from Glaive’s synthetic data generation platform. + * - :ref:`glm4-chat <models_llm_glm4-chat>` + - chat, tools + - 131072 + - GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI. + + * - :ref:`glm4-chat-1m <models_llm_glm4-chat-1m>` + - chat, tools + - 1048576 + - GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI. + * - :ref:`gorilla-openfunctions-v1 <models_llm_gorilla-openfunctions-v1>` - chat - 4096 @@ -575,6 +585,10 @@ The following is a list of built-in LLM in Xinference: glaive-coder + glm4-chat + + glm4-chat-1m + gorilla-openfunctions-v1 gorilla-openfunctions-v2 diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 8acb2c2311..836b524836 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -59,6 +59,7 @@ Currently, supported model includes: - ``qwen-chat`` - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` +- ``glm4-chat``, ``glm4-chat-1m`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 9bd93adade..3d8a1ad468 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -831,6 +831,96 @@ ] } }, + { + "version": 1, + "context_length": 131072, + "model_name": "glm4-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "tools" + ], + "model_description": "GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "THUDM/glm-4-9b-chat", + "model_revision": "b84dc74294ccd507a3d78bde8aebf628221af9bd" + } + ], + "prompt_style": { + "style_name": "CHATGLM3", + "system_prompt": "", + "roles": [ + "user", + "assistant" + ], + "stop_token_ids": [ + 151329, + 151336, + 151338 + ], + "stop": [ + "<|endoftext|>", + "<|user|>", + "<|observation|>" + ] + } + }, + { + "version": 1, + "context_length": 1048576, + "model_name": "glm4-chat-1m", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "tools" + ], + "model_description": "GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "THUDM/glm-4-9b-chat-1m", + "model_revision": "715ddbe91082f976ff6a4ca06d59e5bbff6c3642" + } + ], + "prompt_style": { + "style_name": "CHATGLM3", + "system_prompt": "", + "roles": [ + "user", + "assistant" + ], + "stop_token_ids": [ + 151329, + 151336, + 151338 + ], + "stop": [ + "<|endoftext|>", + "<|user|>", + "<|observation|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index a0abf94351..1d463291f1 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -522,6 +522,98 @@ ] } }, + { + "version": 1, + "context_length": 131072, + "model_name": "glm4-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "tools" + ], + "model_description": "GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "ZhipuAI/glm-4-9b-chat", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "CHATGLM3", + "system_prompt": "", + "roles": [ + "user", + "assistant" + ], + "stop_token_ids": [ + 151329, + 151336, + 151338 + ], + "stop": [ + "<|endoftext|>", + "<|user|>", + "<|observation|>" + ] + } + }, + { + "version": 1, + "context_length": 1048576, + "model_name": "glm4-chat-1m", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "tools" + ], + "model_description": "GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "ZhipuAI/glm-4-9b-chat-1m", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "CHATGLM3", + "system_prompt": "", + "roles": [ + "user", + "assistant" + ], + "stop_token_ids": [ + 151329, + 151336, + 151338 + ], + "stop": [ + "<|endoftext|>", + "<|user|>", + "<|observation|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index b8366fe888..371059726b 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -82,7 +82,8 @@ def match( ) -> bool: if llm_spec.model_format != "pytorch": return False - if "chatglm" not in llm_family.model_name: + model_family = llm_family.model_family or llm_family.model_name + if "chatglm" not in model_family or "glm4" not in model_family: return False if "chat" not in llm_family.model_ability: return False diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index e71c01da9a..e1ea0538c0 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -123,6 +123,8 @@ class VLLMGenerateConfig(TypedDict, total=False): "chatglm3", "chatglm3-32k", "chatglm3-128k", + "glm4-chat", + "glm4-chat-1m", "deepseek-chat", "deepseek-coder-instruct", ] From 29df0fd22f38bb047c056fd416fd7fed5df40648 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 5 Jun 2024 14:11:37 +0800 Subject: [PATCH 119/298] FEAT: add mistral-instruct-v0.3 (#1576) --- doc/source/getting_started/installation.rst | 2 +- doc/source/models/builtin/llm/index.rst | 7 ++ .../builtin/llm/mistral-instruct-v0.3.rst | 79 +++++++++++++++++++ doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 76 ++++++++++++++++++ xinference/model/llm/vllm/core.py | 1 + 6 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 doc/source/models/builtin/llm/mistral-instruct-v0.3.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 33554a4c98..c0650eb5a0 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -42,7 +42,7 @@ Currently, supported models include: - ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` -- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` +- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index f72593d811..8fb8d49c9c 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -286,6 +286,11 @@ The following is a list of built-in LLM in Xinference: - 8192 - The Mistral-7B-Instruct-v0.2 Large Language Model (LLM) is an improved instruct fine-tuned version of Mistral-7B-Instruct-v0.1. + * - :ref:`mistral-instruct-v0.3 <models_llm_mistral-instruct-v0.3>` + - chat + - 32768 + - The Mistral-7B-Instruct-v0.2 Large Language Model (LLM) is an improved instruct fine-tuned version of Mistral-7B-Instruct-v0.1. + * - :ref:`mistral-v0.1 <models_llm_mistral-v0.1>` - generate - 8192 @@ -629,6 +634,8 @@ The following is a list of built-in LLM in Xinference: mistral-instruct-v0.2 + mistral-instruct-v0.3 + mistral-v0.1 mixtral-8x22b-instruct-v0.1 diff --git a/doc/source/models/builtin/llm/mistral-instruct-v0.3.rst b/doc/source/models/builtin/llm/mistral-instruct-v0.3.rst new file mode 100644 index 0000000000..16e1fee81a --- /dev/null +++ b/doc/source/models/builtin/llm/mistral-instruct-v0.3.rst @@ -0,0 +1,79 @@ +.. _models_llm_mistral-instruct-v0.3: + +======================================== +mistral-instruct-v0.3 +======================================== + +- **Context Length:** 32768 +- **Model Name:** mistral-instruct-v0.3 +- **Languages:** en +- **Abilities:** chat +- **Description:** The Mistral-7B-Instruct-v0.2 Large Language Model (LLM) is an improved instruct fine-tuned version of Mistral-7B-Instruct-v0.1. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** mistralai/Mistral-7B-Instruct-v0.3 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.3 --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (gptq, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 7 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** neuralmagic/Mistral-7B-Instruct-v0.3-GPTQ-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/neuralmagic/Mistral-7B-Instruct-v0.3-GPTQ-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.3 --size-in-billions 7 --model-format gptq --quantization ${quantization} + + +Model Spec 3 (awq, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 7 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** solidrust/Mistral-7B-Instruct-v0.3-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/solidrust/Mistral-7B-Instruct-v0.3-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.3 --size-in-billions 7 --model-format awq --quantization ${quantization} + + +Model Spec 4 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_K_S, Q4_K_M, Q5_K_S, Q5_K_M, Q6_K, Q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** MaziyarPanahi/Mistral-7B-Instruct-v0.3-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/MaziyarPanahi/Mistral-7B-Instruct-v0.3-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-instruct-v0.3 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 836b524836..87d8545f28 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -49,7 +49,7 @@ Currently, supported model includes: - ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` -- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2`` +- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 3d8a1ad468..33757e7fb6 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -3341,6 +3341,82 @@ ] } }, + { + "version": 1, + "context_length": 32768, + "model_name": "mistral-instruct-v0.3", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Mistral-7B-Instruct-v0.2 Large Language Model (LLM) is an improved instruct fine-tuned version of Mistral-7B-Instruct-v0.1.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "mistralai/Mistral-7B-Instruct-v0.3", + "model_revision": "83e9aa141f2e28c82232fea5325f54edf17c43de" + }, + { + "model_format": "gptq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4" + ], + "model_id": "neuralmagic/Mistral-7B-Instruct-v0.3-GPTQ-4bit" + }, + { + "model_format": "awq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4" + ], + "model_id": "solidrust/Mistral-7B-Instruct-v0.3-AWQ" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_K_S", + "Q4_K_M", + "Q5_K_S", + "Q5_K_M", + "Q6_K", + "Q8_0", + "fp16" + ], + "model_id": "MaziyarPanahi/Mistral-7B-Instruct-v0.3-GGUF", + "model_file_name_template": "Mistral-7B-Instruct-v0.3.{quantization}.gguf" + } + ], + "prompt_style": { + "style_name": "LLAMA2", + "system_prompt": "[INST] ", + "roles": [ + "[INST]", + "[/INST]" + ], + "intra_message_sep": " ", + "inter_message_sep": "<s>", + "stop_token_ids": [ + 2 + ], + "stop": [ + "</s>" + ] + } + }, { "version": 1, "context_length": 8192, diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index e1ea0538c0..db17b54feb 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -118,6 +118,7 @@ class VLLMGenerateConfig(TypedDict, total=False): "code-llama-instruct", "mistral-instruct-v0.1", "mistral-instruct-v0.2", + "mistral-instruct-v0.3", "mixtral-instruct-v0.1", "mixtral-8x22B-instruct-v0.1", "chatglm3", From ceb24e88df1d47aa6322a4d7bd0a47ccaae17a29 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 5 Jun 2024 16:06:47 +0800 Subject: [PATCH 120/298] FEAT: add codestral-v0.1 (#1575) --- doc/source/getting_started/installation.rst | 1 + .../models/builtin/llm/codestral-v0.1.rst | 47 +++++++++++++++++++ doc/source/models/builtin/llm/index.rst | 14 ++++++ .../models/builtin/llm/internvl-chat.rst | 9 ++-- doc/source/models/builtin/llm/telechat.rst | 6 +-- doc/source/user_guide/backends.rst | 1 + xinference/model/llm/llm_family.json | 43 +++++++++++++++++ xinference/model/llm/pytorch/chatglm.py | 2 +- xinference/model/llm/pytorch/core.py | 5 ++ xinference/model/llm/vllm/core.py | 1 + 10 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 doc/source/models/builtin/llm/codestral-v0.1.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index c0650eb5a0..e1c07fd7e7 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -43,6 +43,7 @@ Currently, supported models include: - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3`` +- ``codestral-v0.1`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` diff --git a/doc/source/models/builtin/llm/codestral-v0.1.rst b/doc/source/models/builtin/llm/codestral-v0.1.rst new file mode 100644 index 0000000000..54d56517a4 --- /dev/null +++ b/doc/source/models/builtin/llm/codestral-v0.1.rst @@ -0,0 +1,47 @@ +.. _models_llm_codestral-v0.1: + +======================================== +codestral-v0.1 +======================================== + +- **Context Length:** 32768 +- **Model Name:** codestral-v0.1 +- **Languages:** en +- **Abilities:** generate +- **Description:** Codestrall-22B-v0.1 is trained on a diverse dataset of 80+ programming languages, including the most popular ones, such as Python, Java, C, C++, JavaScript, and Bash + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 22 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 22 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** mistralai/Mistral-7B-Instruct-v0.2 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name codestral-v0.1 --size-in-billions 22 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (ggufv2, 22 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 22 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_K_S, Q4_K_M, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp +- **Model ID:** bartowski/Codestral-22B-v0.1-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/bartowski/Codestral-22B-v0.1-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name codestral-v0.1 --size-in-billions 22 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 8fb8d49c9c..e95112c0ad 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -126,6 +126,11 @@ The following is a list of built-in LLM in Xinference: - 8194 - CodeShell is a multi-language code LLM developed by the Knowledge Computing Lab of Peking University. + * - :ref:`codestral-v0.1 <models_llm_codestral-v0.1>` + - generate + - 32768 + - Codestrall-22B-v0.1 is trained on a diverse dataset of 80+ programming languages, including the most popular ones, such as Python, Java, C, C++, JavaScript, and Bash + * - :ref:`cogvlm2 <models_llm_cogvlm2>` - chat, vision - 8192 @@ -276,6 +281,11 @@ The following is a list of built-in LLM in Xinference: - 4096 - MiniCPM is an End-Size LLM developed by ModelBest Inc. and TsinghuaNLP, with only 2.4B parameters excluding embeddings. + * - :ref:`minicpm-llama3-v-2_5 <models_llm_minicpm-llama3-v-2_5>` + - chat, vision + - 2048 + - MiniCPM-Llama3-V 2.5 is the latest model in the MiniCPM-V series. The model is built on SigLip-400M and Llama3-8B-Instruct with a total of 8B parameters. + * - :ref:`mistral-instruct-v0.1 <models_llm_mistral-instruct-v0.1>` - chat - 8192 @@ -570,6 +580,8 @@ The following is a list of built-in LLM in Xinference: codeshell-chat + codestral-v0.1 + cogvlm2 deepseek @@ -630,6 +642,8 @@ The following is a list of built-in LLM in Xinference: minicpm-2b-sft-fp32 + minicpm-llama3-v-2_5 + mistral-instruct-v0.1 mistral-instruct-v0.2 diff --git a/doc/source/models/builtin/llm/internvl-chat.rst b/doc/source/models/builtin/llm/internvl-chat.rst index ad0421a8e4..18dd2e9bf2 100644 --- a/doc/source/models/builtin/llm/internvl-chat.rst +++ b/doc/source/models/builtin/llm/internvl-chat.rst @@ -20,13 +20,14 @@ Model Spec 1 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** OpenGVLab/Mini-InternVL-Chat-2B-V1-5 - **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/Mini-InternVL-Chat-2B-V1-5>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name internvl-chat --size-in-billions 2 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internvl-chat --size-in-billions 2 --model-format pytorch --quantization ${quantization} Model Spec 2 (pytorch, 26 Billion) @@ -35,13 +36,14 @@ Model Spec 2 (pytorch, 26 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 26 - **Quantizations:** none +- **Engines**: Transformers - **Model ID:** OpenGVLab/InternVL-Chat-V1-5 - **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name internvl-chat --size-in-billions 26 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internvl-chat --size-in-billions 26 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 26 Billion) @@ -50,11 +52,12 @@ Model Spec 3 (pytorch, 26 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 26 - **Quantizations:** Int8 +- **Engines**: Transformers - **Model ID:** OpenGVLab/InternVL-Chat-V1-5-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5-{quantization}>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-name internvl-chat --size-in-billions 26 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internvl-chat --size-in-billions 26 --model-format pytorch --quantization ${quantization} diff --git a/doc/source/models/builtin/llm/telechat.rst b/doc/source/models/builtin/llm/telechat.rst index a856b8be81..e3361b059b 100644 --- a/doc/source/models/builtin/llm/telechat.rst +++ b/doc/source/models/builtin/llm/telechat.rst @@ -54,7 +54,7 @@ Model Spec 3 (pytorch, 12 Billion) - **Quantizations:** 4-bit, 8-bit, none - **Engines**: Transformers - **Model ID:** Tele-AI/TeleChat-12B -- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/TeleChat-12B>`__, `ModelScope <https://modelscope.cn/models/Tele-AI/TeleChat-12B>`__ +- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/TeleChat-12B>`__, `ModelScope <https://modelscope.cn/models/TeleAI/TeleChat-12B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: @@ -70,7 +70,7 @@ Model Spec 4 (gptq, 12 Billion) - **Quantizations:** int4, int8 - **Engines**: Transformers - **Model ID:** Tele-AI/TeleChat-12B-{quantization} -- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/TeleChat-12B-{quantization}>`__, `ModelScope <https://modelscope.cn/models/Tele-AI/TeleChat-12B-{quantization}>`__ +- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/TeleChat-12B-{quantization}>`__, `ModelScope <https://modelscope.cn/models/TeleAI/TeleChat-12B-{quantization}>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: @@ -86,7 +86,7 @@ Model Spec 5 (pytorch, 52 Billion) - **Quantizations:** 4-bit, 8-bit, none - **Engines**: Transformers - **Model ID:** Tele-AI/TeleChat-52B -- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/TeleChat-52B>`__, `ModelScope <https://modelscope.cn/models/Tele-AI/TeleChat-52B>`__ +- **Model Hubs**: `Hugging Face <https://huggingface.co/Tele-AI/TeleChat-52B>`__, `ModelScope <https://modelscope.cn/models/TeleAI/TeleChat-52B>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 87d8545f28..e319ff51f2 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -50,6 +50,7 @@ Currently, supported model includes: - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3`` +- ``codestral-v0.1`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 33757e7fb6..90327d9139 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -3417,6 +3417,49 @@ ] } }, + { + "version": 1, + "context_length": 32768, + "model_name": "codestral-v0.1", + "model_lang": [ + "en" + ], + "model_ability": [ + "generate" + ], + "model_description": "Codestrall-22B-v0.1 is trained on a diverse dataset of 80+ programming languages, including the most popular ones, such as Python, Java, C, C++, JavaScript, and Bash", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 22, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "mistralai/Mistral-7B-Instruct-v0.2", + "model_revision": "9552e7b1d9b2d5bbd87a5aa7221817285dbb6366" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 22, + "quantizations": [ + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_K_S", + "Q4_K_M", + "Q5_K_S", + "Q5_K_M", + "Q6_K", + "Q8_0" + ], + "model_id": "bartowski/Codestral-22B-v0.1-GGUF", + "model_file_name_template": "Codestral-22B-v0.1-{quantization}.gguf" + } + ] + }, { "version": 1, "context_length": 8192, diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index 371059726b..c916e3a8c3 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -83,7 +83,7 @@ def match( if llm_spec.model_format != "pytorch": return False model_family = llm_family.model_family or llm_family.model_name - if "chatglm" not in model_family or "glm4" not in model_family: + if "chatglm" not in model_family and "glm4" not in model_family: return False if "chat" not in llm_family.model_ability: return False diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 30ed8c8497..ec2bcd8eb9 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -53,6 +53,11 @@ "chatglm2", "chatglm2-32k", "chatglm2-128k", + "chatglm3", + "chatglm3-32k", + "chatglm3-128k", + "glm4-chat", + "glm4-chat-1m", "llama-2", "llama-2-chat", "internlm2-chat", diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index db17b54feb..b0ec9d7f61 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -93,6 +93,7 @@ class VLLMGenerateConfig(TypedDict, total=False): "baichuan", "internlm-16k", "mistral-v0.1", + "codestral-v0.1", "Yi", "Yi-1.5", "code-llama", From 8808a7f05a10191cef70865825a6129286a5b189 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 5 Jun 2024 16:09:44 +0800 Subject: [PATCH 121/298] DOC: added new models in README (#1585) --- README.md | 8 +- README_zh_CN.md | 8 +- .../models/model_abilities/vision.po | 20 +-- .../zh_CN/LC_MESSAGES/reference/index.po | 125 ++++++++++-------- .../zh_CN/LC_MESSAGES/user_guide/backends.po | 33 ++--- .../builtin/llm/minicpm-llama3-v-2_5.rst | 47 +++++++ doc/source/models/model_abilities/vision.rst | 1 + 7 files changed, 155 insertions(+), 87 deletions(-) create mode 100644 doc/source/models/builtin/llm/minicpm-llama3-v-2_5.rst diff --git a/README.md b/README.md index e6a4badf3e..0af2e7f0bc 100644 --- a/README.md +++ b/README.md @@ -34,12 +34,12 @@ potential of cutting-edge AI models. - Docker image: [#855](https://github.com/xorbitsai/inference/pull/855) - Support multimodal: [#829](https://github.com/xorbitsai/inference/pull/829) ### New Models +- Built-in support for [GLM-4](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) +- Built-in support for [Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3): [#1576](https://github.com/xorbitsai/inference/pull/1576) +- Built-in support for [Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1): [#1575](https://github.com/xorbitsai/inference/pull/1575) +- Built-in support for [MiniCPM-Llama3-V 2.5](https://github.com/OpenBMB/MiniCPM-V): [#1577](https://github.com/xorbitsai/inference/pull/1577) - Built-in support for [CogVLM2](https://github.com/THUDM/CogVLM2): [#1551](https://github.com/xorbitsai/inference/pull/1551) - Built-in support for [InternVL-Chat-V1-5](https://github.com/OpenGVLab/InternVL): [#1536](https://github.com/xorbitsai/inference/pull/1536) -- Built-in support for [Yi-1.5](https://github.com/01-ai/Yi-1.5): [#1489](https://github.com/xorbitsai/inference/pull/1489) -- Built-in support for [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) -- Built-in support for [Qwen1.5 110B](https://huggingface.co/Qwen/Qwen1.5-110B-Chat): [#1388](https://github.com/xorbitsai/inference/pull/1388) -- Built-in support for [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) ### Integrations - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. diff --git a/README_zh_CN.md b/README_zh_CN.md index afc23df8f6..df112383e8 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -31,12 +31,12 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - Docker 镜像支持: [#855](https://github.com/xorbitsai/inference/pull/855) - 支持多模态模型:[#829](https://github.com/xorbitsai/inference/pull/829) ### 新模型 +- 内置 [GLM-4](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) +- 内置 [Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3): [#1576](https://github.com/xorbitsai/inference/pull/1576) +- 内置 [Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1): [#1575](https://github.com/xorbitsai/inference/pull/1575) +- 内置 [MiniCPM-Llama3-V 2.5](https://github.com/OpenBMB/MiniCPM-V): [#1577](https://github.com/xorbitsai/inference/pull/1577) - 内置 [CogVLM2](https://github.com/THUDM/CogVLM2): [#1551](https://github.com/xorbitsai/inference/pull/1551) - 内置 [InternVL-Chat-V1-5](https://github.com/OpenGVLab/InternVL): [#1536](https://github.com/xorbitsai/inference/pull/1536) -- 内置 [Yi-1.5](https://github.com/01-ai/Yi-1.5): [#1489](https://github.com/xorbitsai/inference/pull/1489) -- 内置 [Llama 3](https://github.com/meta-llama/llama3): [#1332](https://github.com/xorbitsai/inference/pull/1332) -- 内置 [Qwen1.5 110B](https://huggingface.co/Qwen/Qwen1.5-110B-Chat): [#1388](https://github.com/xorbitsai/inference/pull/1388) -- 内置 [Mixtral-8x22B-instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1): [#1340](https://github.com/xorbitsai/inference/pull/1340) ### 集成 - [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po index 6839a693c6..e191fc7320 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-31 11:46+0800\n" +"POT-Creation-Date: 2024-06-05 12:48+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -75,11 +75,15 @@ msgstr "" msgid ":ref:`cogvlm2 <models_llm_cogvlm2>`" msgstr "" -#: ../../source/models/model_abilities/vision.rst:32 +#: ../../source/models/model_abilities/vision.rst:29 +msgid ":ref:`MiniCPM-Llama3-V 2.5 <models_llm_minicpm-llama3-v-2_5>`" +msgstr "" + +#: ../../source/models/model_abilities/vision.rst:33 msgid "Quickstart" msgstr "快速入门" -#: ../../source/models/model_abilities/vision.rst:34 +#: ../../source/models/model_abilities/vision.rst:35 msgid "" "Images are made available to the model in two main ways: by passing a " "link to the image or by passing the base64 encoded image directly in the " @@ -88,23 +92,23 @@ msgstr "" "模型可以通过两种主要方式获取图像:通过传递图像的链接或直接在请求中传递 " "base64 编码的图像。" -#: ../../source/models/model_abilities/vision.rst:38 +#: ../../source/models/model_abilities/vision.rst:39 msgid "Example using OpenAI Client" msgstr "使用 OpenAI 客户端的示例" -#: ../../source/models/model_abilities/vision.rst:69 +#: ../../source/models/model_abilities/vision.rst:70 msgid "Uploading base 64 encoded images" msgstr "上传 Base64 编码的图片" -#: ../../source/models/model_abilities/vision.rst:111 +#: ../../source/models/model_abilities/vision.rst:112 msgid "You can find more examples of ``vision`` ability in the tutorial notebook:" msgstr "你可以在教程笔记本中找到更多关于 ``vision`` 能力的示例。" -#: ../../source/models/model_abilities/vision.rst:115 +#: ../../source/models/model_abilities/vision.rst:116 msgid "Qwen VL Chat" msgstr "" -#: ../../source/models/model_abilities/vision.rst:118 +#: ../../source/models/model_abilities/vision.rst:119 msgid "Learn vision ability from a example using qwen-vl-chat" msgstr "通过使用 qwen-vl-chat 的示例来学习使用 LLM 的视觉能力" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po b/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po index c6c77e6dd2..d5ff12e4bc 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-27 15:43+0800\n" +"POT-Creation-Date: 2024-03-11 13:33+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/reference/index.rst:5 msgid "API Reference" @@ -127,170 +127,183 @@ msgstr "" msgid "ChatglmCppChatModelHandle" msgstr "" -#: ../../source/reference/index.rst:40:<autosummary>:1 +#: ../../source/reference/index.rst:39:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatglmCppChatModelHandle " "<xinference.client.handlers.ChatglmCppChatModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:40:<autosummary>:1 +#: ../../source/reference/index.rst:39:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulChatglmCppChatModelHandle`" msgstr "" -#: ../../source/reference/index.rst:40:<autosummary>:1 +#: ../../source/reference/index.rst:39:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatglmCppChatModelHandle.chat " "<xinference.client.handlers.ChatglmCppChatModelHandle.chat>`\\ " "\\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:40:<autosummary>:1 +#: ../../source/reference/index.rst:39:<autosummary>:1 msgid "" "Given a list of messages comprising a conversation, the ChatGLM model " "will return a response via RESTful APIs." msgstr "" -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatglmCppChatModelHandle.create_embedding" -" " -"<xinference.client.handlers.ChatglmCppChatModelHandle.create_embedding>`\\" -" \\(input\\)" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -#: ../../source/reference/index.rst:52:<autosummary>:1 -#: ../../source/reference/index.rst:62:<autosummary>:1 -#: ../../source/reference/index.rst:73:<autosummary>:1 -msgid "Create an Embedding from user input via RESTful APIs." -msgstr "" - -#: ../../source/reference/index.rst:42 +#: ../../source/reference/index.rst:41 msgid "ChatModelHandle" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatModelHandle " "<xinference.client.handlers.ChatModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulChatModelHandle`" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatModelHandle.chat " "<xinference.client.handlers.ChatModelHandle.chat>`\\ \\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" "Given a list of messages comprising a conversation, the model will return" " a response via RESTful APIs." msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatModelHandle.create_embedding " -"<xinference.client.handlers.ChatModelHandle.create_embedding>`\\ " -"\\(input\\)" -msgstr "" - -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatModelHandle.generate " "<xinference.client.handlers.ChatModelHandle.generate>`\\ \\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 -#: ../../source/reference/index.rst:73:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" "Creates a completion for the provided prompt and parameters via RESTful " "APIs." msgstr "" -#: ../../source/reference/index.rst:54 +#: ../../source/reference/index.rst:52 msgid "EmbeddingModelHandle" msgstr "" -#: ../../source/reference/index.rst:62:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.EmbeddingModelHandle " "<xinference.client.handlers.EmbeddingModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:62:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulEmbeddingModelHandle`" msgstr "" -#: ../../source/reference/index.rst:62:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.EmbeddingModelHandle.create_embedding" " <xinference.client.handlers.EmbeddingModelHandle.create_embedding>`\\ " "\\(input\\)" msgstr "" -#: ../../source/reference/index.rst:64 +#: ../../source/reference/index.rst:60:<autosummary>:1 +msgid "Create an Embedding from user input via RESTful APIs." +msgstr "" + +#: ../../source/reference/index.rst:62 msgid "GenerateModelHandle" msgstr "" -#: ../../source/reference/index.rst:73:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.GenerateModelHandle " "<xinference.client.handlers.GenerateModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:73:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulGenerateModelHandle`" msgstr "" -#: ../../source/reference/index.rst:73:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.GenerateModelHandle.create_embedding " -"<xinference.client.handlers.GenerateModelHandle.create_embedding>`\\ " -"\\(input\\)" -msgstr "" - -#: ../../source/reference/index.rst:73:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.GenerateModelHandle.generate " "<xinference.client.handlers.GenerateModelHandle.generate>`\\ \\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:75 +#: ../../source/reference/index.rst:72 msgid "ImageModelHandle" msgstr "" -#: ../../source/reference/index.rst:81:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ImageModelHandle " "<xinference.client.handlers.ImageModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:81:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulImageModelHandle`" msgstr "" -#: ../../source/reference/index.rst:81:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ImageModelHandle.text_to_image " "<xinference.client.handlers.ImageModelHandle.text_to_image>`\\ " "\\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:81:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "Creates an image by the input text." msgstr "" +#: ../../source/reference/index.rst:82 +msgid "AudioModelHandle" +msgstr "" + +#: ../../source/reference/index.rst:89:<autosummary>:1 +msgid "" +":py:obj:`xinference.client.handlers.AudioModelHandle " +"<xinference.client.handlers.AudioModelHandle>`\\" +msgstr "" + +#: ../../source/reference/index.rst:89:<autosummary>:1 +msgid "" +"alias of " +":py:class:`~xinference.client.restful.restful_client.RESTfulAudioModelHandle`" +msgstr "" + +#: ../../source/reference/index.rst:89:<autosummary>:1 +msgid "" +":py:obj:`xinference.client.handlers.AudioModelHandle.transcriptions " +"<xinference.client.handlers.AudioModelHandle.transcriptions>`\\ " +"\\(audio\\)" +msgstr "" + +#: ../../source/reference/index.rst:89:<autosummary>:1 +msgid "Transcribes audio into the input language." +msgstr "" + +#: ../../source/reference/index.rst:89:<autosummary>:1 +msgid "" +":py:obj:`xinference.client.handlers.AudioModelHandle.translations " +"<xinference.client.handlers.AudioModelHandle.translations>`\\ \\(audio\\)" +msgstr "" + +#: ../../source/reference/index.rst:89:<autosummary>:1 +msgid "Translates audio into English." +msgstr "" + + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po index 585d2a8831..481deefd57 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-11 10:26+0800\n" +"POT-Creation-Date: 2024-05-31 11:46+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.11.0\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/user_guide/backends.rst:5 msgid "Backends" @@ -157,7 +157,7 @@ msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" msgstr "" #: ../../source/user_guide/backends.rst:53 -msgid "``Yi``, ``Yi-chat``" +msgid "``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k``" msgstr "" #: ../../source/user_guide/backends.rst:54 @@ -165,31 +165,33 @@ msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" msgstr "" #: ../../source/user_guide/backends.rst:55 -msgid "``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit``" +msgid "" +"``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-" +"instruct``" msgstr "" #: ../../source/user_guide/backends.rst:56 -msgid "``vicuna-v1.3``, ``vicuna-v1.5``" +msgid "``codeqwen1.5``, ``codeqwen1.5-chat``" msgstr "" #: ../../source/user_guide/backends.rst:57 -msgid "``internlm2-chat``" +msgid "``vicuna-v1.3``, ``vicuna-v1.5``" msgstr "" #: ../../source/user_guide/backends.rst:58 -msgid "``qwen-chat``" +msgid "``internlm2-chat``" msgstr "" #: ../../source/user_guide/backends.rst:59 -msgid "``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1``" +msgid "``qwen-chat``" msgstr "" #: ../../source/user_guide/backends.rst:60 -msgid "``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k``" +msgid "``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1``" msgstr "" #: ../../source/user_guide/backends.rst:61 -msgid "``deepseek-chat``, ``deepseek-coder-instruct``" +msgid "``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k``" msgstr "" #: ../../source/user_guide/backends.rst:62 @@ -197,15 +199,15 @@ msgid "``qwen1.5-chat``, ``qwen1.5-moe-chat``" msgstr "" #: ../../source/user_guide/backends.rst:63 -msgid "``codeqwen1.5-chat``" +msgid "``gemma-it``" msgstr "" #: ../../source/user_guide/backends.rst:64 -msgid "``gemma-it``" +msgid "``orion-chat``, ``orion-chat-rag``" msgstr "" #: ../../source/user_guide/backends.rst:65 -msgid "``orion-chat``, ``orion-chat-rag``" +msgid "``c4ai-command-r-v01``" msgstr "" #: ../../source/user_guide/backends.rst:69 @@ -220,6 +222,7 @@ msgid "" "multiple calls. And it also supports other common techniques like " "continuous batching and tensor parallelism." msgstr "" -"`SGLang <https://github.com/sgl-project/sglang>`_ 具有基于 RadixAttention 的高性能推理运行时。它通过在多个调用之间自动重用KV缓存,显著加速了复杂 LLM 程序的执行。" -"它还支持其他常见推理技术,如连续批处理和张量并行处理。" +"`SGLang <https://github.com/sgl-project/sglang>`_ 具有基于 RadixAttention" +" 的高性能推理运行时。它通过在多个调用之间自动重用KV缓存,显著加速了复杂 " +"LLM 程序的执行。它还支持其他常见推理技术,如连续批处理和张量并行处理。" diff --git a/doc/source/models/builtin/llm/minicpm-llama3-v-2_5.rst b/doc/source/models/builtin/llm/minicpm-llama3-v-2_5.rst new file mode 100644 index 0000000000..1d3ff9db78 --- /dev/null +++ b/doc/source/models/builtin/llm/minicpm-llama3-v-2_5.rst @@ -0,0 +1,47 @@ +.. _models_llm_minicpm-llama3-v-2_5: + +======================================== +MiniCPM-Llama3-V-2_5 +======================================== + +- **Context Length:** 2048 +- **Model Name:** MiniCPM-Llama3-V-2_5 +- **Languages:** en, zh +- **Abilities:** chat, vision +- **Description:** MiniCPM-Llama3-V 2.5 is the latest model in the MiniCPM-V series. The model is built on SigLip-400M and Llama3-8B-Instruct with a total of 8B parameters. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** none +- **Engines**: Transformers +- **Model ID:** openbmb/MiniCPM-Llama3-V-2_5 +- **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-Llama3-V-2_5>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/MiniCPM-Llama3-V-2_5-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name MiniCPM-Llama3-V-2_5 --size-in-billions 8 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** int4 +- **Engines**: Transformers +- **Model ID:** openbmb/MiniCPM-Llama3-V-2_5-{quantization} +- **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-Llama3-V-2_5-{quantization}>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/MiniCPM-Llama3-V-2_5-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name MiniCPM-Llama3-V-2_5 --size-in-billions 8 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/model_abilities/vision.rst b/doc/source/models/model_abilities/vision.rst index 7e2e8a05db..7ffb92fc4b 100644 --- a/doc/source/models/model_abilities/vision.rst +++ b/doc/source/models/model_abilities/vision.rst @@ -26,6 +26,7 @@ The ``vision`` ability is supported with the following models in Xinference: * :ref:`omnilmm <models_llm_omnilmm>` * :ref:`internvl-chat <models_llm_internvl-chat>` * :ref:`cogvlm2 <models_llm_cogvlm2>` +* :ref:`MiniCPM-Llama3-V 2.5 <models_llm_minicpm-llama3-v-2_5>` Quickstart From dad97d4ba9cfa580bc10bbf7660906631c19527c Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Thu, 6 Jun 2024 05:10:50 +0200 Subject: [PATCH 122/298] FEAT: Support ChatTTS (#1578) --- .github/workflows/python.yaml | 13 +- doc/source/models/builtin/audio/chattts.rst | 19 ++ doc/source/models/builtin/audio/index.rst | 2 + doc/templates/audio.rst.jinja | 2 +- pyproject.toml | 5 +- setup.cfg | 15 + xinference/api/restful_api.py | 50 ++++ xinference/client/restful/restful_client.py | 31 ++ xinference/core/model.py | 19 ++ xinference/model/audio/chattts.py | 84 ++++++ xinference/model/audio/core.py | 13 +- xinference/model/audio/model_spec.json | 20 ++ xinference/model/audio/tests/test_chattts.py | 44 +++ xinference/thirdparty/ChatTTS/__init__.py | 1 + xinference/thirdparty/ChatTTS/core.py | 200 +++++++++++++ .../thirdparty/ChatTTS/experimental/llm.py | 40 +++ xinference/thirdparty/ChatTTS/infer/api.py | 125 +++++++++ xinference/thirdparty/ChatTTS/model/dvae.py | 155 ++++++++++ xinference/thirdparty/ChatTTS/model/gpt.py | 265 ++++++++++++++++++ .../thirdparty/ChatTTS/utils/gpu_utils.py | 23 ++ .../thirdparty/ChatTTS/utils/infer_utils.py | 141 ++++++++++ .../thirdparty/ChatTTS/utils/io_utils.py | 14 + 22 files changed, 1275 insertions(+), 6 deletions(-) create mode 100644 doc/source/models/builtin/audio/chattts.rst create mode 100644 xinference/model/audio/chattts.py create mode 100644 xinference/model/audio/tests/test_chattts.py create mode 100644 xinference/thirdparty/ChatTTS/__init__.py create mode 100644 xinference/thirdparty/ChatTTS/core.py create mode 100644 xinference/thirdparty/ChatTTS/experimental/llm.py create mode 100644 xinference/thirdparty/ChatTTS/infer/api.py create mode 100644 xinference/thirdparty/ChatTTS/model/dvae.py create mode 100644 xinference/thirdparty/ChatTTS/model/gpt.py create mode 100644 xinference/thirdparty/ChatTTS/utils/gpu_utils.py create mode 100644 xinference/thirdparty/ChatTTS/utils/infer_utils.py create mode 100644 xinference/thirdparty/ChatTTS/utils/io_utils.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 6380c9457a..e32484c462 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -143,18 +143,29 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pip install -U "aioprometheus[starlette]" ${{ env.SELF_HOST_PYTHON }} -m pip install -U "pynvml" ${{ env.SELF_HOST_PYTHON }} -m pip install -U "transformers" + ${{ env.SELF_HOST_PYTHON }} -m conda install -c conda-forge pynini=2.1.5 + ${{ env.SELF_HOST_PYTHON }} -m pip install -U nemo_text_processing + ${{ env.SELF_HOST_PYTHON }} -m pip install -U omegaconf~=2.3.0 + ${{ env.SELF_HOST_PYTHON }} -m pip install -U vector_quantize_pytorch + ${{ env.SELF_HOST_PYTHON }} -m pip install -U vocos + ${{ env.SELF_HOST_PYTHON }} -m pip install -U WeTextProcessing + ${{ env.SELF_HOST_PYTHON }} -m pip install -U librosa + ${{ env.SELF_HOST_PYTHON }} -m pip install -U xxhash ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/image/tests/test_stable_diffusion.py ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_whisper.py + ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ + -W ignore::PendingDeprecationWarning \ + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_chattts.py else pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/client/tests/test_client.py pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ - --cov-config=setup.cfg --cov-report=xml --cov=xinference --ignore xinference/client/tests/test_client.py --ignore xinference/model/image/tests/test_stable_diffusion.py --ignore xinference/model/audio/tests/test_whisper.py xinference + --cov-config=setup.cfg --cov-report=xml --cov=xinference --ignore xinference/client/tests/test_client.py --ignore xinference/model/image/tests/test_stable_diffusion.py --ignore xinference/model/audio/tests/test_whisper.py --ignore xinference/model/audio/tests/test_chattts.py xinference fi working-directory: . diff --git a/doc/source/models/builtin/audio/chattts.rst b/doc/source/models/builtin/audio/chattts.rst new file mode 100644 index 0000000000..2ce0b89795 --- /dev/null +++ b/doc/source/models/builtin/audio/chattts.rst @@ -0,0 +1,19 @@ +.. _models_builtin_chattts: + +======= +ChatTTS +======= + +- **Model Name:** ChatTTS +- **Model Family:** ChatTTS +- **Abilities:** text-to-audio +- **Multilingual:** True + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** 2Noise/ChatTTS + +Execute the following command to launch the model:: + + xinference launch --model-name ChatTTS --model-type audio \ No newline at end of file diff --git a/doc/source/models/builtin/audio/index.rst b/doc/source/models/builtin/audio/index.rst index 726a634147..5e98b13c21 100644 --- a/doc/source/models/builtin/audio/index.rst +++ b/doc/source/models/builtin/audio/index.rst @@ -17,6 +17,8 @@ The following is a list of built-in audio models in Xinference: belle-whisper-large-v3-zh + chattts + whisper-base whisper-base.en diff --git a/doc/templates/audio.rst.jinja b/doc/templates/audio.rst.jinja index 9aab97a830..08aafad5eb 100644 --- a/doc/templates/audio.rst.jinja +++ b/doc/templates/audio.rst.jinja @@ -6,7 +6,7 @@ - **Model Name:** {{ model_name }} - **Model Family:** {{ model_family }} -- **Abilities:** audio-to-text +- **Abilities:** {{ ability }} - **Multilingual:** {{ multilingual }} Specifications diff --git a/pyproject.toml b/pyproject.toml index c39057d845..72e171146d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,10 @@ build-backend = "setuptools.build_meta" [tool.black] include = '\.pyi?$' extend-exclude = ''' -^/xinference/(_version.py) +/( +| ^/xinference/(_version.py) +| thirdparty +)/ ''' [tool.pytest.ini_options] diff --git a/setup.cfg b/setup.cfg index aec7b6dd0b..62229386d6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -107,6 +107,13 @@ all = timm>=0.9.16 # For deepseek VL torchvision # For deepseek VL FlagEmbedding # For rerank + omegaconf~=2.3.0 # For ChatTTS + vector_quantize_pytorch # For ChatTTS + vocos # For ChatTTS + nemo_text_processing # For ChatTTS + WeTextProcessing # For ChatTTS + librosa # For ChatTTS + xxhash # For ChatTTS intel = torch==2.1.0a0 intel_extension_for_pytorch==2.1.10+xpu @@ -141,6 +148,14 @@ rerank = image = diffusers controlnet_aux +audio = + omegaconf~=2.3.0 + vector_quantize_pytorch + vocos + nemo_text_processing + WeTextProcessing + librosa + xxhash doc = ipython>=6.5.0 sphinx>=3.0.0 diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index df080d54c6..637c7f2c7b 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -122,6 +122,14 @@ class TextToImageRequest(BaseModel): user: Optional[str] = None +class SpeechRequest(BaseModel): + model: str + input: str + voice: Optional[str] + response_format: Optional[str] = "mp3" + speed: Optional[float] = 1.0 + + class RegisterModelRequest(BaseModel): model: str persist: bool @@ -418,6 +426,16 @@ def serve(self, logging_conf: Optional[dict] = None): else None ), ) + self._router.add_api_route( + "/v1/audio/speech", + self.create_speech, + methods=["POST"], + dependencies=( + [Security(self._auth_service, scopes=["models:read"])] + if self.is_authenticated() + else None + ), + ) self._router.add_api_route( "/v1/images/generations", self.create_images, @@ -1179,6 +1197,38 @@ async def create_translations( await self._report_error_event(model_uid, str(e)) raise HTTPException(status_code=500, detail=str(e)) + async def create_speech(self, request: Request) -> Response: + body = SpeechRequest.parse_obj(await request.json()) + model_uid = body.model + try: + model = await (await self._get_supervisor_ref()).get_model(model_uid) + except ValueError as ve: + logger.error(str(ve), exc_info=True) + await self._report_error_event(model_uid, str(ve)) + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + logger.error(e, exc_info=True) + await self._report_error_event(model_uid, str(e)) + raise HTTPException(status_code=500, detail=str(e)) + + try: + out = await model.speech( + input=body.input, + voice=body.voice, + response_format=body.response_format, + speed=body.speed, + ) + return Response(media_type="application/octet-stream", content=out) + except RuntimeError as re: + logger.error(re, exc_info=True) + await self._report_error_event(model_uid, str(re)) + self.handle_request_limit_error(re) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + await self._report_error_event(model_uid, str(e)) + raise HTTPException(status_code=500, detail=str(e)) + async def create_images(self, request: Request) -> Response: body = TextToImageRequest.parse_obj(await request.json()) model_uid = body.model diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index cb64a77ffa..44f35fa43b 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -684,6 +684,37 @@ def translations( response_data = response.json() return response_data + def speech( + self, + input: str, + voice: str = "", + response_format: str = "mp3", + speed: float = 1.0, + ): + """Generates audio from the input text. + + :param input: The text to generate audio for. The maximum length is 4096 characters. + :param voice: The voice to use when generating the audio. + :param response_format: The format to audio in. + :param speed: The speed of the generated audio. + :return: The generated audio binary. + """ + url = f"{self._base_url}/v1/audio/speech" + params = { + "model": self._model_uid, + "input": input, + "voice": voice, + "response_format": response_format, + "speed": speed, + } + response = requests.post(url, json=params, headers=self.auth_headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to speech the text, detail: {_get_error_string(response)}" + ) + + return response.content + class Client: def __init__(self, base_url, api_key: Optional[str] = None): diff --git a/xinference/core/model.py b/xinference/core/model.py index f8734a8ba7..228187ec04 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -343,6 +343,8 @@ async def _call_wrapper(self, fn: Callable, *args, **kwargs): gen = self._to_json_async_gen(ret) self._current_generator = weakref.ref(gen) return gen + if isinstance(ret, bytes): + return ret return await asyncio.to_thread(json_dumps, ret) @log_async(logger=logger) @@ -482,6 +484,23 @@ async def translations( f"Model {self._model.model_spec} is not for creating translations." ) + @log_async(logger=logger) + @request_limit + async def speech( + self, input: str, voice: str, response_format: str = "mp3", speed: float = 1.0 + ): + if hasattr(self._model, "speech"): + return await self._call_wrapper( + self._model.speech, + input, + voice, + response_format, + speed, + ) + raise AttributeError( + f"Model {self._model.model_spec} is not for creating speech." + ) + @log_async(logger=logger) @request_limit async def text_to_image( diff --git a/xinference/model/audio/chattts.py b/xinference/model/audio/chattts.py new file mode 100644 index 0000000000..be9d17605e --- /dev/null +++ b/xinference/model/audio/chattts.py @@ -0,0 +1,84 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging +from io import BytesIO +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + from .core import AudioModelFamilyV1 + +logger = logging.getLogger(__name__) + + +class ChatTTSModel: + def __init__( + self, + model_uid: str, + model_path: str, + model_spec: "AudioModelFamilyV1", + device: Optional[str] = None, + **kwargs, + ): + self._model_uid = model_uid + self._model_path = model_path + self._model_spec = model_spec + self._device = device + self._model = None + self._kwargs = kwargs + + def load(self): + import torch + + from xinference.thirdparty import ChatTTS + + torch._dynamo.config.cache_size_limit = 64 + torch._dynamo.config.suppress_errors = True + torch.set_float32_matmul_precision("high") + self._model = ChatTTS.Chat() + self._model.load_models( + source="local", local_path=self._model_path, compile=True + ) + + def speech( + self, input: str, voice: str, response_format: str = "mp3", speed: float = 1.0 + ): + import numpy as np + import torch + import torchaudio + import xxhash + + seed = xxhash.xxh32_intdigest(voice) + + torch.manual_seed(seed) + np.random.seed(seed) + torch.cuda.manual_seed(seed) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + assert self._model is not None + rnd_spk_emb = self._model.sample_random_speaker() + + default = 5 + infer_speed = int(default * speed) + params_infer_code = {"spk_emb": rnd_spk_emb, "prompt": f"[speed_{infer_speed}]"} + + assert self._model is not None + wavs = self._model.infer([input], params_infer_code=params_infer_code) + + # Save the generated audio + with BytesIO() as out: + torchaudio.save( + out, torch.from_numpy(wavs[0]), 24000, format=response_format + ) + return out.getvalue() diff --git a/xinference/model/audio/core.py b/xinference/model/audio/core.py index 20b3ff7d36..05f16b50b3 100644 --- a/xinference/model/audio/core.py +++ b/xinference/model/audio/core.py @@ -14,11 +14,12 @@ import logging import os from collections import defaultdict -from typing import Dict, List, Optional, Tuple +from typing import Dict, List, Optional, Tuple, Union from ...constants import XINFERENCE_CACHE_DIR from ..core import CacheableModelSpec, ModelDescription from ..utils import valid_model_revision +from .chattts import ChatTTSModel from .whisper import WhisperModel MAX_ATTEMPTS = 3 @@ -130,10 +131,16 @@ def get_cache_status( def create_audio_model_instance( subpool_addr: str, devices: List[str], model_uid: str, model_name: str, **kwargs -) -> Tuple[WhisperModel, AudioModelDescription]: +) -> Tuple[Union[WhisperModel, ChatTTSModel], AudioModelDescription]: model_spec = match_audio(model_name) model_path = cache(model_spec) - model = WhisperModel(model_uid, model_path, model_spec, **kwargs) + model: Union[WhisperModel, ChatTTSModel] + if model_spec.model_family == "whisper": + model = WhisperModel(model_uid, model_path, model_spec, **kwargs) + elif model_spec.model_family == "ChatTTS": + model = ChatTTSModel(model_uid, model_path, model_spec, **kwargs) + else: + raise Exception(f"Unsupported audio model family: {model_spec.model_family}") model_description = AudioModelDescription( subpool_addr, devices, model_spec, model_path=model_path ) diff --git a/xinference/model/audio/model_spec.json b/xinference/model/audio/model_spec.json index 49da294f92..5087be9832 100644 --- a/xinference/model/audio/model_spec.json +++ b/xinference/model/audio/model_spec.json @@ -4,6 +4,7 @@ "model_family": "whisper", "model_id": "openai/whisper-tiny", "model_revision": "167c219b21f11ef214220b8fdb7536b8a88c2475", + "ability": "text-to-audio", "multilingual": true }, { @@ -11,6 +12,7 @@ "model_family": "whisper", "model_id": "openai/whisper-tiny.en", "model_revision": "87c7102498dcde7456f24cfd30239ca606ed9063", + "ability": "text-to-audio", "multilingual": false }, { @@ -18,6 +20,7 @@ "model_family": "whisper", "model_id": "openai/whisper-base", "model_revision": "8c1db9b51951100007a96a525d83a8ec81b3c237", + "ability": "text-to-audio", "multilingual": true }, { @@ -25,6 +28,7 @@ "model_family": "whisper", "model_id": "openai/whisper-base.en", "model_revision": "911407f4214e0e1d82085af863093ec0b66f9cd6", + "ability": "text-to-audio", "multilingual": false }, { @@ -32,6 +36,7 @@ "model_family": "whisper", "model_id": "openai/whisper-small", "model_revision": "998cb1a777c20db53d6033a61b977ed4c3792cac", + "ability": "text-to-audio", "multilingual": true }, { @@ -39,6 +44,7 @@ "model_family": "whisper", "model_id": "openai/whisper-small.en", "model_revision": "e8727524f962ee844a7319d92be39ac1bd25655a", + "ability": "text-to-audio", "multilingual": false }, { @@ -46,6 +52,7 @@ "model_family": "whisper", "model_id": "openai/whisper-medium", "model_revision": "16688beb1294bedd0a6f5cd86fe7eec57bce41ed", + "ability": "text-to-audio", "multilingual": true }, { @@ -53,6 +60,7 @@ "model_family": "whisper", "model_id": "openai/whisper-medium.en", "model_revision": "2e98eb6279edf5095af0c8dedb36bdec0acd172b", + "ability": "text-to-audio", "multilingual": false }, { @@ -60,6 +68,7 @@ "model_family": "whisper", "model_id": "openai/whisper-large-v3", "model_revision": "6cdf07a7e3ec3806e5d55f787915b85d4cd020b1", + "ability": "text-to-audio", "multilingual": true }, { @@ -67,6 +76,7 @@ "model_family": "whisper", "model_id": "BELLE-2/Belle-distilwhisper-large-v2-zh", "model_revision": "ed25d13498fa5bac758b2fc479435b698532dfe8", + "ability": "text-to-audio", "multilingual": false }, { @@ -74,6 +84,7 @@ "model_family": "whisper", "model_id": "BELLE-2/Belle-whisper-large-v2-zh", "model_revision": "ec5bd5d78598545b7585814edde86dac2002b5b9", + "ability": "text-to-audio", "multilingual": false }, { @@ -81,6 +92,15 @@ "model_family": "whisper", "model_id": "BELLE-2/Belle-whisper-large-v3-zh", "model_revision": "3bebc7247696b39f5ab9ed22db426943ac33f600", + "ability": "text-to-audio", "multilingual": false + }, + { + "model_name": "ChatTTS", + "model_family": "ChatTTS", + "model_id": "2Noise/ChatTTS", + "model_revision": "ce5913842aebd78e4a01a02d47244b8d62ac4ee3", + "ability": "audio-to-text", + "multilingual": true } ] diff --git a/xinference/model/audio/tests/test_chattts.py b/xinference/model/audio/tests/test_chattts.py new file mode 100644 index 0000000000..f526ebc6fa --- /dev/null +++ b/xinference/model/audio/tests/test_chattts.py @@ -0,0 +1,44 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import tempfile + + +def test_chattts(setup): + endpoint, _ = setup + from ....client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_name="ChatTTS", + model_type="audio", + ) + model = client.get_model(model_uid) + input_string = ( + "chat T T S is a text to speech model designed for dialogue applications." + ) + response = model.speech(input_string) + assert type(response) is bytes + assert len(response) > 0 + + # Test openai API + import openai + + client = openai.Client(api_key="not empty", base_url=f"{endpoint}/v1") + response = client.audio.speech.create( + model=model_uid, input=input_string, voice="echo" + ) + with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as f: + response.stream_to_file(f.name) diff --git a/xinference/thirdparty/ChatTTS/__init__.py b/xinference/thirdparty/ChatTTS/__init__.py new file mode 100644 index 0000000000..0f4c079ba7 --- /dev/null +++ b/xinference/thirdparty/ChatTTS/__init__.py @@ -0,0 +1 @@ +from .core import Chat \ No newline at end of file diff --git a/xinference/thirdparty/ChatTTS/core.py b/xinference/thirdparty/ChatTTS/core.py new file mode 100644 index 0000000000..facfbb4d24 --- /dev/null +++ b/xinference/thirdparty/ChatTTS/core.py @@ -0,0 +1,200 @@ + +import os +import logging +from functools import partial +from omegaconf import OmegaConf + +import torch +from vocos import Vocos +from .model.dvae import DVAE +from .model.gpt import GPT_warpper +from .utils.gpu_utils import select_device +from .utils.infer_utils import count_invalid_characters, detect_language, apply_character_map, apply_half2full_map +from .utils.io_utils import get_latest_modified_file +from .infer.api import refine_text, infer_code + +from huggingface_hub import snapshot_download + +logging.basicConfig(level = logging.INFO) + + +class Chat: + def __init__(self, ): + self.pretrain_models = {} + self.normalizer = {} + self.logger = logging.getLogger(__name__) + + def check_model(self, level = logging.INFO, use_decoder = False): + not_finish = False + check_list = ['vocos', 'gpt', 'tokenizer'] + + if use_decoder: + check_list.append('decoder') + else: + check_list.append('dvae') + + for module in check_list: + if module not in self.pretrain_models: + self.logger.log(logging.WARNING, f'{module} not initialized.') + not_finish = True + + if not not_finish: + self.logger.log(level, f'All initialized.') + + return not not_finish + + def load_models(self, source='huggingface', force_redownload=False, local_path='<LOCAL_PATH>', **kwargs): + if source == 'huggingface': + hf_home = os.getenv('HF_HOME', os.path.expanduser("~/.cache/huggingface")) + try: + download_path = get_latest_modified_file(os.path.join(hf_home, 'hub/models--2Noise--ChatTTS/snapshots')) + except: + download_path = None + if download_path is None or force_redownload: + self.logger.log(logging.INFO, f'Download from HF: https://huggingface.co/2Noise/ChatTTS') + download_path = snapshot_download(repo_id="2Noise/ChatTTS", allow_patterns=["*.pt", "*.yaml"]) + else: + self.logger.log(logging.INFO, f'Load from cache: {download_path}') + elif source == 'local': + self.logger.log(logging.INFO, f'Load from local: {local_path}') + download_path = local_path + + self._load(**{k: os.path.join(download_path, v) for k, v in OmegaConf.load(os.path.join(download_path, 'config', 'path.yaml')).items()}, **kwargs) + + def _load( + self, + vocos_config_path: str = None, + vocos_ckpt_path: str = None, + dvae_config_path: str = None, + dvae_ckpt_path: str = None, + gpt_config_path: str = None, + gpt_ckpt_path: str = None, + decoder_config_path: str = None, + decoder_ckpt_path: str = None, + tokenizer_path: str = None, + device: str = None, + compile: bool = True, + ): + if not device: + device = select_device(4096) + self.logger.log(logging.INFO, f'use {device}') + + if vocos_config_path: + vocos = Vocos.from_hparams(vocos_config_path).to(device).eval() + assert vocos_ckpt_path, 'vocos_ckpt_path should not be None' + vocos.load_state_dict(torch.load(vocos_ckpt_path)) + self.pretrain_models['vocos'] = vocos + self.logger.log(logging.INFO, 'vocos loaded.') + + if dvae_config_path: + cfg = OmegaConf.load(dvae_config_path) + dvae = DVAE(**cfg).to(device).eval() + assert dvae_ckpt_path, 'dvae_ckpt_path should not be None' + dvae.load_state_dict(torch.load(dvae_ckpt_path, map_location='cpu')) + self.pretrain_models['dvae'] = dvae + self.logger.log(logging.INFO, 'dvae loaded.') + + if gpt_config_path: + cfg = OmegaConf.load(gpt_config_path) + gpt = GPT_warpper(**cfg).to(device).eval() + assert gpt_ckpt_path, 'gpt_ckpt_path should not be None' + gpt.load_state_dict(torch.load(gpt_ckpt_path, map_location='cpu')) + if compile and 'cuda' in str(device): + gpt.gpt.forward = torch.compile(gpt.gpt.forward, backend='inductor', dynamic=True) + self.pretrain_models['gpt'] = gpt + spk_stat_path = os.path.join(os.path.dirname(gpt_ckpt_path), 'spk_stat.pt') + assert os.path.exists(spk_stat_path), f'Missing spk_stat.pt: {spk_stat_path}' + self.pretrain_models['spk_stat'] = torch.load(spk_stat_path).to(device) + self.logger.log(logging.INFO, 'gpt loaded.') + + if decoder_config_path: + cfg = OmegaConf.load(decoder_config_path) + decoder = DVAE(**cfg).to(device).eval() + assert decoder_ckpt_path, 'decoder_ckpt_path should not be None' + decoder.load_state_dict(torch.load(decoder_ckpt_path, map_location='cpu')) + self.pretrain_models['decoder'] = decoder + self.logger.log(logging.INFO, 'decoder loaded.') + + if tokenizer_path: + tokenizer = torch.load(tokenizer_path, map_location='cpu') + tokenizer.padding_side = 'left' + self.pretrain_models['tokenizer'] = tokenizer + self.logger.log(logging.INFO, 'tokenizer loaded.') + + self.check_model() + + def infer( + self, + text, + skip_refine_text=False, + refine_text_only=False, + params_refine_text={}, + params_infer_code={'prompt':'[speed_5]'}, + use_decoder=True, + do_text_normalization=True, + lang=None, + ): + + assert self.check_model(use_decoder=use_decoder) + + if not isinstance(text, list): + text = [text] + + if do_text_normalization: + for i, t in enumerate(text): + _lang = detect_language(t) if lang is None else lang + self.init_normalizer(_lang) + text[i] = self.normalizer[_lang](t) + if _lang == 'zh': + text[i] = apply_half2full_map(text[i]) + + for i, t in enumerate(text): + invalid_characters = count_invalid_characters(t) + if len(invalid_characters): + self.logger.log(logging.WARNING, f'Invalid characters found! : {invalid_characters}') + text[i] = apply_character_map(t) + + if not skip_refine_text: + text_tokens = refine_text(self.pretrain_models, text, **params_refine_text)['ids'] + text_tokens = [i[i < self.pretrain_models['tokenizer'].convert_tokens_to_ids('[break_0]')] for i in text_tokens] + text = self.pretrain_models['tokenizer'].batch_decode(text_tokens) + if refine_text_only: + return text + + text = [params_infer_code.get('prompt', '') + i for i in text] + params_infer_code.pop('prompt', '') + result = infer_code(self.pretrain_models, text, **params_infer_code, return_hidden=use_decoder) + + if use_decoder: + mel_spec = [self.pretrain_models['decoder'](i[None].permute(0,2,1)) for i in result['hiddens']] + else: + mel_spec = [self.pretrain_models['dvae'](i[None].permute(0,2,1)) for i in result['ids']] + + wav = [self.pretrain_models['vocos'].decode(i).cpu().numpy() for i in mel_spec] + + return wav + + def sample_random_speaker(self, ): + + dim = self.pretrain_models['gpt'].gpt.layers[0].mlp.gate_proj.in_features + std, mean = self.pretrain_models['spk_stat'].chunk(2) + return torch.randn(dim, device=std.device) * std + mean + + def init_normalizer(self, lang): + + if lang not in self.normalizer: + if lang == 'zh': + try: + from tn.chinese.normalizer import Normalizer + except: + self.logger.log(logging.WARNING, f'Package WeTextProcessing not found! \ + Run: conda install -c conda-forge pynini=2.1.5 && pip install WeTextProcessing') + self.normalizer[lang] = Normalizer().normalize + else: + try: + from nemo_text_processing.text_normalization.normalize import Normalizer + except: + self.logger.log(logging.WARNING, f'Package nemo_text_processing not found! \ + Run: conda install -c conda-forge pynini=2.1.5 && pip install nemo_text_processing') + self.normalizer[lang] = partial(Normalizer(input_case='cased', lang=lang).normalize, verbose=False, punct_post_process=True) + diff --git a/xinference/thirdparty/ChatTTS/experimental/llm.py b/xinference/thirdparty/ChatTTS/experimental/llm.py new file mode 100644 index 0000000000..a4e5f94d8e --- /dev/null +++ b/xinference/thirdparty/ChatTTS/experimental/llm.py @@ -0,0 +1,40 @@ + +from openai import OpenAI + +prompt_dict = { + 'kimi': [ {"role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。"}, + {"role": "user", "content": "你好,请注意你现在生成的文字要按照人日常生活的口吻,你的回复将会后续用TTS模型转为语音,并且请把回答控制在100字以内。并且标点符号仅包含逗号和句号,将数字等转为文字回答。"}, + {"role": "assistant", "content": "好的,我现在生成的文字将按照人日常生活的口吻, 并且我会把回答控制在一百字以内, 标点符号仅包含逗号和句号,将阿拉伯数字等转为中文文字回答。下面请开始对话。"},], + 'deepseek': [ + {"role": "system", "content": "You are a helpful assistant"}, + {"role": "user", "content": "你好,请注意你现在生成的文字要按照人日常生活的口吻,你的回复将会后续用TTS模型转为语音,并且请把回答控制在100字以内。并且标点符号仅包含逗号和句号,将数字等转为文字回答。"}, + {"role": "assistant", "content": "好的,我现在生成的文字将按照人日常生活的口吻, 并且我会把回答控制在一百字以内, 标点符号仅包含逗号和句号,将阿拉伯数字等转为中文文字回答。下面请开始对话。"},], + 'deepseek_TN': [ + {"role": "system", "content": "You are a helpful assistant"}, + {"role": "user", "content": "你好,现在我们在处理TTS的文本输入,下面将会给你输入一段文本,请你将其中的阿拉伯数字等等转为文字表达,并且输出的文本里仅包含逗号和句号这两个标点符号"}, + {"role": "assistant", "content": "好的,我现在对TTS的文本输入进行处理。这一般叫做text normalization。下面请输入"}, + {"role": "user", "content": "We paid $123 for this desk."}, + {"role": "assistant", "content": "We paid one hundred and twenty three dollars for this desk."}, + {"role": "user", "content": "详询请拨打010-724654"}, + {"role": "assistant", "content": "详询请拨打零幺零,七二四六五四"}, + {"role": "user", "content": "罗森宣布将于7月24日退市,在华门店超6000家!"}, + {"role": "assistant", "content": "罗森宣布将于七月二十四日退市,在华门店超过六千家。"}, + ], +} + +class llm_api: + def __init__(self, api_key, base_url, model): + self.client = OpenAI( + api_key = api_key, + base_url = base_url, + ) + self.model = model + def call(self, user_question, temperature = 0.3, prompt_version='kimi', **kwargs): + + completion = self.client.chat.completions.create( + model = self.model, + messages = prompt_dict[prompt_version]+[{"role": "user", "content": user_question},], + temperature = temperature, + **kwargs + ) + return completion.choices[0].message.content diff --git a/xinference/thirdparty/ChatTTS/infer/api.py b/xinference/thirdparty/ChatTTS/infer/api.py new file mode 100644 index 0000000000..744dbbd26c --- /dev/null +++ b/xinference/thirdparty/ChatTTS/infer/api.py @@ -0,0 +1,125 @@ + +import torch +import torch.nn.functional as F +from transformers.generation import TopKLogitsWarper, TopPLogitsWarper +from ..utils.infer_utils import CustomRepetitionPenaltyLogitsProcessorRepeat + +def infer_code( + models, + text, + spk_emb = None, + top_P = 0.7, + top_K = 20, + temperature = 0.3, + repetition_penalty = 1.05, + max_new_token = 2048, + **kwargs +): + + device = next(models['gpt'].parameters()).device + + if not isinstance(text, list): + text = [text] + + if not isinstance(temperature, list): + temperature = [temperature] * models['gpt'].num_vq + + if spk_emb is not None: + text = [f'[Stts][spk_emb]{i}[Ptts]' for i in text] + else: + text = [f'[Stts][empty_spk]{i}[Ptts]' for i in text] + + text_token = models['tokenizer'](text, return_tensors='pt', add_special_tokens=False, padding=True).to(device) + input_ids = text_token['input_ids'][...,None].expand(-1, -1, models['gpt'].num_vq) + text_mask = torch.ones(text_token['input_ids'].shape, dtype=bool, device=device) + + inputs = { + 'input_ids': input_ids, + 'text_mask': text_mask, + 'attention_mask': text_token['attention_mask'], + } + + emb = models['gpt'].get_emb(**inputs) + if spk_emb is not None: + emb[inputs['input_ids'][..., 0] == models['tokenizer'].convert_tokens_to_ids('[spk_emb]')] = \ + F.normalize(spk_emb.to(device).to(emb.dtype)[None].expand(len(text), -1), p=2.0, dim=1, eps=1e-12) + + num_code = models['gpt'].emb_code[0].num_embeddings - 1 + + LogitsWarpers = [] + if top_P is not None: + LogitsWarpers.append(TopPLogitsWarper(top_P, min_tokens_to_keep=3)) + if top_K is not None: + LogitsWarpers.append(TopKLogitsWarper(top_K, min_tokens_to_keep=3)) + + LogitsProcessors = [] + if repetition_penalty is not None and repetition_penalty != 1: + LogitsProcessors.append(CustomRepetitionPenaltyLogitsProcessorRepeat(\ + repetition_penalty, num_code, 16)) + + result = models['gpt'].generate( + emb, inputs['input_ids'], + temperature = torch.tensor(temperature, device=device), + attention_mask = inputs['attention_mask'], + LogitsWarpers = LogitsWarpers, + LogitsProcessors = LogitsProcessors, + eos_token = num_code, + max_new_token = max_new_token, + infer_text = False, + **kwargs + ) + + return result + + +def refine_text( + models, + text, + top_P = 0.7, + top_K = 20, + temperature = 0.7, + repetition_penalty = 1.0, + max_new_token = 384, + prompt = '', + **kwargs +): + + device = next(models['gpt'].parameters()).device + + if not isinstance(text, list): + text = [text] + + assert len(text), 'text should not be empty' + + text = [f"[Sbreak]{i}[Pbreak]{prompt}" for i in text] + text_token = models['tokenizer'](text, return_tensors='pt', add_special_tokens=False, padding=True).to(device) + text_mask = torch.ones(text_token['input_ids'].shape, dtype=bool, device=device) + + inputs = { + 'input_ids': text_token['input_ids'][...,None].expand(-1, -1, models['gpt'].num_vq), + 'text_mask': text_mask, + 'attention_mask': text_token['attention_mask'], + } + + LogitsWarpers = [] + if top_P is not None: + LogitsWarpers.append(TopPLogitsWarper(top_P, min_tokens_to_keep=3)) + if top_K is not None: + LogitsWarpers.append(TopKLogitsWarper(top_K, min_tokens_to_keep=3)) + + LogitsProcessors = [] + if repetition_penalty is not None and repetition_penalty != 1: + LogitsProcessors.append(CustomRepetitionPenaltyLogitsProcessorRepeat(repetition_penalty, len(models['tokenizer']), 16)) + + result = models['gpt'].generate( + models['gpt'].get_emb(**inputs), inputs['input_ids'], + temperature = torch.tensor([temperature,], device=device), + attention_mask = inputs['attention_mask'], + LogitsWarpers = LogitsWarpers, + LogitsProcessors = LogitsProcessors, + eos_token = torch.tensor(models['tokenizer'].convert_tokens_to_ids('[Ebreak]'), device=device)[None], + max_new_token = max_new_token, + infer_text = True, + **kwargs + ) + return result \ No newline at end of file diff --git a/xinference/thirdparty/ChatTTS/model/dvae.py b/xinference/thirdparty/ChatTTS/model/dvae.py new file mode 100644 index 0000000000..336e8e16cd --- /dev/null +++ b/xinference/thirdparty/ChatTTS/model/dvae.py @@ -0,0 +1,155 @@ +import math +from einops import rearrange +from vector_quantize_pytorch import GroupedResidualFSQ + +import torch +import torch.nn as nn +import torch.nn.functional as F + +class ConvNeXtBlock(nn.Module): + def __init__( + self, + dim: int, + intermediate_dim: int, + kernel, dilation, + layer_scale_init_value: float = 1e-6, + ): + # ConvNeXt Block copied from Vocos. + super().__init__() + self.dwconv = nn.Conv1d(dim, dim, + kernel_size=kernel, padding=dilation*(kernel//2), + dilation=dilation, groups=dim + ) # depthwise conv + + self.norm = nn.LayerNorm(dim, eps=1e-6) + self.pwconv1 = nn.Linear(dim, intermediate_dim) # pointwise/1x1 convs, implemented with linear layers + self.act = nn.GELU() + self.pwconv2 = nn.Linear(intermediate_dim, dim) + self.gamma = ( + nn.Parameter(layer_scale_init_value * torch.ones(dim), requires_grad=True) + if layer_scale_init_value > 0 + else None + ) + + def forward(self, x: torch.Tensor, cond = None) -> torch.Tensor: + residual = x + x = self.dwconv(x) + x = x.transpose(1, 2) # (B, C, T) -> (B, T, C) + x = self.norm(x) + x = self.pwconv1(x) + x = self.act(x) + x = self.pwconv2(x) + if self.gamma is not None: + x = self.gamma * x + x = x.transpose(1, 2) # (B, T, C) -> (B, C, T) + + x = residual + x + return x + + + +class GFSQ(nn.Module): + + def __init__(self, + dim, levels, G, R, eps=1e-5, transpose = True + ): + super(GFSQ, self).__init__() + self.quantizer = GroupedResidualFSQ( + dim=dim, + levels=levels, + num_quantizers=R, + groups=G, + ) + self.n_ind = math.prod(levels) + self.eps = eps + self.transpose = transpose + self.G = G + self.R = R + + def _embed(self, x): + if self.transpose: + x = x.transpose(1,2) + x = rearrange( + x, "b t (g r) -> g b t r", g = self.G, r = self.R, + ) + feat = self.quantizer.get_output_from_indices(x) + return feat.transpose(1,2) if self.transpose else feat + + def forward(self, x,): + if self.transpose: + x = x.transpose(1,2) + feat, ind = self.quantizer(x) + ind = rearrange( + ind, "g b t r ->b t (g r)", + ) + embed_onehot = F.one_hot(ind.long(), self.n_ind).to(x.dtype) + e_mean = torch.mean(embed_onehot, dim=[0,1]) + e_mean = e_mean / (e_mean.sum(dim=1) + self.eps).unsqueeze(1) + perplexity = torch.exp(-torch.sum(e_mean * torch.log(e_mean + self.eps), dim=1)) + + return ( + torch.zeros(perplexity.shape, dtype=x.dtype, device=x.device), + feat.transpose(1,2) if self.transpose else feat, + perplexity, + None, + ind.transpose(1,2) if self.transpose else ind, + ) + +class DVAEDecoder(nn.Module): + def __init__(self, idim, odim, + n_layer = 12, bn_dim = 64, hidden = 256, + kernel = 7, dilation = 2, up = False + ): + super().__init__() + self.up = up + self.conv_in = nn.Sequential( + nn.Conv1d(idim, bn_dim, 3, 1, 1), nn.GELU(), + nn.Conv1d(bn_dim, hidden, 3, 1, 1) + ) + self.decoder_block = nn.ModuleList([ + ConvNeXtBlock(hidden, hidden* 4, kernel, dilation,) + for _ in range(n_layer)]) + self.conv_out = nn.Conv1d(hidden, odim, kernel_size=1, bias=False) + + def forward(self, input, conditioning=None): + # B, T, C + x = input.transpose(1, 2) + x = self.conv_in(x) + for f in self.decoder_block: + x = f(x, conditioning) + + x = self.conv_out(x) + return x.transpose(1, 2) + + +class DVAE(nn.Module): + def __init__( + self, decoder_config, vq_config, dim=512 + ): + super().__init__() + self.register_buffer('coef', torch.randn(1, 100, 1)) + + self.decoder = DVAEDecoder(**decoder_config) + self.out_conv = nn.Conv1d(dim, 100, 3, 1, 1, bias=False) + if vq_config is not None: + self.vq_layer = GFSQ(**vq_config) + else: + self.vq_layer = None + + def forward(self, inp): + + if self.vq_layer is not None: + vq_feats = self.vq_layer._embed(inp) + else: + vq_feats = inp.detach().clone() + + temp = torch.chunk(vq_feats, 2, dim=1) # flatten trick :) + temp = torch.stack(temp, -1) + vq_feats = temp.reshape(*temp.shape[:2], -1) + + vq_feats = vq_feats.transpose(1, 2) + dec_out = self.decoder(input=vq_feats) + dec_out = self.out_conv(dec_out.transpose(1, 2)) + mel = dec_out * self.coef + + return mel diff --git a/xinference/thirdparty/ChatTTS/model/gpt.py b/xinference/thirdparty/ChatTTS/model/gpt.py new file mode 100644 index 0000000000..de90d9b744 --- /dev/null +++ b/xinference/thirdparty/ChatTTS/model/gpt.py @@ -0,0 +1,265 @@ +import os +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +import logging +from tqdm import tqdm +from einops import rearrange +from transformers.cache_utils import Cache + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.nn.utils.parametrize as P +from torch.nn.utils.parametrizations import weight_norm +from transformers import LlamaModel, LlamaConfig + + +class LlamaMLP(nn.Module): + def __init__(self, hidden_size, intermediate_size): + super().__init__() + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = F.silu + + def forward(self, x): + down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + return down_proj + + +class GPT_warpper(nn.Module): + def __init__( + self, + gpt_config, + num_audio_tokens, + num_text_tokens, + num_vq=4, + **kwargs, + ): + super().__init__() + + self.logger = logging.getLogger(__name__) + self.gpt = self.build_model(gpt_config) + self.model_dim = self.gpt.config.hidden_size + + self.num_vq = num_vq + self.emb_code = nn.ModuleList([nn.Embedding(num_audio_tokens, self.model_dim) for i in range(self.num_vq)]) + self.emb_text = nn.Embedding(num_text_tokens, self.model_dim) + self.head_text = weight_norm(nn.Linear(self.model_dim, num_text_tokens, bias=False), name='weight') + self.head_code = nn.ModuleList([weight_norm(nn.Linear(self.model_dim, num_audio_tokens, bias=False), name='weight') for i in range(self.num_vq)]) + + def build_model(self, config): + + configuration = LlamaConfig(**config) + model = LlamaModel(configuration) + del model.embed_tokens + + return model + + def get_emb(self, input_ids, text_mask, **kwargs): + + emb_text = self.emb_text(input_ids[text_mask][:, 0]) + + emb_code = [self.emb_code[i](input_ids[~text_mask][:, i]) for i in range(self.num_vq)] + emb_code = torch.stack(emb_code, 2).sum(2) + + emb = torch.zeros((input_ids.shape[:-1])+(emb_text.shape[-1],), device=emb_text.device, dtype=emb_text.dtype) + emb[text_mask] = emb_text + emb[~text_mask] = emb_code.to(emb.dtype) + + return emb + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, cache_position=None, **kwargs + ): + # With static cache, the `past_key_values` is None + # TODO joao: standardize interface for the different Cache classes and remove of this if + has_static_cache = False + if past_key_values is None: + past_key_values = getattr(self.gpt.layers[0].self_attn, "past_key_value", None) + has_static_cache = past_key_values is not None + + past_length = 0 + if past_key_values is not None: + if isinstance(past_key_values, Cache): + past_length = cache_position[0] if cache_position is not None else past_key_values.get_seq_length() + max_cache_length = ( + torch.tensor(past_key_values.get_max_length(), device=input_ids.device) + if past_key_values.get_max_length() is not None + else None + ) + cache_length = past_length if max_cache_length is None else torch.min(max_cache_length, past_length) + # TODO joao: remove this `else` after `generate` prioritizes `Cache` objects + else: + cache_length = past_length = past_key_values[0][0].shape[2] + max_cache_length = None + + # Keep only the unprocessed tokens: + # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where + # some of the inputs are exclusively passed as part of the cache (e.g. when passing input_embeds as + # input) + if attention_mask is not None and attention_mask.shape[1] > input_ids.shape[1]: + input_ids = input_ids[:, -(attention_mask.shape[1] - past_length) :] + # 2 - If the past_length is smaller than input_ids', then input_ids holds all input tokens. We can discard + # input_ids based on the past_length. + elif past_length < input_ids.shape[1]: + input_ids = input_ids[:, past_length:] + # 3 - Otherwise (past_length >= input_ids.shape[1]), let's assume input_ids only has unprocessed tokens. + + # If we are about to go beyond the maximum cache length, we need to crop the input attention mask. + if ( + max_cache_length is not None + and attention_mask is not None + and cache_length + input_ids.shape[1] > max_cache_length + ): + attention_mask = attention_mask[:, -max_cache_length:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -input_ids.shape[1] :] + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + # The `contiguous()` here is necessary to have a static stride during decoding. torchdynamo otherwise + # recompiles graphs as the stride of the inputs is a guard. Ref: https://github.com/huggingface/transformers/pull/29114 + # TODO: use `next_tokens` directly instead. + model_inputs = {"input_ids": input_ids.contiguous()} + + input_length = position_ids.shape[-1] if position_ids is not None else input_ids.shape[-1] + if cache_position is None: + cache_position = torch.arange(past_length, past_length + input_length, device=input_ids.device) + else: + cache_position = cache_position[-input_length:] + + if has_static_cache: + past_key_values = None + + model_inputs.update( + { + "position_ids": position_ids, + "cache_position": cache_position, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + def generate( + self, + emb, + inputs_ids, + temperature, + eos_token, + attention_mask = None, + max_new_token = 2048, + min_new_token = 0, + LogitsWarpers = [], + LogitsProcessors = [], + infer_text=False, + return_attn=False, + return_hidden=False, + ): + + with torch.no_grad(): + + attentions = [] + hiddens = [] + + start_idx, end_idx = inputs_ids.shape[1], torch.zeros(inputs_ids.shape[0], device=inputs_ids.device, dtype=torch.long) + finish = torch.zeros(inputs_ids.shape[0], device=inputs_ids.device).bool() + + temperature = temperature[None].expand(inputs_ids.shape[0], -1) + temperature = rearrange(temperature, "b n -> (b n) 1") + + attention_mask_cache = torch.ones((inputs_ids.shape[0], inputs_ids.shape[1]+max_new_token,), dtype=torch.bool, device=inputs_ids.device) + if attention_mask is not None: + attention_mask_cache[:, :attention_mask.shape[1]] = attention_mask + + for i in tqdm(range(max_new_token)): + + model_input = self.prepare_inputs_for_generation(inputs_ids, + outputs.past_key_values if i!=0 else None, + attention_mask_cache[:, :inputs_ids.shape[1]], use_cache=True) + + if i == 0: + model_input['inputs_embeds'] = emb + else: + if infer_text: + model_input['inputs_embeds'] = self.emb_text(model_input['input_ids'][:,:,0]) + else: + code_emb = [self.emb_code[i](model_input['input_ids'][:,:,i]) for i in range(self.num_vq)] + model_input['inputs_embeds'] = torch.stack(code_emb, 3).sum(3) + + model_input['input_ids'] = None + outputs = self.gpt.forward(**model_input, output_attentions=return_attn) + attentions.append(outputs.attentions) + hidden_states = outputs[0] # 🐻 + if return_hidden: + hiddens.append(hidden_states[:, -1]) + + with P.cached(): + if infer_text: + logits = self.head_text(hidden_states) + else: + logits = torch.stack([self.head_code[i](hidden_states) for i in range(self.num_vq)], 3) + + logits = logits[:, -1].float() + + if not infer_text: + logits = rearrange(logits, "b c n -> (b n) c") + logits_token = rearrange(inputs_ids[:, start_idx:], "b c n -> (b n) c") + else: + logits_token = inputs_ids[:, start_idx:, 0] + + logits = logits / temperature + + for logitsProcessors in LogitsProcessors: + logits = logitsProcessors(logits_token, logits) + + for logitsWarpers in LogitsWarpers: + logits = logitsWarpers(logits_token, logits) + + if i < min_new_token: + logits[:, eos_token] = -torch.inf + + scores = F.softmax(logits, dim=-1) + + idx_next = torch.multinomial(scores, num_samples=1) + + if not infer_text: + idx_next = rearrange(idx_next, "(b n) 1 -> b n", n=self.num_vq) + finish = finish | (idx_next == eos_token).any(1) + inputs_ids = torch.cat([inputs_ids, idx_next.unsqueeze(1)], 1) + else: + finish = finish | (idx_next == eos_token).any(1) + inputs_ids = torch.cat([inputs_ids, idx_next.unsqueeze(-1).expand(-1, -1, self.num_vq)], 1) + + end_idx = end_idx + (~finish).int() + + if finish.all(): + break + + inputs_ids = [inputs_ids[idx, start_idx: start_idx+i] for idx, i in enumerate(end_idx.int())] + inputs_ids = [i[:, 0] for i in inputs_ids] if infer_text else inputs_ids + + if return_hidden: + hiddens = torch.stack(hiddens, 1) + hiddens = [hiddens[idx, :i] for idx, i in enumerate(end_idx.int())] + + if not finish.all(): + self.logger.warn(f'Incomplete result. hit max_new_token: {max_new_token}') + + return { + 'ids': inputs_ids, + 'attentions': attentions, + 'hiddens':hiddens, + } \ No newline at end of file diff --git a/xinference/thirdparty/ChatTTS/utils/gpu_utils.py b/xinference/thirdparty/ChatTTS/utils/gpu_utils.py new file mode 100644 index 0000000000..13c7add8f0 --- /dev/null +++ b/xinference/thirdparty/ChatTTS/utils/gpu_utils.py @@ -0,0 +1,23 @@ + +import torch +import logging + +def select_device(min_memory = 2048): + logger = logging.getLogger(__name__) + if torch.cuda.is_available(): + available_gpus = [] + for i in range(torch.cuda.device_count()): + props = torch.cuda.get_device_properties(i) + free_memory = props.total_memory - torch.cuda.memory_reserved(i) + available_gpus.append((i, free_memory)) + selected_gpu, max_free_memory = max(available_gpus, key=lambda x: x[1]) + device = torch.device(f'cuda:{selected_gpu}') + free_memory_mb = max_free_memory / (1024 * 1024) + if free_memory_mb < min_memory: + logger.log(logging.WARNING, f'GPU {selected_gpu} has {round(free_memory_mb, 2)} MB memory left.') + device = torch.device('cpu') + else: + logger.log(logging.WARNING, f'No GPU found, use CPU instead') + device = torch.device('cpu') + + return device diff --git a/xinference/thirdparty/ChatTTS/utils/infer_utils.py b/xinference/thirdparty/ChatTTS/utils/infer_utils.py new file mode 100644 index 0000000000..74efceade6 --- /dev/null +++ b/xinference/thirdparty/ChatTTS/utils/infer_utils.py @@ -0,0 +1,141 @@ + +import re +import torch +import torch.nn.functional as F + + +class CustomRepetitionPenaltyLogitsProcessorRepeat(): + + def __init__(self, penalty: float, max_input_ids, past_window): + if not isinstance(penalty, float) or not (penalty > 0): + raise ValueError(f"`penalty` has to be a strictly positive float, but is {penalty}") + + self.penalty = penalty + self.max_input_ids = max_input_ids + self.past_window = past_window + + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + + input_ids = input_ids[:, -self.past_window:] + freq = F.one_hot(input_ids, scores.size(1)).sum(1) + freq[self.max_input_ids:] = 0 + alpha = self.penalty**freq + scores = torch.where(scores < 0, scores*alpha, scores/alpha) + + return scores + +class CustomRepetitionPenaltyLogitsProcessor(): + + def __init__(self, penalty: float, max_input_ids, past_window): + if not isinstance(penalty, float) or not (penalty > 0): + raise ValueError(f"`penalty` has to be a strictly positive float, but is {penalty}") + + self.penalty = penalty + self.max_input_ids = max_input_ids + self.past_window = past_window + + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + + input_ids = input_ids[:, -self.past_window:] + score = torch.gather(scores, 1, input_ids) + _score = score.detach().clone() + score = torch.where(score < 0, score * self.penalty, score / self.penalty) + score[input_ids>=self.max_input_ids] = _score[input_ids>=self.max_input_ids] + scores.scatter_(1, input_ids, score) + + return scores + +def count_invalid_characters(s): + + s = re.sub(r'\[uv_break\]|\[laugh\]|\[lbreak\]', '', s) + pattern = re.compile(r'[^\u4e00-\u9fffA-Za-z,。、,\. ]') + non_alphabetic_chinese_chars = pattern.findall(s) + return set(non_alphabetic_chinese_chars) + +def detect_language(sentence): + + chinese_char_pattern = re.compile(r'[\u4e00-\u9fff]') + english_word_pattern = re.compile(r'\b[A-Za-z]+\b') + + chinese_chars = chinese_char_pattern.findall(sentence) + english_words = english_word_pattern.findall(sentence) + + if len(chinese_chars) > len(english_words): + return "zh" + else: + return "en" + + +character_map = { + ':': ',', + ';': ',', + '!': '。', + '(': ',', + ')': ',', + '【': ',', + '】': ',', + '『': ',', + '』': ',', + '「': ',', + '」': ',', + '《': ',', + '》': ',', + '-': ',', + '‘': '', + '“': '', + '’': '', + '”': '', + ':': ',', + ';': ',', + '!': '.', + '(': ',', + ')': ',', + '[': ',', + ']': ',', + '>': ',', + '<': ',', + '-': ',', +} + +halfwidth_2_fullwidth_map = { + '!': '!', + '"': '“', + "'": '‘', + '#': '#', + '$': '$', + '%': '%', + '&': '&', + '(': '(', + ')': ')', + ',': ',', + '-': '-', + '*': '*', + '+': '+', + '.': '。', + '/': '/', + ':': ':', + ';': ';', + '<': '<', + '=': '=', + '>': '>', + '?': '?', + '@': '@', + # '[': '[', + '\\': '\', + # ']': ']', + '^': '^', + # '_': '_', + '`': '`', + '{': '{', + '|': '|', + '}': '}', + '~': '~' + } + +def apply_half2full_map(text): + translation_table = str.maketrans(halfwidth_2_fullwidth_map) + return text.translate(translation_table) + +def apply_character_map(text): + translation_table = str.maketrans(character_map) + return text.translate(translation_table) \ No newline at end of file diff --git a/xinference/thirdparty/ChatTTS/utils/io_utils.py b/xinference/thirdparty/ChatTTS/utils/io_utils.py new file mode 100644 index 0000000000..b3f5eda065 --- /dev/null +++ b/xinference/thirdparty/ChatTTS/utils/io_utils.py @@ -0,0 +1,14 @@ + +import os +import logging + +def get_latest_modified_file(directory): + logger = logging.getLogger(__name__) + + files = [os.path.join(directory, f) for f in os.listdir(directory)] + if not files: + logger.log(logging.WARNING, f'No files found in the directory: {directory}') + return None + latest_file = max(files, key=os.path.getmtime) + + return latest_file \ No newline at end of file From 2e3e4cbdd7c57fce009c2f8219bd611170f339c8 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Thu, 6 Jun 2024 11:48:40 +0200 Subject: [PATCH 123/298] DOC: Fix audio doc (#1593) --- doc/source/getting_started/installation.rst | 1 + doc/source/reference/index.rst | 1 + doc/source/user_guide/backends.rst | 1 + xinference/client/restful/restful_client.py | 24 +++++++++++++++------ 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index e1c07fd7e7..df08947009 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -58,6 +58,7 @@ Currently, supported models include: - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` - ``c4ai-command-r-v01`` + .. vllm_end To install Xinference and vLLM:: diff --git a/doc/source/reference/index.rst b/doc/source/reference/index.rst index 2009f5a17b..aca63f17ed 100644 --- a/doc/source/reference/index.rst +++ b/doc/source/reference/index.rst @@ -87,3 +87,4 @@ AudioModelHandle xinference.client.handlers.AudioModelHandle.transcriptions xinference.client.handlers.AudioModelHandle.translations + xinference.client.handlers.AudioModelHandle.speech diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index e319ff51f2..6eb3f0525e 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -65,6 +65,7 @@ Currently, supported model includes: - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` - ``c4ai-command-r-v01`` + .. vllm_end SGLang diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 44f35fa43b..a721411ff0 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -691,13 +691,25 @@ def speech( response_format: str = "mp3", speed: float = 1.0, ): - """Generates audio from the input text. + """ + Generates audio from the input text. + + Parameters + ---------- - :param input: The text to generate audio for. The maximum length is 4096 characters. - :param voice: The voice to use when generating the audio. - :param response_format: The format to audio in. - :param speed: The speed of the generated audio. - :return: The generated audio binary. + input: str + The text to generate audio for. The maximum length is 4096 characters. + voice: str + The voice to use when generating the audio. + response_format: str + The format to audio in. + speed: str + The speed of the generated audio. + + Returns + ------- + bytes + The generated audio binary. """ url = f"{self._base_url}/v1/audio/speech" params = { From 5dacb3d2ef104753f0f6790fd7dc26f620b8d51e Mon Sep 17 00:00:00 2001 From: wxiwnd <40122078+wxiwnd@users.noreply.github.com> Date: Thu, 6 Jun 2024 19:06:57 +0800 Subject: [PATCH 124/298] DOC: Usage about cal-model-memory (#1589) --- .../zh_CN/LC_MESSAGES/models/model_memory.po | 129 ++++++++++++++++++ doc/source/models/index.rst | 1 + doc/source/models/model_memory.rst | 91 ++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/model_memory.po create mode 100644 doc/source/models/model_memory.rst diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_memory.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_memory.po new file mode 100644 index 0000000000..3b48d5e92d --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_memory.po @@ -0,0 +1,129 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-06-06 17:26+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.15.0\n" + +#: ../../source/models/model_memory.rst:5 +msgid "Model Memory Calculation" +msgstr "模型显存使用量计算" + +#: ../../source/models/model_memory.rst:7 +msgid "" +"For better planning of VMEM usage, xinference provided tool for model " +"memory calculation: ``cal-model-mem``" +msgstr "为了更好规划显存使用, Xinference 提供了计算模型显存使用量的工具:``cal-model-mem``" + +#: ../../source/models/model_memory.rst:9 +msgid "Use algorithm from https://github.com/RahulSChand/gpu_poor" +msgstr "算法来自:https://github.com/RahulSChand/gpu_poor" + +#: ../../source/models/model_memory.rst:11 +msgid "Output: model_mem, kv_cache, overhead, active_mem" +msgstr "输出:model_mem, kv_cache, overhead, active_mem" + +#: ../../source/models/model_memory.rst:13 +msgid "" +"Example: To calculate memory usage for qwen1.5-chat, run the following " +"command:" +msgstr "示例:计算 qwen1.5-chat 模型的显存用量,可以运行以下示例指令:" + +#: ../../source/models/model_memory.rst:37 +msgid "Syntax" +msgstr "语法" + +#: ../../source/models/model_memory.rst:39 +msgid "--size-in-billions {model_size}" +msgstr "" + +#: ../../source/models/model_memory.rst:42 +msgid "-s {model_size}" +msgstr "" + +#: ../../source/models/model_memory.rst:45 +msgid "" +"Set the model size. Specify the model size in billions of parameters. " +"Format accept 1_8 and 1.8. For example, 7 for 7.0B model size." +msgstr "设置模型大小。以十亿个参数为单位指定模型大小。参数格式接受形式如 1_8 和 1.8. 例如,7 表示 7.0B 的模型大小。" + +#: ../../source/models/model_memory.rst:50 +msgid "--quantization {precision}" +msgstr "" + +#: ../../source/models/model_memory.rst:53 +msgid "-q {precision} *(Optional)*" +msgstr "-q {precision} *(可选)*" + +#: ../../source/models/model_memory.rst:56 +msgid "" +"Define the quantization settings for the model. For example, Int4 for " +"INT4 quantization." +msgstr "指定模型的量化配置。例如:Int4 参数表示使用 INT4 量化。" + +#: ../../source/models/model_memory.rst:60 +msgid "--model-name {model_name}" +msgstr "" + +#: ../../source/models/model_memory.rst:63 +msgid "-n {model_name} *(Optional)*" +msgstr "-n {model_name} *(可选)*" + +#: ../../source/models/model_memory.rst:66 +msgid "" +"Specify the model's name. If provided, fetch model config from " +"huggingface/modelscope; If not specified, use default model layer to " +"estimate." +msgstr "" +"指定模型名称。如果提供此参数,将从 huggingface/modelscope 中获取模型配置;如果没有指定,将使用默认的 layer " +"参数粗略估计。" + +#: ../../source/models/model_memory.rst:70 +msgid "--context-length {context_length}" +msgstr "" + +#: ../../source/models/model_memory.rst:73 +msgid "-c {context_length}" +msgstr "" + +#: ../../source/models/model_memory.rst:76 +msgid "" +"Specify the maximum number of tokens(context length) that your model " +"support." +msgstr "指定模型的最大上下文长度。" + +#: ../../source/models/model_memory.rst:79 +msgid "--model-format {format}" +msgstr "" + +#: ../../source/models/model_memory.rst:82 +msgid "-f {format}" +msgstr "" + +#: ../../source/models/model_memory.rst:85 +msgid "Specify the format of the model, e.g. pytorch, ggmlv3, etc." +msgstr "指定模型的格式,例如:pytorch, ggmlv3, etc." + +#: ../../source/models/model_memory.rst:89 +msgid "" +"The environment variable ``HF_ENDPOINT`` could set the endpoint of " +"HuggingFace. e.g. hf-mirror, etc. Please refer to :ref:`this document " +"<models_download>`" +msgstr "" +"利用环境变量 ``HF_ENDPOINT`` 可设置 HuggingFace 服务器的 Endpoint。例如,当网络不佳时可以选择 hf-" +"mirror 作为 Endpoint. 更多请参考 :ref:`此文档 <models_download>`" + diff --git a/doc/source/models/index.rst b/doc/source/models/index.rst index 30a9778e96..380fcbb7f2 100644 --- a/doc/source/models/index.rst +++ b/doc/source/models/index.rst @@ -217,3 +217,4 @@ Model Usage custom sources/sources lora + model_memory diff --git a/doc/source/models/model_memory.rst b/doc/source/models/model_memory.rst new file mode 100644 index 0000000000..3e4c7249f8 --- /dev/null +++ b/doc/source/models/model_memory.rst @@ -0,0 +1,91 @@ +.. _cal_model_memory: + +======================== +Model Memory Calculation +======================== + +For better planning of VMEM usage, xinference provided tool for model memory calculation: ``cal-model-mem`` + +Use algorithm from https://github.com/RahulSChand/gpu_poor + +Output: model_mem, kv_cache, overhead, active_mem + +Example: +To calculate memory usage for qwen1.5-chat, run the following command: + +.. tabs:: + + .. code-tab:: bash Command + + xinference cal-model-mem -s 7 -q Int4 -f gptq -c 16384 -n qwen1.5-chat + + .. code-tab:: bash Output + + model_name: qwen1.5-chat + kv_cache_dtype: 16 + model size: 7.0 B + quant: Int4 + context: 16384 + gpu mem usage: + model mem: 4139 MB + kv_cache: 8192 MB + overhead: 650 MB + active: 17024 MB + total: 30005 MB (30 GB) + +Syntax +------ + +* --size-in-billions {model_size} + + + * -s {model_size} + + + Set the model size. + Specify the model size in billions of parameters. Format accept 1_8 and 1.8. + For example, 7 for 7.0B model size. + + +* --quantization {precision} + + + * -q {precision} *(Optional)* + + + Define the quantization settings for the model. + For example, Int4 for INT4 quantization. + + +* --model-name {model_name} + + + * -n {model_name} *(Optional)* + + + Specify the model's name. + If provided, fetch model config from huggingface/modelscope; If not specified, use default model layer to estimate. + + +* --context-length {context_length} + + + * -c {context_length} + + + Specify the maximum number of tokens(context length) that your model support. + + +* --model-format {format} + + + * -f {format} + + + Specify the format of the model, e.g. pytorch, ggmlv3, etc. + + +.. note:: + The environment variable ``HF_ENDPOINT`` could set the endpoint of HuggingFace. e.g. hf-mirror, etc. + Please refer to :ref:`this document <models_download>` + From 7c63a80b367931e8ce5d6b78b73eb123577e9fe2 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 6 Jun 2024 19:15:37 +0800 Subject: [PATCH 125/298] BLD: Docker clean all images after building image on self-hosted machine (#1595) --- .github/workflows/docker-cd.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-cd.yaml b/.github/workflows/docker-cd.yaml index 120ec912e3..5e4cb41612 100644 --- a/.github/workflows/docker-cd.yaml +++ b/.github/workflows/docker-cd.yaml @@ -76,4 +76,4 @@ jobs: env: DOCKER_ORG: ${{ secrets.DOCKERHUB_USERNAME }} run: | - docker system prune -f + docker system prune -f -a From 96250326562eca37dbe75f2ebced4425d51c3f22 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 7 Jun 2024 05:50:48 +0200 Subject: [PATCH 126/298] DOC: Fix audio doc (#1599) Co-authored-by: qinxuye <qinxuye@gmail.com> --- .../development/xinference_internals.po | 31 +++--- .../models/model_abilities/audio.po | 104 +++++++++++++----- doc/source/models/model_abilities/audio.rst | 68 +++++++++++- xinference/model/audio/model_spec.json | 26 ++--- 4 files changed, 172 insertions(+), 57 deletions(-) diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/development/xinference_internals.po b/doc/source/locale/zh_CN/LC_MESSAGES/development/xinference_internals.po index bfad82ba0a..9969ec843a 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/development/xinference_internals.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/development/xinference_internals.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-23 22:22+0800\n" +"POT-Creation-Date: 2024-05-31 11:46+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -165,7 +165,7 @@ msgstr "Python 项目会在 `setup.cfg` 或 `setup.py` 中定义命令行控制 #: ../../source/development/xinference_internals.rst:72 msgid "" -"The command-line ``xinference`` can be refered to code in " +"The command-line ``xinference`` can be referred to code in " "``xinference.deploy.cmdline:cli``." msgstr "命令行 ``xinference`` 可参考 ``xinference.deploy.cmdline:cli`` 中的代码。" @@ -243,9 +243,9 @@ msgstr "" "**引用 Actor 和调用方法**:当创建一个 Actor 时,它会产生一个引用变量," "以便其他 Actor 可以引用它。Actor 也可以用 IP 地址来引用。假设创建了 ``" "WorkerActor``,且引用变量为 ``worker_ref``,那么就可以通过调用 ``worker_" -"ref.launch_model()`` 来调用该 Actor 类的 ``launch_model``。" -"即使 actor 中的方法原来是一个传统的阻塞式的方法,当我们使用引用变量调用这个方法时," -"它也变成了一个异步方法。" +"ref.launch_model()`` 来调用该 Actor 类的 ``launch_model``。即使 actor 中" +"的方法原来是一个传统的阻塞式的方法,当我们使用引用变量调用这个方法时,它" +"也变成了一个异步方法。" #: ../../source/development/xinference_internals.rst:143 msgid "" @@ -279,9 +279,10 @@ msgid "" "in the background and results are returned in the future. This enables us" " to perform activities concurrently." msgstr "" -"Xinference 和 Xoscar 非常依赖异步编程库 ``asyncio``。异步编程是一种非阻塞的编程范式。" -"相比于传统的阻塞式的函数调用,异步编程中的请求或函数调用在后台执行,运行结果在未来某个时刻返回。" -"异步编程的优势是使得可以同时并发进行很多不同的活动或任务。" +"Xinference 和 Xoscar 非常依赖异步编程库 ``asyncio``。异步编程是一种非阻塞" +"的编程范式。相比于传统的阻塞式的函数调用,异步编程中的请求或函数调用在" +"后台执行,运行结果在未来某个时刻返回。异步编程的优势是使得可以同时并发" +"进行很多不同的活动或任务。" #: ../../source/development/xinference_internals.rst:159 msgid "" @@ -291,12 +292,16 @@ msgstr "如果您不熟悉 Python 的 ``asyncio``,可以查看更多教程以 #: ../../source/development/xinference_internals.rst:161 msgid "" -"`Python Asyncio Tutorial <https://bbc.github.io/cloudfit-public-docs/asyncio/asyncio-part-1.html>`__" -msgstr "`Python Asyncio 教程 <https://bbc.github.io/cloudfit-public-docs/asyncio/asyncio-part-1.html>`__" +"`Python Asyncio Tutorial <https://bbc.github.io/cloudfit-public-" +"docs/asyncio/asyncio-part-1.html>`__" +msgstr "" +"`Python Asyncio 教程 <https://bbc.github.io/cloudfit-public-docs/asyncio/" +"asyncio-part-1.html>`__" #: ../../source/development/xinference_internals.rst:163 msgid "" -"`Real Python's asyncio Tutorial <https://realpython.com/async-io-python/>`__" +"`Real Python's asyncio Tutorial <https://realpython.com/async-io-" +"python/>`__" msgstr "`Real Python asyncio 教程 <https://realpython.com/async-io-python/>`__" #: ../../source/development/xinference_internals.rst:165 @@ -333,8 +338,8 @@ msgid "" " LLMs." msgstr "" "以 `model/llm/ <https://github.com/xorbitsai/inference/tree/main/" -"xinference/model/llm>`_ 为例,它主要管理和启动 LLM,包括加载、配置" -"和运行大语言模型。" +"xinference/model/llm>`_ 为例,它主要管理和启动 LLM,包括加载、配置和运行" +"大语言模型。" #: ../../source/development/xinference_internals.rst:181 msgid "" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po index 04bb51a3e3..eb82e44a65 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-01 16:47+0800\n" +"POT-Creation-Date: 2024-06-07 11:33+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/models/model_abilities/audio.rst:5 msgid "Audio (Experimental)" @@ -32,8 +32,8 @@ msgid "Introduction" msgstr "介绍" #: ../../source/models/model_abilities/audio.rst:14 -msgid "The Audio API provides two methods for interacting with audio:" -msgstr "Audio API提供了两种与音频交互的方法:" +msgid "The Audio API provides three methods for interacting with audio:" +msgstr "Audio API提供了三种与音频交互的方法:" #: ../../source/models/model_abilities/audio.rst:17 msgid "The transcriptions endpoint transcribes audio into the input language." @@ -43,93 +43,143 @@ msgstr "转录终端将音频转录为输入语言。" msgid "The translations endpoint translates audio into English." msgstr "翻译端点将音频转换为英文。" -#: ../../source/models/model_abilities/audio.rst:25 +#: ../../source/models/model_abilities/audio.rst:19 +msgid "The speech endpoint generates audio from the input text." +msgstr "转录终端将音频转录为输入语言。" + +#: ../../source/models/model_abilities/audio.rst:26 msgid "API ENDPOINT" msgstr "API 端点" -#: ../../source/models/model_abilities/audio.rst:26 +#: ../../source/models/model_abilities/audio.rst:27 msgid "OpenAI-compatible ENDPOINT" msgstr "OpenAI 兼容端点" -#: ../../source/models/model_abilities/audio.rst:28 +#: ../../source/models/model_abilities/audio.rst:29 msgid "Transcription API" msgstr "" -#: ../../source/models/model_abilities/audio.rst:29 +#: ../../source/models/model_abilities/audio.rst:30 msgid "/v1/audio/transcriptions" msgstr "" -#: ../../source/models/model_abilities/audio.rst:31 +#: ../../source/models/model_abilities/audio.rst:32 msgid "Translation API" msgstr "" -#: ../../source/models/model_abilities/audio.rst:32 +#: ../../source/models/model_abilities/audio.rst:33 msgid "/v1/audio/translations" msgstr "" #: ../../source/models/model_abilities/audio.rst:35 +msgid "Speech API" +msgstr "" + +#: ../../source/models/model_abilities/audio.rst:36 +msgid "/v1/audio/speech" +msgstr "" + +#: ../../source/models/model_abilities/audio.rst:40 msgid "Supported models" msgstr "支持的模型列表" -#: ../../source/models/model_abilities/audio.rst:37 +#: ../../source/models/model_abilities/audio.rst:42 msgid "The audio API is supported with the following models in Xinference:" msgstr "在Xinference中,以下模型支持音频API:" -#: ../../source/models/model_abilities/audio.rst:39 +#: ../../source/models/model_abilities/audio.rst:44 msgid "whisper-tiny" msgstr "" -#: ../../source/models/model_abilities/audio.rst:40 +#: ../../source/models/model_abilities/audio.rst:45 msgid "whisper-tiny.en" msgstr "" -#: ../../source/models/model_abilities/audio.rst:41 +#: ../../source/models/model_abilities/audio.rst:46 msgid "whisper-base" msgstr "" -#: ../../source/models/model_abilities/audio.rst:42 +#: ../../source/models/model_abilities/audio.rst:47 msgid "whisper-base.en" msgstr "" -#: ../../source/models/model_abilities/audio.rst:43 +#: ../../source/models/model_abilities/audio.rst:48 msgid "whisper-medium" msgstr "" -#: ../../source/models/model_abilities/audio.rst:44 +#: ../../source/models/model_abilities/audio.rst:49 msgid "whisper-medium.en" msgstr "" -#: ../../source/models/model_abilities/audio.rst:45 +#: ../../source/models/model_abilities/audio.rst:50 msgid "whisper-large-v3" msgstr "" -#: ../../source/models/model_abilities/audio.rst:49 +#: ../../source/models/model_abilities/audio.rst:51 +msgid "Belle-distilwhisper-large-v2-zh" +msgstr "" + +#: ../../source/models/model_abilities/audio.rst:52 +msgid "Belle-whisper-large-v2-zh" +msgstr "" + +#: ../../source/models/model_abilities/audio.rst:53 +msgid "Belle-whisper-large-v3-zh" +msgstr "" + +#: ../../source/models/model_abilities/audio.rst:54 +msgid "ChatTTS" +msgstr "" + +#: ../../source/models/model_abilities/audio.rst:57 msgid "Quickstart" msgstr "快速入门" -#: ../../source/models/model_abilities/audio.rst:52 +#: ../../source/models/model_abilities/audio.rst:60 msgid "Transcription" msgstr "转录" -#: ../../source/models/model_abilities/audio.rst:54 +#: ../../source/models/model_abilities/audio.rst:62 msgid "" "The Transcription API mimics OpenAI's `create transcriptions API " "<https://platform.openai.com/docs/api-" "reference/audio/createTranscription>`_. We can try Transcription API out " "either via cURL, OpenAI Client, or Xinference's python client:" -msgstr "Transcription API 模仿了 OpenAI 的 `create transcriptions API <https://platform.openai.com/docs/api-reference/audio/createTranscription>`_。" -"你可以通过 cURL、OpenAI Client 或者 Xinference 的 Python 客户端来尝试 Transcription API:" +msgstr "" +"Transcription API 模仿了 OpenAI 的 `create transcriptions API <https://" +"platform.openai.com/docs/api-reference/audio/createTranscription>`_。你" +"可以通过 cURL、OpenAI Client 或者 Xinference 的 Python 客户端来尝试 " +"Transcription API:" -#: ../../source/models/model_abilities/audio.rst:105 +#: ../../source/models/model_abilities/audio.rst:113 msgid "Translation" msgstr "翻译" -#: ../../source/models/model_abilities/audio.rst:107 +#: ../../source/models/model_abilities/audio.rst:115 msgid "" "The Translation API mimics OpenAI's `create translations API " "<https://platform.openai.com/docs/api-" "reference/audio/createTranslation>`_. We can try Translation API out " "either via cURL, OpenAI Client, or Xinference's python client:" -msgstr "Translation API 模仿了 OpenAI 的 `create translations API <https://platform.openai.com/docs/api-reference/audio/createTranslation>`_。" -"你可以通过 cURL、OpenAI Client 或 Xinference 的 Python 客户端来尝试使用 Translation API:" +msgstr "" +"Translation API 模仿了 OpenAI 的 `create translations API <https://" +"platform.openai.com/docs/api-reference/audio/createTranslation>`_。你可以" +"通过 cURL、OpenAI Client 或 Xinference 的 Python 客户端来尝试使用 " +"Translation API:" + +#: ../../source/models/model_abilities/audio.rst:165 +msgid "Speech" +msgstr "语音" + +#: ../../source/models/model_abilities/audio.rst:167 +msgid "" +"The Speech API mimics OpenAI's `create speech API " +"<https://platform.openai.com/docs/api-reference/audio/createSpeech>`_. We" +" can try Speech API out either via cURL, OpenAI Client, or Xinference's " +"python client:" +msgstr "" +"Transcription API 模仿了 OpenAI 的 `create speech API <https://" +"platform.openai.com/docs/api-reference/audio/createSpeech>`_。你" +"可以通过 cURL、OpenAI Client 或者 Xinference 的 Python 客户端来尝试 " +"Speech API:" diff --git a/doc/source/models/model_abilities/audio.rst b/doc/source/models/model_abilities/audio.rst index 7c6753fb67..22338f871d 100644 --- a/doc/source/models/model_abilities/audio.rst +++ b/doc/source/models/model_abilities/audio.rst @@ -11,11 +11,12 @@ Introduction ================== -The Audio API provides two methods for interacting with audio: +The Audio API provides three methods for interacting with audio: * The transcriptions endpoint transcribes audio into the input language. * The translations endpoint translates audio into English. +* The speech endpoint generates audio from the input text. .. list-table:: @@ -31,6 +32,10 @@ The Audio API provides two methods for interacting with audio: * - Translation API - /v1/audio/translations + * - Speech API + - /v1/audio/speech + + Supported models ------------------- @@ -43,7 +48,10 @@ The audio API is supported with the following models in Xinference: * whisper-medium * whisper-medium.en * whisper-large-v3 - +* Belle-distilwhisper-large-v2-zh +* Belle-whisper-large-v2-zh +* Belle-whisper-large-v3-zh +* ChatTTS Quickstart =================== @@ -77,7 +85,7 @@ We can try Transcription API out either via cURL, OpenAI Client, or Xinference's base_url="http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1" ) with open("speech.mp3", "rb") as audio_file: - client.audio.transcriptions( + client.audio.transcriptions.create( model=<MODEL_UID>, file=audio_file, ) @@ -130,7 +138,7 @@ We can try Translation API out either via cURL, OpenAI Client, or Xinference's p base_url="http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1" ) with open("speech.mp3", "rb") as audio_file: - client.audio.translations( + client.audio.translations.create( model=<MODEL_UID>, file=audio_file, ) @@ -152,3 +160,55 @@ We can try Translation API out either via cURL, OpenAI Client, or Xinference's p "text": "Hello, my name is Wolfgang and I come from Germany. Where are you heading today?" } + +Speech +-------------------- + +The Speech API mimics OpenAI's `create speech API <https://platform.openai.com/docs/api-reference/audio/createSpeech>`_. +We can try Speech API out either via cURL, OpenAI Client, or Xinference's python client: + +.. tabs:: + + .. code-tab:: bash cURL + + curl -X 'POST' \ + 'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/audio/speech' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "model": "<MODEL_UID>", + "text": "<The text to generate audio for>", + "voice": "echo", + }' + + + .. code-tab:: python OpenAI Python Client + + import openai + + client = openai.Client( + api_key="cannot be empty", + base_url="http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1" + ) + client.audio.speech.create( + model=<MODEL_UID>, + input=<The text to generate audio for>, + voice="echo", + ) + + .. code-tab:: python Xinference Python Client + + from xinference.client import Client + + client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") + + model = client.get_model("<MODEL_UID>") + model.speech( + input=<The text to generate audio for>, + voice="echo" + ) + + + .. code-tab:: output + + The output will be an audio binary. diff --git a/xinference/model/audio/model_spec.json b/xinference/model/audio/model_spec.json index 5087be9832..2174b59ab7 100644 --- a/xinference/model/audio/model_spec.json +++ b/xinference/model/audio/model_spec.json @@ -4,7 +4,7 @@ "model_family": "whisper", "model_id": "openai/whisper-tiny", "model_revision": "167c219b21f11ef214220b8fdb7536b8a88c2475", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": true }, { @@ -12,7 +12,7 @@ "model_family": "whisper", "model_id": "openai/whisper-tiny.en", "model_revision": "87c7102498dcde7456f24cfd30239ca606ed9063", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": false }, { @@ -20,7 +20,7 @@ "model_family": "whisper", "model_id": "openai/whisper-base", "model_revision": "8c1db9b51951100007a96a525d83a8ec81b3c237", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": true }, { @@ -28,7 +28,7 @@ "model_family": "whisper", "model_id": "openai/whisper-base.en", "model_revision": "911407f4214e0e1d82085af863093ec0b66f9cd6", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": false }, { @@ -36,7 +36,7 @@ "model_family": "whisper", "model_id": "openai/whisper-small", "model_revision": "998cb1a777c20db53d6033a61b977ed4c3792cac", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": true }, { @@ -44,7 +44,7 @@ "model_family": "whisper", "model_id": "openai/whisper-small.en", "model_revision": "e8727524f962ee844a7319d92be39ac1bd25655a", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": false }, { @@ -52,7 +52,7 @@ "model_family": "whisper", "model_id": "openai/whisper-medium", "model_revision": "16688beb1294bedd0a6f5cd86fe7eec57bce41ed", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": true }, { @@ -60,7 +60,7 @@ "model_family": "whisper", "model_id": "openai/whisper-medium.en", "model_revision": "2e98eb6279edf5095af0c8dedb36bdec0acd172b", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": false }, { @@ -68,7 +68,7 @@ "model_family": "whisper", "model_id": "openai/whisper-large-v3", "model_revision": "6cdf07a7e3ec3806e5d55f787915b85d4cd020b1", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": true }, { @@ -76,7 +76,7 @@ "model_family": "whisper", "model_id": "BELLE-2/Belle-distilwhisper-large-v2-zh", "model_revision": "ed25d13498fa5bac758b2fc479435b698532dfe8", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": false }, { @@ -84,7 +84,7 @@ "model_family": "whisper", "model_id": "BELLE-2/Belle-whisper-large-v2-zh", "model_revision": "ec5bd5d78598545b7585814edde86dac2002b5b9", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": false }, { @@ -92,7 +92,7 @@ "model_family": "whisper", "model_id": "BELLE-2/Belle-whisper-large-v3-zh", "model_revision": "3bebc7247696b39f5ab9ed22db426943ac33f600", - "ability": "text-to-audio", + "ability": "audio-to-text", "multilingual": false }, { @@ -100,7 +100,7 @@ "model_family": "ChatTTS", "model_id": "2Noise/ChatTTS", "model_revision": "ce5913842aebd78e4a01a02d47244b8d62ac4ee3", - "ability": "audio-to-text", + "ability": "text-to-audio", "multilingual": true } ] From c5233354d139cf75c8b81441838a66f70f6c0378 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 7 Jun 2024 13:39:06 +0800 Subject: [PATCH 127/298] FEAT: Continuous batching for chat model on transformers backend (#1548) --- benchmark/benchmark_serving.py | 5 +- benchmark/utils.py | 3 +- xinference/api/restful_api.py | 19 + xinference/client/restful/restful_client.py | 27 ++ xinference/constants.py | 4 + xinference/core/model.py | 134 +++++- xinference/core/scheduler.py | 428 ++++++++++++++++++ xinference/core/supervisor.py | 26 ++ .../core/tests/test_continuous_batching.py | 229 ++++++++++ xinference/isolation.py | 11 +- xinference/model/llm/pytorch/core.py | 90 +++- xinference/model/llm/pytorch/utils.py | 388 +++++++++++++++- xinference/types.py | 3 + 13 files changed, 1343 insertions(+), 24 deletions(-) create mode 100644 xinference/core/scheduler.py create mode 100644 xinference/core/tests/test_continuous_batching.py diff --git a/benchmark/benchmark_serving.py b/benchmark/benchmark_serving.py index 9f65ed8b7e..0440e0a722 100644 --- a/benchmark/benchmark_serving.py +++ b/benchmark/benchmark_serving.py @@ -100,7 +100,7 @@ def main(args: argparse.Namespace): logger.info("Preparing for benchmark.") tokenizer = get_tokenizer(args.tokenizer, trust_remote_code=args.trust_remote_code) - input_requests = sample_requests(args.dataset, args.num_prompts, tokenizer) + input_requests = sample_requests(args.dataset, args.num_prompts, tokenizer, prompt_len_limit=args.prompt_len_limit) logger.info("Benchmark starts.") benchmark_start_time = time.time() @@ -153,6 +153,9 @@ def main(args: argparse.Namespace): parser.add_argument( "--num-prompts", type=int, default=100, help="Number of prompts to process." ) + parser.add_argument( + "--prompt-len-limit", type=int, default=1024, help="Prompt length limitation." + ) parser.add_argument( "--concurrency", "-c", diff --git a/benchmark/utils.py b/benchmark/utils.py index 28aad1aae4..3a393adc62 100644 --- a/benchmark/utils.py +++ b/benchmark/utils.py @@ -97,6 +97,7 @@ def sample_requests( dataset_path: str, num_requests: int, tokenizer: "PreTrainedTokenizerBase", + prompt_len_limit: int = 1024 ) -> List[Tuple[str, int, int]]: # Load the dataset. with open(dataset_path) as f: @@ -128,7 +129,7 @@ def sample_requests( # This is because TGI causes errors when the input or output length # is too short. continue - if prompt_len > 1024 or prompt_len + output_len > 2048: + if prompt_len > prompt_len_limit or prompt_len + output_len > prompt_len_limit * 2: # Prune too long sequences. continue filtered_dataset.append((prompt, prompt_len, output_len)) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 637c7f2c7b..7fc0431caf 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -345,6 +345,16 @@ def serve(self, logging_conf: Optional[dict] = None): else None ), ) + self._router.add_api_route( + "/v1/models/{model_uid}/requests/{request_id}/abort", + self.abort_request, + methods=["POST"], + dependencies=( + [Security(self._auth_service, scopes=["models:read"])] + if self.is_authenticated() + else None + ), + ) self._router.add_api_route( "/v1/models/instance", self.launch_model_by_version, @@ -1568,6 +1578,15 @@ async def get_model_events(self, model_uid: str) -> JSONResponse: logger.error(e, exc_info=True) raise HTTPException(status_code=500, detail=str(e)) + async def abort_request(self, model_uid: str, request_id: str) -> JSONResponse: + try: + supervisor_ref = await self._get_supervisor_ref() + res = await supervisor_ref.abort_request(model_uid, request_id) + return JSONResponse(content=res) + except Exception as e: + logger.error(e, exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + async def list_vllm_supported_model_families(self) -> JSONResponse: try: from ..model.llm.vllm.core import ( diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index a721411ff0..428ba65e2a 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -1224,3 +1224,30 @@ def query_engine_by_model_name(self, model_name: str): response_data = response.json() return response_data + + def abort_request(self, model_uid: str, request_id: str): + """ + Abort a request. + Abort a submitted request. If the request is finished or not found, this method will be a no-op. + Currently, this interface is only supported when batching is enabled for models on transformers backend. + + Parameters + ---------- + model_uid: str + Model uid. + request_id: str + Request id. + Returns + ------- + Dict + Return empty dict. + """ + url = f"{self.base_url}/v1/models/{model_uid}/requests/{request_id}/abort" + response = requests.post(url, headers=self._headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to abort request, detail: {_get_error_string(response)}" + ) + + response_data = response.json() + return response_data diff --git a/xinference/constants.py b/xinference/constants.py index ba98f7f73f..13e383a08f 100644 --- a/xinference/constants.py +++ b/xinference/constants.py @@ -27,6 +27,7 @@ XINFERENCE_ENV_DISABLE_VLLM = "XINFERENCE_DISABLE_VLLM" XINFERENCE_ENV_ENABLE_SGLANG = "XINFERENCE_ENABLE_SGLANG" XINFERENCE_ENV_DISABLE_METRICS = "XINFERENCE_DISABLE_METRICS" +XINFERENCE_ENV_TRANSFORMERS_ENABLE_BATCHING = "XINFERENCE_TRANSFORMERS_ENABLE_BATCHING" def get_xinference_home() -> str: @@ -70,3 +71,6 @@ def get_xinference_home() -> str: XINFERENCE_DISABLE_METRICS = bool( int(os.environ.get(XINFERENCE_ENV_DISABLE_METRICS, 0)) ) +XINFERENCE_TRANSFORMERS_ENABLE_BATCHING = bool( + int(os.environ.get(XINFERENCE_ENV_TRANSFORMERS_ENABLE_BATCHING, 0)) +) diff --git a/xinference/core/model.py b/xinference/core/model.py index 228187ec04..fb33aab271 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -20,9 +20,14 @@ import time import types import weakref +from asyncio.queues import Queue +from asyncio.tasks import wait_for +from concurrent.futures import Future as ConcurrentFuture from typing import ( TYPE_CHECKING, + Any, AsyncGenerator, + AsyncIterator, Callable, Dict, Generator, @@ -35,6 +40,8 @@ import sse_starlette.sse import xoscar as xo +from ..constants import XINFERENCE_TRANSFORMERS_ENABLE_BATCHING + if TYPE_CHECKING: from .worker import WorkerActor from ..model.llm.core import LLM @@ -125,6 +132,16 @@ async def __pre_destroy__(self): from ..model.llm.pytorch.core import PytorchModel as LLMPytorchModel from ..model.llm.vllm.core import VLLMModel as LLMVLLMModel + if self.allow_batching(): + try: + assert self._scheduler_ref is not None + await xo.destroy_actor(self._scheduler_ref) + del self._scheduler_ref + except Exception as e: + logger.debug( + f"Destroy scheduler actor failed, address: {self.address}, error: {e}" + ) + if ( isinstance(self._model, (LLMPytorchModel, LLMVLLMModel)) and self._model.model_spec.model_format == "pytorch" @@ -181,9 +198,20 @@ def __init__( } self._loop: Optional[asyncio.AbstractEventLoop] = None + self._scheduler_ref = None + async def __post_create__(self): self._loop = asyncio.get_running_loop() + if self.allow_batching(): + from .scheduler import SchedulerActor + + self._scheduler_ref = await xo.create_actor( + SchedulerActor, + address=self.address, + uid=SchedulerActor.gen_uid(self.model_uid(), self._model.rep_id), + ) + async def _record_completion_metrics( self, duration, completion_tokens, prompt_tokens ): @@ -235,8 +263,22 @@ def is_vllm_backend(self) -> bool: return isinstance(self._model, VLLMModel) - def load(self): + def allow_batching(self) -> bool: + from ..model.llm.pytorch.core import PytorchChatModel + + return ( + XINFERENCE_TRANSFORMERS_ENABLE_BATCHING + and isinstance(self._model, PytorchChatModel) + and self._model.__class__.__name__ == PytorchChatModel.__name__ + ) + + async def load(self): self._model.load() + if self.allow_batching(): + await self._scheduler_ref.set_model(self._model) + logger.debug( + f"Batching enabled for model: {self.model_uid()}, max_num_seqs: {self._model.get_max_num_seqs()}" + ) def model_uid(self): return ( @@ -361,6 +403,36 @@ async def generate(self, prompt: str, *args, **kwargs): ) raise AttributeError(f"Model {self._model.model_spec} is not for generate.") + async def _queue_consumer( + self, queue: Queue, timeout: Optional[float] = None + ) -> AsyncIterator[Any]: + from .scheduler import ( + XINFERENCE_STREAMING_ABORT_FLAG, + XINFERENCE_STREAMING_DONE_FLAG, + XINFERENCE_STREAMING_ERROR_FLAG, + ) + + while True: + # TODO: timeout setting + res = await wait_for(queue.get(), timeout) + if res == XINFERENCE_STREAMING_DONE_FLAG: + break + elif res == XINFERENCE_STREAMING_ABORT_FLAG: + raise RuntimeError( + f"This request has been cancelled by another `abort_request` request." + ) + elif isinstance(res, str) and res.startswith( + XINFERENCE_STREAMING_ERROR_FLAG + ): + raise RuntimeError(res[len(XINFERENCE_STREAMING_ERROR_FLAG) :]) + else: + yield res + + @staticmethod + def get_stream_from_args(*args) -> bool: + assert args[2] is None or isinstance(args[2], dict) + return False if args[2] is None else args[2].get("stream", False) + @log_async(logger=logger) @request_limit @xo.generator @@ -368,17 +440,46 @@ async def chat(self, prompt: str, *args, **kwargs): start_time = time.time() response = None try: - if hasattr(self._model, "chat"): - response = await self._call_wrapper( - self._model.chat, prompt, *args, **kwargs - ) - return response - if hasattr(self._model, "async_chat"): - response = await self._call_wrapper( - self._model.async_chat, prompt, *args, **kwargs - ) - return response - raise AttributeError(f"Model {self._model.model_spec} is not for chat.") + if self.allow_batching(): + stream = self.get_stream_from_args(*args) + assert self._scheduler_ref is not None + if stream: + assert self._scheduler_ref is not None + queue: Queue[Any] = Queue() + ret = self._queue_consumer(queue) + await self._scheduler_ref.add_request( + prompt, queue, *args, **kwargs + ) + gen = self._to_json_async_gen(ret) + self._current_generator = weakref.ref(gen) + return gen + else: + from .scheduler import XINFERENCE_NON_STREAMING_ABORT_FLAG + + assert self._loop is not None + future = ConcurrentFuture() + await self._scheduler_ref.add_request( + prompt, future, *args, **kwargs + ) + fut = asyncio.wrap_future(future, loop=self._loop) + result = await fut + if result == XINFERENCE_NON_STREAMING_ABORT_FLAG: + raise RuntimeError( + f"This request has been cancelled by another `abort_request` request." + ) + return await asyncio.to_thread(json_dumps, result) + else: + if hasattr(self._model, "chat"): + response = await self._call_wrapper( + self._model.chat, prompt, *args, **kwargs + ) + return response + if hasattr(self._model, "async_chat"): + response = await self._call_wrapper( + self._model.async_chat, prompt, *args, **kwargs + ) + return response + raise AttributeError(f"Model {self._model.model_spec} is not for chat.") finally: # For the non stream result. record = None @@ -397,6 +498,15 @@ async def chat(self, prompt: str, *args, **kwargs): prompt_tokens, ) + async def abort_request(self, request_id: str) -> str: + from .scheduler import AbortRequestMessage + + if self.allow_batching(): + if self._scheduler_ref is None: + return AbortRequestMessage.NOT_FOUND.name + return await self._scheduler_ref.abort_request(request_id) + return AbortRequestMessage.NO_OP.name + @log_async(logger=logger) @request_limit async def create_embedding(self, input: Union[str, List[str]], *args, **kwargs): diff --git a/xinference/core/scheduler.py b/xinference/core/scheduler.py new file mode 100644 index 0000000000..cacab8461f --- /dev/null +++ b/xinference/core/scheduler.py @@ -0,0 +1,428 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import functools +import logging +from collections import deque +from enum import Enum +from typing import List, Optional, Set + +import xoscar as xo + +logger = logging.getLogger(__name__) + +XINFERENCE_BATCHING_CLEAN_CACHE_INTERVAL = 5 +XINFERENCE_STREAMING_DONE_FLAG = "<XINFERENCE_STREAMING_DONE>" +XINFERENCE_STREAMING_ERROR_FLAG = "<XINFERENCE_STREAMING_ERROR>" +XINFERENCE_STREAMING_ABORT_FLAG = "<XINFERENCE_STREAMING_ABORT>" +XINFERENCE_NON_STREAMING_ABORT_FLAG = "<XINFERENCE_NON_STREAMING_ABORT>" + + +class AbortRequestMessage(Enum): + NOT_FOUND = 1 + DONE = 2 + NO_OP = 3 + + +class InferenceRequest: + def __init__(self, prompt, future_or_queue, is_prefill, *args, **kwargs): + # original prompt + self._prompt = prompt + # full prompt that contains chat history and applies chat template + self._full_prompt = None + # whether the current request is in the prefill phase + self._is_prefill = is_prefill + # full prompt tokens + self._prompt_tokens = None + # all new generated tokens during decode phase + self._new_tokens = [] + # kv_cache used in decode phase + self._kv_cache = None + # use passed args from `chat` interface + self._inference_args = args + # use passed kwargs from `chat` interface, basically not used for now + self._inference_kwargs = kwargs + # should this request be stopped + self._stopped = False + # finish reason. If this is set, self._stopped is True. + self._finish_reason = None + # should this request be aborted + # note that when this flag is True, assert self._stopped is True + self._aborted = False + # sanitized generate config + self._sanitized_generate_config = None + # Use in stream mode + self.last_output_length = 0 + # inference results, + # it is a list type because when stream=True, + # self.completion contains all the results in a decode round. + self.completion = [] + # The way upstream gets the returned results, + # when stream=True, it is an asyncio.Queue, + # and when stream=False, it is an asyncio future. + self.future_or_queue = future_or_queue + # Record error message when this request has error. + # Must set stopped=True when this field is set. + self.error_msg: Optional[str] = None + + # check the integrity of args passed upstream + self._check_args() + + def _check_args(self): + assert len(self._inference_args) == 3 + # system prompt + assert self._inference_args[0] is None or isinstance( + self._inference_args[0], str + ) + # chat history + assert self._inference_args[1] is None or isinstance( + self._inference_args[1], list + ) + # generate config + assert self._inference_args[2] is None or isinstance( + self._inference_args[2], dict + ) + + @property + def prompt(self): + return self._prompt + + @property + def system_prompt(self): + return self._inference_args[0] + + @property + def chat_history(self): + return self._inference_args[1] + + @property + def full_prompt(self): + return self._full_prompt + + @full_prompt.setter + def full_prompt(self, value: str): + self._full_prompt = value + + @property + def is_prefill(self): + return self._is_prefill + + @is_prefill.setter + def is_prefill(self, value: bool): + self._is_prefill = value + + @property + def prompt_tokens(self): + return self._prompt_tokens + + @prompt_tokens.setter + def prompt_tokens(self, value: List[int]): + self._prompt_tokens = value + + @property + def kv_cache(self): + return self._kv_cache + + @kv_cache.setter + def kv_cache(self, value): + self._kv_cache = value + + @property + def new_tokens(self): + return self._new_tokens + + def append_new_token(self, token: int): + self._new_tokens.append(token) + + @property + def generate_config(self): + return self._inference_args[2] + + @property + def sanitized_generate_config(self): + return self._sanitized_generate_config + + @sanitized_generate_config.setter + def sanitized_generate_config(self, value: dict): + self._sanitized_generate_config = value + + @property + def stopped(self): + return self._stopped + + @stopped.setter + def stopped(self, value: bool): + self._stopped = value + + @property + def finish_reason(self): + return self._finish_reason + + @finish_reason.setter + def finish_reason(self, value: Optional[str]): + self._finish_reason = value + + @property + def stream(self) -> bool: + return ( + False + if self.generate_config is None + else self.generate_config.get("stream", False) + ) + + @property + def stream_interval(self) -> int: + return self.sanitized_generate_config.get("stream_interval", 2) + + @property + def include_usage(self) -> bool: + stream_options = self.sanitized_generate_config.get("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) + return include_usage + + @property + def aborted(self) -> bool: + return self._aborted + + @aborted.setter + def aborted(self, value: bool): + self._aborted = value + + @property + def request_id(self) -> Optional[str]: + return ( + None + if self.generate_config is None + else self.generate_config.get("request_id", None) + ) + + @functools.lru_cache + def get_generate_configs(self, eos_token_id: int): + from ..types import max_tokens_field + + max_new_tokens = int( + self.sanitized_generate_config.get("max_tokens", max_tokens_field.default) + ) + stream_interval = self.sanitized_generate_config.get("stream_interval", 2) + include_usage = self.include_usage + stop_str = self.sanitized_generate_config.get("stop", None) + stop_token_ids = ( + self.sanitized_generate_config.get("stop_token_ids", None) or [] + ) + stop_token_ids = set(stop_token_ids) + stop_token_ids.add(eos_token_id) + temperature = float(self.sanitized_generate_config.get("temperature", 1.0)) + repetition_penalty = float( + self.sanitized_generate_config.get("repetition_penalty", 1.0) + ) + top_p = float(self.sanitized_generate_config.get("top_p", 1.0)) + top_k = int(self.sanitized_generate_config.get("top_k", -1)) # -1 means disable + return ( + max_new_tokens, + stream_interval, + include_usage, + stop_str, + stop_token_ids, + temperature, + repetition_penalty, + top_p, + top_k, + ) + + +def _get_valid_batch_kv_cache(data, skipped_indexes: Set[int]): + from transformers.cache_utils import DynamicCache + + cache = DynamicCache.from_legacy_cache(data) + batch_size = cache.key_cache[0].shape[0] + batch_slices = [num for num in range(batch_size) if num not in skipped_indexes] + for idx in range(len(cache)): + cache.key_cache[idx] = cache.key_cache[idx][batch_slices, ::] + cache.value_cache[idx] = cache.value_cache[idx][batch_slices, ::] + return cache.to_legacy_cache() + + +class SchedulerActor(xo.StatelessActor): + @classmethod + def gen_uid(cls, model_uid: str, replica_id: str): + return f"{model_uid}-{replica_id}-scheduler-actor" + + def __init__(self): + super().__init__() + self._waiting_queue: deque[InferenceRequest] = deque() + self._running_queue: deque[InferenceRequest] = deque() + self._model = None + self._id_to_req = {} + self._abort_req_ids: Set[str] = set() + self._isolation = None + + async def __post_create__(self): + from ..isolation import Isolation + + self._isolation = Isolation( + asyncio.new_event_loop(), threaded=True, daemon=True + ) + self._isolation.start() + asyncio.run_coroutine_threadsafe(self.run(), loop=self._isolation.loop) + + async def __pre_destroy__(self): + try: + assert self._isolation is not None + self._isolation.stop() + del self._isolation + except Exception as e: + logger.debug( + f"Destroy scheduler actor failed, address: {self.address}, error: {e}" + ) + + def set_model(self, model): + self._model = model + + def get_max_num_seqs(self): + assert self._model is not None + return self._model.get_max_num_seqs() + + def _check_request_aborted(self, req: InferenceRequest): + if req.request_id and req.request_id in self._abort_req_ids: + req.aborted = True + req.stopped = True + + def _handle_request(self) -> Optional[List[InferenceRequest]]: + if self._model is None: + return None + max_num_seqs = self.get_max_num_seqs() + # currently, FCFS strategy + running_list: List[InferenceRequest] = [] + while len(self._running_queue) > 0: + if len(running_list) == max_num_seqs: + break + req = self._running_queue.popleft() + self._check_request_aborted(req) + running_list.append(req) + + waiting_list: List[InferenceRequest] = [] + if len(running_list) < max_num_seqs: + while len(self._waiting_queue) > 0: + req = self._waiting_queue.popleft() + self._check_request_aborted(req) + waiting_list.append(req) + if len(running_list) + len(waiting_list) == max_num_seqs: + break + # must waiting_list in front + return waiting_list + running_list + + @staticmethod + def _empty_cache(): + from ..model.llm.pytorch.utils import empty_cache + + empty_cache() + + async def step(self): + req_list = self._handle_request() + if not req_list: + return + self._model.batch_inference(req_list) + + stopped_batch_indexes = set() + for idx, r in enumerate(req_list): + if r.stream: + for completion in r.completion: + await r.future_or_queue.put(completion) + r.completion = [] + + if not r.stopped: + self._running_queue.append(r) + else: + if r.new_tokens: + stopped_batch_indexes.add(idx) + # set kv_cache to None for collection + r.kv_cache = None + rid = r.request_id + # clear data structure + if rid is not None: + self._id_to_req.pop(rid, None) + self._abort_req_ids.discard(rid) + + if r.aborted: # stop due to abort + # handle abort result + if r.stream: + await r.future_or_queue.put(XINFERENCE_STREAMING_ABORT_FLAG) + else: + r.future_or_queue.set_result( + XINFERENCE_NON_STREAMING_ABORT_FLAG + ) + else: + if r.error_msg is None: # normal stop + if not r.stream: + r.future_or_queue.set_result(r.completion[0]) + else: + await r.future_or_queue.put(XINFERENCE_STREAMING_DONE_FLAG) + # Abnormal stop, currently indicates that the parameter check does not pass, + # and does not participate in the inference + else: + if not r.stream: + r.future_or_queue.set_exception(ValueError(r.error_msg)) + else: + await r.future_or_queue.put( + XINFERENCE_STREAMING_ERROR_FLAG + r.error_msg + ) + + # Some requests have been completed. Batch size needs to be reduced for kv cache. + if stopped_batch_indexes and len(self._running_queue) > 0: + kv_cache = self._running_queue[0].kv_cache + reduced_kv_cache = _get_valid_batch_kv_cache( + kv_cache, stopped_batch_indexes + ) + for r in self._running_queue: + r.kv_cache = reduced_kv_cache + + self._empty_cache() + + async def add_request(self, prompt: str, future_or_queue, *args, **kwargs): + req = InferenceRequest(prompt, future_or_queue, True, *args, **kwargs) + rid = req.request_id + if rid is not None: + if rid in self._id_to_req: + raise KeyError(f"Request id: {rid} has already existed!") + self._id_to_req[rid] = req + self._waiting_queue.append(req) + + async def abort_request(self, req_id: str) -> str: + """ + Abort a request. + Abort a submitted request. If the request is finished or not found, this method will be a no-op. + """ + if req_id not in self._id_to_req: + logger.info(f"Request id: {req_id} not found. No-op for xinference.") + return AbortRequestMessage.NOT_FOUND.name + else: + self._abort_req_ids.add(req_id) + logger.info(f"Request id: {req_id} found to be aborted.") + return AbortRequestMessage.DONE.name + + async def run(self): + try: + while True: + # wait 10ms + await asyncio.sleep(0.01) + await self.step() + except Exception as e: + logger.exception( + f"Scheduler actor uid: {self.uid}, address: {self.address} run with error: {e}" + ) diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 414f0a1285..5df3512d90 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -1010,6 +1010,32 @@ async def list_cached_models(self) -> List[Dict[str, Any]]: cached_models.append(cache_entry) return cached_models + @log_async(logger=logger) + async def abort_request(self, model_uid: str, request_id: str) -> Dict: + from .scheduler import AbortRequestMessage + + res = {"msg": AbortRequestMessage.NO_OP.name} + replica_info = self._model_uid_to_replica_info.get(model_uid, None) + if not replica_info: + return res + replica_cnt = replica_info.replica + + # Query all replicas + for rep_mid in iter_replica_model_uid(model_uid, replica_cnt): + worker_ref = self._replica_model_uid_to_worker.get(rep_mid, None) + if worker_ref is None: + continue + model_ref = await worker_ref.get_model(model_uid=rep_mid) + result_info = await model_ref.abort_request(request_id) + res["msg"] = result_info + if result_info == AbortRequestMessage.DONE.name: + break + elif result_info == AbortRequestMessage.NOT_FOUND.name: + logger.debug(f"Request id: {request_id} not found for model {rep_mid}") + else: + logger.debug(f"No-op for model {rep_mid}") + return res + @log_async(logger=logger) async def add_worker(self, worker_address: str): from .worker import WorkerActor diff --git a/xinference/core/tests/test_continuous_batching.py b/xinference/core/tests/test_continuous_batching.py new file mode 100644 index 0000000000..4d612d3bcf --- /dev/null +++ b/xinference/core/tests/test_continuous_batching.py @@ -0,0 +1,229 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import os +import sys +import threading +import time + +import pytest +import requests + +from ...client.restful.restful_client import Client as RESTfulClient +from ..scheduler import AbortRequestMessage + + +class BaseThread(threading.Thread): + def __init__(self): + super().__init__() + self._ex = None + + def run_internal(self): + super().run() + + def run(self): + try: + self.run_internal() + except BaseException as e: + self._ex = e + + def join(self, timeout=None): + super().join() + if self._ex is not None: + raise self._ex + + +class InferenceThread(BaseThread): + def __init__(self, prompt, generate_config, client, model): + super().__init__() + self._prompt = prompt + self._generate_config = generate_config + self._client = client + self._model = model + self._ex = None + + @property + def stream(self): + return self._generate_config.get("stream", False) + + def run_internal(self): + if self.stream: + results = [] + for res in self._model.chat( + self._prompt, generate_config=self._generate_config + ): + results.append(res) + assert len(results) > 0 + else: + res = self._model.chat(self._prompt, generate_config=self._generate_config) + assert isinstance(res, dict) + choices = res["choices"] + assert isinstance(choices, list) + choice = choices[0]["text"] + assert isinstance(choice, str) + assert len(choice) > 0 + + +class InferenceThreadWithError(InferenceThread): + def __init__(self, prompt, generate_config, client, model, sleep=None): + super().__init__(prompt, generate_config, client, model) + self._sleep = sleep + + def run_internal(self): + if self._sleep is not None: + time.sleep(self._sleep) + if self.stream: + with pytest.raises(Exception): + for res in self._model.chat( + self._prompt, generate_config=self._generate_config + ): + print(res) + else: + with pytest.raises(Exception): + self._model.chat(self._prompt, generate_config=self._generate_config) + + +class AbortThread(BaseThread): + def __init__(self, client, model_uid, request_id, expected_res, sleep=None): + super().__init__() + self._client = client + self._model_uid = model_uid + self._request_id = request_id + self._sleep = sleep + self._expected_res = expected_res + + def run_internal(self): + if self._sleep is not None: + time.sleep(self._sleep) + result = self._client.abort_request(self._model_uid, self._request_id) + assert result["msg"] == self._expected_res + + +@pytest.fixture +def enable_batch(): + os.environ["XINFERENCE_TRANSFORMERS_ENABLE_BATCHING"] = "1" + + +@pytest.mark.skipif( + sys.platform == "win32", + reason="does not run on windows github CI due to its terrible runtime", +) +def test_continuous_batching(enable_batch, setup): + endpoint, _ = setup + url = f"{endpoint}/v1/models" + client = RESTfulClient(endpoint) + + # launch + payload = { + "model_engine": "transformers", + "model_type": "LLM", + "model_name": "qwen1.5-chat", + "quantization": "none", + "model_format": "pytorch", + "model_size_in_billions": "0_5", + # here note that device must be `cpu` for macOS, + # since torch mps may have some issues for batch tensor calculation, + # see: https://github.com/pytorch/pytorch/issues/122030 and + # https://github.com/pytorch/pytorch/issues/126862 + "device": "cpu", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "qwen1.5-chat" + + model = client.get_model(model_uid_res) + + # test correct + thread1 = InferenceThread("1+1=3正确吗?", {"stream": True}, client, model) + thread2 = InferenceThread("中国的首都是哪座城市?", {"stream": False}, client, model) + thread1.start() + thread2.start() + thread1.join() + thread2.join() + + # test error generate config + with pytest.raises(RuntimeError): + model.chat("你好", generate_config={"max_tokens": 99999999999999999}) + + with pytest.raises(RuntimeError): + model.chat("你好", generate_config={"stream_interval": 0}) + + # test error with other correct requests + thread1 = InferenceThread("1+1=3正确吗?", {"stream": True}, client, model) + thread2 = InferenceThread("中国的首都是哪座城市?", {"stream": False}, client, model) + thread3 = InferenceThreadWithError( + "猫和狗有什么区别?", {"stream": True, "max_tokens": 99999999999999}, client, model + ) + thread4 = InferenceThreadWithError( + "简介篮球的发展历史。", {"stream": False, "stream_interval": 0}, client, model + ) + + thread1.start() + thread2.start() + thread3.start() + thread4.start() + thread1.join() + thread2.join() + thread3.join() + thread4.join() + + # test same request ids + thread1 = InferenceThread( + "1+1=3正确吗?", {"stream": True, "request_id": "aaabbb"}, client, model + ) + thread2 = InferenceThreadWithError( + "中国的首都是哪座城市?", {"stream": False, "request_id": "aaabbb"}, client, model, 0.03 + ) + thread1.start() + thread2.start() + thread1.join() + thread2.join() + + # test abort request for stream + thread1 = InferenceThread( + "猫和狗有什么区别吗?", {"stream": True, "request_id": "aaabbb"}, client, model + ) + thread2 = AbortThread( + client, model_uid_res, "bbbaaa", AbortRequestMessage.NOT_FOUND.name + ) + thread3 = AbortThread(client, "abcd", "aaabbb", AbortRequestMessage.NO_OP.name) + thread4 = AbortThread( + client, model_uid_res, "aaabbb", AbortRequestMessage.DONE.name, 0.01 + ) + thread1.start() + thread2.start() + thread3.start() + thread4.start() + with pytest.raises(Exception): + thread1.join() + thread2.join() + thread3.join() + thread4.join() + + # test abort request for non-stream + thread1 = InferenceThread("猫和狗有什么区别吗?", {"request_id": "aaabbb"}, client, model) + thread2 = AbortThread( + client, model_uid_res, "aaabbb", AbortRequestMessage.DONE.name, 0.01 + ) + thread1.start() + thread2.start() + with pytest.raises(Exception): + thread1.join() + thread2.join() + + # correctly terminate model + client.terminate_model(model_uid_res) diff --git a/xinference/isolation.py b/xinference/isolation.py index c7bc3e2a36..e4c852d41f 100644 --- a/xinference/isolation.py +++ b/xinference/isolation.py @@ -19,13 +19,19 @@ class Isolation: # TODO: better move isolation to xoscar. - def __init__(self, loop: asyncio.AbstractEventLoop, threaded: bool = True): + def __init__( + self, + loop: asyncio.AbstractEventLoop, + threaded: bool = True, + daemon: bool = True, + ): self._loop = loop self._threaded = threaded self._stopped = None self._thread = None self._thread_ident = None + self._daemon = daemon def _run(self): asyncio.set_event_loop(self._loop) @@ -35,7 +41,8 @@ def _run(self): def start(self): if self._threaded: self._thread = thread = threading.Thread(target=self._run) - thread.daemon = True + if self._daemon: + thread.daemon = True thread.start() self._thread_ident = thread.ident diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index ec2bcd8eb9..7721cf62c9 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -17,6 +17,7 @@ import os from typing import Iterable, Iterator, List, Optional, Union +from ....core.scheduler import InferenceRequest from ....device_utils import ( get_device_preferred_dtype, gpu_count, @@ -40,6 +41,7 @@ from ..core import LLM from ..llm_family import LLMFamilyV1, LLMSpecV1 from ..utils import ChatModelMixin +from .utils import get_context_length, get_max_src_len logger = logging.getLogger(__name__) @@ -102,6 +104,7 @@ def _sanitize_model_config( pytorch_model_config.setdefault("gptq_act_order", False) pytorch_model_config.setdefault("device", "auto") pytorch_model_config.setdefault("trust_remote_code", True) + pytorch_model_config.setdefault("max_num_seqs", 16) return pytorch_model_config def _sanitize_generate_config( @@ -460,6 +463,7 @@ def __init__( pytorch_model_config, peft_model, ) + self._context_len = None def _sanitize_generate_config( self, @@ -503,13 +507,8 @@ def chat( chat_history: Optional[List[ChatCompletionMessage]] = None, generate_config: Optional[PytorchGenerateConfig] = None, ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: - assert self.model_family.prompt_style is not None - prompt_style = self.model_family.prompt_style.copy() - if system_prompt: - prompt_style.system_prompt = system_prompt - chat_history = chat_history or [] tools = generate_config.pop("tools", []) if generate_config else None - full_prompt = self.get_prompt(prompt, chat_history, prompt_style, tools=tools) + full_prompt = self._get_full_prompt(prompt, system_prompt, chat_history, tools) generate_config = self._sanitize_generate_config(generate_config) # TODO(codingl2k1): qwen hacky to set stop for function call. @@ -537,3 +536,82 @@ def chat( self.model_family, self.model_uid, c, tools ) return self._to_chat_completion(c) + + def load(self): + super().load() + self._context_len = get_context_length(self._model.config) + + def _get_full_prompt(self, prompt, system_prompt, chat_history, tools): + assert self.model_family.prompt_style is not None + prompt_style = self.model_family.prompt_style.copy() + if system_prompt: + prompt_style.system_prompt = system_prompt + chat_history = chat_history or [] + full_prompt = ChatModelMixin.get_prompt( + prompt, chat_history, prompt_style, tools=tools + ) + return full_prompt + + def get_max_num_seqs(self) -> int: + return self._pytorch_model_config.get("max_num_seqs") # type: ignore + + def batch_inference(self, req_list: List[InferenceRequest]): + from .utils import batch_inference_one_step + + for r in req_list: + if r.sanitized_generate_config is None: + r.sanitized_generate_config = self._sanitize_generate_config( + r.generate_config + ) + if r.is_prefill: + # check some generate params + max_src_len = get_max_src_len(self._context_len, r) # type: ignore + if max_src_len < 0: + r.stopped = True + r.error_msg = "Max tokens exceeds model's max length" + continue + if r.stream_interval <= 0: + r.stopped = True + r.error_msg = "`stream_interval` must be greater than 0" + continue + stop_str = r.sanitized_generate_config.get("stop", None) + if stop_str and ( + not (isinstance(stop_str, str) or isinstance(stop_str, Iterable)) + ): + r.stopped = True + r.error_msg = "Invalid `stop` field type" + continue + r.full_prompt = self._get_full_prompt( + r.prompt, r.system_prompt, r.chat_history, None + ) + + assert isinstance(self._context_len, int) + batch_inference_one_step( + req_list, + self.model_uid, + self._model, + self._tokenizer, + self._device, + self._context_len, + ) + for req in req_list: + if req.stream and req.error_msg is None: + if req.completion: + results = [] + for i, c in enumerate(req.completion): + if c == "<bos_stream>": + results.append( + self._get_first_chat_completion_chunk( + req.completion[i + 1] + ) + ) + elif c == "<eos_stream>": + break + else: + results.append(self._to_chat_completion_chunk(c)) + + if req.stopped and req.include_usage: + results.append( + self._get_final_chat_completion_chunk(req.completion[-1]) + ) + req.completion = results diff --git a/xinference/model/llm/pytorch/utils.py b/xinference/model/llm/pytorch/utils.py index 76d264cae9..09fe9ee0ed 100644 --- a/xinference/model/llm/pytorch/utils.py +++ b/xinference/model/llm/pytorch/utils.py @@ -14,13 +14,15 @@ import gc import logging +import os import time import uuid from threading import Thread -from typing import Iterable, Iterator, Tuple +from typing import Dict, Iterable, Iterator, List, Optional, Tuple import torch from transformers import GenerationConfig, TextIteratorStreamer +from transformers.cache_utils import DynamicCache from transformers.generation.logits_process import ( LogitsProcessorList, RepetitionPenaltyLogitsProcessor, @@ -29,8 +31,10 @@ TopPLogitsWarper, ) +from ....core.scheduler import InferenceRequest from ....device_utils import empty_cache from ....types import ( + Completion, CompletionChoice, CompletionChunk, CompletionUsage, @@ -54,7 +58,7 @@ def is_partial_stop(output: str, stop_str: str): return False -def get_context_length(config): +def get_context_length(config) -> int: """Get the context length of a model from a huggingface model config.""" if ( hasattr(config, "max_sequence_length") @@ -528,3 +532,383 @@ def generate_stream_falcon( # clean gc.collect() empty_cache() + + +def _get_token_from_logits( + req: InferenceRequest, i: int, logits, temperature, repetition_penalty, top_p, top_k +): + logits_processor = prepare_logits_processor( + temperature, repetition_penalty, top_p, top_k + ) + + if logits_processor: + if repetition_penalty > 1.0: + tmp_output_ids = torch.as_tensor( + [req.prompt_tokens + req.new_tokens], device=logits.device + ) + else: + tmp_output_ids = None + last_token_logits = logits_processor(tmp_output_ids, logits[i : i + 1, -1, :])[ + 0 + ] + else: + last_token_logits = logits[i : i + 1, -1, :] + + if temperature < 1e-5 or top_p < 1e-8: # greedy + _, indices = torch.topk(last_token_logits, 2) + else: + probs = torch.softmax(last_token_logits, dim=-1) + indices = torch.multinomial(probs, num_samples=2) + token = indices[0].int().item() + return token + + +def _pad_to_max_length(x: List[int], max_len: int, pad: int) -> List[int]: + assert len(x) <= max_len + return [pad] * (max_len - len(x)) + x + + +def _pad_seqs_inplace(seqs: List[List[int]], pad: int): + max_len = max(len(seq) for seq in seqs) + n = len(seqs) + i = 0 + while i < n: + seqs[i] = _pad_to_max_length(seqs[i], max_len, pad) + i += 1 + + +def get_max_src_len(context_len: int, r: InferenceRequest) -> int: + max_new_tokens = int( + r.sanitized_generate_config.get("max_tokens", max_tokens_field.default) + ) + return context_len - max_new_tokens - 8 + + +def _get_completion_chunk( + output: str, + finish_reason: Optional[str], + model_uid: str, + r: InferenceRequest, + just_usage: bool, +): + completion_choice = ( + [ + CompletionChoice( + text=output, index=0, logprobs=None, finish_reason=finish_reason + ) + ] + if not just_usage + else [] + ) + completion_chunk = CompletionChunk( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=model_uid, + choices=completion_choice, + ) + completion_usage = CompletionUsage( + prompt_tokens=len(r.prompt_tokens), + completion_tokens=len(r.new_tokens), + total_tokens=len(r.prompt_tokens) + len(r.new_tokens), + ) + completion_chunk["usage"] = completion_usage + return completion_chunk + + +def _get_completion( + output: str, finish_reason: Optional[str], model_uid: str, r: InferenceRequest +): + completion_choice = CompletionChoice( + text=output, index=0, logprobs=None, finish_reason=finish_reason + ) + + completion_chunk = CompletionChunk( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=len(r.prompt_tokens), + completion_tokens=len(r.new_tokens), + total_tokens=len(r.prompt_tokens) + len(r.new_tokens), + ) + completion = Completion( + id=completion_chunk["id"], + object=completion_chunk["object"], + created=completion_chunk["created"], + model=completion_chunk["model"], + choices=completion_chunk["choices"], + usage=completion_usage, + ) + return completion + + +def _merge_kv_cache( + past_kv: Tuple[Tuple[torch.Tensor]], new_kv: Tuple[Tuple[torch.Tensor]] +): + from torch.nn.functional import pad + + past_cache = DynamicCache.from_legacy_cache(past_kv) + new_cache = DynamicCache.from_legacy_cache(new_kv) + past_seq_len = past_cache.get_seq_length() + new_seq_len = new_cache.get_seq_length() + if past_seq_len != new_seq_len: + padding_target = new_cache if past_seq_len > new_seq_len else past_cache + padding_len = abs(past_seq_len - new_seq_len) + for idx in range(len(padding_target)): + k = padding_target.key_cache[idx] + v = padding_target.value_cache[idx] + _k = pad(k, (0, 0, padding_len, 0)) + _v = pad(v, (0, 0, padding_len, 0)) + padding_target.key_cache[idx] = _k + padding_target.value_cache[idx] = _v + + ret_kv = DynamicCache() + for idx in range(len(past_cache)): + k1, k2 = new_cache.key_cache[idx], past_cache.key_cache[idx] + v1, v2 = new_cache.value_cache[idx], past_cache.value_cache[idx] + ret_kv.update(torch.cat((k1, k2), 0), torch.cat((v1, v2), 0), idx) + return ret_kv.to_legacy_cache() + + +@torch.inference_mode() +def _batch_inference_one_step_internal( + req_list: List[InferenceRequest], + model_uid, + model, + tokenizer, + device, + context_len: int, + decode_round: int = 16, + bos_flag: str = "<bos_stream>", + eos_flag: str = "<eos_stream>", +): + # need to judge stopped here, + # since some requests state may change to stopped due to invalid parameters, e.g. max_src_len + valid_req_list = [r for r in req_list if not r.stopped] + if not valid_req_list: + return + generate_config_mapping: Dict[InferenceRequest, Tuple] = { + r: r.get_generate_configs(tokenizer.eos_token_id) for r in valid_req_list + } + s_time = time.time() + + prefill_reqs = [] + prompts = [] + decode_reqs = [] + for r in valid_req_list: + if r.is_prefill: + prompts.append(r.full_prompt) + prefill_reqs.append(r) + else: + decode_reqs.append(r) + + if prompts: # prefill first + input_ids: List[List[int]] = tokenizer(prompts, padding=False).input_ids + prompt_tokens = [] + for i, input_id in enumerate(input_ids): + req = valid_req_list[i] + max_src_len = get_max_src_len(context_len, req) + req.prompt_tokens = input_id[-max_src_len:] + prompt_tokens.append(req.prompt_tokens) + _pad_seqs_inplace(prompt_tokens, 0) + out = model(torch.as_tensor(prompt_tokens, device=device), use_cache=True) + + logits = out.logits + past_key_values = out.past_key_values + + for i, r in enumerate(prefill_reqs): + ( + max_new_tokens, + stream_interval, + include_usage, + stop_str, + stop_token_ids, + temperature, + repetition_penalty, + top_p, + top_k, + ) = generate_config_mapping[r] + + token = _get_token_from_logits( + r, i, logits, temperature, repetition_penalty, top_p, top_k + ) + r.is_prefill = False + r.append_new_token(token) + + if decode_reqs: + decode_kv = decode_reqs[0].kv_cache + # prefill and decode kv cache need to be merged at `batch_size` and `seq_len` dimensions. + merged_kv_cache = _merge_kv_cache(decode_kv, past_key_values) + for r in valid_req_list: + r.kv_cache = merged_kv_cache + empty_cache() + else: + for r in valid_req_list: + r.kv_cache = past_key_values + + past_key_values = valid_req_list[0].kv_cache + stop_token_mapping: Dict[InferenceRequest, int] = {} + output_mapping: Dict[InferenceRequest, str] = {} + # here, only decode phase, just run some rounds + for _i in range(decode_round): + decode_tokens: List[List[int]] = [[r.new_tokens[-1]] for r in valid_req_list] + out = model( + input_ids=torch.as_tensor(decode_tokens, device=device), + use_cache=True, + past_key_values=past_key_values, + ) + logits = out.logits + past_key_values = out.past_key_values + + for i, r in enumerate(valid_req_list): + ( + max_new_tokens, + stream_interval, + include_usage, + stop_str, + stop_token_ids, + temperature, + repetition_penalty, + top_p, + top_k, + ) = generate_config_mapping[r] + + token = _get_token_from_logits( + r, i, logits, temperature, repetition_penalty, top_p, top_k + ) + r.kv_cache = past_key_values + r.append_new_token(token) + + output = None + if not r.stopped: + stopped = token in stop_token_ids + + if stopped: + finish_reason = "stop" + elif len(r.new_tokens) == max_new_tokens: + finish_reason = "length" + stopped = True + else: + finish_reason = None + + # handle stop str + if stop_str and r not in output_mapping: + output = tokenizer.decode( + r.new_tokens, + skip_special_tokens=True, + spaces_between_special_tokens=False, + clean_up_tokenization_spaces=True, + ) + if isinstance(stop_str, str): + stop_str = [stop_str] + for stop in stop_str: + pos = output.rfind(stop) + if pos != -1: + output = output[:pos] + output_mapping[r] = output + stopped = True + finish_reason = "stop" + break + + r.stopped = stopped + r.finish_reason = finish_reason + + if r.stopped and r not in stop_token_mapping and r not in output_mapping: + stop_token_mapping[r] = _i + 1 + + if r.stream: + """ + Note that you can't just decode based on the newest r.new_tokens here, + which may destroy the integrity of the parsed characters, + and at the same time is not good at handling some special characters. + So the implementation here is to decode all the tokens that have been generated each time, + and then take the slice. + """ + if r.stopped or len(r.new_tokens) % stream_interval == 0: + if output is None: + output = tokenizer.decode( + r.new_tokens, + skip_special_tokens=True, + spaces_between_special_tokens=False, + clean_up_tokenization_spaces=True, + ) + + if r.last_output_length == 0: + r.completion.append(bos_flag) + + # this special character is mainly for qwen + output = output.strip("�") + output = output[r.last_output_length :] + r.last_output_length += len(output) + + completion_chunk = _get_completion_chunk( + output, r.finish_reason, model_uid, r, False + ) + r.completion.append(completion_chunk) + if r.stopped: + r.completion.append(eos_flag) + + # last round, handle stream result + # append usage information when enable `include_usage` for OPENAI API compatibility + # The reason for counting the usage in the last round of the iteration is that, + # these tokens are real generated and should be counted. + if r.stopped and _i == decode_round - 1 and include_usage: + r.completion.append( + _get_completion_chunk( + "", r.finish_reason, model_uid, r, True + ) + ) + else: + # last round, handle non-stream result + if r.stopped and _i == decode_round - 1: + invalid_token_num = decode_round - stop_token_mapping[r] + outputs = ( + tokenizer.decode( + r.new_tokens[: -(invalid_token_num + 1)] + if r.finish_reason == "stop" + else r.new_tokens[:-invalid_token_num], + skip_special_tokens=True, + spaces_between_special_tokens=False, + clean_up_tokenization_spaces=True, + ) + if r not in output_mapping + else output_mapping[r] + ) + completion = _get_completion(outputs, r.finish_reason, model_uid, r) + r.completion = [completion] + + e_time = time.time() + logger.debug( + f"Average throughput for a step: {(len(valid_req_list) * decode_round + len(prompts)) / (e_time - s_time)} token/s." + ) + + +def batch_inference_one_step( + req_list: List[InferenceRequest], + model_uid, + model, + tokenizer, + device, + context_len: int, +): + from ....core.model import OutOfMemoryError + + try: + _batch_inference_one_step_internal( + req_list, model_uid, model, tokenizer, device, context_len + ) + except OutOfMemoryError: + logger.exception( + f"Batch inference out of memory. " + f"Xinference will restart the model: {model_uid}. " + f"Please be patient for a few moments." + ) + # Just kill the process and let xinference auto-recover the model + os._exit(1) + except Exception as e: + logger.exception(f"Internal error for batch inference: {e}.") + # TODO: handle this diff --git a/xinference/types.py b/xinference/types.py index 923ae1ca70..fda35750fa 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -284,6 +284,7 @@ class PytorchGenerateConfig(TypedDict, total=False): tools: Optional[List[Dict]] lora_name: Optional[str] stream_options: Optional[Union[dict, None]] + request_id: Optional[str] class PytorchModelConfig(TypedDict, total=False): @@ -297,6 +298,7 @@ class PytorchModelConfig(TypedDict, total=False): gptq_groupsize: int gptq_act_order: bool trust_remote_code: bool + max_num_seqs: int def get_pydantic_model_from_method( @@ -361,6 +363,7 @@ class CreateCompletionTorch(BaseModel): top_p: float = top_p_field top_k: int = top_k_field lora_name: Optional[str] + request_id: Optional[str] CreateCompletionLlamaCpp: BaseModel From a578b3fa72adfda0f5c10547ea9cd91a3e57cf82 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 7 Jun 2024 14:08:46 +0800 Subject: [PATCH 128/298] FEAT: support qwen2 (#1597) --- doc/source/getting_started/installation.rst | 2 +- doc/source/models/builtin/llm/index.rst | 14 ++ .../models/builtin/llm/qwen2-instruct.rst | 223 +++++++++++++++++ .../models/builtin/llm/qwen2-moe-instruct.rst | 47 ++++ doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 212 ++++++++++++++++ .../model/llm/llm_family_modelscope.json | 227 ++++++++++++++++++ xinference/model/llm/vllm/core.py | 2 + 8 files changed, 727 insertions(+), 2 deletions(-) create mode 100644 doc/source/models/builtin/llm/qwen2-instruct.rst create mode 100644 doc/source/models/builtin/llm/qwen2-moe-instruct.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index df08947009..eab89c3488 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -55,10 +55,10 @@ Currently, supported models include: - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``glm4-chat``, ``glm4-chat-1m`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` +- ``qwen2-instruct``, ``qwen2-moe-instruct`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` - ``c4ai-command-r-v01`` - .. vllm_end To install Xinference and vLLM:: diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index e95112c0ad..a99863199f 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -396,6 +396,16 @@ The following is a list of built-in LLM in Xinference: - 32768 - Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data. + * - :ref:`qwen2-instruct <models_llm_qwen2-instruct>` + - chat, tools + - 32768 + - Qwen2 is the new series of Qwen large language models + + * - :ref:`qwen2-moe-instruct <models_llm_qwen2-moe-instruct>` + - chat + - 32768 + - Qwen2 is the new series of Qwen large language models. + * - :ref:`seallm_v2 <models_llm_seallm_v2>` - generate - 8192 @@ -688,6 +698,10 @@ The following is a list of built-in LLM in Xinference: qwen1.5-moe-chat + qwen2-instruct + + qwen2-moe-instruct + seallm_v2 seallm_v2.5 diff --git a/doc/source/models/builtin/llm/qwen2-instruct.rst b/doc/source/models/builtin/llm/qwen2-instruct.rst new file mode 100644 index 0000000000..70f405b956 --- /dev/null +++ b/doc/source/models/builtin/llm/qwen2-instruct.rst @@ -0,0 +1,223 @@ +.. _models_llm_qwen2-instruct: + +======================================== +qwen2-instruct +======================================== + +- **Context Length:** 32768 +- **Model Name:** qwen2-instruct +- **Languages:** en, zh +- **Abilities:** chat, tools +- **Description:** Qwen2 is the new series of Qwen large language models + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 0_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 0_5 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** Qwen/Qwen2-0.5B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-0.5B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 1_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 1_5 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** Qwen/Qwen2-1.5B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-1.5B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 1_5 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** Qwen/Qwen2-7B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-7B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-7B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 4 (pytorch, 72 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 72 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** Qwen/Qwen2-72B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-72B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-72B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 72 --model-format pytorch --quantization ${quantization} + + +Model Spec 5 (gptq, 0_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 0_5 +- **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers +- **Model ID:** Qwen/Qwen2-0.5B-Instruct-GPTQ-{quantization} +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-GPTQ-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format gptq --quantization ${quantization} + + +Model Spec 6 (gptq, 1_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 1_5 +- **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers +- **Model ID:** Qwen/Qwen2-1.5B-Instruct-GPTQ-{quantization} +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-GPTQ-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 1_5 --model-format gptq --quantization ${quantization} + + +Model Spec 7 (gptq, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 7 +- **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers +- **Model ID:** Qwen/Qwen2-7B-Instruct-GPTQ-{quantization} +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-7B-Instruct-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-GPTQ-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 7 --model-format gptq --quantization ${quantization} + + +Model Spec 8 (gptq, 72 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 72 +- **Quantizations:** Int4, Int8 +- **Engines**: vLLM, Transformers +- **Model ID:** Qwen/Qwen2-72B-Instruct-GPTQ-{quantization} +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-72B-Instruct-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-GPTQ-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 72 --model-format gptq --quantization ${quantization} + + +Model Spec 9 (awq, 0_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 0_5 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** Qwen/Qwen2-0.5B-Instruct-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format awq --quantization ${quantization} + + +Model Spec 10 (awq, 1_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 1_5 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** Qwen/Qwen2-1.5B-Instruct-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 1_5 --model-format awq --quantization ${quantization} + + +Model Spec 11 (awq, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 7 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** Qwen/Qwen2-7B-Instruct-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-7B-Instruct-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 7 --model-format awq --quantization ${quantization} + + +Model Spec 12 (awq, 72 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 72 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** Qwen/Qwen2-72B-Instruct-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-72B-Instruct-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 72 --model-format awq --quantization ${quantization} + + +Model Spec 13 (ggufv2, 0_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 0_5 +- **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** Qwen/Qwen2-0.5B-Instruct-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/qwen2-moe-instruct.rst b/doc/source/models/builtin/llm/qwen2-moe-instruct.rst new file mode 100644 index 0000000000..c512ca2ad8 --- /dev/null +++ b/doc/source/models/builtin/llm/qwen2-moe-instruct.rst @@ -0,0 +1,47 @@ +.. _models_llm_qwen2-moe-instruct: + +======================================== +qwen2-moe-instruct +======================================== + +- **Context Length:** 32768 +- **Model Name:** qwen2-moe-instruct +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** Qwen2 is the new series of Qwen large language models. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 14 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 14 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** Qwen/Qwen2-57B-A14B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-57B-A14B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-moe-instruct --size-in-billions 14 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (gptq, 14 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 14 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4 +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-moe-instruct --size-in-billions 14 --model-format gptq --quantization ${quantization} + diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 6eb3f0525e..d6edb66c48 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -62,10 +62,10 @@ Currently, supported model includes: - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``glm4-chat``, ``glm4-chat-1m`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` +- ``qwen2-instruct``, ``qwen2-moe-instruct`` - ``gemma-it`` - ``orion-chat``, ``orion-chat-rag`` - ``c4ai-command-r-v01`` - .. vllm_end SGLang diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 90327d9139..0c9ffb2d83 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -2381,6 +2381,218 @@ ] } }, + { + "version": 1, + "context_length": 32768, + "model_name": "qwen2-instruct", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "tools" + ], + "model_description": "Qwen2 is the new series of Qwen large language models", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "0_5", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/Qwen2-0.5B-Instruct" + }, + { + "model_format": "pytorch", + "model_size_in_billions": "1_5", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/Qwen2-1.5B-Instruct" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/Qwen2-7B-Instruct" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 72, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/Qwen2-72B-Instruct" + }, + { + "model_format": "gptq", + "model_size_in_billions": "0_5", + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "Qwen/Qwen2-0.5B-Instruct-GPTQ-{quantization}" + }, + { + "model_format": "gptq", + "model_size_in_billions": "1_5", + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "Qwen/Qwen2-1.5B-Instruct-GPTQ-{quantization}" + }, + { + "model_format": "gptq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "Qwen/Qwen2-7B-Instruct-GPTQ-{quantization}" + }, + { + "model_format": "gptq", + "model_size_in_billions": 72, + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "Qwen/Qwen2-72B-Instruct-GPTQ-{quantization}" + }, + { + "model_format": "awq", + "model_size_in_billions": "0_5", + "quantizations": [ + "Int4" + ], + "model_id": "Qwen/Qwen2-0.5B-Instruct-AWQ" + }, + { + "model_format": "awq", + "model_size_in_billions": "1_5", + "quantizations": [ + "Int4" + ], + "model_id": "Qwen/Qwen2-1.5B-Instruct-AWQ" + }, + { + "model_format": "awq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4" + ], + "model_id": "Qwen/Qwen2-7B-Instruct-AWQ" + }, + { + "model_format": "awq", + "model_size_in_billions": 72, + "quantizations": [ + "Int4" + ], + "model_id": "Qwen/Qwen2-72B-Instruct-AWQ" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": "0_5", + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "Qwen/Qwen2-0.5B-Instruct-GGUF", + "model_file_name_template": "qwen2-0_5b-instruct-{quantization}.gguf" + } + ], + "prompt_style": { + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] + } + }, + { + "version": 1, + "context_length": 32768, + "model_name": "qwen2-moe-instruct", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "Qwen2 is the new series of Qwen large language models. ", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 14, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/Qwen2-57B-A14B-Instruct" + }, + { + "model_format": "gptq", + "model_size_in_billions": 14, + "quantizations": [ + "Int4" + ], + "model_id": "Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4" + } + ], + "prompt_style": { + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] + } + }, { "version": 1, "context_length": 8192, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 1d463291f1..b564c75ae2 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2740,6 +2740,233 @@ ] } }, + { + "version": 1, + "context_length": 32768, + "model_name": "qwen2-instruct", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "tools" + ], + "model_description": "Qwen2 is the new series of Qwen large language models", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "0_5", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "qwen/Qwen2-0.5B-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": "1_5", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "qwen/Qwen2-1.5B-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "qwen/Qwen2-7B-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 72, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "qwen/Qwen2-72B-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": "0_5", + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "qwen/Qwen2-0.5B-Instruct-GPTQ-{quantization}", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": "1_5", + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "qwen/Qwen2-1.5B-Instruct-GPTQ-{quantization}", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "qwen/Qwen2-7B-Instruct-GPTQ-{quantization}", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": 72, + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "qwen/Qwen2-72B-Instruct-GPTQ-{quantization}", + "model_hub": "modelscope" + }, + { + "model_format": "awq", + "model_size_in_billions": "0_5", + "quantizations": [ + "Int4" + ], + "model_id": "qwen/Qwen2-0.5B-Instruct-AWQ", + "model_hub": "modelscope" + }, + { + "model_format": "awq", + "model_size_in_billions": "1_5", + "quantizations": [ + "Int4" + ], + "model_id": "qwen/Qwen2-1.5B-Instruct-AWQ", + "model_hub": "modelscope" + }, + { + "model_format": "awq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4" + ], + "model_id": "qwen/Qwen2-7B-Instruct-AWQ", + "model_hub": "modelscope" + }, + { + "model_format": "awq", + "model_size_in_billions": 72, + "quantizations": [ + "Int4" + ], + "model_id": "qwen/Qwen2-72B-Instruct-AWQ", + "model_hub": "modelscope" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": "0_5", + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "qwen/Qwen2-0.5B-Instruct-GGUF", + "model_file_name_template": "qwen2-0_5b-instruct-{quantization}.gguf", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] + } + }, + { + "version": 1, + "context_length": 32768, + "model_name": "qwen2-moe-instruct", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "Qwen2 is the new series of Qwen large language models. ", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 14, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "qwen/Qwen2-57B-A14B-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": 14, + "quantizations": [ + "Int4" + ], + "model_id": "qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] + } + }, { "version": 1, "context_length": 4096, diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index b0ec9d7f61..d83afffeb9 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -134,6 +134,7 @@ class VLLMGenerateConfig(TypedDict, total=False): VLLM_SUPPORTED_CHAT_MODELS.append("qwen1.5-chat") VLLM_SUPPORTED_MODELS.append("codeqwen1.5") VLLM_SUPPORTED_CHAT_MODELS.append("codeqwen1.5-chat") + VLLM_SUPPORTED_CHAT_MODELS.append("qwen2-instruct") if VLLM_INSTALLED and vllm.__version__ >= "0.3.2": VLLM_SUPPORTED_CHAT_MODELS.append("gemma-it") @@ -144,6 +145,7 @@ class VLLMGenerateConfig(TypedDict, total=False): if VLLM_INSTALLED and vllm.__version__ >= "0.4.0": VLLM_SUPPORTED_CHAT_MODELS.append("qwen1.5-moe-chat") + VLLM_SUPPORTED_CHAT_MODELS.append("qwen2-moe-instruct") VLLM_SUPPORTED_CHAT_MODELS.append("c4ai-command-r-v01") From 95ee0d1873ddf429e585062c63d6b782a405d6ae Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Fri, 7 Jun 2024 14:50:43 +0800 Subject: [PATCH 129/298] Feat: support glm-4v 9b (#1591) --- xinference/model/llm/__init__.py | 2 + xinference/model/llm/llm_family.json | 43 +++ .../model/llm/llm_family_modelscope.json | 44 +++ xinference/model/llm/pytorch/core.py | 1 + xinference/model/llm/pytorch/glm4v.py | 258 ++++++++++++++++++ 5 files changed, 348 insertions(+) create mode 100644 xinference/model/llm/pytorch/glm4v.py diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 9d56307428..c4084746a6 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -117,6 +117,7 @@ def _install(): from .pytorch.core import PytorchChatModel, PytorchModel from .pytorch.deepseek_vl import DeepSeekVLChatModel from .pytorch.falcon import FalconPytorchChatModel, FalconPytorchModel + from .pytorch.glm4v import Glm4VModel from .pytorch.intern_vl import InternVLChatModel from .pytorch.internlm2 import Internlm2PytorchChatModel from .pytorch.llama_2 import LlamaPytorchChatModel, LlamaPytorchModel @@ -163,6 +164,7 @@ def _install(): PytorchModel, CogVLM2Model, MiniCPMV25Model, + Glm4VModel, ] ) if OmniLMMModel: # type: ignore diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 0c9ffb2d83..b5806199b6 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -921,6 +921,49 @@ ] } }, + { + "version": 1, + "context_length": 8192, + "model_name": "glm-4v", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "none" + ], + "model_id": "THUDM/glm-4v-9b", + "model_revision": "e8b84fefc07e58a90c8489337675573fda95e289" + } + ], + "prompt_style": { + "style_name": "CHATGLM3", + "system_prompt": "", + "roles": [ + "user", + "assistant" + ], + "stop_token_ids": [ + 151329, + 151336, + 151338 + ], + "stop": [ + "<|endoftext|>", + "<|user|>", + "<|observation|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index b564c75ae2..635630028d 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -614,6 +614,50 @@ ] } }, + { + "version": 1, + "context_length": 8192, + "model_name": "glm-4v", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + "model_id": "ZhipuAI/glm-4v-9b", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "CHATGLM3", + "system_prompt": "", + "roles": [ + "user", + "assistant" + ], + "stop_token_ids": [ + 151329, + 151336, + 151338 + ], + "stop": [ + "<|endoftext|>", + "<|user|>", + "<|observation|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 7721cf62c9..a0b43bc4b3 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -71,6 +71,7 @@ "mini-internvl-chat", "cogvlm2", "MiniCPM-Llama3-V-2_5", + "glm-4v", ] diff --git a/xinference/model/llm/pytorch/glm4v.py b/xinference/model/llm/pytorch/glm4v.py new file mode 100644 index 0000000000..09b4d98491 --- /dev/null +++ b/xinference/model/llm/pytorch/glm4v.py @@ -0,0 +1,258 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import base64 +import logging +import time +import uuid +from concurrent.futures import ThreadPoolExecutor +from io import BytesIO +from threading import Thread +from typing import Dict, Iterator, List, Optional, Union + +import requests +import torch +from PIL import Image + +from ....types import ( + ChatCompletion, + ChatCompletionChunk, + ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionChunk, + CompletionUsage, +) +from ...utils import select_device +from ..llm_family import LLMFamilyV1, LLMSpecV1 +from .core import PytorchChatModel, PytorchGenerateConfig + +logger = logging.getLogger(__name__) + + +class Glm4VModel(PytorchChatModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._device = None + self._tokenizer = None + self._model = None + + @classmethod + def match( + cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str + ) -> bool: + family = model_family.model_family or model_family.model_name + if "glm-4v" in family.lower(): + return True + return False + + def load(self, **kwargs): + from transformers import AutoModelForCausalLM, AutoTokenizer + + device = self._pytorch_model_config.get("device", "auto") + self._device = select_device(device) + self._device = "auto" if self._device == "cuda" else self._device + + model = AutoModelForCausalLM.from_pretrained( + self.model_path, + low_cpu_mem_usage=True, + trust_remote_code=True, + torch_dtype=torch.float16, + device_map=self._device, + ) + self._model = model.eval() + + tokenizer = AutoTokenizer.from_pretrained( + self.model_path, trust_remote_code=True + ) + self._tokenizer = tokenizer + + def _message_content_to_chat(self, content): + def _load_image(_url): + if _url.startswith("data:"): + logging.info("Parse url by base64 decoder.") + # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images + # e.g. f"data:image/jpeg;base64,{base64_image}" + _type, data = _url.split(";") + _, ext = _type.split("/") + data = data[len("base64,") :] + data = base64.b64decode(data.encode("utf-8")) + return Image.open(BytesIO(data)).convert("RGB") + else: + try: + response = requests.get(_url) + except requests.exceptions.MissingSchema: + return Image.open(_url).convert("RGB") + else: + return Image.open(BytesIO(response.content)).convert("RGB") + + if not isinstance(content, str): + texts = [] + image_urls = [] + for c in content: + c_type = c.get("type") + if c_type == "text": + texts.append(c["text"]) + elif c_type == "image_url": + image_urls.append(c["image_url"]["url"]) + image_futures = [] + with ThreadPoolExecutor() as executor: + for image_url in image_urls: + fut = executor.submit(_load_image, image_url) + image_futures.append(fut) + images = [fut.result() for fut in image_futures] + # images = [] + # for image_url in image_urls: + # images.append(_load_image(image_url)) + text = " ".join(texts) + if len(images) == 0: + return text, [] + elif len(images) == 1: + return text, images + else: + raise RuntimeError("Only one image per message is supported") + return content, [] + + def chat( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[PytorchGenerateConfig] = None, + ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + from transformers import TextIteratorStreamer + + if not generate_config: + generate_config = {} + + stream = generate_config.get("stream", False) + content, images_chat = self._message_content_to_chat(prompt) + + msgs = [] + query_to_response: List[Dict] = [] + images_history = [] + for h in chat_history or []: + role = h["role"] + content_h, images_tmp = self._message_content_to_chat(h["content"]) + if images_tmp != []: + images_history = images_tmp + if len(query_to_response) == 0 and role == "user": + query_to_response.append({"role": "user", "content": content_h}) + if len(query_to_response) == 1 and role == "assistant": + query_to_response.append({"role": "assistant", "content": content_h}) + if len(query_to_response) == 2: + msgs.extend(query_to_response) + query_to_response = [] + image = None + if len(images_chat) > 0: + image = images_chat[0] + elif len(images_history) > 0: + image = images_history[0] + msgs.append({"role": "user", "content": content, "image": image}) + + inputs = self._tokenizer.apply_chat_template( + msgs, + add_generation_prompt=True, + tokenize=True, + return_tensors="pt", + return_dict=True, + ) # chat mode + inputs = inputs.to(self._model.device) + + generate_kwargs = { + **inputs, + "eos_token_id": [151329, 151336, 151338], + "do_sample": True, + "max_length": generate_config.get("max_tokens", 2048), + "temperature": generate_config.get("temperature", 0.7), + } + stop_str = "<|endoftext|>" + + if stream: + streamer = TextIteratorStreamer( + tokenizer=self._tokenizer, + timeout=60, + skip_prompt=True, + skip_special_tokens=True, + ) + generate_kwargs = { + **generate_kwargs, + "streamer": streamer, + } + t = Thread(target=self._model.generate, kwargs=generate_kwargs) + t.start() + + it = self.chat_stream(streamer, stop_str) + return self._to_chat_completion_chunks(it) + else: + with torch.no_grad(): + outputs = self._model.generate(**generate_kwargs) + outputs = outputs[:, inputs["input_ids"].shape[1] :] + response = self._tokenizer.decode(outputs[0]) + if response.endswith(stop_str): + response = response[: -len(stop_str)] + c = Completion( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=response, finish_reason="stop", logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + return self._to_chat_completion(c) + + def chat_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: + completion_id = str(uuid.uuid1()) + for new_text in streamer: + if not new_text.endswith(stop_str): + completion_choice = CompletionChoice( + text=new_text, index=0, logprobs=None, finish_reason=None + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk + + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk From e7a6331fb573e76d693a18f159af756496db2476 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 7 Jun 2024 14:58:09 +0800 Subject: [PATCH 130/298] DOC: Continuous batching (#1602) --- .../user_guide/continuous_batching.po | 93 +++++++++++++++++++ doc/source/user_guide/continuous_batching.rst | 69 ++++++++++++++ doc/source/user_guide/index.rst | 1 + 3 files changed, 163 insertions(+) create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/user_guide/continuous_batching.po create mode 100644 doc/source/user_guide/continuous_batching.rst diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/continuous_batching.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/continuous_batching.po new file mode 100644 index 0000000000..b192ebc6df --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/continuous_batching.po @@ -0,0 +1,93 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-06-07 14:38+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.11.0\n" + +#: ../../source/user_guide/continuous_batching.rst:5 +msgid "Continuous Batching (experimental)" +msgstr "连续批处理(实验性质)" + +#: ../../source/user_guide/continuous_batching.rst:7 +msgid "" +"Continuous batching, as a means to improve throughput during model " +"serving, has already been implemented in inference engines like ``VLLM``." +" Xinference aims to provide this optimization capability when using the " +"transformers engine as well." +msgstr "" +"连续批处理是诸如 ``VLLM`` 这样的推理引擎中提升吞吐的重要技术。Xinference 旨在" +"通过这项技术提升 ``transformers`` 推理引擎的吞吐。" + +#: ../../source/user_guide/continuous_batching.rst:11 +msgid "Usage" +msgstr "使用方式" + +#: ../../source/user_guide/continuous_batching.rst:12 +msgid "Currently, this feature can be enabled under the following conditions:" +msgstr "当前,此功能在满足以下条件时开启:" + +#: ../../source/user_guide/continuous_batching.rst:14 +msgid "" +"First, set the environment variable " +"``XINFERENCE_TRANSFORMERS_ENABLE_BATCHING`` to ``1`` when starting " +"xinference. For example:" +msgstr "" +"首先,启动 Xinference 时需要将环境变量 ``XINFERENCE_TRANSFORMERS_ENABLE_BATCHING`` 置为 ``1`` 。" + +#: ../../source/user_guide/continuous_batching.rst:21 +msgid "" +"Then, ensure that the ``transformers`` engine is selected when launching " +"the model. For example:" +msgstr "" +"然后,启动 LLM 模型时选择 ``transformers`` 推理引擎。例如:" + +#: ../../source/user_guide/continuous_batching.rst:57 +msgid "" +"Once this feature is enabled, all ``chat`` requests will be managed by " +"continuous batching, and the average throughput of requests made to a " +"single model will increase. The usage of the ``chat`` interface remains " +"exactly the same as before, with no differences." +msgstr "" +"一旦此功能开启,``chat`` 接口将被此功能接管,别的接口不受影响。``chat`` 接口的使用方式没有任何变化。" + +#: ../../source/user_guide/continuous_batching.rst:62 +msgid "Note" +msgstr "注意事项" + +#: ../../source/user_guide/continuous_batching.rst:64 +msgid "" +"Currently, this feature only supports the ``chat`` interface for ``LLM`` " +"models." +msgstr "当前,此功能仅支持 LLM 模型的 ``chat`` 功能。" + +#: ../../source/user_guide/continuous_batching.rst:66 +msgid "" +"If using GPU inference, this method will consume more GPU memory. Please " +"be cautious when increasing the number of concurrent requests to the same" +" model. The ``launch_model`` interface provides the ``max_num_seqs`` " +"parameter to adjust the concurrency level, with a default value of " +"``16``." +msgstr "" +"如果使用 GPU 推理,此功能对显存要求较高。因此请谨慎提高对同一个模型的并发请求量。" +"``launch_model`` 接口提供可选参数 ``max_num_seqs`` 用于调整并发度,默认值为 ``16`` 。" + +#: ../../source/user_guide/continuous_batching.rst:69 +msgid "" +"This feature is still in the experimental stage, and we welcome your " +"active feedback on any issues." +msgstr "" +"此功能仍处于实验阶段,欢迎反馈任何问题。" + diff --git a/doc/source/user_guide/continuous_batching.rst b/doc/source/user_guide/continuous_batching.rst new file mode 100644 index 0000000000..7c3a468099 --- /dev/null +++ b/doc/source/user_guide/continuous_batching.rst @@ -0,0 +1,69 @@ +.. _user_guide_continuous_batching: + +================================== +Continuous Batching (experimental) +================================== + +Continuous batching, as a means to improve throughput during model serving, has already been implemented in inference engines like ``VLLM``. +Xinference aims to provide this optimization capability when using the transformers engine as well. + +Usage +===== +Currently, this feature can be enabled under the following conditions: + +* First, set the environment variable ``XINFERENCE_TRANSFORMERS_ENABLE_BATCHING`` to ``1`` when starting xinference. For example: + +.. code-block:: + + XINFERENCE_TRANSFORMERS_ENABLE_BATCHING=1 xinference-local --log-level debug + + +* Then, ensure that the ``transformers`` engine is selected when launching the model. For example: + +.. tabs:: + + .. code-tab:: bash shell + + xinference launch -e <endpoint> --model-engine transformers -n qwen1.5-chat -s 4 -f pytorch -q none + + .. code-tab:: bash cURL + + curl -X 'POST' \ + 'http://127.0.0.1:9997/v1/models' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "model_engine": "transformers", + "model_name": "qwen1.5-chat", + "model_format": "pytorch", + "size_in_billions": 4, + "quantization": "none" + }' + + .. code-tab:: python + + from xinference.client import Client + client = Client("http://127.0.0.1:9997") + model_uid = client.launch_model( + model_engine="transformers", + model_name="qwen1.5-chat", + model_format="pytorch", + model_size_in_billions=4, + quantization="none" + ) + print('Model uid: ' + model_uid) + + +Once this feature is enabled, all ``chat`` requests will be managed by continuous batching, +and the average throughput of requests made to a single model will increase. +The usage of the ``chat`` interface remains exactly the same as before, with no differences. + +Note +==== + +* Currently, this feature only supports the ``chat`` interface for ``LLM`` models. + +* If using GPU inference, this method will consume more GPU memory. Please be cautious when increasing the number of concurrent requests to the same model. + The ``launch_model`` interface provides the ``max_num_seqs`` parameter to adjust the concurrency level, with a default value of ``16``. + +* This feature is still in the experimental stage, and we welcome your active feedback on any issues. diff --git a/doc/source/user_guide/index.rst b/doc/source/user_guide/index.rst index edacf8ba10..8ba1eeb5d9 100644 --- a/doc/source/user_guide/index.rst +++ b/doc/source/user_guide/index.rst @@ -11,3 +11,4 @@ User Guide client_api auth_system metrics + continuous_batching From a1cd729cbea92544c2038c54fc84a76d4c1cac4c Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 7 Jun 2024 15:02:05 +0800 Subject: [PATCH 131/298] DOC: add new models to readme (#1604) --- README.md | 4 ++- README_zh_CN.md | 4 ++- doc/source/models/builtin/llm/glm-4v.rst | 31 ++++++++++++++++++++ doc/source/models/builtin/llm/index.rst | 7 +++++ doc/source/models/model_abilities/vision.rst | 1 + 5 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 doc/source/models/builtin/llm/glm-4v.rst diff --git a/README.md b/README.md index 0af2e7f0bc..afd3d451af 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,9 @@ potential of cutting-edge AI models. - Docker image: [#855](https://github.com/xorbitsai/inference/pull/855) - Support multimodal: [#829](https://github.com/xorbitsai/inference/pull/829) ### New Models -- Built-in support for [GLM-4](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) +- Built-in support for [Qwen2](https://github.com/QwenLM/Qwen2): [#1509](https://github.com/xorbitsai/inference/pull/1597) +- Built-in support for [ChatTTS](https://github.com/2noise/ChatTTS): [#1578](https://github.com/xorbitsai/inference/pull/1578) +- Built-in support for [GLM-4 & GLM-4V](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) - Built-in support for [Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3): [#1576](https://github.com/xorbitsai/inference/pull/1576) - Built-in support for [Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1): [#1575](https://github.com/xorbitsai/inference/pull/1575) - Built-in support for [MiniCPM-Llama3-V 2.5](https://github.com/OpenBMB/MiniCPM-V): [#1577](https://github.com/xorbitsai/inference/pull/1577) diff --git a/README_zh_CN.md b/README_zh_CN.md index df112383e8..e2f62f43c5 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -31,7 +31,9 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - Docker 镜像支持: [#855](https://github.com/xorbitsai/inference/pull/855) - 支持多模态模型:[#829](https://github.com/xorbitsai/inference/pull/829) ### 新模型 -- 内置 [GLM-4](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) +- 内置 [Qwen2](https://github.com/QwenLM/Qwen2): [#1509](https://github.com/xorbitsai/inference/pull/1597) +- 内置 [ChatTTS](https://github.com/2noise/ChatTTS): [#1578](https://github.com/xorbitsai/inference/pull/1578) +- 内置 [GLM-4 & GLM-4V](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) - 内置 [Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3): [#1576](https://github.com/xorbitsai/inference/pull/1576) - 内置 [Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1): [#1575](https://github.com/xorbitsai/inference/pull/1575) - 内置 [MiniCPM-Llama3-V 2.5](https://github.com/OpenBMB/MiniCPM-V): [#1577](https://github.com/xorbitsai/inference/pull/1577) diff --git a/doc/source/models/builtin/llm/glm-4v.rst b/doc/source/models/builtin/llm/glm-4v.rst new file mode 100644 index 0000000000..346f873c7c --- /dev/null +++ b/doc/source/models/builtin/llm/glm-4v.rst @@ -0,0 +1,31 @@ +.. _models_llm_glm-4v: + +======================================== +glm-4v +======================================== + +- **Context Length:** 8192 +- **Model Name:** glm-4v +- **Languages:** en, zh +- **Abilities:** chat, vision +- **Description:** GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 9 +- **Quantizations:** none +- **Engines**: Transformers +- **Model ID:** THUDM/glm-4v-9b +- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/glm-4v-9b>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/glm-4v-9b>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name glm-4v --size-in-billions 9 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index a99863199f..e2187324cc 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -181,6 +181,11 @@ The following is a list of built-in LLM in Xinference: - 16384 - A code model trained on a dataset of ~140k programming related problems and solutions generated from Glaive’s synthetic data generation platform. + * - :ref:`glm-4v <models_llm_glm-4v>` + - chat, vision + - 8192 + - GLM4 is the open source version of the latest generation of pre-trained models in the GLM-4 series launched by Zhipu AI. + * - :ref:`glm4-chat <models_llm_glm4-chat>` - chat, tools - 131072 @@ -612,6 +617,8 @@ The following is a list of built-in LLM in Xinference: glaive-coder + glm-4v + glm4-chat glm4-chat-1m diff --git a/doc/source/models/model_abilities/vision.rst b/doc/source/models/model_abilities/vision.rst index 7ffb92fc4b..7a8a25a750 100644 --- a/doc/source/models/model_abilities/vision.rst +++ b/doc/source/models/model_abilities/vision.rst @@ -27,6 +27,7 @@ The ``vision`` ability is supported with the following models in Xinference: * :ref:`internvl-chat <models_llm_internvl-chat>` * :ref:`cogvlm2 <models_llm_cogvlm2>` * :ref:`MiniCPM-Llama3-V 2.5 <models_llm_minicpm-llama3-v-2_5>` +* :ref:`GLM-4V <models_llm_glm-4v>` Quickstart From 55c5636f2b6022842d1827eae373c8e5f162a1a3 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:04:33 +0800 Subject: [PATCH 132/298] BLD: Fix pip is looking multiple versions of some packages while installing (#1603) --- setup.cfg | 8 ++++---- xinference/deploy/docker/cpu.Dockerfile | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/setup.cfg b/setup.cfg index 62229386d6..5c3aa46d7b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,7 +26,7 @@ packages = find: install_requires = xoscar>=0.3.0 torch - gradio>=3.39.0 + gradio==4.26.0 typer[all]<0.12.0 # fix typer required by gradio pillow click @@ -34,12 +34,12 @@ install_requires = tabulate requests pydantic - fastapi + fastapi==0.110.3 uvicorn huggingface-hub>=0.19.4 typing_extensions - fsspec>=2023.1.0,<=2023.10.0 - s3fs + fsspec==2023.10.0 + s3fs==2023.10.0 modelscope>=1.10.0 sse_starlette>=1.6.5 # ensure_bytes API break change: https://github.com/sysid/sse-starlette/issues/65 openai>1 # For typing diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index 5185781910..15e02a3590 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -22,7 +22,7 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ pip install -i "$PIP_INDEX" \ "xoscar>=0.3.0" \ - "gradio>=3.39.0" \ + "gradio==4.26.0" \ "typer[all]<0.12.0" \ pillow \ click \ @@ -30,12 +30,12 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ tabulate \ requests \ pydantic \ - fastapi \ + "fastapi==0.110.3" \ uvicorn \ "huggingface-hub>=0.19.4" \ typing_extensions \ - "fsspec>=2023.1.0,<=2023.10.0" \ - s3fs \ + "fsspec==2023.10.0" \ + "s3fs==2023.10.0" \ "modelscope>=1.10.0" \ "sse_starlette>=1.6.5" \ "openai>1" \ From f1d0a307bab99b262120c4cb5fd001ad2817a041 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Sat, 8 Jun 2024 03:10:31 +0200 Subject: [PATCH 133/298] BUG: Fix wheel package missing thirdparty ChatTTS (#1606) --- xinference/thirdparty/ChatTTS/experimental/__init__.py | 0 xinference/thirdparty/ChatTTS/infer/__init__.py | 0 xinference/thirdparty/ChatTTS/model/__init__.py | 0 xinference/thirdparty/ChatTTS/utils/__init__.py | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 xinference/thirdparty/ChatTTS/experimental/__init__.py create mode 100644 xinference/thirdparty/ChatTTS/infer/__init__.py create mode 100644 xinference/thirdparty/ChatTTS/model/__init__.py create mode 100644 xinference/thirdparty/ChatTTS/utils/__init__.py diff --git a/xinference/thirdparty/ChatTTS/experimental/__init__.py b/xinference/thirdparty/ChatTTS/experimental/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/ChatTTS/infer/__init__.py b/xinference/thirdparty/ChatTTS/infer/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/ChatTTS/model/__init__.py b/xinference/thirdparty/ChatTTS/model/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/ChatTTS/utils/__init__.py b/xinference/thirdparty/ChatTTS/utils/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 1ea34120ddea40ccc93cf576f3bc82fc6aae2070 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Tue, 11 Jun 2024 10:34:16 +0800 Subject: [PATCH 134/298] ENH: modelscope for audio models (#1607) --- xinference/model/audio/__init__.py | 15 +++++++++++++- xinference/model/audio/core.py | 13 +++++++++++- xinference/model/audio/custom.py | 10 ++++++---- .../model/audio/model_spec_modelscope.json | 20 +++++++++++++++++++ 4 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 xinference/model/audio/model_spec_modelscope.json diff --git a/xinference/model/audio/__init__.py b/xinference/model/audio/__init__.py index de6367f9df..fe33f5d629 100644 --- a/xinference/model/audio/__init__.py +++ b/xinference/model/audio/__init__.py @@ -32,6 +32,9 @@ ) _model_spec_json = os.path.join(os.path.dirname(__file__), "model_spec.json") +_model_spec_modelscope_json = os.path.join( + os.path.dirname(__file__), "model_spec_modelscope.json" +) BUILTIN_AUDIO_MODELS = dict( (spec["model_name"], AudioModelFamilyV1(**spec)) for spec in json.load(codecs.open(_model_spec_json, "r", encoding="utf-8")) @@ -39,8 +42,17 @@ for model_name, model_spec in BUILTIN_AUDIO_MODELS.items(): MODEL_NAME_TO_REVISION[model_name].append(model_spec.model_revision) +MODELSCOPE_AUDIO_MODELS = dict( + (spec["model_name"], AudioModelFamilyV1(**spec)) + for spec in json.load( + codecs.open(_model_spec_modelscope_json, "r", encoding="utf-8") + ) +) +for model_name, model_spec in MODELSCOPE_AUDIO_MODELS.items(): + MODEL_NAME_TO_REVISION[model_name].append(model_spec.model_revision) + # register model description after recording model revision -for model_spec_info in [BUILTIN_AUDIO_MODELS]: +for model_spec_info in [BUILTIN_AUDIO_MODELS, MODELSCOPE_AUDIO_MODELS]: for model_name, model_spec in model_spec_info.items(): if model_spec.model_name not in AUDIO_MODEL_DESCRIPTIONS: AUDIO_MODEL_DESCRIPTIONS.update(generate_audio_description(model_spec)) @@ -64,3 +76,4 @@ AUDIO_MODEL_DESCRIPTIONS.update(generate_audio_description(ud_audio)) del _model_spec_json +del _model_spec_modelscope_json diff --git a/xinference/model/audio/core.py b/xinference/model/audio/core.py index 05f16b50b3..1e37b1cf3d 100644 --- a/xinference/model/audio/core.py +++ b/xinference/model/audio/core.py @@ -95,13 +95,24 @@ def generate_audio_description( def match_audio(model_name: str) -> AudioModelFamilyV1: - from . import BUILTIN_AUDIO_MODELS + from ..utils import download_from_modelscope + from . import BUILTIN_AUDIO_MODELS, MODELSCOPE_AUDIO_MODELS from .custom import get_user_defined_audios for model_spec in get_user_defined_audios(): if model_spec.model_name == model_name: return model_spec + if download_from_modelscope(): + if model_name in MODELSCOPE_AUDIO_MODELS: + logger.debug(f"Audio model {model_name} found in ModelScope.") + return MODELSCOPE_AUDIO_MODELS[model_name] + else: + logger.debug( + f"Audio model {model_name} not found in ModelScope, " + f"now try to load it via builtin way." + ) + if model_name in BUILTIN_AUDIO_MODELS: return BUILTIN_AUDIO_MODELS[model_name] else: diff --git a/xinference/model/audio/custom.py b/xinference/model/audio/custom.py index 12599f89e6..c342bcc1a7 100644 --- a/xinference/model/audio/custom.py +++ b/xinference/model/audio/custom.py @@ -83,15 +83,17 @@ def get_user_defined_audios() -> List[CustomAudioModelFamilyV1]: def register_audio(model_spec: CustomAudioModelFamilyV1, persist: bool): from ...constants import XINFERENCE_MODEL_DIR from ..utils import is_valid_model_name, is_valid_model_uri - from . import BUILTIN_AUDIO_MODELS + from . import BUILTIN_AUDIO_MODELS, MODELSCOPE_AUDIO_MODELS if not is_valid_model_name(model_spec.model_name): raise ValueError(f"Invalid model name {model_spec.model_name}.") with UD_AUDIO_LOCK: - for model_name in list(BUILTIN_AUDIO_MODELS.keys()) + [ - spec.model_name for spec in UD_AUDIOS - ]: + for model_name in ( + list(BUILTIN_AUDIO_MODELS.keys()) + + list(MODELSCOPE_AUDIO_MODELS.keys()) + + [spec.model_name for spec in UD_AUDIOS] + ): if model_spec.model_name == model_name: raise ValueError( f"Model name conflicts with existing model {model_spec.model_name}" diff --git a/xinference/model/audio/model_spec_modelscope.json b/xinference/model/audio/model_spec_modelscope.json new file mode 100644 index 0000000000..564be61090 --- /dev/null +++ b/xinference/model/audio/model_spec_modelscope.json @@ -0,0 +1,20 @@ +[ + { + "model_name": "whisper-large-v3", + "model_family": "whisper", + "model_hub": "modelscope", + "model_id": "AI-ModelScope/whisper-large-v3", + "model_revision": "master", + "ability": "audio-to-text", + "multilingual": true + }, + { + "model_name": "ChatTTS", + "model_family": "ChatTTS", + "model_hub": "modelscope", + "model_id": "pzc163/chatTTS", + "model_revision": "master", + "ability": "text-to-audio", + "multilingual": true + } +] From db69f4afcd1660a4edb1ecbe1a432bdcee51326e Mon Sep 17 00:00:00 2001 From: Luke Wang <44051798+LukeWang-Plus@users.noreply.github.com> Date: Tue, 11 Jun 2024 18:32:15 +0800 Subject: [PATCH 135/298] BUG: fix XINFERENCE_MODEL_SRC behavior (#1616) --- xinference/model/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xinference/model/utils.py b/xinference/model/utils.py index 278d33e3ae..90acec51e1 100644 --- a/xinference/model/utils.py +++ b/xinference/model/utils.py @@ -42,8 +42,8 @@ def is_locale_chinese_simplified() -> bool: def download_from_modelscope() -> bool: - if os.environ.get(XINFERENCE_ENV_MODEL_SRC) == "modelscope": - return True + if os.environ.get(XINFERENCE_ENV_MODEL_SRC): + return os.environ.get(XINFERENCE_ENV_MODEL_SRC) == "modelscope" elif is_locale_chinese_simplified(): return True else: From d9f155ad59413a3c257c1ec8f0d3fc580d212b1c Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Thu, 13 Jun 2024 14:02:28 +0800 Subject: [PATCH 136/298] Remove selected cache models (#1613) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/api/restful_api.py | 72 +++++++++++++-- xinference/client/restful/restful_client.py | 79 +++++++++++++++-- xinference/client/tests/test_client.py | 30 ++++++- xinference/core/cache_tracker.py | 76 ++++++++++------ xinference/core/supervisor.py | 97 ++++++++++++++++----- xinference/core/worker.py | 70 ++++++++++++++- xinference/deploy/cmdline.py | 88 ++++++++++++++++++- xinference/deploy/test/test_cmdline.py | 29 +++--- 8 files changed, 464 insertions(+), 77 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 7fc0431caf..66cca36dbe 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -522,11 +522,31 @@ def serve(self, logging_conf: Optional[dict] = None): ), ) self._router.add_api_route( - "/v1/cached/list_cached_models", + "/v1/cache/models", self.list_cached_models, methods=["GET"], dependencies=( - [Security(self._auth_service, scopes=["models:list"])] + [Security(self._auth_service, scopes=["cache:list"])] + if self.is_authenticated() + else None + ), + ) + self._router.add_api_route( + "/v1/cache/models/files", + self.list_model_files, + methods=["GET"], + dependencies=( + [Security(self._auth_service, scopes=["cache:list"])] + if self.is_authenticated() + else None + ), + ) + self._router.add_api_route( + "/v1/cache/models", + self.confirm_and_remove_model, + methods=["DELETE"], + dependencies=( + [Security(self._auth_service, scopes=["cache:delete"])] if self.is_authenticated() else None ), @@ -1555,10 +1575,17 @@ async def get_model_registrations( logger.error(e, exc_info=True) raise HTTPException(status_code=500, detail=str(e)) - async def list_cached_models(self) -> JSONResponse: + async def list_cached_models( + self, model_name: str = Query(None), worker_ip: str = Query(None) + ) -> JSONResponse: try: - data = await (await self._get_supervisor_ref()).list_cached_models() - return JSONResponse(content=data) + data = await (await self._get_supervisor_ref()).list_cached_models( + model_name, worker_ip + ) + resp = { + "list": data, + } + return JSONResponse(content=resp) except ValueError as re: logger.error(re, exc_info=True) raise HTTPException(status_code=400, detail=str(re)) @@ -1623,6 +1650,41 @@ async def get_cluster_version(self) -> JSONResponse: logger.error(e, exc_info=True) raise HTTPException(status_code=500, detail=str(e)) + async def list_model_files( + self, model_version: str = Query(None), worker_ip: str = Query(None) + ) -> JSONResponse: + try: + data = await (await self._get_supervisor_ref()).list_deletable_models( + model_version, worker_ip + ) + response = { + "model_version": model_version, + "worker_ip": worker_ip, + "paths": data, + } + return JSONResponse(content=response) + except ValueError as re: + logger.error(re, exc_info=True) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + + async def confirm_and_remove_model( + self, model_version: str = Query(None), worker_ip: str = Query(None) + ) -> JSONResponse: + try: + res = await (await self._get_supervisor_ref()).confirm_and_remove_model( + model_version=model_version, worker_ip=worker_ip + ) + return JSONResponse(content={"result": res}) + except ValueError as re: + logger.error(re, exc_info=True) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + def run( supervisor_address: str, diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 428ba65e2a..2230bab848 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -1145,13 +1145,17 @@ def list_model_registrations(self, model_type: str) -> List[Dict[str, Any]]: response_data = response.json() return response_data - def list_cached_models(self) -> List[Dict[Any, Any]]: + def list_cached_models( + self, model_name: Optional[str] = None, worker_ip: Optional[str] = None + ) -> List[Dict[Any, Any]]: """ Get a list of cached models. - Parameters ---------- - None + model_name: Optional[str] + The name of model. + worker_ip: Optional[str] + Specify the worker ip where the model is located in a distributed scenario. Returns ------- @@ -1164,16 +1168,81 @@ def list_cached_models(self) -> List[Dict[Any, Any]]: Raised when the request fails, including the reason for the failure. """ - url = f"{self.base_url}/v1/cached/list_cached_models" - response = requests.get(url, headers=self._headers) + url = f"{self.base_url}/v1/cache/models" + params = { + "model_name": model_name, + "worker_ip": worker_ip, + } + response = requests.get(url, headers=self._headers, params=params) if response.status_code != 200: raise RuntimeError( f"Failed to list cached model, detail: {_get_error_string(response)}" ) + response_data = response.json() + response_data = response_data.get("list") + return response_data + + def list_deletable_models( + self, model_version: str, worker_ip: Optional[str] = None + ) -> Dict[str, Any]: + """ + Get the cached models with the model path cached on the server. + Parameters + ---------- + model_version: str + The version of the model. + worker_ip: Optional[str] + Specify the worker ip where the model is located in a distributed scenario. + Returns + ------- + Dict[str, Dict[str,str]]] + Dictionary with keys "model_name" and values model_file_location. + """ + url = f"{self.base_url}/v1/cache/models/files" + params = { + "model_version": model_version, + "worker_ip": worker_ip, + } + response = requests.get(url, headers=self._headers, params=params) + if response.status_code != 200: + raise RuntimeError( + f"Failed to get paths by model name, detail: {_get_error_string(response)}" + ) + response_data = response.json() return response_data + def confirm_and_remove_model( + self, model_version: str, worker_ip: Optional[str] = None + ) -> bool: + """ + Remove the cached models with the model name cached on the server. + Parameters + ---------- + model_version: str + The version of the model. + worker_ip: Optional[str] + Specify the worker ip where the model is located in a distributed scenario. + Returns + ------- + str + The response of the server. + """ + url = f"{self.base_url}/v1/cache/models" + params = { + "model_version": model_version, + "worker_ip": worker_ip, + } + response = requests.delete(url, headers=self._headers, params=params) + if response.status_code != 200: + raise RuntimeError( + f"Failed to remove cached models, detail: {_get_error_string(response)}" + ) + + response_data = response.json() + return response_data.get("result", False) + def get_model_registration( self, model_type: str, model_name: str ) -> Dict[str, Any]: diff --git a/xinference/client/tests/test_client.py b/xinference/client/tests/test_client.py index 2fce98ae04..a89b54f4b1 100644 --- a/xinference/client/tests/test_client.py +++ b/xinference/client/tests/test_client.py @@ -171,8 +171,36 @@ def _check(stream=False): def test_list_cached_models(setup): endpoint, _ = setup client = RESTfulClient(endpoint) + res = client.list_cached_models() + assert len(res) > 0 - assert len(client.list_cached_models()) == 2 + +@pytest.mark.skipif(os.name == "nt", reason="Skip windows") +def test_list_deletable_models(setup): + endpoint, local_host = setup + client = RESTfulClient(endpoint) + response = client.list_deletable_models("orca--3B--ggmlv3--q4_0") + paths = response.get("paths", []) + + expected_path = os.path.join( + os.environ["HOME"], + ".xinference", + "cache", + "orca-ggmlv3-3b", + "orca-mini-3b.ggmlv3.q4_0.bin", + ) + + normalized_expected_path = os.path.normpath(expected_path) + + assert normalized_expected_path in paths + + +@pytest.mark.skipif(os.name == "nt", reason="Skip windows") +def test_remove_cached_models(setup): + endpoint, local_host = setup + client = RESTfulClient(endpoint) + responses = client.confirm_and_remove_model("orca--3B--ggmlv3--q4_0") + assert responses def test_RESTful_client_for_embedding(setup): diff --git a/xinference/core/cache_tracker.py b/xinference/core/cache_tracker.py index ae2ab28352..7f6975d4bc 100644 --- a/xinference/core/cache_tracker.py +++ b/xinference/core/cache_tracker.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import os from logging import getLogger from typing import Any, Dict, List, Optional @@ -102,33 +101,54 @@ def get_model_versions(self, model_name: str) -> List[Dict]: def get_model_version_count(self, model_name: str) -> int: return len(self.get_model_versions(model_name)) - def list_cached_models(self) -> List[Dict[Any, Any]]: + def list_cached_models( + self, worker_ip: str, model_name: Optional[str] = None + ) -> List[Dict[Any, Any]]: cached_models = [] - for model_name, model_versions in self._model_name_to_version_info.items(): - for version_info in model_versions: - cache_status = version_info.get("cache_status", None) - if cache_status == True: - ret = version_info.copy() - ret["model_name"] = model_name + for name, versions in self._model_name_to_version_info.items(): + # only return assigned cached model if model_name is not none + # else return all cached model + if model_name and model_name != name: + continue + for version_info in versions: + cache_status = version_info.get("cache_status", False) + # search cached model + if cache_status: + res = version_info.copy() + res["model_name"] = name + paths = res.get("model_file_location", {}) + # only return assigned worker's device path + if worker_ip in paths.keys(): + res["model_file_location"] = paths[worker_ip] + cached_models.append(res) + return cached_models - re_dict = version_info.get("model_file_location", None) - if re_dict is not None and isinstance(re_dict, dict): - if re_dict: - actor_ip_address, path = next(iter(re_dict.items())) - else: - raise ValueError("The dictionary is empty.") - else: - raise ValueError("re_dict must be a non-empty dictionary.") + def list_deletable_models(self, model_version: str, worker_ip: str) -> str: + model_file_location = "" + for model, model_versions in self._model_name_to_version_info.items(): + for version_info in model_versions: + # search assign model version + if model_version == version_info.get("model_version", None): + # check if exist + if version_info.get("cache_status", False): + paths = version_info.get("model_file_location", {}) + # only return assigned worker's device path + if worker_ip in paths.keys(): + model_file_location = paths[worker_ip] + return model_file_location - ret["actor_ip_address"] = actor_ip_address - ret["path"] = path - if os.path.isdir(path): - files = os.listdir(path) - resolved_file = os.path.realpath(os.path.join(path, files[0])) - if resolved_file: - ret["real_path"] = os.path.dirname(resolved_file) - else: - ret["real_path"] = os.path.realpath(path) - cached_models.append(ret) - cached_models = sorted(cached_models, key=lambda x: x["model_name"]) - return cached_models + def confirm_and_remove_model(self, model_version: str, worker_ip: str): + # find remove path + rm_path = self.list_deletable_models(model_version, worker_ip) + # search _model_name_to_version_info if exist this path, and delete + for model, model_versions in self._model_name_to_version_info.items(): + for version_info in model_versions: + # check if exist + if version_info.get("cache_status", False): + paths = version_info.get("model_file_location", {}) + # only delete assigned worker's device path + if worker_ip in paths.keys() and rm_path == paths[worker_ip]: + del paths[worker_ip] + # if path is empty, update cache status + if not paths: + version_info["cache_status"] = False diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 5df3512d90..4132cb73e0 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -982,32 +982,31 @@ def is_local_deployment(self) -> bool: ) @log_async(logger=logger) - async def list_cached_models(self) -> List[Dict[str, Any]]: + async def list_cached_models( + self, model_name: Optional[str] = None, worker_ip: Optional[str] = None + ) -> List[Dict[str, Any]]: + target_ip_worker_ref = ( + self._get_worker_ref_by_ip(worker_ip) if worker_ip is not None else None + ) + if ( + worker_ip is not None + and not self.is_local_deployment() + and target_ip_worker_ref is None + ): + raise ValueError(f"Worker ip address {worker_ip} is not in the cluster.") + + # search assigned worker and return + if target_ip_worker_ref: + cached_models = await target_ip_worker_ref.list_cached_models(model_name) + cached_models = sorted(cached_models, key=lambda x: x["model_name"]) + return cached_models + + # search all worker cached_models = [] for worker in self._worker_address_to_worker.values(): - ret = await worker.list_cached_models() - for model_version in ret: - model_name = model_version.get("model_name", None) - model_format = model_version.get("model_format", None) - model_size_in_billions = model_version.get( - "model_size_in_billions", None - ) - quantizations = model_version.get("quantization", None) - actor_ip_address = model_version.get("actor_ip_address", None) - path = model_version.get("path", None) - real_path = model_version.get("real_path", None) - - cache_entry = { - "model_name": model_name, - "model_format": model_format, - "model_size_in_billions": model_size_in_billions, - "quantizations": quantizations, - "path": path, - "Actor IP Address": actor_ip_address, - "real_path": real_path, - } - - cached_models.append(cache_entry) + res = await worker.list_cached_models(model_name) + cached_models.extend(res) + cached_models = sorted(cached_models, key=lambda x: x["model_name"]) return cached_models @log_async(logger=logger) @@ -1083,6 +1082,56 @@ async def report_worker_status( worker_status.update_time = time.time() worker_status.status = status + async def list_deletable_models( + self, model_version: str, worker_ip: Optional[str] = None + ) -> List[str]: + target_ip_worker_ref = ( + self._get_worker_ref_by_ip(worker_ip) if worker_ip is not None else None + ) + if ( + worker_ip is not None + and not self.is_local_deployment() + and target_ip_worker_ref is None + ): + raise ValueError(f"Worker ip address {worker_ip} is not in the cluster.") + + ret = [] + if target_ip_worker_ref: + ret = await target_ip_worker_ref.list_deletable_models( + model_version=model_version, + ) + return ret + + for worker in self._worker_address_to_worker.values(): + path = await worker.list_deletable_models(model_version=model_version) + ret.extend(path) + return ret + + async def confirm_and_remove_model( + self, model_version: str, worker_ip: Optional[str] = None + ) -> bool: + target_ip_worker_ref = ( + self._get_worker_ref_by_ip(worker_ip) if worker_ip is not None else None + ) + if ( + worker_ip is not None + and not self.is_local_deployment() + and target_ip_worker_ref is None + ): + raise ValueError(f"Worker ip address {worker_ip} is not in the cluster.") + + if target_ip_worker_ref: + ret = await target_ip_worker_ref.confirm_and_remove_model( + model_version=model_version, + ) + return ret + ret = True + for worker in self._worker_address_to_worker.values(): + ret = ret and await worker.confirm_and_remove_model( + model_version=model_version, + ) + return ret + @staticmethod def record_metrics(name, op, kwargs): record_metrics(name, op, kwargs) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 677e5ba535..4f79393685 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -16,6 +16,7 @@ import os import platform import queue +import shutil import signal import threading import time @@ -786,8 +787,73 @@ async def _periodical_report_status(self): except asyncio.CancelledError: # pragma: no cover break - async def list_cached_models(self) -> List[Dict[Any, Any]]: - return self._cache_tracker_ref.list_cached_models() + async def list_cached_models( + self, model_name: Optional[str] = None + ) -> List[Dict[Any, Any]]: + lists = await self._cache_tracker_ref.list_cached_models( + self.address, model_name + ) + cached_models = [] + for list in lists: + cached_model = { + "model_name": list.get("model_name"), + "model_size_in_billions": list.get("model_size_in_billions"), + "model_format": list.get("model_format"), + "quantization": list.get("quantization"), + "model_version": list.get("model_version"), + } + path = list.get("model_file_location") + cached_model["path"] = path + # parsing soft links + if os.path.isdir(path): + files = os.listdir(path) + # dir has files + if files: + resolved_file = os.path.realpath(os.path.join(path, files[0])) + if resolved_file: + cached_model["real_path"] = os.path.dirname(resolved_file) + else: + cached_model["real_path"] = os.path.realpath(path) + cached_model["actor_ip_address"] = self.address + cached_models.append(cached_model) + return cached_models + + async def list_deletable_models(self, model_version: str) -> List[str]: + paths = set() + path = await self._cache_tracker_ref.list_deletable_models( + model_version, self.address + ) + if os.path.isfile(path): + path = os.path.dirname(path) + + if os.path.isdir(path): + files = os.listdir(path) + paths.update([os.path.join(path, file) for file in files]) + # search real path + if paths: + paths.update([os.path.realpath(path) for path in paths]) + + return list(paths) + + async def confirm_and_remove_model(self, model_version: str) -> bool: + paths = await self.list_deletable_models(model_version) + for path in paths: + try: + if os.path.islink(path): + os.unlink(path) + elif os.path.isfile(path): + os.remove(path) + elif os.path.isdir(path): + shutil.rmtree(path) + else: + logger.debug(f"{path} is not a valid path.") + except Exception as e: + logger.error(f"Fail to delete {path} with error:{e}.") + return False + await self._cache_tracker_ref.confirm_and_remove_model( + model_version, self.address + ) + return True @staticmethod def record_metrics(name, op, kwargs): diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 0b6fc4b3b7..56b6a61182 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -577,6 +577,18 @@ def list_model_registrations( type=str, help="Xinference endpoint.", ) +@click.option( + "--model_name", + "-n", + type=str, + help="Provide the name of the models to be removed.", +) +@click.option( + "--worker-ip", + default=None, + type=str, + help="Specify which worker this model runs on by ip, for distributed situation.", +) @click.option( "--api-key", "-ak", @@ -587,6 +599,8 @@ def list_model_registrations( def list_cached_models( endpoint: Optional[str], api_key: Optional[str], + model_name: Optional[str], + worker_ip: Optional[str], ): from tabulate import tabulate @@ -595,10 +609,13 @@ def list_cached_models( if api_key is None: client._set_token(get_stored_token(endpoint, client)) - cached_models = client.list_cached_models() + cached_models = client.list_cached_models(model_name, worker_ip) + if not cached_models: + print("There are no cache files.") + return + headers = list(cached_models[0].keys()) print("cached_model: ") - headers = list(cached_models[0].keys()) table_data = [] for model in cached_models: row_data = [ @@ -608,6 +625,73 @@ def list_cached_models( print(tabulate(table_data, headers=headers, tablefmt="pretty")) +@cli.command("remove-cache", help="Remove selected cached models in Xinference.") +@click.option( + "--endpoint", + "-e", + type=str, + help="Xinference endpoint.", +) +@click.option( + "--model_version", + "-n", + type=str, + help="Provide the version of the models to be removed.", +) +@click.option( + "--worker-ip", + default=None, + type=str, + help="Specify which worker this model runs on by ip, for distributed situation.", +) +@click.option( + "--api-key", + "-ak", + default=None, + type=str, + help="Api-Key for access xinference api with authorization.", +) +@click.option("--check", is_flag=True, help="Confirm the deletion of the cache.") +def remove_cache( + endpoint: Optional[str], + model_version: str, + api_key: Optional[str], + check: bool, + worker_ip: Optional[str] = None, +): + endpoint = get_endpoint(endpoint) + client = RESTfulClient(base_url=endpoint, api_key=api_key) + if api_key is None: + client._set_token(get_stored_token(endpoint, client)) + + if not check: + response = client.list_deletable_models( + model_version=model_version, worker_ip=worker_ip + ) + paths: List[str] = response.get("paths", []) + if not paths: + click.echo(f"There is no model version named {model_version}.") + return + click.echo(f"Model {model_version} cache directory to be deleted:") + for path in response.get("paths", []): + click.echo(f"{path}") + + if click.confirm("Do you want to proceed with the deletion?", abort=True): + check = True + try: + result = client.confirm_and_remove_model( + model_version=model_version, worker_ip=worker_ip + ) + if result: + click.echo(f"Cache directory {model_version} has been deleted.") + else: + click.echo( + f"Cache directory {model_version} fail to be deleted. Please check the log." + ) + except Exception as e: + click.echo(f"An error occurred while deleting the cache: {e}") + + @cli.command( "launch", help="Launch a model with the Xinference framework with the given parameters.", diff --git a/xinference/deploy/test/test_cmdline.py b/xinference/deploy/test/test_cmdline.py index 0af9805626..ddf76ef8c1 100644 --- a/xinference/deploy/test/test_cmdline.py +++ b/xinference/deploy/test/test_cmdline.py @@ -26,6 +26,7 @@ model_list, model_terminate, register_model, + remove_cache, unregister_model, ) @@ -287,18 +288,26 @@ def test_list_cached_models(setup): result = runner.invoke( list_cached_models, - [ - "--endpoint", - endpoint, - ], + ["--endpoint", endpoint, "--model_name", "orca"], ) - assert result.exit_code == 0 - assert "cached_model: " in result.stdout - - # check if the output is in tabular format assert "model_name" in result.stdout assert "model_format" in result.stdout assert "model_size_in_billions" in result.stdout - assert "quantizations" in result.stdout + assert "quantization" in result.stdout + assert "model_version" in result.stdout assert "path" in result.stdout - assert "Actor IP Address" in result.stdout + assert "actor_ip_address" in result.stdout + + +def test_remove_cache(setup): + endpoint, _ = setup + runner = CliRunner() + + result = runner.invoke( + remove_cache, + ["--endpoint", endpoint, "--model_version", "orca"], + input="y\n", + ) + + assert result.exit_code == 0 + assert "Cache directory orca has been deleted." From c51fae5e5fef55912f57d158a2fa1941830175cc Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 13 Jun 2024 15:53:52 +0800 Subject: [PATCH 137/298] ENH: Supports `generate` interface for continuous batching (#1621) --- xinference/core/model.py | 96 +++++++++-------- xinference/core/scheduler.py | 50 ++++++--- xinference/model/llm/pytorch/core.py | 134 ++++++++++++++++-------- xinference/model/llm/pytorch/qwen_vl.py | 2 +- xinference/model/llm/pytorch/utils.py | 41 +++++--- 5 files changed, 208 insertions(+), 115 deletions(-) diff --git a/xinference/core/model.py b/xinference/core/model.py index fb33aab271..ef85295dea 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -264,12 +264,13 @@ def is_vllm_backend(self) -> bool: return isinstance(self._model, VLLMModel) def allow_batching(self) -> bool: - from ..model.llm.pytorch.core import PytorchChatModel + from ..model.llm.pytorch.core import PytorchChatModel, PytorchModel return ( XINFERENCE_TRANSFORMERS_ENABLE_BATCHING - and isinstance(self._model, PytorchChatModel) - and self._model.__class__.__name__ == PytorchChatModel.__name__ + and isinstance(self._model, PytorchModel) + and self._model.__class__.__name__ + in (PytorchChatModel.__name__, PytorchModel.__name__) ) async def load(self): @@ -393,18 +394,24 @@ async def _call_wrapper(self, fn: Callable, *args, **kwargs): @request_limit @xo.generator async def generate(self, prompt: str, *args, **kwargs): - if hasattr(self._model, "generate"): - return await self._call_wrapper( - self._model.generate, prompt, *args, **kwargs - ) - if hasattr(self._model, "async_generate"): - return await self._call_wrapper( - self._model.async_generate, prompt, *args, **kwargs + if self.allow_batching(): + return await self.handle_batching_request( + prompt, "generate", *args, **kwargs ) - raise AttributeError(f"Model {self._model.model_spec} is not for generate.") + else: + if hasattr(self._model, "generate"): + return await self._call_wrapper( + self._model.generate, prompt, *args, **kwargs + ) + if hasattr(self._model, "async_generate"): + return await self._call_wrapper( + self._model.async_generate, prompt, *args, **kwargs + ) + raise AttributeError(f"Model {self._model.model_spec} is not for generate.") + @staticmethod async def _queue_consumer( - self, queue: Queue, timeout: Optional[float] = None + queue: Queue, timeout: Optional[float] = None ) -> AsyncIterator[Any]: from .scheduler import ( XINFERENCE_STREAMING_ABORT_FLAG, @@ -429,9 +436,38 @@ async def _queue_consumer( yield res @staticmethod - def get_stream_from_args(*args) -> bool: - assert args[2] is None or isinstance(args[2], dict) - return False if args[2] is None else args[2].get("stream", False) + def _get_stream_from_args(ability: str, *args) -> bool: + if ability == "chat": + assert args[2] is None or isinstance(args[2], dict) + return False if args[2] is None else args[2].get("stream", False) + else: + assert args[0] is None or isinstance(args[0], dict) + return False if args[0] is None else args[0].get("stream", False) + + async def handle_batching_request(self, prompt: str, ability: str, *args, **kwargs): + stream = self._get_stream_from_args(ability, *args) + assert self._scheduler_ref is not None + if stream: + assert self._scheduler_ref is not None + queue: Queue[Any] = Queue() + ret = self._queue_consumer(queue) + await self._scheduler_ref.add_request(prompt, queue, *args, **kwargs) + gen = self._to_json_async_gen(ret) + self._current_generator = weakref.ref(gen) + return gen + else: + from .scheduler import XINFERENCE_NON_STREAMING_ABORT_FLAG + + assert self._loop is not None + future = ConcurrentFuture() + await self._scheduler_ref.add_request(prompt, future, *args, **kwargs) + fut = asyncio.wrap_future(future, loop=self._loop) + result = await fut + if result == XINFERENCE_NON_STREAMING_ABORT_FLAG: + raise RuntimeError( + f"This request has been cancelled by another `abort_request` request." + ) + return await asyncio.to_thread(json_dumps, result) @log_async(logger=logger) @request_limit @@ -441,33 +477,9 @@ async def chat(self, prompt: str, *args, **kwargs): response = None try: if self.allow_batching(): - stream = self.get_stream_from_args(*args) - assert self._scheduler_ref is not None - if stream: - assert self._scheduler_ref is not None - queue: Queue[Any] = Queue() - ret = self._queue_consumer(queue) - await self._scheduler_ref.add_request( - prompt, queue, *args, **kwargs - ) - gen = self._to_json_async_gen(ret) - self._current_generator = weakref.ref(gen) - return gen - else: - from .scheduler import XINFERENCE_NON_STREAMING_ABORT_FLAG - - assert self._loop is not None - future = ConcurrentFuture() - await self._scheduler_ref.add_request( - prompt, future, *args, **kwargs - ) - fut = asyncio.wrap_future(future, loop=self._loop) - result = await fut - if result == XINFERENCE_NON_STREAMING_ABORT_FLAG: - raise RuntimeError( - f"This request has been cancelled by another `abort_request` request." - ) - return await asyncio.to_thread(json_dumps, result) + return await self.handle_batching_request( + prompt, "chat", *args, **kwargs + ) else: if hasattr(self._model, "chat"): response = await self._call_wrapper( diff --git a/xinference/core/scheduler.py b/xinference/core/scheduler.py index cacab8461f..81c130dbd9 100644 --- a/xinference/core/scheduler.py +++ b/xinference/core/scheduler.py @@ -15,6 +15,7 @@ import asyncio import functools import logging +import uuid from collections import deque from enum import Enum from typing import List, Optional, Set @@ -50,9 +51,9 @@ def __init__(self, prompt, future_or_queue, is_prefill, *args, **kwargs): self._new_tokens = [] # kv_cache used in decode phase self._kv_cache = None - # use passed args from `chat` interface + # use passed args from upstream interface self._inference_args = args - # use passed kwargs from `chat` interface, basically not used for now + # use passed kwargs from upstream interface, basically not used for now self._inference_kwargs = kwargs # should this request be stopped self._stopped = False @@ -63,6 +64,8 @@ def __init__(self, prompt, future_or_queue, is_prefill, *args, **kwargs): self._aborted = False # sanitized generate config self._sanitized_generate_config = None + # Chunk id for results. In stream mode, all the chunk ids should be same. + self._stream_chunk_id = str(uuid.uuid4()) # Use in stream mode self.last_output_length = 0 # inference results, @@ -81,19 +84,26 @@ def __init__(self, prompt, future_or_queue, is_prefill, *args, **kwargs): self._check_args() def _check_args(self): - assert len(self._inference_args) == 3 - # system prompt - assert self._inference_args[0] is None or isinstance( - self._inference_args[0], str - ) - # chat history - assert self._inference_args[1] is None or isinstance( - self._inference_args[1], list - ) - # generate config - assert self._inference_args[2] is None or isinstance( - self._inference_args[2], dict - ) + # chat + if len(self._inference_args) == 3: + # system prompt + assert self._inference_args[0] is None or isinstance( + self._inference_args[0], str + ) + # chat history + assert self._inference_args[1] is None or isinstance( + self._inference_args[1], list + ) + # generate config + assert self._inference_args[2] is None or isinstance( + self._inference_args[2], dict + ) + else: # generate + assert len(self._inference_args) == 1 + # generate config + assert self._inference_args[0] is None or isinstance( + self._inference_args[0], dict + ) @property def prompt(self): @@ -148,7 +158,11 @@ def append_new_token(self, token: int): @property def generate_config(self): - return self._inference_args[2] + return ( + self._inference_args[2] + if len(self._inference_args) == 3 + else self._inference_args[0] + ) @property def sanitized_generate_config(self): @@ -174,6 +188,10 @@ def finish_reason(self): def finish_reason(self, value: Optional[str]): self._finish_reason = value + @property + def chunk_id(self): + return self._stream_chunk_id + @property def stream(self) -> bool: return ( diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index a0b43bc4b3..9129949f38 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -15,6 +15,7 @@ import json import logging import os +from functools import lru_cache from typing import Iterable, Iterator, List, Optional, Union from ....core.scheduler import InferenceRequest @@ -28,6 +29,7 @@ ChatCompletionChunk, ChatCompletionMessage, Completion, + CompletionChoice, CompletionChunk, CreateCompletionTorch, Embedding, @@ -366,6 +368,90 @@ def generator_wrapper( else: return generator_wrapper(prompt, generate_config) + @lru_cache + def get_context_len(self): + return get_context_length(self._model.config) + + def get_max_num_seqs(self) -> int: + return self._pytorch_model_config.get("max_num_seqs") # type: ignore + + def prepare_batch_inference(self, req_list: List[InferenceRequest]): + # check some parameters + for r in req_list: + if r.sanitized_generate_config is None: + r.sanitized_generate_config = self._sanitize_generate_config( + r.generate_config + ) + if r.is_prefill: + # check some generate params + max_src_len = get_max_src_len(self.get_context_len(), r) # type: ignore + if max_src_len < 0: + r.stopped = True + r.error_msg = "Max tokens exceeds model's max length" + continue + if r.stream_interval <= 0: + r.stopped = True + r.error_msg = "`stream_interval` must be greater than 0" + continue + stop_str = r.sanitized_generate_config.get("stop", None) + if stop_str and ( + not (isinstance(stop_str, str) or isinstance(stop_str, Iterable)) + ): + r.stopped = True + r.error_msg = "Invalid `stop` field type" + continue + + def handle_batch_inference_results(self, req_list: List[InferenceRequest]): + for req in req_list: + if req.error_msg is None: + # nothing need handle for non-stream case + if req.stream: + results = [] + for i, c in enumerate(req.completion): + if c == "<bos_stream>": + chunk = req.completion[i + 1] + results.append( + CompletionChunk( + id=chunk["id"], + object=chunk["object"], + created=chunk["created"], + model=chunk["model"], + choices=[ + CompletionChoice( + text="", + index=0, + logprobs=None, + finish_reason=None, + ) + ], + ) + ) + continue + elif c == "<eos_stream>": + break + else: + results.append(c) + + if req.stopped and req.include_usage: + results.append(req.completion[-1]) + req.completion = results + + def batch_inference(self, req_list: List[InferenceRequest]): + from .utils import batch_inference_one_step + + self.prepare_batch_inference(req_list) + context_len = self.get_context_len() + assert isinstance(context_len, int) + batch_inference_one_step( + req_list, + self.model_uid, + self._model, + self._tokenizer, + self._device, + context_len, + ) + self.handle_batch_inference_results(req_list) + def create_embedding(self, input: Union[str, List[str]]) -> Embedding: try: import torch @@ -464,7 +550,6 @@ def __init__( pytorch_model_config, peft_model, ) - self._context_len = None def _sanitize_generate_config( self, @@ -540,7 +625,6 @@ def chat( def load(self): super().load() - self._context_len = get_context_length(self._model.config) def _get_full_prompt(self, prompt, system_prompt, chat_history, tools): assert self.model_family.prompt_style is not None @@ -553,48 +637,14 @@ def _get_full_prompt(self, prompt, system_prompt, chat_history, tools): ) return full_prompt - def get_max_num_seqs(self) -> int: - return self._pytorch_model_config.get("max_num_seqs") # type: ignore - - def batch_inference(self, req_list: List[InferenceRequest]): - from .utils import batch_inference_one_step - + def prepare_batch_inference(self, req_list: List[InferenceRequest]): + super().prepare_batch_inference(req_list) for r in req_list: - if r.sanitized_generate_config is None: - r.sanitized_generate_config = self._sanitize_generate_config( - r.generate_config - ) - if r.is_prefill: - # check some generate params - max_src_len = get_max_src_len(self._context_len, r) # type: ignore - if max_src_len < 0: - r.stopped = True - r.error_msg = "Max tokens exceeds model's max length" - continue - if r.stream_interval <= 0: - r.stopped = True - r.error_msg = "`stream_interval` must be greater than 0" - continue - stop_str = r.sanitized_generate_config.get("stop", None) - if stop_str and ( - not (isinstance(stop_str, str) or isinstance(stop_str, Iterable)) - ): - r.stopped = True - r.error_msg = "Invalid `stop` field type" - continue - r.full_prompt = self._get_full_prompt( - r.prompt, r.system_prompt, r.chat_history, None - ) + r.full_prompt = self._get_full_prompt( + r.prompt, r.system_prompt, r.chat_history, None + ) - assert isinstance(self._context_len, int) - batch_inference_one_step( - req_list, - self.model_uid, - self._model, - self._tokenizer, - self._device, - self._context_len, - ) + def handle_batch_inference_results(self, req_list: List[InferenceRequest]): for req in req_list: if req.stream and req.error_msg is None: if req.completion: diff --git a/xinference/model/llm/pytorch/qwen_vl.py b/xinference/model/llm/pytorch/qwen_vl.py index 778738426a..cc9b954715 100644 --- a/xinference/model/llm/pytorch/qwen_vl.py +++ b/xinference/model/llm/pytorch/qwen_vl.py @@ -45,7 +45,7 @@ def __init__(self, *args, **kwargs): def match( cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str ) -> bool: - if "qwen" in model_family.model_name: + if "qwen" in model_family.model_name and "vision" in model_family.model_ability: return True return False diff --git a/xinference/model/llm/pytorch/utils.py b/xinference/model/llm/pytorch/utils.py index 09fe9ee0ed..0462425617 100644 --- a/xinference/model/llm/pytorch/utils.py +++ b/xinference/model/llm/pytorch/utils.py @@ -126,6 +126,7 @@ def generate_stream( stop_str = generate_config.get("stop", None) stop_token_ids = generate_config.get("stop_token_ids", None) or [] stop_token_ids.append(tokenizer.eos_token_id) + chunk_id = str(uuid.uuid4()) logits_processor = prepare_logits_processor( temperature, repetition_penalty, top_p, top_k @@ -289,7 +290,7 @@ def generate_stream( text=output, index=0, logprobs=None, finish_reason=None ) completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=chunk_id, object="text_completion", created=int(time.time()), model=model_uid, @@ -327,7 +328,7 @@ def generate_stream( ) completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=chunk_id, object="text_completion", created=int(time.time()), model=model_uid, @@ -343,7 +344,7 @@ def generate_stream( if include_usage: completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=chunk_id, object="text_completion", created=int(time.time()), model=model_uid, @@ -390,6 +391,7 @@ def generate_stream_falcon( stop_str = generate_config.get("stop", None) stop_token_ids = generate_config.get("stop_token_ids", None) or [] stop_token_ids.append(tokenizer.eos_token_id) + chunk_id = str(uuid.uuid4()) inputs = tokenizer(prompt, return_tensors="pt").to(model.device) input_ids = inputs["input_ids"] @@ -473,7 +475,7 @@ def generate_stream_falcon( text=output, index=0, logprobs=None, finish_reason=None ) completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=chunk_id, object="text_completion", created=int(time.time()), model=model_uid, @@ -500,7 +502,7 @@ def generate_stream_falcon( text=output, index=0, logprobs=None, finish_reason=finish_reason ) completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=chunk_id, object="text_completion", created=int(time.time()), model=model_uid, @@ -516,7 +518,7 @@ def generate_stream_falcon( if include_usage: completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=chunk_id, object="text_completion", created=int(time.time()), model=model_uid, @@ -586,6 +588,7 @@ def get_max_src_len(context_len: int, r: InferenceRequest) -> int: def _get_completion_chunk( output: str, + chunk_id: str, finish_reason: Optional[str], model_uid: str, r: InferenceRequest, @@ -601,7 +604,7 @@ def _get_completion_chunk( else [] ) completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=chunk_id, object="text_completion", created=int(time.time()), model=model_uid, @@ -617,14 +620,18 @@ def _get_completion_chunk( def _get_completion( - output: str, finish_reason: Optional[str], model_uid: str, r: InferenceRequest + output: str, + chunk_id: str, + finish_reason: Optional[str], + model_uid: str, + r: InferenceRequest, ): completion_choice = CompletionChoice( text=output, index=0, logprobs=None, finish_reason=finish_reason ) completion_chunk = CompletionChunk( - id=str(uuid.uuid1()), + id=chunk_id, object="text_completion", created=int(time.time()), model=model_uid, @@ -701,7 +708,7 @@ def _batch_inference_one_step_internal( decode_reqs = [] for r in valid_req_list: if r.is_prefill: - prompts.append(r.full_prompt) + prompts.append(r.full_prompt if r.full_prompt is not None else r.prompt) prefill_reqs.append(r) else: decode_reqs.append(r) @@ -846,7 +853,7 @@ def _batch_inference_one_step_internal( r.last_output_length += len(output) completion_chunk = _get_completion_chunk( - output, r.finish_reason, model_uid, r, False + output, r.chunk_id, r.finish_reason, model_uid, r, False ) r.completion.append(completion_chunk) if r.stopped: @@ -859,7 +866,7 @@ def _batch_inference_one_step_internal( if r.stopped and _i == decode_round - 1 and include_usage: r.completion.append( _get_completion_chunk( - "", r.finish_reason, model_uid, r, True + "", r.chunk_id, r.finish_reason, model_uid, r, True ) ) else: @@ -878,7 +885,9 @@ def _batch_inference_one_step_internal( if r not in output_mapping else output_mapping[r] ) - completion = _get_completion(outputs, r.finish_reason, model_uid, r) + completion = _get_completion( + outputs, r.chunk_id, r.finish_reason, model_uid, r + ) r.completion = [completion] e_time = time.time() @@ -911,4 +920,8 @@ def batch_inference_one_step( os._exit(1) except Exception as e: logger.exception(f"Internal error for batch inference: {e}.") - # TODO: handle this + # If internal error happens, just skip all the requests in this batch. + # If not handle here, the client will hang. + for r in req_list: + r.stopped = True + r.error_msg = str(e) From 7b626c1513f7b663ac4566525619127593ef510d Mon Sep 17 00:00:00 2001 From: Hexiao Zhang <731931282@qq.com> Date: Fri, 14 Jun 2024 03:19:25 +0800 Subject: [PATCH 138/298] BUG: Filtering Step for Streaming Responses to Qwen's Tool Calls when using vLLM (#1598) --- .../model/llm/tests/test_stream_options.py | 159 ++++++++++++++++++ xinference/model/llm/utils.py | 19 ++- xinference/model/llm/vllm/core.py | 14 +- 3 files changed, 179 insertions(+), 13 deletions(-) diff --git a/xinference/model/llm/tests/test_stream_options.py b/xinference/model/llm/tests/test_stream_options.py index f675f66d59..c114920f8c 100644 --- a/xinference/model/llm/tests/test_stream_options.py +++ b/xinference/model/llm/tests/test_stream_options.py @@ -918,3 +918,162 @@ async def test_openai_stream_options_vllm(setup): # usage assert not result3[-1].choices assert result3[-1].usage + + +@pytest.mark.asyncio +@pytest.mark.skip(reason="Too large model to be tested") +async def test_openai_stream_tools_vllm(setup): + import json + + endpoint, _ = setup + url = f"{endpoint}/v1/models" + os.environ.get(XINFERENCE_ENV_MODEL_SRC, "modelscope") + + # list + response = requests.get(url) + response_data = response.json() + assert len(response_data["data"]) == 0 + + # launch + payload = { + "model_uid": "test_restful_api", + "model_engine": "vLLM", + "model_name": "qwen-chat", + "model_size_in_billions": "7", + "quantization": "none", + "model_format": "pytorch", + } + + response = requests.post(url, json=payload) + response_data = response.json() + model_uid_res = response_data["model_uid"] + assert model_uid_res == "test_restful_api" + + def get_current_weather(location: str, unit="fahrenheit"): + """Get the current weather in a given location""" + if "tokyo" in location.lower(): + return json.dumps({"location": "Tokyo", "temperature": "10", "unit": unit}) + else: + return json.dumps({"location": location, "temperature": "unknown"}) + + def handle_tools_response(messages, tool_calls): + for tool_call in tool_calls: + function_name = tool_call.function.name + function_to_call = get_current_weather + function_args = json.loads(tool_call.function.arguments) + function_response = function_to_call( + location=function_args.get("location"), + unit=function_args.get("unit"), + ) + messages.append( + { + "tool_call_id": tool_call.id, + "role": "tool", + "name": function_name, + "content": function_response, + } + ) + + # create conversation with tool call + messages = [ + { + "role": "user", + "content": "What's the weather like in tokyo? Use tools to answer.", + } + ] + tools = [ + { + "type": "function", + "function": { + "name": "get_current_weather", + "description": "Get the current weather in a given location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA", + }, + "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}, + }, + "required": ["location"], + }, + }, + } + ] + + if version.parse(openai.__version__) < version.parse("1.0"): + openai.api_key = "" + openai.api_base = f"{endpoint}/v1" + openai_chat_completion = openai.ChatCompletion.acreate + stream_chunk_type_name = "OpenAIObject" + response_type_name = "OpenAIObject" + else: + client = openai.AsyncClient(api_key="not empty", base_url=f"{endpoint}/v1") + openai_chat_completion = client.chat.completions.create + stream_chunk_type_name = "ChatCompletionChunk" + response_type_name = "ChatCompletion" + + # Step 1: Get the initial response with stream=True + result_stream_initial = [] + for chunk in openai_chat_completion( + messages=messages, + model=model_uid_res, + stream=True, + tools=tools, + ): + result_stream_initial.append(chunk) + + assert result_stream_initial + assert type(result_stream_initial[0]).__name__ == stream_chunk_type_name + + # Simulate the tool calls for the initial stream response + tool_calls = result_stream_initial[-1].choices[0].delta.tool_calls + assert tool_calls + handle_tools_response(messages, tool_calls) + + # Step 2: Get the final response after tool calls with stream=True + result_stream_final = [] + for chunk in openai_chat_completion( + messages=messages, + model=model_uid_res, + stream=True, + ): + result_stream_final.append(chunk) + + assert result_stream_final + assert type(result_stream_final[0]).__name__ == stream_chunk_type_name + + # Combine streamed chunks into a single response + final_response_stream = "".join( + chunk.choices[0].delta.content for chunk in result_stream_final + ) + assert "tokyo" in final_response_stream.lower() + + # Step 3: Get the initial response with stream=False + messages = messages[:1] # reset to initial messages + initial_response = openai_chat_completion( + messages=messages, # reset to initial messages + model=model_uid_res, + tools=tools, + stream=False, + ) + + assert initial_response + assert type(initial_response).__name__ == response_type_name + + # Simulate the tool calls for the initial non-stream response + tool_calls = initial_response.choices[0].message.tool_calls + assert tool_calls is not None + handle_tools_response(messages, tool_calls) + + # Step 4: Get the final response after tool calls with stream=False + final_response = openai_chat_completion( + messages=messages, model=model_uid_res, stream=False + ) + + assert final_response + assert type(final_response).__name__ == response_type_name + + # Check the final response contains the weather info + assert "tokyo" in final_response.choices[0].message.content.lower() diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 636c3fc973..47024efb82 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -676,28 +676,29 @@ def _tools_token_filter(cls, model_family): Generates a filter function for Qwen series models to retain outputs after "\nFinal Answer:". Returns: - A function that takes tokens (string output by the model so far) as input - returns True if current token is after "\nFinal Answer:", else False. + A function that takes tokens (string output by the model so far) and delta (new tokens added) as input, + returns the part after "\nFinal Answer:" if found, else returns delta. """ family = model_family.model_family or model_family.model_name if family in ["qwen-chat", "qwen1.5-chat"]: # Encapsulating function to reset 'found' after each call found = False - def process_token(tokens: str): + def process_tokens(tokens: str, delta: str): nonlocal found # Once "Final Answer:" is found, future tokens are allowed. if found: - return True + return delta # Check if the token ends with "\nFinal Answer:" and update `found`. - if tokens.endswith("\nFinal Answer:"): + final_answer_idx = tokens.lower().rfind("\nfinal answer:") + if final_answer_idx != -1: found = True - return False + return tokens[final_answer_idx + len("\nfinal answer:") :] + return "" - return process_token + return process_tokens else: - # For other families, allow all tokens. - return lambda tokens: True + return lambda tokens, delta: delta @classmethod def _tool_calls_completion(cls, model_family, model_uid, c, tools): diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index d83afffeb9..996c70e071 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -444,7 +444,9 @@ async def stream_results() -> AsyncGenerator[CompletionChunk, None]: _content, func, args = ChatModelMixin._eval_tool_arguments( self.model_family, chunk, tools ) - choice["text"] = choice_delta + choice["text"] = tools_token_filter( + tokens=previous_texts[0], delta=choice_delta + ) if func is not None: choice["text"] = None choice["finish_reason"] = "tool_calls" @@ -458,9 +460,13 @@ async def stream_results() -> AsyncGenerator[CompletionChunk, None]: ), ) ] - # use a filter function to skip Qwen's react thought process - elif not tools_token_filter(previous_texts[0]): - continue + else: + # use a filter function to skip Qwen's react thought process + choice["text"] = tools_token_filter( + tokens=previous_texts[0], delta=choice["text"] + ) + if not choice["text"]: + continue prompt_tokens = len(_request_output.prompt_token_ids) completion_tokens = sum( len(output.token_ids) for output in _request_output.outputs From 83f2b79515c6c133a1dd855ed3c8c7f4d56c5ac6 Mon Sep 17 00:00:00 2001 From: Yang Haohong <142222531+ayhhyhh@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:12:15 +0800 Subject: [PATCH 139/298] FEAT: qwen2-instruct support tool call (#1631) Co-authored-by: codingl2k1 <codingl2k1@outlook.com> --- xinference/api/restful_api.py | 7 ++++++- xinference/core/tests/test_restful_api.py | 5 +++-- xinference/model/llm/utils.py | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 66cca36dbe..e3e3978f54 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1424,6 +1424,7 @@ async def create_chat_completion(self, request: Request) -> Response: "gorilla-openfunctions-v1", "qwen-chat", "qwen1.5-chat", + "qwen2-instruct", ] is_qwen = desc.get("model_format") == "ggmlv3" and "qwen-chat" == model_family @@ -1446,7 +1447,11 @@ async def create_chat_completion(self, request: Request) -> Response: ) if body.tools and body.stream: is_vllm = await model.is_vllm_backend() - if not is_vllm or model_family not in ["qwen-chat", "qwen1.5-chat"]: + if not is_vllm or model_family not in [ + "qwen-chat", + "qwen1.5-chat", + "qwen2-instruct", + ]: raise HTTPException( status_code=400, detail="Streaming support for tool calls is available only when using vLLM backend and Qwen models.", diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index 608b1cb9d5..516193d2bd 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -740,7 +740,8 @@ def test_restful_api_for_qwen_tool_calls(setup, model_format, quantization): payload = { "model_uid": "test_tool", "model_name": model_name, - "model_size_in_billions": 4, + "model_engine": "transformers", + "model_size_in_billions": 7, "model_format": model_format, "quantization": quantization, } @@ -813,7 +814,7 @@ def test_restful_api_for_qwen_tool_calls(setup, model_format, quantization): arguments = completion["choices"][0]["message"]["tool_calls"][0]["function"][ "arguments" ] - assert not json.loads(arguments) + assert json.loads(arguments) assert completion["usage"] assert completion["usage"]["prompt_tokens"] != -1 diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 47024efb82..35cfed9a90 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -661,7 +661,7 @@ def _eval_tool_arguments(cls, model_family, c, tools): content, func, args = cls._eval_gorilla_openfunctions_arguments(c, tools) elif "chatglm3" == family: content, func, args = cls._eval_chatglm3_arguments(c, tools) - elif family in ["qwen-chat", "qwen1.5-chat"]: + elif family in ["qwen-chat", "qwen1.5-chat", "qwen2-instruct"]: content, func, args = cls._eval_qwen_chat_arguments(c, tools) else: raise Exception( From d8f113b242bce8a6901534dfe3c9a0336ac0c9ed Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Fri, 14 Jun 2024 07:35:17 +0800 Subject: [PATCH 140/298] FEAT: Added a method to download models from csghub. (#1627) --- xinference/constants.py | 1 + xinference/model/llm/__init__.py | 36 ++++++++- xinference/model/llm/llm_family.py | 87 ++++++++++++++++++++- xinference/model/llm/llm_family_csghub.json | 66 ++++++++++++++++ xinference/model/utils.py | 6 ++ 5 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 xinference/model/llm/llm_family_csghub.json diff --git a/xinference/constants.py b/xinference/constants.py index 13e383a08f..c2127579f6 100644 --- a/xinference/constants.py +++ b/xinference/constants.py @@ -17,6 +17,7 @@ XINFERENCE_ENV_ENDPOINT = "XINFERENCE_ENDPOINT" XINFERENCE_ENV_MODEL_SRC = "XINFERENCE_MODEL_SRC" +XINFERENCE_ENV_CSG_TOKEN = "XINFERENCE_CSG_TOKEN" XINFERENCE_ENV_HOME_PATH = "XINFERENCE_HOME" XINFERENCE_ENV_HEALTH_CHECK_FAILURE_THRESHOLD = ( "XINFERENCE_HEALTH_CHECK_FAILURE_THRESHOLD" diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index c4084746a6..fb56d82488 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -25,6 +25,7 @@ get_llm_model_descriptions, ) from .llm_family import ( + BUILTIN_CSGHUB_LLM_FAMILIES, BUILTIN_LLM_FAMILIES, BUILTIN_LLM_MODEL_CHAT_FAMILIES, BUILTIN_LLM_MODEL_GENERATE_FAMILIES, @@ -221,13 +222,44 @@ def _install(): if "tools" in model_spec.model_ability: BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES.add(model_spec.model_name) - for llm_specs in [BUILTIN_LLM_FAMILIES, BUILTIN_MODELSCOPE_LLM_FAMILIES]: + csghub_json_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "llm_family_csghub.json" + ) + for json_obj in json.load(codecs.open(csghub_json_path, "r", encoding="utf-8")): + model_spec = LLMFamilyV1.parse_obj(json_obj) + BUILTIN_CSGHUB_LLM_FAMILIES.append(model_spec) + + # register prompt style, in case that we have something missed + # if duplicated with huggingface json, keep it as the huggingface style + if ( + "chat" in model_spec.model_ability + and isinstance(model_spec.prompt_style, PromptStyleV1) + and model_spec.model_name not in BUILTIN_LLM_PROMPT_STYLE + ): + BUILTIN_LLM_PROMPT_STYLE[model_spec.model_name] = model_spec.prompt_style + # register model family + if "chat" in model_spec.model_ability: + BUILTIN_LLM_MODEL_CHAT_FAMILIES.add(model_spec.model_name) + else: + BUILTIN_LLM_MODEL_GENERATE_FAMILIES.add(model_spec.model_name) + if "tools" in model_spec.model_ability: + BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES.add(model_spec.model_name) + + for llm_specs in [ + BUILTIN_LLM_FAMILIES, + BUILTIN_MODELSCOPE_LLM_FAMILIES, + BUILTIN_CSGHUB_LLM_FAMILIES, + ]: for llm_spec in llm_specs: if llm_spec.model_name not in LLM_MODEL_DESCRIPTIONS: LLM_MODEL_DESCRIPTIONS.update(generate_llm_description(llm_spec)) # traverse all families and add engine parameters corresponding to the model name - for families in [BUILTIN_LLM_FAMILIES, BUILTIN_MODELSCOPE_LLM_FAMILIES]: + for families in [ + BUILTIN_LLM_FAMILIES, + BUILTIN_MODELSCOPE_LLM_FAMILIES, + BUILTIN_CSGHUB_LLM_FAMILIES, + ]: for family in families: generate_engine_config_by_model_family(family) diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index b23a88a030..b3b3c8dbc5 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -32,10 +32,15 @@ load_str_bytes, validator, ) -from ...constants import XINFERENCE_CACHE_DIR, XINFERENCE_MODEL_DIR +from ...constants import ( + XINFERENCE_CACHE_DIR, + XINFERENCE_ENV_CSG_TOKEN, + XINFERENCE_MODEL_DIR, +) from ..utils import ( IS_NEW_HUGGINGFACE_HUB, create_symlink, + download_from_csghub, download_from_modelscope, is_valid_model_uri, parse_uri, @@ -232,6 +237,7 @@ def parse_raw( BUILTIN_LLM_FAMILIES: List["LLMFamilyV1"] = [] BUILTIN_MODELSCOPE_LLM_FAMILIES: List["LLMFamilyV1"] = [] +BUILTIN_CSGHUB_LLM_FAMILIES: List["LLMFamilyV1"] = [] SGLANG_CLASSES: List[Type[LLM]] = [] TRANSFORMERS_CLASSES: List[Type[LLM]] = [] @@ -292,6 +298,9 @@ def cache( elif llm_spec.model_hub == "modelscope": logger.info(f"Caching from Modelscope: {llm_spec.model_id}") return cache_from_modelscope(llm_family, llm_spec, quantization) + elif llm_spec.model_hub == "csghub": + logger.info(f"Caching from CSGHub: {llm_spec.model_id}") + return cache_from_csghub(llm_family, llm_spec, quantization) else: raise ValueError(f"Unknown model hub: {llm_spec.model_hub}") @@ -566,6 +575,7 @@ def _skip_download( "modelscope": _get_meta_path( cache_dir, model_format, "modelscope", quantization ), + "csghub": _get_meta_path(cache_dir, model_format, "csghub", quantization), } if valid_model_revision(model_hub_to_meta_path[model_hub], model_revision): logger.info(f"Cache {cache_dir} exists") @@ -650,6 +660,75 @@ def _merge_cached_files( logger.info(f"Merge complete.") +def cache_from_csghub( + llm_family: LLMFamilyV1, + llm_spec: "LLMSpecV1", + quantization: Optional[str] = None, +) -> str: + """ + Cache model from CSGHub. Return the cache directory. + """ + from pycsghub.file_download import file_download + from pycsghub.snapshot_download import snapshot_download + + cache_dir = _get_cache_dir(llm_family, llm_spec) + + if _skip_download( + cache_dir, + llm_spec.model_format, + llm_spec.model_hub, + llm_spec.model_revision, + quantization, + ): + return cache_dir + + if llm_spec.model_format in ["pytorch", "gptq", "awq"]: + download_dir = retry_download( + snapshot_download, + llm_family.model_name, + { + "model_size": llm_spec.model_size_in_billions, + "model_format": llm_spec.model_format, + }, + llm_spec.model_id, + endpoint="https://hub-stg.opencsg.com", + token=os.environ.get(XINFERENCE_ENV_CSG_TOKEN), + ) + create_symlink(download_dir, cache_dir) + + elif llm_spec.model_format in ["ggmlv3", "ggufv2"]: + file_names, final_file_name, need_merge = _generate_model_file_names( + llm_spec, quantization + ) + + for filename in file_names: + download_path = retry_download( + file_download, + llm_family.model_name, + { + "model_size": llm_spec.model_size_in_billions, + "model_format": llm_spec.model_format, + }, + llm_spec.model_id, + file_name=filename, + endpoint="https://hub-stg.opencsg.com", + token=os.environ.get(XINFERENCE_ENV_CSG_TOKEN), + ) + symlink_local_file(download_path, cache_dir, filename) + + if need_merge: + _merge_cached_files(cache_dir, file_names, final_file_name) + else: + raise ValueError(f"Unsupported format: {llm_spec.model_format}") + + meta_path = _get_meta_path( + cache_dir, llm_spec.model_format, llm_spec.model_hub, quantization + ) + _generate_meta_file(meta_path, llm_family, llm_spec, quantization) + + return cache_dir + + def cache_from_modelscope( llm_family: LLMFamilyV1, llm_spec: "LLMSpecV1", @@ -931,6 +1010,12 @@ def _apply_format_to_model_id(spec: LLMSpecV1, q: str) -> LLMSpecV1: + BUILTIN_LLM_FAMILIES + user_defined_llm_families ) + elif download_from_csghub(): + all_families = ( + BUILTIN_CSGHUB_LLM_FAMILIES + + BUILTIN_LLM_FAMILIES + + user_defined_llm_families + ) else: all_families = BUILTIN_LLM_FAMILIES + user_defined_llm_families diff --git a/xinference/model/llm/llm_family_csghub.json b/xinference/model/llm/llm_family_csghub.json new file mode 100644 index 0000000000..1aaefc8d12 --- /dev/null +++ b/xinference/model/llm/llm_family_csghub.json @@ -0,0 +1,66 @@ +[ + { + "version": 1, + "context_length": 32768, + "model_name": "qwen2-instruct", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "tools" + ], + "model_description": "Qwen2 is the new series of Qwen large language models", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "0_5", + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "Qwen/Qwen2-0.5B-Instruct", + "model_hub": "csghub" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": "0_5", + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "qwen/Qwen2-0.5B-Instruct-GGUF", + "model_file_name_template": "qwen2-0_5b-instruct-{quantization}.gguf", + "model_hub": "csghub" + } + ], + "prompt_style": { + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] + } + } +] diff --git a/xinference/model/utils.py b/xinference/model/utils.py index 90acec51e1..961d132b7b 100644 --- a/xinference/model/utils.py +++ b/xinference/model/utils.py @@ -50,6 +50,12 @@ def download_from_modelscope() -> bool: return False +def download_from_csghub() -> bool: + if os.environ.get(XINFERENCE_ENV_MODEL_SRC) == "csghub": + return True + return False + + def symlink_local_file(path: str, local_dir: str, relpath: str) -> str: from huggingface_hub.file_download import _create_symlink From ca2fbe92cbbcbfb54682b3acdea2095e7cf45c77 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 14 Jun 2024 03:58:25 +0200 Subject: [PATCH 141/298] FEAT: glm4-chat support tool call (#1617) --- xinference/api/restful_api.py | 1 + xinference/core/tests/test_restful_api.py | 4 +++ xinference/model/llm/pytorch/chatglm.py | 30 ++++++++++++++--------- xinference/model/llm/utils.py | 6 ++--- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index e3e3978f54..0e9c6493fe 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1421,6 +1421,7 @@ async def create_chat_completion(self, request: Request) -> Response: model_family = desc.get("model_family", "") function_call_models = [ "chatglm3", + "glm4-chat", "gorilla-openfunctions-v1", "qwen-chat", "qwen1.5-chat", diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index 516193d2bd..a520d2191b 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -447,6 +447,7 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): # launch payload = { "model_uid": "test_tool", + "model_engine": "transformers", "model_name": model_name, "model_size_in_billions": 6, "model_format": model_format, @@ -497,6 +498,7 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): } response = requests.post(url, json=payload) completion = response.json() + # glm4-chat fail response: 好的,请告诉我您希望使用的温度单位是摄氏度还是华氏度? assert ( "get_current_weather" @@ -608,6 +610,8 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): }, ] + # When kwargs is {}, the glm4-chat does not observe the output tool calls, + # so the test will fail. for kwargs in [{"tools": tools}, {}]: completion = client.chat.completions.create( model=model_uid_res, messages=messages, **kwargs diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index c916e3a8c3..e263bb82da 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -89,24 +89,30 @@ def match( return False return True - @staticmethod - def _handle_tools(generate_config) -> Optional[dict]: + def _handle_tools(self, generate_config) -> Optional[dict]: """Convert openai tools to ChatGLM tools.""" if generate_config is None: return None tools = generate_config.pop("tools", None) if tools is None: return None - chatglm_tools = [] - for elem in tools: - if elem.get("type") != "function" or "function" not in elem: - raise ValueError("ChatGLM tools only support function type.") - chatglm_tools.append(elem["function"]) - return { - "role": "system", - "content": f"Answer the following questions as best as you can. You have access to the following tools:", - "tools": chatglm_tools, - } + if self.model_family.model_name == "glm4-chat": + return { + "role": "system", + "content": None, + "tools": tools, + } + else: + chatglm_tools = [] + for elem in tools: + if elem.get("type") != "function" or "function" not in elem: + raise ValueError("ChatGLM tools only support function type.") + chatglm_tools.append(elem["function"]) + return { + "role": "system", + "content": f"Answer the following questions as best as you can. You have access to the following tools:", + "tools": chatglm_tools, + } def chat( self, diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 35cfed9a90..a95d2dfc15 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -607,7 +607,7 @@ def tool_call(n, **kwargs): return arguments, None, None @staticmethod - def _eval_chatglm3_arguments(c, tools): + def _eval_glm_chat_arguments(c, tools): if isinstance(c[0], str): return c[0], None, None return None, c[0]["name"], c[0]["parameters"] @@ -659,8 +659,8 @@ def _eval_tool_arguments(cls, model_family, c, tools): family = model_family.model_family or model_family.model_name if family in ["gorilla-openfunctions-v1", "gorilla-openfunctions-v2"]: content, func, args = cls._eval_gorilla_openfunctions_arguments(c, tools) - elif "chatglm3" == family: - content, func, args = cls._eval_chatglm3_arguments(c, tools) + elif family in ["chatglm3", "glm4-chat"]: + content, func, args = cls._eval_glm_chat_arguments(c, tools) elif family in ["qwen-chat", "qwen1.5-chat", "qwen2-instruct"]: content, func, args = cls._eval_qwen_chat_arguments(c, tools) else: From 29b7337285916262a2a52fbcd6c7cfd466ac3bc4 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:01:41 +0800 Subject: [PATCH 142/298] FEAT: [UI] Supports viewing and deleting cache data. (#1637) --- .../web/ui/src/scenes/cluster_info/index.js | 2 +- .../launch_model/LaunchModelComponent.js | 51 +- .../ui/src/scenes/launch_model/launchLLM.js | 51 +- .../ui/src/scenes/launch_model/modelCard.js | 640 ++++++++++++++---- .../launch_model/styles/modelCardStyle.css | 141 ++++ .../launch_model/styles/modelCardStyle.js | 103 --- .../scenes/register_model/registerModel.js | 7 +- 7 files changed, 739 insertions(+), 256 deletions(-) create mode 100644 xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.css delete mode 100644 xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.js diff --git a/xinference/web/ui/src/scenes/cluster_info/index.js b/xinference/web/ui/src/scenes/cluster_info/index.js index ecf1fa4eb8..ec80319f99 100644 --- a/xinference/web/ui/src/scenes/cluster_info/index.js +++ b/xinference/web/ui/src/scenes/cluster_info/index.js @@ -21,7 +21,7 @@ const ClusterInfo = () => { }} > <Title title="Cluster Information" /> - <Grid container spacing={3}> + <Grid container spacing={3} style={{ width: '100%' }}> <Grid item xs={12}> <Paper sx={{ diff --git a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js index 10a1e27391..17fd13df47 100644 --- a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js +++ b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js @@ -1,4 +1,4 @@ -import { Box, FormControl } from '@mui/material' +import { Box, FormControl, InputLabel, MenuItem, Select } from '@mui/material' import React, { useContext, useEffect, useState } from 'react' import { ApiContext } from '../../components/apiContext' @@ -11,6 +11,8 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { let endPoint = useContext(ApiContext).endPoint const [registrationData, setRegistrationData] = useState([]) const [searchTerm, setSearchTerm] = useState('') + const [status, setStatus] = useState('all') + const [completeDeleteArr, setCompleteDeleteArr] = useState([]) const { isCallingApi, setIsCallingApi } = useContext(ApiContext) const { isUpdatingModel } = useContext(ApiContext) @@ -19,12 +21,38 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { setSearchTerm(e.target.value) } + const handleStatusChange = (event) => { + setStatus(event.target.value) + } + const filter = (registration) => { if (!registration || typeof searchTerm !== 'string') return false const modelName = registration.model_name ? registration.model_name.toLowerCase() : '' - return modelName.includes(searchTerm.toLowerCase()) + if (!modelName.includes(searchTerm.toLowerCase())) { + return false + } + if (completeDeleteArr.includes(registration.model_name)) { + registration.cache_status = Array.isArray(registration.cache_status) + ? [false] + : false + } + if (status && status !== 'all') { + if ( + registration.cache_status && + !completeDeleteArr.includes(registration.model_name) + ) { + return true + } else { + return false + } + } + return true + } + + const handleCompleteDelete = (model_name) => { + setCompleteDeleteArr([...completeDeleteArr, model_name]) } const update = async () => { @@ -62,10 +90,26 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { <div style={{ display: 'grid', - gridTemplateColumns: '1fr', + gridTemplateColumns: '150px 1fr', + columnGap: '20px', margin: '30px 2rem', }} > + <FormControl variant="outlined" margin="normal"> + <InputLabel id="select-status">Status</InputLabel> + <Select + id="status" + labelId="select-status" + label="Status" + onChange={handleStatusChange} + value={status} + size="small" + sx={{ width: '150px' }} + > + <MenuItem value="all">all</MenuItem> + <MenuItem value="cached">cached</MenuItem> + </Select> + </FormControl> <FormControl variant="outlined" margin="normal"> <HotkeyFocusTextField id="search" @@ -88,6 +132,7 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { modelData={filteredRegistration} modelType={modelType} gpuAvailable={gpuAvailable} + onHandleCompleteDelete={handleCompleteDelete} /> ))} </div> diff --git a/xinference/web/ui/src/scenes/launch_model/launchLLM.js b/xinference/web/ui/src/scenes/launch_model/launchLLM.js index 3971b7071a..4bbf96390d 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchLLM.js +++ b/xinference/web/ui/src/scenes/launch_model/launchLLM.js @@ -18,6 +18,8 @@ const LaunchLLM = ({ gpuAvailable }) => { // States used for filtering const [searchTerm, setSearchTerm] = useState('') const [modelAbility, setModelAbility] = useState('all') + const [status, setStatus] = useState('all') + const [completeDeleteArr, setCompleteDeleteArr] = useState([]) const handleChange = (event) => { setSearchTerm(event.target.value) @@ -27,6 +29,10 @@ const LaunchLLM = ({ gpuAvailable }) => { setModelAbility(event.target.value) } + const handleStatusChange = (event) => { + setStatus(event.target.value) + } + const filter = (registration) => { if (!registration || typeof searchTerm !== 'string') return false const modelName = registration.model_name @@ -47,9 +53,36 @@ const LaunchLLM = ({ gpuAvailable }) => { return false } } + if (completeDeleteArr.includes(registration.model_name)) { + registration.model_specs.forEach((item) => { + item.cache_status = Array.isArray(item) ? [false] : false + }) + } + if (status && status !== 'all') { + const judge = registration.model_specs.some((spec) => { + return filterCache(spec) + }) + if (judge && !completeDeleteArr.includes(registration.model_name)) { + return true + } else { + return false + } + } return true } + const filterCache = (spec) => { + if (spec.model_format === 'pytorch') { + return spec.cache_status && spec.cache_status === true + } else { + return spec.cache_status && spec.cache_status.some((cs) => cs) + } + } + + const handleCompleteDelete = (model_name) => { + setCompleteDeleteArr([...completeDeleteArr, model_name]) + } + const update = () => { if ( isCallingApi || @@ -104,7 +137,7 @@ const LaunchLLM = ({ gpuAvailable }) => { <div style={{ display: 'grid', - gridTemplateColumns: '150px 1fr', + gridTemplateColumns: '150px 150px 1fr', columnGap: '20px', margin: '30px 2rem', }} @@ -126,6 +159,21 @@ const LaunchLLM = ({ gpuAvailable }) => { <MenuItem value="vision">vl-chat</MenuItem> </Select> </FormControl> + <FormControl variant="outlined" margin="normal"> + <InputLabel id="select-status">Status</InputLabel> + <Select + id="status" + labelId="select-status" + label="Status" + onChange={handleStatusChange} + value={status} + size="small" + sx={{ width: '150px' }} + > + <MenuItem value="all">all</MenuItem> + <MenuItem value="cached">cached</MenuItem> + </Select> + </FormControl> <FormControl variant="outlined" margin="normal"> <HotkeyFocusTextField id="search" @@ -148,6 +196,7 @@ const LaunchLLM = ({ gpuAvailable }) => { modelData={filteredRegistration} gpuAvailable={gpuAvailable} modelType={'LLM'} + onHandleCompleteDelete={handleCompleteDelete} /> ))} </div> diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 3a1aa32965..b01707c406 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -1,19 +1,32 @@ +import './styles/modelCardStyle.css' + import { ChatOutlined, + Close, + EditNote, EditNoteOutlined, ExpandLess, ExpandMore, HelpCenterOutlined, RocketLaunchOutlined, UndoOutlined, + WarningAmber, } from '@mui/icons-material' import DeleteIcon from '@mui/icons-material/Delete' +import FilterNoneIcon from '@mui/icons-material/FilterNone' import { Alert, + Backdrop, Box, + Button, Chip, CircularProgress, Collapse, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, Drawer, FormControl, Grid, @@ -22,12 +35,22 @@ import { ListItemButton, ListItemText, MenuItem, + Paper, Select, Snackbar, Stack, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TablePagination, + TableRow, TextField, + Tooltip, } from '@mui/material' -import Paper from '@mui/material/Paper' +import { styled } from '@mui/material/styles' +import ClipboardJS from 'clipboard' import React, { useContext, useEffect, useRef, useState } from 'react' import { useNavigate } from 'react-router-dom' @@ -35,7 +58,6 @@ import { ApiContext } from '../../components/apiContext' import fetcher from '../../components/fetcher' import TitleTypography from '../../components/titleTypography' import AddPair from './components/addPair' -import styles from './styles/modelCardStyle' const ModelCard = ({ url, @@ -43,6 +65,7 @@ const ModelCard = ({ gpuAvailable, modelType, is_custom = false, + onHandleCompleteDelete, }) => { const [hover, setHover] = useState(false) const [selected, setSelected] = useState(false) @@ -80,6 +103,13 @@ const ModelCard = ({ const [loraListArr, setLoraListArr] = useState([]) const [imageLoraLoadKwargsArr, setImageLoraLoadKwargsArr] = useState([]) const [imageLoraFuseKwargsArr, setImageLoraFuseKwargsArr] = useState([]) + const [isOpenCachedList, setIsOpenCachedList] = useState(false) + const [isDeleteCached, setIsDeleteCached] = useState(false) + const [cachedListArr, setCachedListArr] = useState([]) + const [cachedModelVersion, setCachedModelVersion] = useState('') + const [cachedRealPath, setCachedRealPath] = useState('') + const [page, setPage] = useState(0) + const [isCopySuccess, setIsCopySuccess] = useState(false) const parentRef = useRef(null) @@ -404,114 +434,136 @@ const ModelCard = ({ setCustomParametersArr(arr) } - // Set two different states based on mouse hover - return ( - <Paper - style={hover ? styles.containerSelected : styles.container} - onMouseEnter={() => setHover(true)} - onMouseLeave={() => setHover(false)} - onClick={() => { - if (!selected && !customDeleted) { - setSelected(true) - if (modelType === 'LLM') { - getModelEngine(modelData.model_name) - } + const StyledTableRow = styled(TableRow)(({ theme }) => ({ + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + })) + + const emptyRows = + page >= 0 ? Math.max(0, (1 + page) * 5 - cachedListArr.length) : 0 + + const handleChangePage = (_, newPage) => { + setPage(newPage) + } + + const handleCopyPath = (path) => { + const clipboard = new ClipboardJS('.copyPath', { + text: () => path, + }) + + clipboard.on('success', (e) => { + e.clearSelection() + setIsCopySuccess(true) + }) + } + + const handleOpenCachedList = () => { + setIsOpenCachedList(true) + getCachedList() + document.body.style.overflow = 'hidden' + } + + const handleCloseCachedList = () => { + document.body.style.overflow = 'auto' + setHover(false) + setIsOpenCachedList(false) + if (cachedListArr.length === 0) { + onHandleCompleteDelete(modelData.model_name) + } + } + + const getCachedList = () => { + fetcher(url + `/v1/cache/models?model_name=${modelData.model_name}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }) + .then((response) => { + if (!response.ok) { + response.json().then((errorData) => { + setErrorMsg( + `Server error: ${response.status} - ${ + errorData.detail || 'Unknown error' + }` + ) + }) + } else { + response.json().then((data) => { + setCachedListArr(data.list) + }) } - }} - elevation={hover ? 24 : 4} - > - {modelType === 'LLM' ? ( - <Box style={styles.descriptionCard}> - {is_custom && ( - <Stack direction="row" spacing={1} useFlexGap> - <TitleTypography value={modelData.model_name} /> - <IconButton - aria-label="delete" - onClick={handeCustomDelete} - disabled={customDeleted} - > - <DeleteIcon /> - </IconButton> - </Stack> - )} - {!is_custom && <TitleTypography value={modelData.model_name} />} - <Stack - spacing={1} - direction="row" - useFlexGap - flexWrap="wrap" - sx={{ marginLeft: 1 }} - > - {modelData.model_lang && - (() => { - return modelData.model_lang.map((v) => { - return ( - <Chip key={v} label={v} variant="outlined" size="small" /> - ) - }) - })()} - {(() => { - if ( - modelData.model_specs && - modelData.model_specs.some((spec) => isCached(spec)) - ) { - return <Chip label="Cached" variant="outlined" size="small" /> - } - })()} - {(() => { - if (is_custom && customDeleted) { - return <Chip label="Deleted" variant="outlined" size="small" /> - } - })()} - </Stack> - {modelData.model_description && ( - <p style={styles.p} title={modelData.model_description}> - {modelData.model_description} - </p> - )} + }) + .catch((error) => { + console.error('Error:', error) + }) + } - <div style={styles.iconRow}> - <div style={styles.iconItem}> - <span style={styles.boldIconText}> - {Math.floor(modelData.context_length / 1000)}K - </span> - <small style={styles.smallText}>context length</small> - </div> - {(() => { + const handleOpenDeleteCachedDialog = (real_path, model_version) => { + setCachedRealPath(real_path) + setCachedModelVersion(model_version) + setIsDeleteCached(true) + } + + const handleDeleteCached = () => { + fetcher(url + `/v1/cache/models?model_version=${cachedModelVersion}`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + }) + .then((response) => { + if (!response.ok) { + response.json().then((errorData) => { + setErrorMsg( + `Server error: ${response.status} - ${ + errorData.detail || 'Unknown error' + }` + ) + }) + } else { + response.json().then(() => { + const cachedArr = cachedListArr.filter( + (item) => item.real_path !== cachedRealPath + ) + setCachedListArr(cachedArr) + setIsDeleteCached(false) + if (cachedArr.length) { if ( - modelData.model_ability && - modelData.model_ability.includes('chat') + (page + 1) * 5 >= cachedListArr.length && + cachedArr.length % 5 === 0 ) { - return ( - <div style={styles.iconItem}> - <ChatOutlined style={styles.muiIcon} /> - <small style={styles.smallText}>chat model</small> - </div> - ) - } else if ( - modelData.model_ability && - modelData.model_ability.includes('generate') - ) { - return ( - <div style={styles.iconItem}> - <EditNoteOutlined style={styles.muiIcon} /> - <small style={styles.smallText}>generate model</small> - </div> - ) - } else { - return ( - <div style={styles.iconItem}> - <HelpCenterOutlined style={styles.muiIcon} /> - <small style={styles.smallText}>other model</small> - </div> - ) + setPage(cachedArr.length / 5 - 1) } - })()} - </div> - </Box> - ) : ( - <Box style={styles.descriptionCard}> - <div style={styles.titleContainer}> + } + }) + } + }) + .catch((error) => { + console.error('Error:', error) + }) + } + + // Set two different states based on mouse hover + return ( + <> + <Paper + className="container" + onMouseEnter={() => setHover(true)} + onMouseLeave={() => setHover(false)} + onClick={() => { + if (!selected && !customDeleted) { + setSelected(true) + if (modelType === 'LLM') { + getModelEngine(modelData.model_name) + } + } + }} + elevation={hover ? 24 : 4} + > + {modelType === 'LLM' ? ( + <Box className="descriptionCard"> {is_custom && ( <Stack direction="row" spacing={1} useFlexGap> <TitleTypography value={modelData.model_name} /> @@ -532,26 +584,30 @@ const ModelCard = ({ flexWrap="wrap" sx={{ marginLeft: 1 }} > - {(() => { - if (modelData.language) { - return modelData.language.map((v) => { - return <Chip label={v} variant="outlined" size="small" /> + {modelData.model_lang && + (() => { + return modelData.model_lang.map((v) => { + return ( + <Chip key={v} label={v} variant="outlined" size="small" /> + ) }) - } else if (modelData.model_family) { + })()} + {(() => { + if ( + modelData.model_specs && + modelData.model_specs.some((spec) => isCached(spec)) + ) { return ( <Chip - label={modelData.model_family} + label="Cached" variant="outlined" size="small" + deleteIcon={<EditNote />} + onDelete={handleOpenCachedList} /> ) } })()} - {(() => { - if (modelData.cache_status) { - return <Chip label="Cached" variant="outlined" size="small" /> - } - })()} {(() => { if (is_custom && customDeleted) { return ( @@ -560,26 +616,132 @@ const ModelCard = ({ } })()} </Stack> - </div> - {modelData.dimensions && ( - <div style={styles.iconRow}> - <div style={styles.iconItem}> - <span style={styles.boldIconText}>{modelData.dimensions}</span> - <small style={styles.smallText}>dimensions</small> - </div> - <div style={styles.iconItem}> - <span style={styles.boldIconText}>{modelData.max_tokens}</span> - <small style={styles.smallText}>max tokens</small> + {modelData.model_description && ( + <p className="p" title={modelData.model_description}> + {modelData.model_description} + </p> + )} + + <div className="iconRow"> + <div className="iconItem"> + <span className="boldIconText"> + {Math.floor(modelData.context_length / 1000)}K + </span> + <small className="smallText">context length</small> </div> + {(() => { + if ( + modelData.model_ability && + modelData.model_ability.includes('chat') + ) { + return ( + <div className="iconItem"> + <ChatOutlined className="muiIcon" /> + <small className="smallText">chat model</small> + </div> + ) + } else if ( + modelData.model_ability && + modelData.model_ability.includes('generate') + ) { + return ( + <div className="iconItem"> + <EditNoteOutlined className="muiIcon" /> + <small className="smallText">generate model</small> + </div> + ) + } else { + return ( + <div className="iconItem"> + <HelpCenterOutlined className="muiIcon" /> + <small className="smallText">other model</small> + </div> + ) + } + })()} </div> - )} - {!selected && hover && ( - <p style={styles.instructionText}> - Click with mouse to launch the model - </p> - )} - </Box> - )} + </Box> + ) : ( + <Box className="descriptionCard"> + <div className="titleContainer"> + {is_custom && ( + <Stack direction="row" spacing={1} useFlexGap> + <TitleTypography value={modelData.model_name} /> + <IconButton + aria-label="delete" + onClick={handeCustomDelete} + disabled={customDeleted} + > + <DeleteIcon /> + </IconButton> + </Stack> + )} + {!is_custom && <TitleTypography value={modelData.model_name} />} + <Stack + spacing={1} + direction="row" + useFlexGap + flexWrap="wrap" + sx={{ marginLeft: 1 }} + > + {(() => { + if (modelData.language) { + return modelData.language.map((v) => { + return <Chip label={v} variant="outlined" size="small" /> + }) + } else if (modelData.model_family) { + return ( + <Chip + label={modelData.model_family} + variant="outlined" + size="small" + /> + ) + } + })()} + {(() => { + if (modelData.cache_status) { + return ( + <Chip + label="Cached" + variant="outlined" + size="small" + deleteIcon={<EditNote />} + onDelete={handleOpenCachedList} + /> + ) + } + })()} + {(() => { + if (is_custom && customDeleted) { + return ( + <Chip label="Deleted" variant="outlined" size="small" /> + ) + } + })()} + </Stack> + </div> + {modelData.dimensions && ( + <div className="iconRow"> + <div className="iconItem"> + <span className="boldIconText">{modelData.dimensions}</span> + <small className="smallText">dimensions</small> + </div> + <div className="iconItem"> + <span className="boldIconText">{modelData.max_tokens}</span> + <small className="smallText">max tokens</small> + </div> + </div> + )} + {!selected && hover && ( + <p className="instructionText"> + Click with mouse to launch the model + </p> + )} + </Box> + )} + </Paper> + <Drawer open={selected} onClose={() => { @@ -588,12 +750,12 @@ const ModelCard = ({ }} anchor={'right'} > - <div style={styles.drawerCard}> + <div className="drawerCard"> <TitleTypography value={modelData.model_name} /> {modelType === 'LLM' ? ( <Box ref={parentRef} - style={styles.formContainer} + className="formContainer" display="flex" flexDirection="column" width="100%" @@ -610,15 +772,17 @@ const ModelCard = ({ label="Model Engine" > {engineOptions.map((engine) => { - const arr = [] + const subArr = [] enginesObj[engine].forEach((item) => { - arr.push(item.model_format) + subArr.push(item.model_format) }) + const arr = [...new Set(subArr)] const specs = modelData.model_specs.filter((spec) => arr.includes(spec.model_format) ) const cached = specs.some((spec) => isCached(spec)) + const displayedEngine = cached ? engine + ' (cached)' : engine @@ -652,6 +816,7 @@ const ModelCard = ({ ) const cached = specs.some((spec) => isCached(spec)) + const displayedFormat = cached ? format + ' (cached)' : format @@ -686,6 +851,7 @@ const ModelCard = ({ (spec) => spec.model_size_in_billions === size ) const cached = specs.some((spec) => isCached(spec)) + const displayedSize = cached ? size + ' (cached)' : size return ( @@ -726,6 +892,7 @@ const ModelCard = ({ modelFormat === 'pytorch' ? specs[0]?.cache_status ?? false === true : specs[0]?.cache_status?.[index] ?? false === true + const displayedQuant = cached ? quant + ' (cached)' : quant @@ -1004,10 +1171,10 @@ const ModelCard = ({ )} </FormControl> )} - <Box style={styles.buttonsContainer}> + <Box className="buttonsContainer"> <button title="Launch" - style={styles.buttonContainer} + className="buttonContainer" onClick={() => launchModel(url, modelData)} disabled={ (modelType === 'LLM' && @@ -1034,8 +1201,8 @@ const ModelCard = ({ if (isCallingApi || isUpdatingModel) { return ( <Box + className="buttonItem" style={{ - ...styles.buttonItem, backgroundColor: '#f2f2f2', }} > @@ -1058,8 +1225,8 @@ const ModelCard = ({ ) { return ( <Box + className="buttonItem" style={{ - ...styles.buttonItem, backgroundColor: '#f2f2f2', }} > @@ -1068,7 +1235,7 @@ const ModelCard = ({ ) } else { return ( - <Box style={styles.buttonItem}> + <Box className="buttonItem"> <RocketLaunchOutlined color="#000000" size="20px" /> </Box> ) @@ -1077,13 +1244,13 @@ const ModelCard = ({ </button> <button title="Go Back" - style={styles.buttonContainer} + className="buttonContainer" onClick={() => { setSelected(false) setHover(false) }} > - <Box style={styles.buttonItem}> + <Box className="buttonItem"> <UndoOutlined color="#000000" size="20px" /> </Box> </button> @@ -1097,7 +1264,188 @@ const ModelCard = ({ message="Please fill in the complete parameters before adding!!" key={'top' + 'center'} /> - </Paper> + + <Backdrop + sx={{ color: '#fff', zIndex: (theme) => theme.zIndex.drawer + 1 }} + open={isOpenCachedList} + > + <div className="dialogBox"> + <div className="dialogTitle"> + <div className="dialogTitle-model_name">{modelData.model_name}</div> + <Close + style={{ cursor: 'pointer' }} + onClick={handleCloseCachedList} + /> + </div> + <TableContainer component={Paper}> + <Table + sx={{ minWidth: 500 }} + style={{ height: '500px', width: '100%' }} + stickyHeader + aria-label="simple pagination table" + > + <TableHead> + <TableRow> + {modelType === 'LLM' && ( + <> + <TableCell align="left">model_format</TableCell> + <TableCell align="left">model_size_in_billions</TableCell> + <TableCell align="left">quantizations</TableCell> + </> + )} + <TableCell align="left" style={{ width: 192 }}> + real_path + </TableCell> + <TableCell align="left" style={{ width: 46 }}></TableCell> + <TableCell align="left" style={{ width: 192 }}> + path + </TableCell> + <TableCell align="left" style={{ width: 46 }}></TableCell> + <TableCell + align="left" + style={{ whiteSpace: 'nowrap', minWidth: 116 }} + > + IP Address + </TableCell> + <TableCell align="left">operation</TableCell> + </TableRow> + </TableHead> + <TableBody style={{ position: 'relative' }}> + {cachedListArr.slice(page * 5, page * 5 + 5).map((row) => ( + <StyledTableRow + style={{ maxHeight: 90 }} + key={row.model_name} + > + {modelType === 'LLM' && ( + <> + <TableCell component="th" scope="row"> + {row.model_format === null ? '—' : row.model_format} + </TableCell> + <TableCell> + {row.model_size_in_billions === null + ? '—' + : row.model_size_in_billions} + </TableCell> + <TableCell> + {row.quantization === null ? '—' : row.quantization} + </TableCell> + </> + )} + <TableCell> + <Tooltip title={row.real_path}> + <div + className={ + modelType === 'LLM' ? 'pathBox' : 'pathBox pathBox2' + } + > + {row.real_path} + </div> + </Tooltip> + </TableCell> + <TableCell> + <Tooltip title="Copy real_path" placement="top"> + <FilterNoneIcon + className="copyPath" + onClick={() => handleCopyPath(row.real_path)} + /> + </Tooltip> + </TableCell> + <TableCell> + <Tooltip title={row.path}> + <div + className={ + modelType === 'LLM' ? 'pathBox' : 'pathBox pathBox2' + } + > + {row.path} + </div> + </Tooltip> + </TableCell> + <TableCell> + <Tooltip title="Copy path" placement="top"> + <FilterNoneIcon + className="copyPath" + onClick={() => handleCopyPath(row.path)} + /> + </Tooltip> + </TableCell> + <TableCell>{row.actor_ip_address}</TableCell> + <TableCell align={modelType === 'LLM' ? 'center' : 'left'}> + <IconButton + aria-label="delete" + size="large" + onClick={() => + handleOpenDeleteCachedDialog( + row.real_path, + row.model_version + ) + } + > + <DeleteIcon /> + </IconButton> + </TableCell> + </StyledTableRow> + ))} + {emptyRows > 0 && ( + <TableRow style={{ height: 89.4 * emptyRows }}> + <TableCell /> + </TableRow> + )} + {cachedListArr.length === 0 && ( + <div className="empty">No cache for now !</div> + )} + </TableBody> + </Table> + </TableContainer> + <TablePagination + style={{ float: 'right' }} + rowsPerPageOptions={[5]} + count={cachedListArr.length} + rowsPerPage={5} + page={page} + onPageChange={handleChangePage} + /> + </div> + </Backdrop> + <Dialog + open={isDeleteCached} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + <DialogTitle id="alert-dialog-title">Warning</DialogTitle> + <DialogContent> + <DialogContentText + className="deleteDialog" + id="alert-dialog-description" + > + <WarningAmber className="warningIcon" /> + <p>Confirm deletion of cache files? This action is irreversible.</p> + </DialogContentText> + </DialogContent> + <DialogActions> + <Button + onClick={() => { + setIsDeleteCached(false) + }} + > + no + </Button> + <Button onClick={handleDeleteCached} autoFocus> + yes + </Button> + </DialogActions> + </Dialog> + <Snackbar + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + open={isCopySuccess} + autoHideDuration={1500} + onClose={() => setIsCopySuccess(false)} + > + <Alert severity="success" variant="filled" sx={{ width: '100%' }}> + Copied to clipboard! + </Alert> + </Snackbar> + </> ) } diff --git a/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.css b/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.css new file mode 100644 index 0000000000..a357f79935 --- /dev/null +++ b/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.css @@ -0,0 +1,141 @@ +.container { + display: block; + position: relative; + width: 300px; + height: 300px; + cursor: pointer; + border-radius: 20px; +} +.descriptionCard { + position: relative; + top: -1px; + left: -1px; + width: 300px; + height: 300px; + padding: 20px; + border-radius: 20px; +} +.drawerCard { + position: relative; + padding: 20px 80px 0; + min-height: 100%; + width: 60vw; +} +.p { + display: -webkit-box; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-word; + font-size: 14px; + padding: 0px 10px; +} +.formContainer { + height: 80%; + overflow: scroll; + padding: 0 10px; +} +.buttonsContainer { + position: absolute; + bottom: 50px; + left: 100px; + right: 100px; + display: flex; + justify-content: space-between; + align-items: center; +} +.buttonContainer { + width: 45%; + border-width: 0px; + background-color: transparent; +} +.buttonItem { + width: 100%; + padding: 5px; + border-radius: 4px; + border: 1px solid #e5e7eb; + border-width: 1px; + border-color: #e5e7eb; +} +.instructionText { + font-size: 12px; + color: #666666; + font-style: italic; + margin: 30px 0; + text-align: center; +} +.iconRow { + position: absolute; + bottom: 20px; + left: 20px; + right: 20px; + display: flex; + justify-content: space-between; + align-items: center; +} +.iconItem { + display: flex; + flex-direction: column; + align-items: center; + margin: 20px; +} +.boldIconText { + font-weight: bold; + font-size: 1.2em; +} +.muiIcon { + font-size: 1.5em; +} +.smallText { + font-size: 0.8em; +} +.dialogBox { + width: 1241px; + height: 607px; + background-color: #fff; + margin: 32px; + overflow-x: scroll; +} +.dialogTitle { + display: flex; + justify-content: space-between; + padding: 20px 20px 7px; + color: #000; +} +.dialogTitle-model_name { + font-size: 18px; + font-weight: 700; +} +.pathBox { + width: 160px; + cursor: pointer; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.pathBox2 { + width: 300px; +} +.copyPath { + font-size: 14px !important; + cursor: pointer; + color: #555; +} +.empty { + position: absolute; + left: 50%; + top: 30%; + font-size: 20px; + color: #555; + transform: translate(-50%, 0); +} +.deleteDialog { + display: flex; + align-items: center; +} + +.warningIcon { + margin-right: 10px; + color: rgb(237, 108, 2); +} diff --git a/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.js b/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.js deleted file mode 100644 index d5f86867a1..0000000000 --- a/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.js +++ /dev/null @@ -1,103 +0,0 @@ -const styles = { - container: { - display: 'block', - position: 'relative', - width: '300px', - height: '300px', - borderRadius: '20px', - }, - containerSelected: { - cursor: 'pointer', - display: 'block', - position: 'relative', - width: '300px', - height: '300px', - borderRadius: '20px', - }, - descriptionCard: { - position: 'relative', - top: '-1px', - left: '-1px', - width: '300px', - height: '300px', - padding: '20px', - borderRadius: '20px', - }, - drawerCard: { - position: 'relative', - padding: '20px 80px 0', - minHeight: '100%', - width: '60vw', - }, - p: { - 'display': '-webkit-box', - '-webkit-line-clamp': '4', - '-webkit-box-orient': 'vertical', - 'overflow': 'hidden', - 'textOverflow': 'ellipsis', - 'wordBreak': 'break-word', - 'fontSize': '14px', - 'padding': '0px 10px', - }, - formContainer: { - height: '80%', - overflow: 'scroll', - padding: '0 10px', - }, - buttonsContainer: { - position: 'absolute', - bottom: '50px', - left: '100px', - right: '100px', - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - }, - buttonContainer: { - width: '45%', - borderWidth: '0px', - backgroundColor: 'transparent', - }, - buttonItem: { - width: '100%', - padding: '5px', - borderRadius: '4px', - border: '1px solid #e5e7eb', - borderWidth: '1px', - borderColor: '#e5e7eb', - }, - instructionText: { - fontSize: '12px', - color: '#666666', - fontStyle: 'italic', - margin: '30px 0', - textAlign: 'center', - }, - iconRow: { - position: 'absolute', - bottom: '20px', - left: '20px', - right: '20px', - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - }, - iconItem: { - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - margin: '20px', - }, - boldIconText: { - fontWeight: 'bold', - fontSize: '1.2em', - }, - muiIcon: { - fontSize: '1.5em', - }, - smallText: { - fontSize: '0.8em', - }, -} - -export default styles diff --git a/xinference/web/ui/src/scenes/register_model/registerModel.js b/xinference/web/ui/src/scenes/register_model/registerModel.js index bb97d36ef7..df4ab19311 100644 --- a/xinference/web/ui/src/scenes/register_model/registerModel.js +++ b/xinference/web/ui/src/scenes/register_model/registerModel.js @@ -371,7 +371,7 @@ const RegisterModelComponent = ({ modelType, customData }) => { setFormData({ ...formData, controlnet: arr }) } - const handleCopy = async () => { + const handleCopy = () => { const clipboard = new ClipboardJS('.copyIcon', { text: () => jsonData, }) @@ -692,7 +692,10 @@ const RegisterModelComponent = ({ modelType, customData }) => { toggleFamily(e.target.value) }} > - <Box sx={styles.checkboxWrapper} style={{ marginLeft: '10px' }}> + <Box + sx={styles.checkboxWrapper} + style={{ paddingLeft: '10px' }} + > {modelType === 'LLM' && sortStringsByFirstLetter(getFamilyByAbility()).map((v) => ( <Box sx={{ width: '20%' }} key={v}> From 34a57df449f0890415c424802d3596f3c8758412 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Fri, 14 Jun 2024 17:17:50 +0800 Subject: [PATCH 143/298] ENH: quantization for glm-4v (#1610) --- xinference/model/llm/llm_family.json | 2 ++ xinference/model/llm/llm_family_modelscope.json | 2 ++ xinference/model/llm/pytorch/glm4v.py | 16 +++++++++++++--- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index b5806199b6..5f24917fcc 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -939,6 +939,8 @@ "model_format": "pytorch", "model_size_in_billions": 9, "quantizations": [ + "4-bit", + "8-bit", "none" ], "model_id": "THUDM/glm-4v-9b", diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 635630028d..7675378a97 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -632,6 +632,8 @@ "model_format": "pytorch", "model_size_in_billions": 9, "quantizations": [ + "4-bit", + "8-bit", "none" ], "model_hub": "modelscope", diff --git a/xinference/model/llm/pytorch/glm4v.py b/xinference/model/llm/pytorch/glm4v.py index 09b4d98491..0b4bde2e09 100644 --- a/xinference/model/llm/pytorch/glm4v.py +++ b/xinference/model/llm/pytorch/glm4v.py @@ -56,19 +56,29 @@ def match( return True return False - def load(self, **kwargs): + def load(self): from transformers import AutoModelForCausalLM, AutoTokenizer device = self._pytorch_model_config.get("device", "auto") self._device = select_device(device) - self._device = "auto" if self._device == "cuda" else self._device + + kwargs = {"device_map": self._device} + quantization = self.quantization + if quantization != "none": + if self._device == "cuda" and self._is_linux(): + kwargs["device_map"] = "auto" + self._device = "auto" + if quantization == "4-bit": + kwargs["load_in_4bit"] = True + elif quantization == "8-bit": + kwargs["load_in_8bit"] = True model = AutoModelForCausalLM.from_pretrained( self.model_path, low_cpu_mem_usage=True, trust_remote_code=True, torch_dtype=torch.float16, - device_map=self._device, + **kwargs, ) self._model = model.eval() From cc972cdac6cf06085dac5fc6dd5a663c0eed892d Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Sun, 16 Jun 2024 13:17:03 +0800 Subject: [PATCH 144/298] BUG: show error when user launch quantized model without device supported (#1645) --- xinference/model/llm/pytorch/glm4v.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/xinference/model/llm/pytorch/glm4v.py b/xinference/model/llm/pytorch/glm4v.py index 0b4bde2e09..fa7878faf9 100644 --- a/xinference/model/llm/pytorch/glm4v.py +++ b/xinference/model/llm/pytorch/glm4v.py @@ -64,6 +64,8 @@ def load(self): kwargs = {"device_map": self._device} quantization = self.quantization + + # referenced from PytorchModel.load if quantization != "none": if self._device == "cuda" and self._is_linux(): kwargs["device_map"] = "auto" @@ -72,6 +74,15 @@ def load(self): kwargs["load_in_4bit"] = True elif quantization == "8-bit": kwargs["load_in_8bit"] = True + else: + raise ValueError( + f"Quantization {quantization} is not supported in temporary" + ) + else: + if quantization != "8-bit": + raise ValueError( + f"Only 8-bit quantization is supported if it is not linux system or cuda device" + ) model = AutoModelForCausalLM.from_pretrained( self.model_path, From aa3acc3a42cef00caccdd6309f3a4c0f879cd056 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Mon, 17 Jun 2024 04:02:36 +0200 Subject: [PATCH 145/298] BUG: Fix default rerank type (#1649) --- xinference/model/rerank/core.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index b9b4b3c4b8..f1ec7e2b29 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -136,9 +136,10 @@ def _auto_detect_type(model_path): tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) rerank_type = type_mapper.get(type(tokenizer).__name__) if rerank_type is None: - raise Exception( - f"Can't determine the rerank type based on the tokenizer {tokenizer}" + logger.warning( + f"Can't determine the rerank type based on the tokenizer {tokenizer}, use normal type by default." ) + return "normal" return rerank_type def load(self): From 7a70214ab43b55e646e9c82c430810fcbe101dc3 Mon Sep 17 00:00:00 2001 From: Hexiao Zhang <731931282@qq.com> Date: Mon, 17 Jun 2024 18:15:02 +0800 Subject: [PATCH 146/298] FEAT: Add Tools Support for Qwen Series MOE Models (#1642) --- xinference/api/restful_api.py | 4 ++++ xinference/model/llm/llm_family.json | 6 ++++-- xinference/model/llm/llm_family_modelscope.json | 6 ++++-- xinference/model/llm/utils.py | 16 ++++++++++++++-- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 0e9c6493fe..6b4d2b79a5 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1425,7 +1425,9 @@ async def create_chat_completion(self, request: Request) -> Response: "gorilla-openfunctions-v1", "qwen-chat", "qwen1.5-chat", + "qwen1.5-moe-chat", "qwen2-instruct", + "qwen2-moe-instruct", ] is_qwen = desc.get("model_format") == "ggmlv3" and "qwen-chat" == model_family @@ -1451,7 +1453,9 @@ async def create_chat_completion(self, request: Request) -> Response: if not is_vllm or model_family not in [ "qwen-chat", "qwen1.5-chat", + "qwen1.5-moe-chat", "qwen2-instruct", + "qwen2-moe-instruct", ]: raise HTTPException( status_code=400, diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 5f24917fcc..69aa9face7 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -2290,7 +2290,8 @@ "zh" ], "model_ability": [ - "chat" + "chat", + "tools" ], "model_description": "Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data.", "model_specs": [ @@ -2595,7 +2596,8 @@ "zh" ], "model_ability": [ - "chat" + "chat", + "tools" ], "model_description": "Qwen2 is the new series of Qwen large language models. ", "model_specs": [ diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 7675378a97..d33e7c450b 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2644,7 +2644,8 @@ "zh" ], "model_ability": [ - "chat" + "chat", + "tools" ], "model_description": "Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data.", "model_specs": [ @@ -2968,7 +2969,8 @@ "zh" ], "model_ability": [ - "chat" + "chat", + "tools" ], "model_description": "Qwen2 is the new series of Qwen large language models. ", "model_specs": [ diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index a95d2dfc15..f404eb8e24 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -661,7 +661,13 @@ def _eval_tool_arguments(cls, model_family, c, tools): content, func, args = cls._eval_gorilla_openfunctions_arguments(c, tools) elif family in ["chatglm3", "glm4-chat"]: content, func, args = cls._eval_glm_chat_arguments(c, tools) - elif family in ["qwen-chat", "qwen1.5-chat", "qwen2-instruct"]: + elif family in [ + "qwen-chat", + "qwen1.5-chat", + "qwen1.5-moe-chat", + "qwen2-instruct", + "qwen2-moe-instruct", + ]: content, func, args = cls._eval_qwen_chat_arguments(c, tools) else: raise Exception( @@ -680,7 +686,13 @@ def _tools_token_filter(cls, model_family): returns the part after "\nFinal Answer:" if found, else returns delta. """ family = model_family.model_family or model_family.model_name - if family in ["qwen-chat", "qwen1.5-chat"]: + if family in [ + "qwen-chat", + "qwen1.5-chat", + "qwen1.5-moe-chat", + "qwen2-instruct", + "qwen2-moe-instruct", + ]: # Encapsulating function to reset 'found' after each call found = False From dbbd5d054f2a1003f0f8175adf91fbcef1f70b1d Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:13:36 +0800 Subject: [PATCH 147/298] TST: Fix CI due to `tenacity` (#1660) --- .github/workflows/python.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index e32484c462..90903bb6ff 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -125,6 +125,7 @@ jobs: pip install diffusers pip install protobuf pip install FlagEmbedding + pip install "tenacity>=8.2.0,<8.4.0" pip install -e ".[dev]" pip install "jinja2==3.1.2" working-directory: . From 5e5e691ac5cbde419065ff4522bad6ac6c9d2d30 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:42:18 +0800 Subject: [PATCH 148/298] FEAT: [UI]Modify the deletion function of a custom model. (#1656) --- .../web/ui/src/components/deleteDialog.js | 45 +++++++++++++ .../launch_model/LaunchModelComponent.js | 35 +++++----- .../src/scenes/launch_model/launchCustom.js | 9 +++ .../ui/src/scenes/launch_model/launchLLM.js | 61 +++++++++-------- .../ui/src/scenes/launch_model/modelCard.js | 65 ++++++++----------- 5 files changed, 132 insertions(+), 83 deletions(-) create mode 100644 xinference/web/ui/src/components/deleteDialog.js diff --git a/xinference/web/ui/src/components/deleteDialog.js b/xinference/web/ui/src/components/deleteDialog.js new file mode 100644 index 0000000000..d690347149 --- /dev/null +++ b/xinference/web/ui/src/components/deleteDialog.js @@ -0,0 +1,45 @@ +import { WarningAmber } from '@mui/icons-material' +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, +} from '@mui/material' +import React from 'react' + +const AddPair = ({ text, isDelete, onHandleIsDelete, onHandleDelete }) => { + return ( + <Dialog + open={isDelete} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + <DialogTitle id="alert-dialog-title">Warning</DialogTitle> + <DialogContent> + <DialogContentText + className="deleteDialog" + id="alert-dialog-description" + > + <WarningAmber className="warningIcon" /> + <p>{text}</p> + </DialogContentText> + </DialogContent> + <DialogActions> + <Button + onClick={() => { + onHandleIsDelete() + }} + > + no + </Button> + <Button onClick={onHandleDelete} autoFocus> + yes + </Button> + </DialogActions> + </Dialog> + ) +} + +export default AddPair diff --git a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js index 17fd13df47..82ab43893d 100644 --- a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js +++ b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js @@ -26,27 +26,26 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { } const filter = (registration) => { - if (!registration || typeof searchTerm !== 'string') return false - const modelName = registration.model_name - ? registration.model_name.toLowerCase() - : '' - if (!modelName.includes(searchTerm.toLowerCase())) { - return false - } - if (completeDeleteArr.includes(registration.model_name)) { - registration.cache_status = Array.isArray(registration.cache_status) - ? [false] - : false + if (searchTerm !== '') { + if (!registration || typeof searchTerm !== 'string') return false + const modelName = registration.model_name + ? registration.model_name.toLowerCase() + : '' + if (!modelName.includes(searchTerm.toLowerCase())) { + return false + } + if (completeDeleteArr.includes(registration.model_name)) { + registration.cache_status = Array.isArray(registration.cache_status) + ? [false] + : false + } } - if (status && status !== 'all') { - if ( + + if (status !== 'all') { + return ( registration.cache_status && !completeDeleteArr.includes(registration.model_name) - ) { - return true - } else { - return false - } + ) } return true } diff --git a/xinference/web/ui/src/scenes/launch_model/launchCustom.js b/xinference/web/ui/src/scenes/launch_model/launchCustom.js index 6d647a11b0..e807bf02a8 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchCustom.js +++ b/xinference/web/ui/src/scenes/launch_model/launchCustom.js @@ -85,6 +85,14 @@ const LaunchCustom = ({ gpuAvailable }) => { } } + const handlecustomDelete = (model_name) => { + setRegistrationData( + registrationData.filter((item) => { + return item.model_name !== model_name + }) + ) + } + const style = { display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', @@ -144,6 +152,7 @@ const LaunchCustom = ({ gpuAvailable }) => { gpuAvailable={gpuAvailable} is_custom={true} modelType={item === 'llm' ? 'LLM' : item} + onHandlecustomDelete={handlecustomDelete} /> ))} </div> diff --git a/xinference/web/ui/src/scenes/launch_model/launchLLM.js b/xinference/web/ui/src/scenes/launch_model/launchLLM.js index 4bbf96390d..5abf1e14e9 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchLLM.js +++ b/xinference/web/ui/src/scenes/launch_model/launchLLM.js @@ -34,40 +34,45 @@ const LaunchLLM = ({ gpuAvailable }) => { } const filter = (registration) => { - if (!registration || typeof searchTerm !== 'string') return false - const modelName = registration.model_name - ? registration.model_name.toLowerCase() - : '' - const modelDescription = registration.model_description - ? registration.model_description.toLowerCase() - : '' - - if ( - !modelName.includes(searchTerm.toLowerCase()) && - !modelDescription.includes(searchTerm.toLowerCase()) - ) { - return false - } - if (modelAbility && modelAbility !== 'all') { - if (registration.model_ability.indexOf(modelAbility) < 0) { + if (searchTerm !== '') { + if (!registration || typeof searchTerm !== 'string') return false + const modelName = registration.model_name + ? registration.model_name.toLowerCase() + : '' + const modelDescription = registration.model_description + ? registration.model_description.toLowerCase() + : '' + + if ( + !modelName.includes(searchTerm.toLowerCase()) && + !modelDescription.includes(searchTerm.toLowerCase()) + ) { return false } } - if (completeDeleteArr.includes(registration.model_name)) { - registration.model_specs.forEach((item) => { - item.cache_status = Array.isArray(item) ? [false] : false - }) + + if (modelAbility !== 'all') { + if (modelAbility && modelAbility !== 'all') { + if (registration.model_ability.indexOf(modelAbility) < 0) { + return false + } + } } - if (status && status !== 'all') { - const judge = registration.model_specs.some((spec) => { - return filterCache(spec) - }) - if (judge && !completeDeleteArr.includes(registration.model_name)) { - return true - } else { - return false + + if (status !== 'all') { + if (completeDeleteArr.includes(registration.model_name)) { + registration.model_specs.forEach((item) => { + item.cache_status = Array.isArray(item) ? [false] : false + }) + } + if (status && status !== 'all') { + const judge = registration.model_specs.some((spec) => { + return filterCache(spec) + }) + return judge && !completeDeleteArr.includes(registration.model_name) } } + return true } diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index b01707c406..09a7019355 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -10,7 +10,6 @@ import { HelpCenterOutlined, RocketLaunchOutlined, UndoOutlined, - WarningAmber, } from '@mui/icons-material' import DeleteIcon from '@mui/icons-material/Delete' import FilterNoneIcon from '@mui/icons-material/FilterNone' @@ -18,15 +17,9 @@ import { Alert, Backdrop, Box, - Button, Chip, CircularProgress, Collapse, - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, Drawer, FormControl, Grid, @@ -55,6 +48,7 @@ import React, { useContext, useEffect, useRef, useState } from 'react' import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' +import DeleteDialog from '../../components/deleteDialog' import fetcher from '../../components/fetcher' import TitleTypography from '../../components/titleTypography' import AddPair from './components/addPair' @@ -66,6 +60,7 @@ const ModelCard = ({ modelType, is_custom = false, onHandleCompleteDelete, + onHandlecustomDelete, }) => { const [hover, setHover] = useState(false) const [selected, setSelected] = useState(false) @@ -110,6 +105,7 @@ const ModelCard = ({ const [cachedRealPath, setCachedRealPath] = useState('') const [page, setPage] = useState(0) const [isCopySuccess, setIsCopySuccess] = useState(false) + const [isDeleteCustomModel, setIsDeleteCustomModel] = useState(false) const parentRef = useRef(null) @@ -385,6 +381,8 @@ const ModelCard = ({ ) .then(() => { setCustomDeleted(true) + onHandlecustomDelete(modelData.model_name) + setIsDeleteCustomModel(false) }) .catch(console.error) } @@ -569,7 +567,10 @@ const ModelCard = ({ <TitleTypography value={modelData.model_name} /> <IconButton aria-label="delete" - onClick={handeCustomDelete} + onClick={(e) => { + e.stopPropagation() + setIsDeleteCustomModel(true) + }} disabled={customDeleted} > <DeleteIcon /> @@ -577,6 +578,7 @@ const ModelCard = ({ </Stack> )} {!is_custom && <TitleTypography value={modelData.model_name} />} + <Stack spacing={1} direction="row" @@ -669,7 +671,10 @@ const ModelCard = ({ <TitleTypography value={modelData.model_name} /> <IconButton aria-label="delete" - onClick={handeCustomDelete} + onClick={(e) => { + e.stopPropagation() + setIsDeleteCustomModel(true) + }} disabled={customDeleted} > <DeleteIcon /> @@ -742,6 +747,14 @@ const ModelCard = ({ )} </Paper> + <DeleteDialog + text={ + 'Are you sure to delete this custom model? This behavior is irreversible.' + } + isDelete={isDeleteCustomModel} + onHandleIsDelete={() => setIsDeleteCustomModel(false)} + onHandleDelete={handeCustomDelete} + /> <Drawer open={selected} onClose={() => { @@ -1407,34 +1420,12 @@ const ModelCard = ({ /> </div> </Backdrop> - <Dialog - open={isDeleteCached} - aria-labelledby="alert-dialog-title" - aria-describedby="alert-dialog-description" - > - <DialogTitle id="alert-dialog-title">Warning</DialogTitle> - <DialogContent> - <DialogContentText - className="deleteDialog" - id="alert-dialog-description" - > - <WarningAmber className="warningIcon" /> - <p>Confirm deletion of cache files? This action is irreversible.</p> - </DialogContentText> - </DialogContent> - <DialogActions> - <Button - onClick={() => { - setIsDeleteCached(false) - }} - > - no - </Button> - <Button onClick={handleDeleteCached} autoFocus> - yes - </Button> - </DialogActions> - </Dialog> + <DeleteDialog + text={'Confirm deletion of cache files? This action is irreversible.'} + isDelete={isDeleteCached} + onHandleIsDelete={() => setIsDeleteCached(false)} + onHandleDelete={handleDeleteCached} + /> <Snackbar anchorOrigin={{ vertical: 'top', horizontal: 'center' }} open={isCopySuccess} From c2e9d6d60f44d604cfb88a2c53d18b9453c471e2 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:49:23 +0800 Subject: [PATCH 149/298] ENH: Continuous batching supports all the models with `transformers` backend (#1659) --- .github/workflows/python.yaml | 2 +- xinference/api/restful_api.py | 36 ++- xinference/core/model.py | 9 +- xinference/core/scheduler.py | 16 +- .../core/tests/test_continuous_batching.py | 2 + xinference/deploy/docker/cpu.Dockerfile | 2 +- xinference/model/llm/llm_family.json | 2 + .../model/llm/llm_family_modelscope.json | 2 + xinference/model/llm/pytorch/chatglm.py | 23 ++ xinference/model/llm/pytorch/core.py | 88 +++---- xinference/model/llm/pytorch/internlm2.py | 15 ++ xinference/model/llm/pytorch/utils.py | 225 ++++-------------- 12 files changed, 178 insertions(+), 244 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 90903bb6ff..8dd2ef18df 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -109,7 +109,7 @@ jobs: sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" fi - pip install "llama-cpp-python>=0.2.23,!=0.2.58" + pip install "llama-cpp-python>=0.2.23,!=0.2.58" --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu pip install transformers pip install attrdict pip install "timm>=0.9.16" diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 6b4d2b79a5..bc4f338613 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -981,7 +981,8 @@ async def get_address(self) -> JSONResponse: return JSONResponse(content=self._supervisor_address) async def create_completion(self, request: Request) -> Response: - body = CreateCompletionRequest.parse_obj(await request.json()) + raw_body = await request.json() + body = CreateCompletionRequest.parse_obj(raw_body) exclude = { "prompt", "model", @@ -991,6 +992,7 @@ async def create_completion(self, request: Request) -> Response: "logit_bias_type", "user", } + raw_kwargs = {k: v for k, v in raw_body.items() if k not in exclude} kwargs = body.dict(exclude_unset=True, exclude=exclude) # TODO: Decide if this default value override is necessary #1061 @@ -1020,7 +1022,9 @@ async def stream_results(): iterator = None try: try: - iterator = await model.generate(body.prompt, kwargs) + iterator = await model.generate( + body.prompt, kwargs, raw_params=raw_kwargs + ) except RuntimeError as re: self.handle_request_limit_error(re) async for item in iterator: @@ -1040,7 +1044,7 @@ async def stream_results(): return EventSourceResponse(stream_results()) else: try: - data = await model.generate(body.prompt, kwargs) + data = await model.generate(body.prompt, kwargs, raw_params=raw_kwargs) return Response(data, media_type="application/json") except Exception as e: logger.error(e, exc_info=True) @@ -1341,7 +1345,8 @@ async def create_variations( raise HTTPException(status_code=500, detail=str(e)) async def create_chat_completion(self, request: Request) -> Response: - body = CreateChatCompletion.parse_obj(await request.json()) + raw_body = await request.json() + body = CreateChatCompletion.parse_obj(raw_body) exclude = { "prompt", "model", @@ -1351,6 +1356,7 @@ async def create_chat_completion(self, request: Request) -> Response: "logit_bias_type", "user", } + raw_kwargs = {k: v for k, v in raw_body.items() if k not in exclude} kwargs = body.dict(exclude_unset=True, exclude=exclude) # TODO: Decide if this default value override is necessary #1061 @@ -1469,10 +1475,16 @@ async def stream_results(): try: try: if is_qwen: - iterator = await model.chat(prompt, chat_history, kwargs) + iterator = await model.chat( + prompt, chat_history, kwargs, raw_params=raw_kwargs + ) else: iterator = await model.chat( - prompt, system_prompt, chat_history, kwargs + prompt, + system_prompt, + chat_history, + kwargs, + raw_params=raw_kwargs, ) except RuntimeError as re: await self._report_error_event(model_uid, str(re)) @@ -1502,9 +1514,17 @@ async def stream_results(): else: try: if is_qwen: - data = await model.chat(prompt, chat_history, kwargs) + data = await model.chat( + prompt, chat_history, kwargs, raw_params=raw_kwargs + ) else: - data = await model.chat(prompt, system_prompt, chat_history, kwargs) + data = await model.chat( + prompt, + system_prompt, + chat_history, + kwargs, + raw_params=raw_kwargs, + ) return Response(content=data, media_type="application/json") except Exception as e: logger.error(e, exc_info=True) diff --git a/xinference/core/model.py b/xinference/core/model.py index ef85295dea..fae1b1811a 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -264,13 +264,14 @@ def is_vllm_backend(self) -> bool: return isinstance(self._model, VLLMModel) def allow_batching(self) -> bool: - from ..model.llm.pytorch.core import PytorchChatModel, PytorchModel + from ..model.llm.pytorch.core import PytorchModel + + model_ability = self._model_description.get("model_ability", []) return ( XINFERENCE_TRANSFORMERS_ENABLE_BATCHING and isinstance(self._model, PytorchModel) - and self._model.__class__.__name__ - in (PytorchChatModel.__name__, PytorchModel.__name__) + and "vision" not in model_ability ) async def load(self): @@ -399,6 +400,7 @@ async def generate(self, prompt: str, *args, **kwargs): prompt, "generate", *args, **kwargs ) else: + kwargs.pop("raw_params", None) if hasattr(self._model, "generate"): return await self._call_wrapper( self._model.generate, prompt, *args, **kwargs @@ -481,6 +483,7 @@ async def chat(self, prompt: str, *args, **kwargs): prompt, "chat", *args, **kwargs ) else: + kwargs.pop("raw_params", None) if hasattr(self._model, "chat"): response = await self._call_wrapper( self._model.chat, prompt, *args, **kwargs diff --git a/xinference/core/scheduler.py b/xinference/core/scheduler.py index 81c130dbd9..a3e436ac5b 100644 --- a/xinference/core/scheduler.py +++ b/xinference/core/scheduler.py @@ -18,7 +18,7 @@ import uuid from collections import deque from enum import Enum -from typing import List, Optional, Set +from typing import List, Optional, Set, Tuple import xoscar as xo @@ -53,7 +53,8 @@ def __init__(self, prompt, future_or_queue, is_prefill, *args, **kwargs): self._kv_cache = None # use passed args from upstream interface self._inference_args = args - # use passed kwargs from upstream interface, basically not used for now + # use passed kwargs from upstream interface, currently for getting raw generate config from upstream, + # which is useful for some special models self._inference_kwargs = kwargs # should this request be stopped self._stopped = False @@ -66,6 +67,8 @@ def __init__(self, prompt, future_or_queue, is_prefill, *args, **kwargs): self._sanitized_generate_config = None # Chunk id for results. In stream mode, all the chunk ids should be same. self._stream_chunk_id = str(uuid.uuid4()) + # For calculate attention mask if needed + self.padding_len = 0 # Use in stream mode self.last_output_length = 0 # inference results, @@ -172,6 +175,10 @@ def sanitized_generate_config(self): def sanitized_generate_config(self, value: dict): self._sanitized_generate_config = value + @property + def inference_kwargs(self): + return self._inference_kwargs + @property def stopped(self): return self._stopped @@ -231,7 +238,9 @@ def request_id(self) -> Optional[str]: ) @functools.lru_cache - def get_generate_configs(self, eos_token_id: int): + def get_generate_configs( + self, eos_token_id: int, builtin_stop_token_ids: Optional[Tuple[int]] = None + ): from ..types import max_tokens_field max_new_tokens = int( @@ -245,6 +254,7 @@ def get_generate_configs(self, eos_token_id: int): ) stop_token_ids = set(stop_token_ids) stop_token_ids.add(eos_token_id) + stop_token_ids.update(builtin_stop_token_ids or []) temperature = float(self.sanitized_generate_config.get("temperature", 1.0)) repetition_penalty = float( self.sanitized_generate_config.get("repetition_penalty", 1.0) diff --git a/xinference/core/tests/test_continuous_batching.py b/xinference/core/tests/test_continuous_batching.py index 4d612d3bcf..a7121ccbcc 100644 --- a/xinference/core/tests/test_continuous_batching.py +++ b/xinference/core/tests/test_continuous_batching.py @@ -114,6 +114,8 @@ def run_internal(self): @pytest.fixture def enable_batch(): os.environ["XINFERENCE_TRANSFORMERS_ENABLE_BATCHING"] = "1" + yield + os.environ["XINFERENCE_TRANSFORMERS_ENABLE_BATCHING"] = "0" @pytest.mark.skipif( diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index 15e02a3590..ea29397264 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -63,7 +63,7 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ timm \ opencv-contrib-python-headless && \ pip install -i "$PIP_INDEX" -U chatglm-cpp && \ - pip install -i "$PIP_INDEX" "llama-cpp-python>=0.2.25,!=0.2.58" && \ + pip install "llama-cpp-python>=0.2.25,!=0.2.58" --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu && \ cd /opt/inference && \ python setup.py build_web && \ git restore . && \ diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 69aa9face7..a5a632e303 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -5677,9 +5677,11 @@ ], "intra_message_sep": "<|im_end|>", "stop_token_ids": [ + 2, 92542 ], "stop": [ + "</s>", "<|im_end|>" ] } diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index d33e7c450b..c62afa4764 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3352,9 +3352,11 @@ ], "intra_message_sep": "<|im_end|>", "stop_token_ids": [ + 2, 92542 ], "stop": [ + "</s>", "<|im_end|>" ] } diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index e263bb82da..56cc7afaf4 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -15,6 +15,7 @@ import uuid from typing import Any, Dict, Iterator, List, Optional, Union +from ....core.scheduler import InferenceRequest from ....types import ( SPECIAL_TOOL_PROMPT, ChatCompletion, @@ -244,3 +245,25 @@ def _stream_generator(): prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 ), ) + + @staticmethod + def require_attention_mask(): + """ + GLM4 needs to use attention mask and position ids during inference. + Otherwise, the inference result would be not available. + """ + return True + + def prepare_sanitize_generate_config(self, req: InferenceRequest): + """ + Set temperature and top_p to 0.8 by default + """ + raw_config = req.inference_kwargs.get("raw_params", {}) + temperature = raw_config.get("temperature", None) + if temperature is None: + raw_config["temperature"] = 0.8 + top_p = raw_config.get("top_p", None) + if top_p is None: + raw_config["top_p"] = 0.8 + + return raw_config diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 9129949f38..d2aab93cb4 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -16,7 +16,7 @@ import logging import os from functools import lru_cache -from typing import Iterable, Iterator, List, Optional, Union +from typing import Iterable, Iterator, List, Optional, Tuple, Union from ....core.scheduler import InferenceRequest from ....device_utils import ( @@ -283,35 +283,21 @@ def match( def generate( self, prompt: str, generate_config: Optional[PytorchGenerateConfig] = None ) -> Union[Completion, Iterator[CompletionChunk]]: - from .utils import generate_stream, generate_stream_falcon - - model_family_name = self.model_family.model_name.lower() + from .utils import generate_stream def generator_wrapper( prompt: str, generate_config: PytorchGenerateConfig ) -> Iterator[CompletionChunk]: - if "falcon" in model_family_name: - for completion_chunk, completion_usage in generate_stream_falcon( - self.model_uid, - self._model, - self._tokenizer, - prompt, - self._device, - generate_config, - ): - completion_chunk["usage"] = completion_usage - yield completion_chunk - else: - for completion_chunk, completion_usage in generate_stream( - self.model_uid, - self._model, - self._tokenizer, - prompt, - self._device, - generate_config, - ): - completion_chunk["usage"] = completion_usage - yield completion_chunk + for completion_chunk, completion_usage in generate_stream( + self.model_uid, + self._model, + self._tokenizer, + prompt, + self._device, + generate_config, + ): + completion_chunk["usage"] = completion_usage + yield completion_chunk logger.debug( "Enter generate, prompt: %s, generate config: %s", prompt, generate_config @@ -336,26 +322,15 @@ def generator_wrapper( stream = generate_config.get("stream", False) if not stream: - if "falcon" in model_family_name: - for completion_chunk, completion_usage in generate_stream_falcon( - self.model_uid, - self._model, - self._tokenizer, - prompt, - self._device, - generate_config, - ): - pass - else: - for completion_chunk, completion_usage in generate_stream( - self.model_uid, - self._model, - self._tokenizer, - prompt, - self._device, - generate_config, - ): - pass + for completion_chunk, completion_usage in generate_stream( + self.model_uid, + self._model, + self._tokenizer, + prompt, + self._device, + generate_config, + ): + pass completion = Completion( id=completion_chunk["id"], object=completion_chunk["object"], @@ -368,6 +343,10 @@ def generator_wrapper( else: return generator_wrapper(prompt, generate_config) + @staticmethod + def require_attention_mask(): + return False + @lru_cache def get_context_len(self): return get_context_length(self._model.config) @@ -375,13 +354,14 @@ def get_context_len(self): def get_max_num_seqs(self) -> int: return self._pytorch_model_config.get("max_num_seqs") # type: ignore + def prepare_sanitize_generate_config(self, req: InferenceRequest): + return self._sanitize_generate_config(req.generate_config) + def prepare_batch_inference(self, req_list: List[InferenceRequest]): # check some parameters for r in req_list: if r.sanitized_generate_config is None: - r.sanitized_generate_config = self._sanitize_generate_config( - r.generate_config - ) + r.sanitized_generate_config = self.prepare_sanitize_generate_config(r) if r.is_prefill: # check some generate params max_src_len = get_max_src_len(self.get_context_len(), r) # type: ignore @@ -401,6 +381,14 @@ def prepare_batch_inference(self, req_list: List[InferenceRequest]): r.error_msg = "Invalid `stop` field type" continue + def _get_builtin_stop_token_ids(self) -> Tuple: + return ( + tuple(self.model_family.prompt_style.stop_token_ids) + if self.model_family.prompt_style + and self.model_family.prompt_style.stop_token_ids + else tuple() + ) + def handle_batch_inference_results(self, req_list: List[InferenceRequest]): for req in req_list: if req.error_msg is None: @@ -449,6 +437,8 @@ def batch_inference(self, req_list: List[InferenceRequest]): self._tokenizer, self._device, context_len, + self._get_builtin_stop_token_ids(), + require_attention_mask=self.require_attention_mask(), ) self.handle_batch_inference_results(req_list) diff --git a/xinference/model/llm/pytorch/internlm2.py b/xinference/model/llm/pytorch/internlm2.py index 9d82663d39..fa81a98a49 100644 --- a/xinference/model/llm/pytorch/internlm2.py +++ b/xinference/model/llm/pytorch/internlm2.py @@ -15,6 +15,7 @@ import uuid from typing import Any, Dict, Iterator, List, Optional, Union +from ....core.scheduler import InferenceRequest from ....types import ( ChatCompletion, ChatCompletionChoice, @@ -88,6 +89,20 @@ def match( return False return True + def prepare_sanitize_generate_config(self, req: InferenceRequest): + """ + Overwrite this func for this special model. + Cannot use the default configuration, which works poorly on this model. + """ + raw_config = req.inference_kwargs.get("raw_params", {}) + temperature = raw_config.get("temperature", None) + if temperature is None: + raw_config["temperature"] = 0.8 + top_p = raw_config.get("top_p", None) + if top_p is None: + raw_config["top_p"] = 0.8 + return raw_config + def chat( self, prompt: str, diff --git a/xinference/model/llm/pytorch/utils.py b/xinference/model/llm/pytorch/utils.py index 0462425617..fb066eec4f 100644 --- a/xinference/model/llm/pytorch/utils.py +++ b/xinference/model/llm/pytorch/utils.py @@ -17,11 +17,9 @@ import os import time import uuid -from threading import Thread from typing import Dict, Iterable, Iterator, List, Optional, Tuple import torch -from transformers import GenerationConfig, TextIteratorStreamer from transformers.cache_utils import DynamicCache from transformers.generation.logits_process import ( LogitsProcessorList, @@ -363,179 +361,6 @@ def generate_stream( empty_cache() -@torch.inference_mode() -def generate_stream_falcon( - model_uid, - model, - tokenizer, - prompt, - device, - generate_config, - judge_sent_end=False, -) -> Iterator[Tuple[CompletionChunk, CompletionUsage]]: - context_len = get_context_length(model.config) - stream_interval = generate_config.get("stream_interval", 2) - stream = generate_config.get("stream", False) - stream_options = generate_config.pop("stream_options", None) - include_usage = ( - stream_options["include_usage"] if isinstance(stream_options, dict) else False - ) - len_prompt = len(prompt) - - temperature = float(generate_config.get("temperature", 1.0)) - repetition_penalty = float(generate_config.get("repetition_penalty", 1.0)) - top_p = float(generate_config.get("top_p", 1.0)) - top_k = int(generate_config.get("top_k", 50)) # -1 means disable - max_new_tokens = int(generate_config.get("max_tokens", max_tokens_field.default)) - echo = bool(generate_config.get("echo", False)) - stop_str = generate_config.get("stop", None) - stop_token_ids = generate_config.get("stop_token_ids", None) or [] - stop_token_ids.append(tokenizer.eos_token_id) - chunk_id = str(uuid.uuid4()) - - inputs = tokenizer(prompt, return_tensors="pt").to(model.device) - input_ids = inputs["input_ids"] - attention_mask = inputs["attention_mask"] - - max_src_len = context_len - max_new_tokens - 8 - - input_ids = input_ids[-max_src_len:] # truncate from the left - attention_mask = attention_mask[-max_src_len:] # truncate from the left - input_echo_len = len(input_ids) - - decode_config = dict(skip_special_tokens=True, clean_up_tokenization_spaces=True) - streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, **decode_config) - - generation_config = GenerationConfig( - max_new_tokens=max_new_tokens, - do_sample=temperature >= 1e-5, - temperature=temperature, - repetition_penalty=repetition_penalty, - no_repeat_ngram_size=10, - top_p=top_p, - top_k=top_k, - eos_token_id=stop_token_ids, - ) - - generation_kwargs = dict( - inputs=input_ids, - attention_mask=attention_mask, - streamer=streamer, - generation_config=generation_config, - ) - - thread = Thread(target=model.generate, kwargs=generation_kwargs) - thread.start() - - if echo: - # means keep the prompt - output = prompt - else: - output = "" - - last_output_length = 0 - for i, new_text in enumerate(streamer): - output += new_text - if i % stream_interval == 0: - if echo: - rfind_start = len_prompt - else: - rfind_start = 0 - - partially_stopped = False - if stop_str: - if isinstance(stop_str, str): - pos = output.rfind(stop_str, rfind_start) - if pos != -1: - output = output[:pos] - else: - partially_stopped = is_partial_stop(output, stop_str) - elif isinstance(stop_str, Iterable): - for each_stop in stop_str: - pos = output.rfind(each_stop, rfind_start) - if pos != -1: - output = output[:pos] - break - else: - partially_stopped = is_partial_stop(output, each_stop) - if partially_stopped: - break - else: - raise ValueError("Invalid stop field type.") - - if stream: - output = output.strip("�") - tmp_output_length = len(output) - output = output[last_output_length:] - last_output_length = tmp_output_length - - # prevent yielding partial stop sequence - if not partially_stopped: - completion_choice = CompletionChoice( - text=output, index=0, logprobs=None, finish_reason=None - ) - completion_chunk = CompletionChunk( - id=chunk_id, - object="text_completion", - created=int(time.time()), - model=model_uid, - choices=[completion_choice], - ) - completion_usage = CompletionUsage( - prompt_tokens=input_echo_len, - completion_tokens=i, - total_tokens=(input_echo_len + i), - ) - - yield completion_chunk, completion_usage - output = output.strip() - - # finish stream event, which contains finish reason - if i == max_new_tokens - 1: - finish_reason = "length" - elif partially_stopped: - finish_reason = None - else: - finish_reason = "stop" - - completion_choice = CompletionChoice( - text=output, index=0, logprobs=None, finish_reason=finish_reason - ) - completion_chunk = CompletionChunk( - id=chunk_id, - object="text_completion", - created=int(time.time()), - model=model_uid, - choices=[completion_choice], - ) - completion_usage = CompletionUsage( - prompt_tokens=input_echo_len, - completion_tokens=i, - total_tokens=(input_echo_len + i), - ) - - yield completion_chunk, completion_usage - - if include_usage: - completion_chunk = CompletionChunk( - id=chunk_id, - object="text_completion", - created=int(time.time()), - model=model_uid, - choices=[], - ) - completion_usage = CompletionUsage( - prompt_tokens=input_echo_len, - completion_tokens=i, - total_tokens=(input_echo_len + i), - ) - yield completion_chunk, completion_usage - - # clean - gc.collect() - empty_cache() - - def _get_token_from_logits( req: InferenceRequest, i: int, logits, temperature, repetition_penalty, top_p, top_k ): @@ -570,12 +395,15 @@ def _pad_to_max_length(x: List[int], max_len: int, pad: int) -> List[int]: return [pad] * (max_len - len(x)) + x -def _pad_seqs_inplace(seqs: List[List[int]], pad: int): +def _pad_seqs_inplace(seqs: List[List[int]], reqs: List[InferenceRequest], pad: int): max_len = max(len(seq) for seq in seqs) n = len(seqs) i = 0 while i < n: + prev_seq_len = len(seqs[i]) seqs[i] = _pad_to_max_length(seqs[i], max_len, pad) + padding_len = len(seqs[i]) - prev_seq_len + reqs[i].padding_len = padding_len i += 1 @@ -681,6 +509,25 @@ def _merge_kv_cache( return ret_kv.to_legacy_cache() +def _get_attention_mask_and_position_ids(kv, reqs: List[InferenceRequest]): + batch_size, seq_length, device = ( + kv[0][0].shape[0], + kv[0][0].shape[2], + kv[0][0].device, + ) + seq_length = seq_length + 1 + position_ids = torch.as_tensor([[seq_length - 1]], dtype=torch.long, device=device) + attention_mask = torch.ones( + (batch_size, seq_length), dtype=torch.long, device=device + ) + padding_lens = torch.as_tensor([r.padding_len for r in reqs]) + mask = torch.arange(seq_length).expand( + batch_size, seq_length + ) < padding_lens.unsqueeze(1) + attention_mask[mask] = 0 + return attention_mask, position_ids + + @torch.inference_mode() def _batch_inference_one_step_internal( req_list: List[InferenceRequest], @@ -689,7 +536,9 @@ def _batch_inference_one_step_internal( tokenizer, device, context_len: int, + stop_tokens: Tuple[int], decode_round: int = 16, + require_attention_mask: bool = False, bos_flag: str = "<bos_stream>", eos_flag: str = "<eos_stream>", ): @@ -699,7 +548,8 @@ def _batch_inference_one_step_internal( if not valid_req_list: return generate_config_mapping: Dict[InferenceRequest, Tuple] = { - r: r.get_generate_configs(tokenizer.eos_token_id) for r in valid_req_list + r: r.get_generate_configs(tokenizer.eos_token_id, stop_tokens) + for r in valid_req_list } s_time = time.time() @@ -721,7 +571,7 @@ def _batch_inference_one_step_internal( max_src_len = get_max_src_len(context_len, req) req.prompt_tokens = input_id[-max_src_len:] prompt_tokens.append(req.prompt_tokens) - _pad_seqs_inplace(prompt_tokens, 0) + _pad_seqs_inplace(prompt_tokens, valid_req_list, 0) out = model(torch.as_tensor(prompt_tokens, device=device), use_cache=True) logits = out.logits @@ -763,10 +613,18 @@ def _batch_inference_one_step_internal( # here, only decode phase, just run some rounds for _i in range(decode_round): decode_tokens: List[List[int]] = [[r.new_tokens[-1]] for r in valid_req_list] + inf_kws = {} + if require_attention_mask: + attention_mask, position_ids = _get_attention_mask_and_position_ids( + past_key_values, valid_req_list + ) + inf_kws["position_ids"] = position_ids + inf_kws["attention_mask"] = attention_mask out = model( input_ids=torch.as_tensor(decode_tokens, device=device), use_cache=True, past_key_values=past_key_values, + **inf_kws, ) logits = out.logits past_key_values = out.past_key_values @@ -903,12 +761,21 @@ def batch_inference_one_step( tokenizer, device, context_len: int, + stop_token_ids: Tuple[int], + require_attention_mask: bool = False, ): from ....core.model import OutOfMemoryError try: _batch_inference_one_step_internal( - req_list, model_uid, model, tokenizer, device, context_len + req_list, + model_uid, + model, + tokenizer, + device, + context_len, + stop_token_ids, + require_attention_mask=require_attention_mask, ) except OutOfMemoryError: logger.exception( From d6041d502360743b487580fa8ef62a0d3742477c Mon Sep 17 00:00:00 2001 From: liuzhenghua <1090179900@qq.com> Date: Thu, 20 Jun 2024 10:17:22 +0800 Subject: [PATCH 150/298] BUG: chat_completion not response while error appears more than 100 (#1663) Co-authored-by: liuzhenghua-jk <liuzhenghua-jk@360shuke.com> --- xinference/core/event.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/xinference/core/event.py b/xinference/core/event.py index 0319a4d5f8..fb5df80dc2 100644 --- a/xinference/core/event.py +++ b/xinference/core/event.py @@ -12,8 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import queue -from collections import defaultdict +from collections import defaultdict, deque from enum import Enum from typing import Dict, List, TypedDict @@ -37,8 +36,8 @@ class Event(TypedDict): class EventCollectorActor(xo.StatelessActor): def __init__(self): super().__init__() - self._model_uid_to_events: Dict[str, queue.Queue] = defaultdict( # type: ignore - lambda: queue.Queue(maxsize=MAX_EVENT_COUNT_PER_MODEL) + self._model_uid_to_events: Dict[str, deque] = defaultdict( # type: ignore + lambda: deque(maxlen=MAX_EVENT_COUNT_PER_MODEL) ) @classmethod @@ -50,7 +49,7 @@ def get_model_events(self, model_uid: str) -> List[Dict]: if event_queue is None: return [] else: - return [dict(e, event_type=e["event_type"].name) for e in event_queue.queue] + return [dict(e, event_type=e["event_type"].name) for e in iter(event_queue)] def report_event(self, model_uid: str, event: Event): - self._model_uid_to_events[model_uid].put(event) + self._model_uid_to_events[model_uid].append(event) From 2bbfab1432e743a83a75d4f76b8bc3e202fd26b1 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Fri, 21 Jun 2024 10:11:32 +0800 Subject: [PATCH 151/298] CHORE: [pre-commit] Add exclude thirdparty rules (#1678) --- .pre-commit-config.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5e6f50afef..61d19c86ae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,11 +4,14 @@ repos: rev: 23.12.0 hooks: - id: black + exclude: thirdparty - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: - id: end-of-file-fixer + exclude: ^xinference/thirdparty - id: trailing-whitespace + exclude: thirdparty - repo: https://github.com/PyCQA/flake8 rev: 6.0.0 hooks: @@ -20,6 +23,7 @@ repos: hooks: - id: isort args: [--sp, setup.cfg] + exclude: thirdparty - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.9.0 hooks: @@ -32,3 +36,4 @@ repos: hooks: - id: codespell args: [ --config, setup.cfg] + exclude: thirdparty From 21b5ab2ac91f967da50db760f89b6545b787dd69 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Fri, 21 Jun 2024 10:46:22 +0800 Subject: [PATCH 152/298] FEAT: [UI]Custom model presents JSON data and modifies it. (#1670) --- xinference/web/ui/src/components/MenuSide.js | 8 + .../components/copyComponent/copyComponent.js | 41 +++ .../ui/src/components/copyComponent/style.css | 9 + .../web/ui/src/components/deleteDialog.js | 4 +- xinference/web/ui/src/router/index.js | 2 +- .../launch_model/LaunchModelComponent.js | 33 +- .../ui/src/scenes/launch_model/launchLLM.js | 48 +-- .../ui/src/scenes/launch_model/modelCard.js | 170 ++++++---- .../launch_model/styles/launchModelStyle.js | 8 - .../launch_model/styles/modelCardStyle.css | 50 ++- .../components/addControlnet.js | 24 +- .../components/addModelSpecs.js | 105 ++++++- .../web/ui/src/scenes/register_model/index.js | 20 +- .../scenes/register_model/registerModel.js | 292 ++++++++++++++---- .../styles/registerModelStyle.css | 26 +- 15 files changed, 606 insertions(+), 234 deletions(-) create mode 100644 xinference/web/ui/src/components/copyComponent/copyComponent.js create mode 100644 xinference/web/ui/src/components/copyComponent/style.css delete mode 100644 xinference/web/ui/src/scenes/launch_model/styles/launchModelStyle.js diff --git a/xinference/web/ui/src/components/MenuSide.js b/xinference/web/ui/src/components/MenuSide.js index 429f454032..1476b1abb7 100644 --- a/xinference/web/ui/src/components/MenuSide.js +++ b/xinference/web/ui/src/components/MenuSide.js @@ -165,6 +165,14 @@ const MenuSide = () => { ) setActive(link) console.log(active) + } else if (link === 'register_model') { + sessionStorage.setItem( + 'registerModelType', + '/register_model/llm' + ) + navigate('/register_model/llm') + setActive(link) + console.log(active) } else { navigate(`/${link}`) setActive(link) diff --git a/xinference/web/ui/src/components/copyComponent/copyComponent.js b/xinference/web/ui/src/components/copyComponent/copyComponent.js new file mode 100644 index 0000000000..fdd6030fd7 --- /dev/null +++ b/xinference/web/ui/src/components/copyComponent/copyComponent.js @@ -0,0 +1,41 @@ +import './style.css' + +import FilterNoneIcon from '@mui/icons-material/FilterNone' +import { Alert, Snackbar, Tooltip } from '@mui/material' +import ClipboardJS from 'clipboard' +import React, { useState } from 'react' + +const CopyComponent = ({ tip, text }) => { + const [isCopySuccess, setIsCopySuccess] = useState(false) + + const handleCopy = () => { + const clipboard = new ClipboardJS('.copyText', { + text: () => text, + }) + + clipboard.on('success', (e) => { + e.clearSelection() + setIsCopySuccess(true) + }) + } + + return ( + <> + <Tooltip title={tip} placement="top"> + <FilterNoneIcon className="copyText" onClick={handleCopy} /> + </Tooltip> + <Snackbar + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + open={isCopySuccess} + autoHideDuration={1500} + onClose={() => setIsCopySuccess(false)} + > + <Alert severity="success" variant="filled" sx={{ width: '100%' }}> + Copied to clipboard! + </Alert> + </Snackbar> + </> + ) +} + +export default CopyComponent diff --git a/xinference/web/ui/src/components/copyComponent/style.css b/xinference/web/ui/src/components/copyComponent/style.css new file mode 100644 index 0000000000..9f7744f5c6 --- /dev/null +++ b/xinference/web/ui/src/components/copyComponent/style.css @@ -0,0 +1,9 @@ +.copyText { + font-size: 14px !important; + color: #666; + cursor: pointer; +} + +.copyText:hover { + color: #1976d2; +} diff --git a/xinference/web/ui/src/components/deleteDialog.js b/xinference/web/ui/src/components/deleteDialog.js index d690347149..fe03296d21 100644 --- a/xinference/web/ui/src/components/deleteDialog.js +++ b/xinference/web/ui/src/components/deleteDialog.js @@ -9,7 +9,7 @@ import { } from '@mui/material' import React from 'react' -const AddPair = ({ text, isDelete, onHandleIsDelete, onHandleDelete }) => { +const DeleteDialog = ({ text, isDelete, onHandleIsDelete, onHandleDelete }) => { return ( <Dialog open={isDelete} @@ -42,4 +42,4 @@ const AddPair = ({ text, isDelete, onHandleIsDelete, onHandleDelete }) => { ) } -export default AddPair +export default DeleteDialog diff --git a/xinference/web/ui/src/router/index.js b/xinference/web/ui/src/router/index.js index b51299d72d..69d4de33de 100644 --- a/xinference/web/ui/src/router/index.js +++ b/xinference/web/ui/src/router/index.js @@ -25,7 +25,7 @@ const routes = [ element: <RunningModels />, }, { - path: 'register_model', + path: 'register_model/:registerModelType/:model_name?', element: <RegisterModel />, }, { diff --git a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js index 82ab43893d..e2e4257ad2 100644 --- a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js +++ b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js @@ -5,7 +5,6 @@ import { ApiContext } from '../../components/apiContext' import fetcher from '../../components/fetcher' import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' -import style from './styles/launchModelStyle' const LaunchModelComponent = ({ modelType, gpuAvailable }) => { let endPoint = useContext(ApiContext).endPoint @@ -17,14 +16,6 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { const { isCallingApi, setIsCallingApi } = useContext(ApiContext) const { isUpdatingModel } = useContext(ApiContext) - const handleChange = (e) => { - setSearchTerm(e.target.value) - } - - const handleStatusChange = (event) => { - setStatus(event.target.value) - } - const filter = (registration) => { if (searchTerm !== '') { if (!registration || typeof searchTerm !== 'string') return false @@ -34,11 +25,12 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { if (!modelName.includes(searchTerm.toLowerCase())) { return false } - if (completeDeleteArr.includes(registration.model_name)) { - registration.cache_status = Array.isArray(registration.cache_status) - ? [false] - : false - } + } + + if (completeDeleteArr.includes(registration.model_name)) { + registration.cache_status = Array.isArray(registration.cache_status) + ? [false] + : false } if (status !== 'all') { @@ -100,7 +92,7 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { id="status" labelId="select-status" label="Status" - onChange={handleStatusChange} + onChange={(e) => setStatus(e.target.value)} value={status} size="small" sx={{ width: '150px' }} @@ -115,13 +107,20 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { type="search" label={`Search for ${modelType} model name`} value={searchTerm} - onChange={handleChange} + onChange={(e) => setSearchTerm(e.target.value)} size="small" hotkey="/" /> </FormControl> </div> - <div style={style}> + <div + style={{ + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', + paddingLeft: '2rem', + gridGap: '2rem 0rem', + }} + > {registrationData .filter((registration) => filter(registration)) .map((filteredRegistration) => ( diff --git a/xinference/web/ui/src/scenes/launch_model/launchLLM.js b/xinference/web/ui/src/scenes/launch_model/launchLLM.js index 5abf1e14e9..7f8bde7695 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchLLM.js +++ b/xinference/web/ui/src/scenes/launch_model/launchLLM.js @@ -21,18 +21,6 @@ const LaunchLLM = ({ gpuAvailable }) => { const [status, setStatus] = useState('all') const [completeDeleteArr, setCompleteDeleteArr] = useState([]) - const handleChange = (event) => { - setSearchTerm(event.target.value) - } - - const handleAbilityChange = (event) => { - setModelAbility(event.target.value) - } - - const handleStatusChange = (event) => { - setStatus(event.target.value) - } - const filter = (registration) => { if (searchTerm !== '') { if (!registration || typeof searchTerm !== 'string') return false @@ -51,26 +39,20 @@ const LaunchLLM = ({ gpuAvailable }) => { } } - if (modelAbility !== 'all') { - if (modelAbility && modelAbility !== 'all') { - if (registration.model_ability.indexOf(modelAbility) < 0) { - return false - } - } - } + if ( + modelAbility !== 'all' && + registration.model_ability.indexOf(modelAbility) < 0 + ) + return false + if (completeDeleteArr.includes(registration.model_name)) { + registration.model_specs.forEach((item) => { + item.cache_status = Array.isArray(item) ? [false] : false + }) + } if (status !== 'all') { - if (completeDeleteArr.includes(registration.model_name)) { - registration.model_specs.forEach((item) => { - item.cache_status = Array.isArray(item) ? [false] : false - }) - } - if (status && status !== 'all') { - const judge = registration.model_specs.some((spec) => { - return filterCache(spec) - }) - return judge && !completeDeleteArr.includes(registration.model_name) - } + const judge = registration.model_specs.some((spec) => filterCache(spec)) + return judge && !completeDeleteArr.includes(registration.model_name) } return true @@ -153,7 +135,7 @@ const LaunchLLM = ({ gpuAvailable }) => { id="ability" labelId="ability-select-label" label="Model Ability" - onChange={handleAbilityChange} + onChange={(e) => setModelAbility(e.target.value)} value={modelAbility} size="small" sx={{ width: '150px' }} @@ -170,7 +152,7 @@ const LaunchLLM = ({ gpuAvailable }) => { id="status" labelId="select-status" label="Status" - onChange={handleStatusChange} + onChange={(e) => setStatus(e.target.value)} value={status} size="small" sx={{ width: '150px' }} @@ -185,7 +167,7 @@ const LaunchLLM = ({ gpuAvailable }) => { type="search" label="Search for model name and description" value={searchTerm} - onChange={handleChange} + onChange={(e) => setSearchTerm(e.target.value)} size="small" hotkey="/" /> diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 09a7019355..3063a9d839 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -3,6 +3,7 @@ import './styles/modelCardStyle.css' import { ChatOutlined, Close, + Delete, EditNote, EditNoteOutlined, ExpandLess, @@ -11,12 +12,11 @@ import { RocketLaunchOutlined, UndoOutlined, } from '@mui/icons-material' -import DeleteIcon from '@mui/icons-material/Delete' -import FilterNoneIcon from '@mui/icons-material/FilterNone' import { Alert, Backdrop, Box, + Button, Chip, CircularProgress, Collapse, @@ -43,11 +43,11 @@ import { Tooltip, } from '@mui/material' import { styled } from '@mui/material/styles' -import ClipboardJS from 'clipboard' import React, { useContext, useEffect, useRef, useState } from 'react' import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' +import CopyComponent from '../../components/copyComponent/copyComponent' import DeleteDialog from '../../components/deleteDialog' import fetcher from '../../components/fetcher' import TitleTypography from '../../components/titleTypography' @@ -104,8 +104,8 @@ const ModelCard = ({ const [cachedModelVersion, setCachedModelVersion] = useState('') const [cachedRealPath, setCachedRealPath] = useState('') const [page, setPage] = useState(0) - const [isCopySuccess, setIsCopySuccess] = useState(false) const [isDeleteCustomModel, setIsDeleteCustomModel] = useState(false) + const [isJsonShow, setIsJsonShow] = useState(false) const parentRef = useRef(null) @@ -445,17 +445,6 @@ const ModelCard = ({ setPage(newPage) } - const handleCopyPath = (path) => { - const clipboard = new ClipboardJS('.copyPath', { - text: () => path, - }) - - clipboard.on('success', (e) => { - e.clearSelection() - setIsCopySuccess(true) - }) - } - const handleOpenCachedList = () => { setIsOpenCachedList(true) getCachedList() @@ -543,6 +532,16 @@ const ModelCard = ({ }) } + const handleJsonDataPresentation = () => { + const arr = sessionStorage.getItem('subType').split('/') + sessionStorage.setItem( + 'registerModelType', + `/register_model/${arr[arr.length - 1]}` + ) + sessionStorage.setItem('customJsonData', JSON.stringify(modelData)) + navigate(`/register_model/${arr[arr.length - 1]}/${modelData.model_name}`) + } + // Set two different states based on mouse hover return ( <> @@ -563,19 +562,34 @@ const ModelCard = ({ {modelType === 'LLM' ? ( <Box className="descriptionCard"> {is_custom && ( - <Stack direction="row" spacing={1} useFlexGap> + <div className="cardTitle"> <TitleTypography value={modelData.model_name} /> - <IconButton - aria-label="delete" - onClick={(e) => { - e.stopPropagation() - setIsDeleteCustomModel(true) - }} - disabled={customDeleted} - > - <DeleteIcon /> - </IconButton> - </Stack> + <div className="iconButtonBox"> + <Tooltip title={'Edit'} placement="top"> + <IconButton + aria-label="show" + onClick={(e) => { + e.stopPropagation() + setIsJsonShow(true) + }} + > + <EditNote /> + </IconButton> + </Tooltip> + <Tooltip title={'delete'} placement="top"> + <IconButton + aria-label="delete" + onClick={(e) => { + e.stopPropagation() + setIsDeleteCustomModel(true) + }} + disabled={customDeleted} + > + <Delete /> + </IconButton> + </Tooltip> + </div> + </div> )} {!is_custom && <TitleTypography value={modelData.model_name} />} @@ -667,19 +681,34 @@ const ModelCard = ({ <Box className="descriptionCard"> <div className="titleContainer"> {is_custom && ( - <Stack direction="row" spacing={1} useFlexGap> + <div className="cardTitle"> <TitleTypography value={modelData.model_name} /> - <IconButton - aria-label="delete" - onClick={(e) => { - e.stopPropagation() - setIsDeleteCustomModel(true) - }} - disabled={customDeleted} - > - <DeleteIcon /> - </IconButton> - </Stack> + <div className="iconButtonBox"> + <Tooltip title={'Edit'} placement="top"> + <IconButton + aria-label="show" + onClick={(e) => { + e.stopPropagation() + setIsJsonShow(true) + }} + > + <EditNote /> + </IconButton> + </Tooltip> + <Tooltip title={'delete'} placement="top"> + <IconButton + aria-label="delete" + onClick={(e) => { + e.stopPropagation() + setIsDeleteCustomModel(true) + }} + disabled={customDeleted} + > + <Delete /> + </IconButton> + </Tooltip> + </div> + </div> )} {!is_custom && <TitleTypography value={modelData.model_name} />} <Stack @@ -1270,11 +1299,43 @@ const ModelCard = ({ </Box> </div> </Drawer> + <Backdrop + sx={{ color: '#fff', zIndex: (theme) => theme.zIndex.drawer + 1 }} + open={isJsonShow} + > + <div className="jsonDialog"> + <div className="jsonDialog-title"> + <div className="title-name">{modelData.model_name}</div> + <CopyComponent + tip={'Copy Json'} + text={JSON.stringify(modelData, null, 4)} + /> + </div> + <div className="main-box"> + <textarea + readOnly + className="textarea-box" + value={JSON.stringify(modelData, null, 4)} + /> + </div> + <div className="but-box"> + <Button + onClick={() => { + setIsJsonShow(false) + }} + style={{ marginRight: 30 }} + > + Cancel + </Button> + <Button onClick={handleJsonDataPresentation}>Edit</Button> + </div> + </div> + </Backdrop> <Snackbar anchorOrigin={{ vertical: 'top', horizontal: 'center' }} open={openSnackbar} onClose={() => setOpenSnackbar(false)} - message="Please fill in the complete parameters before adding!!" + message="Please fill in the complete parameters before adding!" key={'top' + 'center'} /> @@ -1356,12 +1417,10 @@ const ModelCard = ({ </Tooltip> </TableCell> <TableCell> - <Tooltip title="Copy real_path" placement="top"> - <FilterNoneIcon - className="copyPath" - onClick={() => handleCopyPath(row.real_path)} - /> - </Tooltip> + <CopyComponent + tip={'Copy real_path'} + text={row.real_path} + /> </TableCell> <TableCell> <Tooltip title={row.path}> @@ -1375,12 +1434,7 @@ const ModelCard = ({ </Tooltip> </TableCell> <TableCell> - <Tooltip title="Copy path" placement="top"> - <FilterNoneIcon - className="copyPath" - onClick={() => handleCopyPath(row.path)} - /> - </Tooltip> + <CopyComponent tip={'Copy path'} text={row.path} /> </TableCell> <TableCell>{row.actor_ip_address}</TableCell> <TableCell align={modelType === 'LLM' ? 'center' : 'left'}> @@ -1394,7 +1448,7 @@ const ModelCard = ({ ) } > - <DeleteIcon /> + <Delete /> </IconButton> </TableCell> </StyledTableRow> @@ -1426,16 +1480,6 @@ const ModelCard = ({ onHandleIsDelete={() => setIsDeleteCached(false)} onHandleDelete={handleDeleteCached} /> - <Snackbar - anchorOrigin={{ vertical: 'top', horizontal: 'center' }} - open={isCopySuccess} - autoHideDuration={1500} - onClose={() => setIsCopySuccess(false)} - > - <Alert severity="success" variant="filled" sx={{ width: '100%' }}> - Copied to clipboard! - </Alert> - </Snackbar> </> ) } diff --git a/xinference/web/ui/src/scenes/launch_model/styles/launchModelStyle.js b/xinference/web/ui/src/scenes/launch_model/styles/launchModelStyle.js deleted file mode 100644 index 7cb1f1c6f0..0000000000 --- a/xinference/web/ui/src/scenes/launch_model/styles/launchModelStyle.js +++ /dev/null @@ -1,8 +0,0 @@ -const style = { - display: 'grid', - gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', - paddingLeft: '2rem', - gridGap: '2rem 0rem', -} - -export default style diff --git a/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.css b/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.css index a357f79935..6674618cc7 100644 --- a/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.css +++ b/xinference/web/ui/src/scenes/launch_model/styles/modelCardStyle.css @@ -15,6 +15,14 @@ padding: 20px; border-radius: 20px; } +.cardTitle { + display: flex; + justify-content: space-between; +} +.iconButtonBox { + display: flex; + align-items: center; +} .drawerCard { position: relative; padding: 20px 80px 0; @@ -117,11 +125,6 @@ .pathBox2 { width: 300px; } -.copyPath { - font-size: 14px !important; - cursor: pointer; - color: #555; -} .empty { position: absolute; left: 50%; @@ -134,8 +137,43 @@ display: flex; align-items: center; } - .warningIcon { margin-right: 10px; color: rgb(237, 108, 2); } +.jsonDialog { + display: flex; + flex-direction: column; + padding: 10px 30px; + background-color: #fff; + color: #000; + border-radius: 8px; +} +.jsonDialog-title { + display: flex; + justify-content: space-between; + align-items: center; + margin: 10px 0 20px 0; +} +.title-name { + font-size: 16px; + font-weight: 700; +} +.main-box { + width: 700px; + height: 500px; +} +.textarea-box { + width: 100%; + height: 100%; + padding: 5px 10px; + border: 1px solid #ddd; + border-radius: 5px; + resize: none; + color: #444; +} +.but-box { + display: flex; + justify-content: end; + margin-top: 20px; +} diff --git a/xinference/web/ui/src/scenes/register_model/components/addControlnet.js b/xinference/web/ui/src/scenes/register_model/components/addControlnet.js index 649c3479f6..4c65a730d2 100644 --- a/xinference/web/ui/src/scenes/register_model/components/addControlnet.js +++ b/xinference/web/ui/src/scenes/register_model/components/addControlnet.js @@ -11,10 +11,25 @@ import { } from '@mui/material' import React, { useEffect, useState } from 'react' -const AddControlnet = ({ onGetControlnetArr, scrollRef }) => { +const AddControlnet = ({ + controlnetDataArr, + onGetControlnetArr, + scrollRef, +}) => { const [count, setCount] = useState(0) const [controlnetArr, setControlnetArr] = useState([]) - const [arrLength, setArrLength] = useState(0) + const [isAdd, setIsAdd] = useState(false) + + useEffect(() => { + if (controlnetDataArr && controlnetDataArr.length) { + const dataArr = controlnetDataArr.map((item) => { + setCount(count + 1) + item.id = count + return item + }) + setControlnetArr(dataArr) + } + }, []) useEffect(() => { const arr = controlnetArr.map((item) => { @@ -26,8 +41,8 @@ const AddControlnet = ({ onGetControlnetArr, scrollRef }) => { } }) onGetControlnetArr(arr) - setArrLength(controlnetArr.length) - arrLength < controlnetArr.length ? handleScrollBottom() : '' + isAdd && handleScrollBottom() + setIsAdd(false) }, [controlnetArr]) const handleAddControlnet = () => { @@ -39,6 +54,7 @@ const AddControlnet = ({ onGetControlnetArr, scrollRef }) => { model_family: 'controlnet', } setControlnetArr([...controlnetArr, item]) + setIsAdd(true) } const handleUpdateSpecsArr = (index, type, newValue) => { diff --git a/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js b/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js index 5e898af7fb..9d6f8397fd 100644 --- a/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js +++ b/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js @@ -20,19 +20,66 @@ const modelFormatArr = [ { value: 'awq', label: 'AWQ' }, ] -const AddModelSpecs = ({ formData, onGetArr, scrollRef }) => { - const [count, setCount] = useState(1) - const [specsArr, setSpecsArr] = useState([ - { - id: 0, - ...formData, - }, - ]) - const [path, setPath] = useState('/path/to/llama-2') +const AddModelSpecs = ({ + isJump, + formData, + specsDataArr, + onGetArr, + scrollRef, +}) => { + const [count, setCount] = useState(0) + const [specsArr, setSpecsArr] = useState([]) + const [pathArr, setPathArr] = useState([]) const [modelSizeAlertId, setModelSizeAlertId] = useState([]) const [quantizationAlertId, setQuantizationAlertId] = useState([]) const [isError, setIsError] = useState(false) - const [arrLength, setArrLength] = useState(1) + const [isAdd, setIsAdd] = useState(false) + + useEffect(() => { + if (isJump) { + const dataArr = specsDataArr.map((item, index) => { + const { + model_uri, + model_size_in_billions, + model_format, + quantizations, + model_file_name_template, + } = item + let size = model_size_in_billions + if (typeof size !== 'number') size = size.split('_').join('.') + + return { + id: index, + model_uri, + model_size_in_billions: size, + model_format, + quantizations, + model_file_name_template, + } + }) + setCount(dataArr.length) + setSpecsArr(dataArr) + + const subPathArr = [] + specsDataArr.forEach((item) => { + if (item.model_format !== 'ggmlv3' && item.model_format !== 'ggufv2') { + subPathArr.push(item.model_uri) + } else { + subPathArr.push(item.model_uri + '/' + item.model_file_name_template) + } + }) + setPathArr(subPathArr) + } else { + setSpecsArr([ + { + id: count, + ...formData, + }, + ]) + setCount(count + 1) + setPathArr([formData.model_uri]) + } + }, []) useEffect(() => { const arr = specsArr.map((item) => { @@ -71,23 +118,41 @@ const AddModelSpecs = ({ formData, onGetArr, scrollRef }) => { setIsError(false) } onGetArr(arr, isError) - setArrLength(specsArr.length) - arrLength < specsArr.length ? handleScrollBottom() : '' + isAdd && handleScrollBottom() + setIsAdd(false) }, [specsArr, isError]) const handleAddSpecs = () => { setCount(count + 1) const item = { id: count, - model_uri: '/path/to/llama-2', + model_uri: '/path/to/llama-1', model_size_in_billions: 7, model_format: 'pytorch', quantizations: [], } setSpecsArr([...specsArr, item]) + setIsAdd(true) + setPathArr([...pathArr, '/path/to/llama-1']) } const handleUpdateSpecsArr = (index, type, newValue) => { + if (type === 'model_format') { + const subPathArr = [...pathArr] + if ( + specsArr[index].model_format !== 'ggmlv3' && + specsArr[index].model_format !== 'ggufv2' + ) { + pathArr[index] = specsArr[index].model_uri + } else { + pathArr[index] = + specsArr[index].model_uri + + '/' + + specsArr[index].model_file_name_template + } + setPathArr(subPathArr) + } + setSpecsArr( specsArr.map((item, subIndex) => { if (subIndex === index) { @@ -95,7 +160,7 @@ const AddModelSpecs = ({ formData, onGetArr, scrollRef }) => { return { ...item, [type]: [newValue] } } else if (type === 'model_format') { if (newValue === 'ggmlv3' || newValue === 'ggufv2') { - const { baseDir, filename } = getPathComponents(path) + const { baseDir, filename } = getPathComponents(pathArr[index]) const obj = { ...item, model_format: newValue, @@ -108,7 +173,7 @@ const AddModelSpecs = ({ formData, onGetArr, scrollRef }) => { const { id, model_size_in_billions, model_format } = item return { id, - model_uri: path, + model_uri: pathArr[index], model_size_in_billions, model_format, [type]: newValue, @@ -116,7 +181,9 @@ const AddModelSpecs = ({ formData, onGetArr, scrollRef }) => { } } } else if (type === 'model_uri') { - setPath(newValue) + const subPathArr = [...pathArr] + subPathArr[index] = newValue + setPathArr(subPathArr) if ( item.model_format === 'ggmlv3' || item.model_format === 'ggufv2' @@ -235,7 +302,11 @@ const AddModelSpecs = ({ formData, onGetArr, scrollRef }) => { style={{ minWidth: '60%' }} label="Model Path" size="small" - value={path} + value={ + item.model_format !== 'ggmlv3' && item.model_format !== 'ggufv2' + ? item.model_uri + : item.model_uri + '/' + item.model_file_name_template + } onChange={(e) => { handleUpdateSpecsArr(index, 'model_uri', e.target.value) }} diff --git a/xinference/web/ui/src/scenes/register_model/index.js b/xinference/web/ui/src/scenes/register_model/index.js index 1050c80323..2c07284fce 100644 --- a/xinference/web/ui/src/scenes/register_model/index.js +++ b/xinference/web/ui/src/scenes/register_model/index.js @@ -9,7 +9,11 @@ import Title from '../../components/Title' import RegisterModelComponent from './registerModel' const RegisterModel = () => { - const [tabValue, setTabValue] = React.useState('/register_model/llm') + const [tabValue, setTabValue] = React.useState( + sessionStorage.getItem('registerModelType') + ? sessionStorage.getItem('registerModelType') + : '/register_model/llm' + ) const [cookie] = useCookies(['token']) const navigate = useNavigate() @@ -23,17 +27,21 @@ const RegisterModel = () => { } }, [cookie.token]) + const handleTabChange = (_, newValue) => { + setTabValue(newValue) + navigate(newValue) + sessionStorage.setItem('registerModelType', newValue) + } + return ( - <Box m="20px"> + <Box m="20px" style={{ overflow: 'hidden' }}> <Title title="Register Model" /> <ErrorMessageSnackBar /> <TabContext value={tabValue}> <Box sx={{ borderBottom: 1, borderColor: 'divider' }}> <TabList value={tabValue} - onChange={(e, v) => { - setTabValue(v) - }} + onChange={handleTabChange} aria-label="tabs" > <Tab label="Language Model" value="/register_model/llm" /> @@ -56,7 +64,7 @@ const RegisterModel = () => { model_family: '', model_specs: [ { - model_uri: '/path/to/llama-2', + model_uri: '/path/to/llama-1', model_size_in_billions: 7, model_format: 'pytorch', quantizations: ['none'], diff --git a/xinference/web/ui/src/scenes/register_model/registerModel.js b/xinference/web/ui/src/scenes/register_model/registerModel.js index df4ab19311..710b7cef45 100644 --- a/xinference/web/ui/src/scenes/register_model/registerModel.js +++ b/xinference/web/ui/src/scenes/register_model/registerModel.js @@ -1,7 +1,6 @@ import './styles/registerModelStyle.css' import CheckIcon from '@mui/icons-material/Check' -import FilterNoneIcon from '@mui/icons-material/FilterNone' import KeyboardDoubleArrowRightIcon from '@mui/icons-material/KeyboardDoubleArrowRight' import NotesIcon from '@mui/icons-material/Notes' import { @@ -17,18 +16,17 @@ import { Radio, RadioGroup, Select, - Snackbar, Stack, Switch, TextField, Tooltip, } from '@mui/material' -import ClipboardJS from 'clipboard' import React, { useContext, useEffect, useRef, useState } from 'react' import { useCookies } from 'react-cookie' -import { useNavigate } from 'react-router-dom' +import { useNavigate, useParams } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' +import CopyComponent from '../../components/copyComponent/copyComponent' import fetcher from '../../components/fetcher' import AddControlnet from './components/addControlnet' import AddModelSpecs from './components/addModelSpecs' @@ -48,18 +46,149 @@ const RegisterModelComponent = ({ modelType, customData }) => { chat: [], generate: [], }) - const [isShow, setIsShow] = useState(false) const [languagesArr, setLanguagesArr] = useState([]) const [isContextLengthAlert, setIsContextLengthAlert] = useState(false) const [isDimensionsAlert, setIsDimensionsAlert] = useState(false) const [isMaxTokensAlert, setIsMaxTokensAlert] = useState(false) const [jsonData, setJsonData] = useState('') - const [isCopySuccess, setIsCopySuccess] = useState(false) const [isSpecsArrError, setIsSpecsArrError] = useState(false) + const scrollRef = useRef(null) const [cookie] = useCookies(['token']) const navigate = useNavigate() + const { registerModelType, model_name } = useParams() + const [isShow, setIsShow] = useState(model_name ? true : false) + const [specsArr, setSpecsArr] = useState( + model_name + ? JSON.parse(sessionStorage.getItem('customJsonData')).model_specs + : [] + ) + const [controlnetArr, setControlnetArr] = useState( + model_name + ? JSON.parse(sessionStorage.getItem('customJsonData')).controlnet + : [] + ) + const [contrastObj, setContrastObj] = useState({}) + const [isEqual, setIsEqual] = useState(true) + + useEffect(() => { + if (model_name) { + const data = JSON.parse(sessionStorage.getItem('customJsonData')) + + if (modelType === 'LLM') { + const lagArr = data.model_lang.filter( + (item) => item !== 'en' && item !== 'zh' + ) + setLanguagesArr(lagArr) + + const { + version, + model_name, + model_description, + context_length, + model_lang, + model_ability, + model_family, + model_specs, + prompt_style, + } = data + const specsDataArr = model_specs.map((item) => { + const { + model_uri, + model_size_in_billions, + model_format, + quantizations, + model_file_name_template, + } = item + return { + model_uri, + model_size_in_billions, + model_format, + quantizations, + model_file_name_template, + } + }) + const llmData = { + version, + model_name, + model_description, + context_length, + model_lang, + model_ability, + model_family, + model_specs: specsDataArr, + } + prompt_style ? (llmData.prompt_style = prompt_style) : '' + setFormData(llmData) + setContrastObj(llmData) + setSpecsArr(specsDataArr) + } else { + if (modelType === 'embedding') { + const lagArr = data.language.filter( + (item) => item !== 'en' && item !== 'zh' + ) + setLanguagesArr(lagArr) + + const { model_name, dimensions, max_tokens, model_uri, language } = + data + const embeddingData = { + model_name, + dimensions, + max_tokens, + model_uri, + language, + } + setFormData(embeddingData) + setContrastObj(embeddingData) + } else if (modelType === 'rerank') { + const lagArr = data.language.filter( + (item) => item !== 'en' && item !== 'zh' + ) + setLanguagesArr(lagArr) + + const { model_name, model_uri, language } = data + const rerankData = { + model_name, + model_uri, + language, + } + setFormData(rerankData) + setContrastObj(rerankData) + } else if (modelType === 'image') { + const { model_name, model_uri, model_family, controlnet } = data + const controlnetArr = controlnet.map((item) => { + const { model_name, model_uri, model_family } = item + return { + model_name, + model_uri, + model_family, + } + }) + const imageData = { + model_name, + model_uri, + model_family, + controlnet: controlnetArr, + } + setFormData(imageData) + setContrastObj(imageData) + setControlnetArr(controlnetArr) + } else if (modelType === 'audio') { + const { model_name, model_uri, multilingual, model_family } = data + const audioData = { + model_name, + model_uri, + multilingual, + model_family, + } + setFormData(audioData) + setContrastObj(audioData) + } + } + } + }, [model_name]) + useEffect(() => { if (cookie.token === '' || cookie.token === undefined) { return @@ -145,6 +274,9 @@ const RegisterModelComponent = ({ modelType, customData }) => { useEffect(() => { setJsonData(JSON.stringify(formData, null, 4)) + if (contrastObj.model_name) { + deepEqual(contrastObj, formData) ? setIsEqual(true) : setIsEqual(false) + } }, [formData]) const getFamilyByAbility = () => { @@ -241,11 +373,6 @@ const RegisterModelComponent = ({ modelType, customData }) => { setIsMaxTokensAlert(false) setFormData({ ...formData, [parameterName]: value }) - // if(value !== '' && Number(value) > 0) { - // console.log(111); - // setFormData({ ...formData, [parameterName]: Number(value) }) - // } - if ( value !== '' && (!Number(value) || @@ -371,15 +498,51 @@ const RegisterModelComponent = ({ modelType, customData }) => { setFormData({ ...formData, controlnet: arr }) } - const handleCopy = () => { - const clipboard = new ClipboardJS('.copyIcon', { - text: () => jsonData, - }) + const handleCancel = () => { + navigate(`/launch_model/custom/${registerModelType}`) + } - clipboard.on('success', function (event) { - event.clearSelection() - setIsCopySuccess(true) - }) + const handleEdit = () => { + fetcher( + endPoint + + `/v1/model_registrations/${ + registerModelType === 'llm' ? 'LLM' : registerModelType + }/${model_name}`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + } + ) + .then(() => { + handleClick() + }) + .catch((error) => { + console.error('Error:', error) + }) + } + + const deepEqual = (obj1, obj2) => { + if (obj1 === obj2) return true + if ( + typeof obj1 !== 'object' || + typeof obj2 !== 'object' || + obj1 == null || + obj2 == null + ) { + return false + } + + let keysA = Object.keys(obj1) + let keysB = Object.keys(obj2) + if (keysA.length !== keysB.length) return false + for (let key of keysA) { + if (!keysB.includes(key) || !deepEqual(obj1[key], obj2[key])) { + return false + } + } + return true } return ( @@ -404,7 +567,7 @@ const RegisterModelComponent = ({ modelType, customData }) => { </div> <div ref={scrollRef} className={isShow ? 'formBox' : 'formBox broaden'}> {/* Base Information */} - <FormControl sx={styles.baseFormControl}> + <FormControl style={{ width: '100%' }}> {/* name */} {customData.model_name && ( <> @@ -538,7 +701,7 @@ const RegisterModelComponent = ({ modelType, customData }) => { > Model Languages </label> - <Box sx={styles.checkboxWrapper}> + <Box className="checkboxWrapper"> {SUPPORTED_LANGUAGES.map((lang) => ( <Box key={lang} sx={{ marginRight: '10px' }}> <FormControlLabel @@ -610,7 +773,7 @@ const RegisterModelComponent = ({ modelType, customData }) => { </label> <FormControlLabel style={{ marginLeft: 0, width: 50 }} - control={<Switch />} + control={<Switch checked={formData.multilingual} />} onChange={(e) => setFormData({ ...formData, multilingual: e.target.checked }) } @@ -631,7 +794,7 @@ const RegisterModelComponent = ({ modelType, customData }) => { > Model Abilities </label> - <Box sx={styles.checkboxWrapper}> + <Box className="checkboxWrapper"> {SUPPORTED_FEATURES.map((ability) => ( <Box key={ability} sx={{ marginRight: '10px' }}> <FormControlLabel @@ -658,7 +821,7 @@ const RegisterModelComponent = ({ modelType, customData }) => { {/* family */} {(customData.model_family === '' || customData.model_family) && ( - <FormControl sx={styles.baseFormControl}> + <FormControl> <label style={{ paddingLeft: 5, @@ -693,7 +856,7 @@ const RegisterModelComponent = ({ modelType, customData }) => { }} > <Box - sx={styles.checkboxWrapper} + className="checkboxWrapper" style={{ paddingLeft: '10px' }} > {modelType === 'LLM' && @@ -724,7 +887,9 @@ const RegisterModelComponent = ({ modelType, customData }) => { {customData.model_specs && ( <> <AddModelSpecs + isJump={model_name ? true : false} formData={customData.model_specs[0]} + specsDataArr={specsArr} onGetArr={getSpecsArr} scrollRef={scrollRef} /> @@ -736,6 +901,7 @@ const RegisterModelComponent = ({ modelType, customData }) => { {customData.controlnet && ( <> <AddControlnet + controlnetDataArr={controlnetArr} onGetControlnetArr={getControlnetArr} scrollRef={scrollRef} /> @@ -744,53 +910,51 @@ const RegisterModelComponent = ({ modelType, customData }) => { )} </FormControl> - <Box width={'100%'}> - <Button - variant="contained" - color="primary" - type="submit" - onClick={handleClick} - > - Register Model - </Button> - </Box> + {model_name ? ( + <> + <Button + variant="contained" + color="primary" + type="submit" + onClick={handleEdit} + disabled={isEqual} + > + Edit + </Button> + <Button + style={{ marginLeft: 30 }} + variant="outlined" + color="primary" + type="submit" + onClick={handleCancel} + > + Cancel + </Button> + </> + ) : ( + <Box width={'100%'}> + <Button + variant="contained" + color="primary" + type="submit" + onClick={handleClick} + > + Register Model + </Button> + </Box> + )} </div> {/* JSON */} <div className={isShow ? 'jsonBox' : 'jsonBox hide'}> - <div className="jsonBox-header">JSON Format</div> - <Tooltip title="Copy all" placement="top"> - <FilterNoneIcon className="copyIcon" onClick={handleCopy} /> - </Tooltip> + <div className="jsonBox-header"> + <div className="jsonBox-title">JSON Format</div> + <CopyComponent tip={'Copy all'} text={jsonData} /> + </div> <textarea readOnly className="textarea" value={jsonData} /> </div> - - <Snackbar - anchorOrigin={{ vertical: 'top', horizontal: 'center' }} - open={isCopySuccess} - autoHideDuration={1500} - onClose={() => setIsCopySuccess(false)} - > - <Alert severity="success" variant="filled" sx={{ width: '100%' }}> - Copied to clipboard! - </Alert> - </Snackbar> </Box> ) } export default RegisterModelComponent - -const styles = { - baseFormControl: { - width: '100%', - margin: 'normal', - size: 'small', - }, - checkboxWrapper: { - display: 'flex', - flexWrap: 'wrap', - alignItems: 'center', - width: '100%', - }, -} diff --git a/xinference/web/ui/src/scenes/register_model/styles/registerModelStyle.css b/xinference/web/ui/src/scenes/register_model/styles/registerModelStyle.css index 7764d5080b..e7d8b9fd68 100644 --- a/xinference/web/ui/src/scenes/register_model/styles/registerModelStyle.css +++ b/xinference/web/ui/src/scenes/register_model/styles/registerModelStyle.css @@ -51,7 +51,20 @@ overflow: hidden; } +.checkboxWrapper { + display: flex; + flex-wrap: wrap; + align-items: center; + width: 100%; +} + .jsonBox-header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.jsonBox-title { line-height: 40px; font-weight: 700; } @@ -66,19 +79,6 @@ color: #444; } -.copyIcon { - cursor: pointer; - position: absolute; - top: 13px; - right: 5px; - font-size: 16px !important; - color: #555; -} - -.copyIcon:hover { - color: #1976d2; -} - .addBtn { margin-left: 20px !important; } From 5cef7c3d4bb0c5208d262fc3ffb7d7083724de1c Mon Sep 17 00:00:00 2001 From: wxiwnd <40122078+wxiwnd@users.noreply.github.com> Date: Fri, 21 Jun 2024 15:34:17 +0800 Subject: [PATCH 153/298] FEAT: Add Rerank model token input/output usage (#1657) --- xinference/api/restful_api.py | 2 ++ xinference/client/restful/restful_client.py | 4 +++ xinference/core/model.py | 2 ++ xinference/model/rerank/core.py | 36 +++++++++++++++++--- xinference/model/rerank/tests/test_rerank.py | 13 +++++++ xinference/types.py | 28 +++++++++++++++ 6 files changed, 81 insertions(+), 4 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index bc4f338613..03a77f341f 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -109,6 +109,7 @@ class RerankRequest(BaseModel): documents: List[str] top_n: Optional[int] = None return_documents: Optional[bool] = False + return_len: Optional[bool] = False max_chunks_per_doc: Optional[int] = None @@ -1116,6 +1117,7 @@ async def rerank(self, request: Request) -> Response: top_n=body.top_n, max_chunks_per_doc=body.max_chunks_per_doc, return_documents=body.return_documents, + return_len=body.return_len, **kwargs, ) return Response(scores, media_type="application/json") diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 2230bab848..10d9ae8231 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -135,6 +135,7 @@ def rerank( top_n: Optional[int] = None, max_chunks_per_doc: Optional[int] = None, return_documents: Optional[bool] = None, + return_len: Optional[bool] = None, **kwargs, ): """ @@ -152,6 +153,8 @@ def rerank( The maximum number of chunks derived from a document return_documents: bool if return documents + return_len: bool + if return tokens len Returns ------- Scores @@ -170,6 +173,7 @@ def rerank( "top_n": top_n, "max_chunks_per_doc": max_chunks_per_doc, "return_documents": return_documents, + "return_len": return_len, } request_body.update(kwargs) response = requests.post(url, json=request_body, headers=self.auth_headers) diff --git a/xinference/core/model.py b/xinference/core/model.py index fae1b1811a..94c9f16cec 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -543,6 +543,7 @@ async def rerank( top_n: Optional[int], max_chunks_per_doc: Optional[int], return_documents: Optional[bool], + return_len: Optional[bool], *args, **kwargs, ): @@ -554,6 +555,7 @@ async def rerank( top_n, max_chunks_per_doc, return_documents, + return_len, *args, **kwargs, ) diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index f1ec7e2b29..2f7924ebcd 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -23,7 +23,7 @@ from ...constants import XINFERENCE_CACHE_DIR from ...device_utils import empty_cache -from ...types import Document, DocumentObj, Rerank +from ...types import Document, DocumentObj, Rerank, RerankTokens from ..core import CacheableModelSpec, ModelDescription from ..utils import is_model_cached @@ -121,11 +121,17 @@ def __init__( if model_spec.type == "unknown": model_spec.type = self._auto_detect_type(model_path) + @staticmethod + def _get_tokenizer(model_path): + from transformers import AutoTokenizer + + tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) + return tokenizer + @staticmethod def _auto_detect_type(model_path): """This method may not be stable due to the fact that the tokenizer name may be changed. Therefore, we only use this method for unknown model types.""" - from transformers import AutoTokenizer type_mapper = { "LlamaTokenizerFast": "LLM-based layerwise", @@ -133,7 +139,7 @@ def _auto_detect_type(model_path): "XLMRobertaTokenizerFast": "normal", } - tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) + tokenizer = RerankModel._get_tokenizer(model_path) rerank_type = type_mapper.get(type(tokenizer).__name__) if rerank_type is None: logger.warning( @@ -186,6 +192,7 @@ def rerank( top_n: Optional[int], max_chunks_per_doc: Optional[int], return_documents: Optional[bool], + return_len: Optional[bool], **kwargs, ) -> Rerank: self._counter += 1 @@ -224,7 +231,28 @@ def rerank( ) for arg in sim_scores_argsort ] - return Rerank(id=str(uuid.uuid1()), results=docs) + if return_len: + tokenizer = self._get_tokenizer(self._model_path) + input_len = sum([len(tokenizer.tokenize(t)) for t in documents]) + + # Rerank Model output is just score or documents + # while return_documents = True + output_len = input_len + + # api_version, billed_units, warnings + # is for Cohere API compatibility, set to None + metadata = { + "api_version": None, + "billed_units": None, + "tokens": ( + RerankTokens(input_tokens=input_len, output_tokens=output_len) + if return_len + else None + ), + "warnings": None, + } + + return Rerank(id=str(uuid.uuid1()), results=docs, meta=metadata) def get_cache_dir(model_spec: RerankModelSpec): diff --git a/xinference/model/rerank/tests/test_rerank.py b/xinference/model/rerank/tests/test_rerank.py index aa6ac848bd..7314e5b964 100644 --- a/xinference/model/rerank/tests/test_rerank.py +++ b/xinference/model/rerank/tests/test_rerank.py @@ -54,6 +54,19 @@ def test_restful_api(model_name, setup): assert scores["results"][0]["index"] == 0 assert scores["results"][0]["document"] == corpus[0] + scores = model.rerank(corpus, query, return_len=True) + assert ( + scores["meta"]["tokens"]["input_tokens"] + == scores["meta"]["tokens"]["output_tokens"] + ) + + print(scores) + + scores = model.rerank(corpus, query) + assert scores["meta"]["tokens"] == None + + print(scores) + kwargs = { "invalid": "invalid", } diff --git a/xinference/types.py b/xinference/types.py index fda35750fa..3ea098c60e 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -80,9 +80,37 @@ class DocumentObj(TypedDict): document: Optional[Document] +# Cohere API compatibility +class ApiVersion(TypedDict): + version: str + is_deprecated: bool + is_experimental: bool + + +# Cohere API compatibility +class BilledUnit(TypedDict): + input_tokens: int + output_tokens: int + search_units: int + classifications: int + + +class RerankTokens(TypedDict): + input_tokens: int + output_tokens: int + + +class Meta(TypedDict): + api_version: Optional[ApiVersion] + billed_units: Optional[BilledUnit] + tokens: RerankTokens + warnings: Optional[List[str]] + + class Rerank(TypedDict): id: str results: List[DocumentObj] + meta: Meta class CompletionLogprobs(TypedDict): From 7705d4ae1eb68523e87c4f2abf84026dae18b694 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Sat, 22 Jun 2024 23:28:43 +0800 Subject: [PATCH 154/298] BLD: pin `chatglm-cpp` version `v0.3.x` (#1692) --- xinference/deploy/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 72342d89b7..cc148cbc98 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -21,7 +21,7 @@ ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ # uninstall builtin torchvision, and let xinference decide which version to be installed pip uninstall -y torchvision torchaudio && \ - CMAKE_ARGS="-DGGML_CUBLAS=ON" pip install -i "$PIP_INDEX" -U chatglm-cpp && \ + CMAKE_ARGS="-DGGML_CUDA=ON" pip install -i "$PIP_INDEX" -U "chatglm-cpp<0.4.0" && \ # use pre-built whl package for llama-cpp-python, otherwise may core dump when init llama in some envs pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121 && \ cd /opt/inference && \ From 006e2c26fdfd55ecc011a0dce6aab048cc320517 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Mon, 24 Jun 2024 11:24:10 +0800 Subject: [PATCH 155/298] BUG: [UI] Fix the issue where Model Abilities in the registration model includes chat, and modify Model Family to other to remove prompt_style. (#1707) --- .../scenes/register_model/registerModel.js | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/xinference/web/ui/src/scenes/register_model/registerModel.js b/xinference/web/ui/src/scenes/register_model/registerModel.js index 710b7cef45..427cff01d6 100644 --- a/xinference/web/ui/src/scenes/register_model/registerModel.js +++ b/xinference/web/ui/src/scenes/register_model/registerModel.js @@ -453,7 +453,25 @@ const RegisterModelComponent = ({ modelType, customData }) => { prompt_style, }) } else { - setFormData({ ...formData, model_family: value }) + const { + version, + model_name, + model_description, + context_length, + model_lang, + model_ability, + model_specs, + } = formData + setFormData({ + version, + model_name, + model_description, + context_length, + model_lang, + model_ability, + model_family: value, + model_specs, + }) } } From f5c66fa46830cb6970f8c86bdf354d1a6d7fff81 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:21:01 +0800 Subject: [PATCH 156/298] BUG: GGUF models cannot use GPU in docker (#1710) --- xinference/deploy/docker/Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index cc148cbc98..f4801676e4 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -21,9 +21,10 @@ ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ # uninstall builtin torchvision, and let xinference decide which version to be installed pip uninstall -y torchvision torchaudio && \ - CMAKE_ARGS="-DGGML_CUDA=ON" pip install -i "$PIP_INDEX" -U "chatglm-cpp<0.4.0" && \ + pip install -i "$PIP_INDEX" "diskcache>=5.6.1" "jinja2>=2.11.3" && \ # use pre-built whl package for llama-cpp-python, otherwise may core dump when init llama in some envs - pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121 && \ + pip install "llama-cpp-python" -i https://abetlen.github.io/llama-cpp-python/whl/cu121 && \ + CMAKE_ARGS="-DGGML_CUBLAS=ON" pip install -i "$PIP_INDEX" -U "chatglm-cpp<0.4.0" && \ cd /opt/inference && \ python setup.py build_web && \ git restore . && \ From 85ce9fe22c8527b5b52d8c0715beae623adc9974 Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:25:22 +0800 Subject: [PATCH 157/298] ENH: Set the CSG Hub endpoint as an environment variable. (#1666) --- xinference/constants.py | 4 ++++ xinference/model/llm/llm_family.py | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/xinference/constants.py b/xinference/constants.py index c2127579f6..3fc23d2629 100644 --- a/xinference/constants.py +++ b/xinference/constants.py @@ -18,6 +18,7 @@ XINFERENCE_ENV_ENDPOINT = "XINFERENCE_ENDPOINT" XINFERENCE_ENV_MODEL_SRC = "XINFERENCE_MODEL_SRC" XINFERENCE_ENV_CSG_TOKEN = "XINFERENCE_CSG_TOKEN" +XINFERENCE_ENV_CSG_ENDPOINT = "XINFERENCE_CSG_ENDPOINT" XINFERENCE_ENV_HOME_PATH = "XINFERENCE_HOME" XINFERENCE_ENV_HEALTH_CHECK_FAILURE_THRESHOLD = ( "XINFERENCE_HEALTH_CHECK_FAILURE_THRESHOLD" @@ -48,6 +49,9 @@ def get_xinference_home() -> str: XINFERENCE_LOG_DIR = os.path.join(XINFERENCE_HOME, "logs") XINFERENCE_IMAGE_DIR = os.path.join(XINFERENCE_HOME, "image") XINFERENCE_AUTH_DIR = os.path.join(XINFERENCE_HOME, "auth") +XINFERENCE_CSG_ENDPOINT = str( + os.environ.get(XINFERENCE_ENV_CSG_ENDPOINT, "https://hub-stg.opencsg.com/") +) XINFERENCE_DEFAULT_LOCAL_HOST = "127.0.0.1" XINFERENCE_DEFAULT_DISTRIBUTED_HOST = "0.0.0.0" diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index b3b3c8dbc5..a405d8f532 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -34,6 +34,7 @@ ) from ...constants import ( XINFERENCE_CACHE_DIR, + XINFERENCE_CSG_ENDPOINT, XINFERENCE_ENV_CSG_TOKEN, XINFERENCE_MODEL_DIR, ) @@ -691,7 +692,7 @@ def cache_from_csghub( "model_format": llm_spec.model_format, }, llm_spec.model_id, - endpoint="https://hub-stg.opencsg.com", + endpoint=XINFERENCE_CSG_ENDPOINT, token=os.environ.get(XINFERENCE_ENV_CSG_TOKEN), ) create_symlink(download_dir, cache_dir) @@ -711,7 +712,7 @@ def cache_from_csghub( }, llm_spec.model_id, file_name=filename, - endpoint="https://hub-stg.opencsg.com", + endpoint=XINFERENCE_CSG_ENDPOINT, token=os.environ.get(XINFERENCE_ENV_CSG_TOKEN), ) symlink_local_file(download_path, cache_dir, filename) From b2a84c1f952d58be6735de259acd9db445ccaf90 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Tue, 25 Jun 2024 07:53:22 +0200 Subject: [PATCH 158/298] BUG: Fix tool call observation (#1648) --- xinference/api/restful_api.py | 18 +- xinference/core/tests/test_restful_api.py | 8 +- xinference/model/llm/ggml/llamacpp.py | 4 +- xinference/model/llm/pytorch/chatglm.py | 244 +++++++++++++++------- xinference/model/llm/pytorch/core.py | 4 +- xinference/model/llm/utils.py | 25 +-- xinference/model/llm/vllm/core.py | 4 +- 7 files changed, 191 insertions(+), 116 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 03a77f341f..d4e2cb8082 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1426,17 +1426,14 @@ async def create_chat_completion(self, request: Request) -> Response: await self._report_error_event(model_uid, str(e)) raise HTTPException(status_code=500, detail=str(e)) + from ..model.llm.utils import QWEN_TOOL_CALL_FAMILY + model_family = desc.get("model_family", "") function_call_models = [ "chatglm3", "glm4-chat", "gorilla-openfunctions-v1", - "qwen-chat", - "qwen1.5-chat", - "qwen1.5-moe-chat", - "qwen2-instruct", - "qwen2-moe-instruct", - ] + ] + QWEN_TOOL_CALL_FAMILY is_qwen = desc.get("model_format") == "ggmlv3" and "qwen-chat" == model_family @@ -1458,13 +1455,8 @@ async def create_chat_completion(self, request: Request) -> Response: ) if body.tools and body.stream: is_vllm = await model.is_vllm_backend() - if not is_vllm or model_family not in [ - "qwen-chat", - "qwen1.5-chat", - "qwen1.5-moe-chat", - "qwen2-instruct", - "qwen2-moe-instruct", - ]: + + if not is_vllm or model_family not in QWEN_TOOL_CALL_FAMILY: raise HTTPException( status_code=400, detail="Streaming support for tool calls is available only when using vLLM backend and Qwen models.", diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index a520d2191b..2d51b8885d 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -456,6 +456,7 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): response = requests.post(url, json=payload) response_data = response.json() + assert "model_uid" in response_data, response_data model_uid_res = response_data["model_uid"] assert model_uid_res == "test_tool" @@ -503,7 +504,7 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): assert ( "get_current_weather" == completion["choices"][0]["message"]["tool_calls"][0]["function"]["name"] - ) + ), completion arguments = completion["choices"][0]["message"]["tool_calls"][0]["function"][ "arguments" ] @@ -618,8 +619,9 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): ) assert completion.choices assert completion.choices[0].finish_reason == "stop" - assert "10111" in completion.choices[0].message.content - assert "12345" in completion.choices[0].message.content + if kwargs: + assert "10111" in completion.choices[0].message.content + assert "12345" in completion.choices[0].message.content _check_invalid_tool_calls(endpoint, model_uid_res) diff --git a/xinference/model/llm/ggml/llamacpp.py b/xinference/model/llm/ggml/llamacpp.py index 4136184fb1..be3e8f09ed 100644 --- a/xinference/model/llm/ggml/llamacpp.py +++ b/xinference/model/llm/ggml/llamacpp.py @@ -31,7 +31,7 @@ ) from ..core import LLM from ..llm_family import LLMFamilyV1, LLMSpecV1 -from ..utils import ChatModelMixin +from ..utils import QWEN_TOOL_CALL_FAMILY, ChatModelMixin logger = logging.getLogger(__name__) @@ -326,7 +326,7 @@ def chat( generate_config = self._sanitize_generate_config(generate_config) # TODO(codingl2k1): qwen hacky to set stop for function call. model_family = self.model_family.model_family or self.model_family.model_name - if tools and model_family in ["qwen-chat", "qwen1.5-chat"]: + if tools and model_family in QWEN_TOOL_CALL_FAMILY: stop = generate_config.get("stop") if isinstance(stop, str): generate_config["stop"] = [stop, "Observation:"] diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index 56cc7afaf4..a0cf708ab5 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -90,30 +90,119 @@ def match( return False return True - def _handle_tools(self, generate_config) -> Optional[dict]: + def _handle_tools(self, chat_history, generate_config) -> bool: """Convert openai tools to ChatGLM tools.""" if generate_config is None: - return None + return False tools = generate_config.pop("tools", None) if tools is None: - return None + return False + tool_choice = generate_config.pop("tool_choice", "none") if self.model_family.model_name == "glm4-chat": - return { - "role": "system", - "content": None, - "tools": tools, - } + chat_history[:] = self.process_messages( + chat_history, tools=tools, tool_choice=tool_choice + ) + return True else: chatglm_tools = [] for elem in tools: if elem.get("type") != "function" or "function" not in elem: raise ValueError("ChatGLM tools only support function type.") chatglm_tools.append(elem["function"]) - return { + tool_prompt_message = { "role": "system", "content": f"Answer the following questions as best as you can. You have access to the following tools:", "tools": chatglm_tools, } + chat_history.insert(0, tool_prompt_message) + return True + + @staticmethod + def process_messages(messages, tools=None, tool_choice="none"): + # This method is adapted from https://github.com/THUDM/GLM-4/blob/main/basic_demo/openai_api_server.py + _messages = messages + processed_messages = [] + msg_has_sys = False + + def _filter_tools(_tool_choice, _tools): + function_name = _tool_choice.get("function", {}).get("name", None) + if not function_name: + return [] + filtered_tools = [ + tool + for tool in _tools + if tool.get("function", {}).get("name") == function_name + ] + return filtered_tools + + if tool_choice != "none": + if isinstance(tool_choice, dict): + tools = _filter_tools(tool_choice, tools) + + if tools: + processed_messages.append( + {"role": "system", "content": None, "tools": tools} + ) + msg_has_sys = True + + if isinstance(tool_choice, dict) and tools: + processed_messages.append( + { + "role": "assistant", + "metadata": tool_choice["function"]["name"], + "content": "", + } + ) + + for m in _messages: + role, content = m["role"], m["content"] or "" + tool_calls = m.get("tool_calls") + + if role == "function": + processed_messages.append({"role": "observation", "content": content}) + elif role == "tool": + processed_messages.append( + {"role": "observation", "content": content, "function_call": True} + ) + elif role == "assistant": + if tool_calls: + for tool_call in tool_calls: + processed_messages.append( + { + "role": "assistant", + "metadata": tool_call.get("function", {}).get("name"), + "content": tool_call.get("function", {}).get( + "arguments" + ), + } + ) + else: + for response in content.split("\n"): + if "\n" in response: + metadata, sub_content = response.split("\n", maxsplit=1) + else: + metadata, sub_content = "", response + processed_messages.append( + { + "role": role, + "metadata": metadata, + "content": sub_content.strip(), + } + ) + else: + if role == "system" and msg_has_sys: + msg_has_sys = False + continue + processed_messages.append({"role": role, "content": content}) + + if not tools or tool_choice == "none": + for m in _messages: + if m["role"] == "system": + processed_messages.insert( + 0, {"role": m["role"], "content": m["content"]} + ) + break + return processed_messages def chat( self, @@ -122,7 +211,6 @@ def chat( chat_history: Optional[List[ChatCompletionMessage]] = None, generate_config: Optional[PytorchGenerateConfig] = None, ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: - tools = self._handle_tools(generate_config) kwargs: Dict[str, Any] = {} generate_config = generate_config or {} temperature = generate_config.get("temperature") @@ -134,6 +222,8 @@ def chat( max_new_tokens = generate_config.get("max_tokens") if max_new_tokens is not None: kwargs["max_new_tokens"] = int(max_new_tokens) + chat_history = chat_history or [] + tools = self._handle_tools(chat_history, generate_config) # Tool calls only works for non stream, so we call chat directly. if prompt == SPECIAL_TOOL_PROMPT and chat_history: tool_message = chat_history.pop() @@ -142,93 +232,87 @@ def chat( prompt = content kwargs["role"] = "observation" chat_history = [h for h in chat_history if not h.get("tool_calls")] - if not chat_history: - chat_history = [] if system_prompt: chat_history.append({"role": "system", "content": system_prompt}) - if tools: - msg = self._model.chat( - self._tokenizer, prompt, [tools] + chat_history, **kwargs - ) - return self._tool_calls_completion( - self.model_family, self.model_uid, msg, tools - ) - else: - stream = generate_config.get("stream", False) - stream_options = generate_config.pop("stream_options", None) - include_usage = ( - stream_options["include_usage"] - if isinstance(stream_options, dict) - else False - ) - if stream: + stream = generate_config.get("stream", False) + stream_options = generate_config.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) + if stream and not tools: - def _stream_generator(): - last_chunk_text_length = 0 - chunk_id = "chat-" + str(uuid.uuid1()) - prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 - inputs = self._tokenizer([prompt], return_tensors="pt") - inputs = inputs.to(self._model.device) - prompt_tokens = len(inputs["input_ids"][0]) - for chunk_text, _ in self._model.stream_chat( - self._tokenizer, prompt, chat_history, **kwargs - ): - completion_tokens = completion_tokens + 1 - total_tokens = prompt_tokens + completion_tokens - chunk_text = chunk_text[last_chunk_text_length:] - last_chunk_text_length += len(chunk_text) - completion_choice = CompletionChoice( - text=chunk_text, index=0, logprobs=None, finish_reason=None - ) - yield CompletionChunk( - id=chunk_id, - object="text_completion", - created=int(time.time()), - model=self.model_uid, - choices=[completion_choice], - usage=CompletionUsage( - prompt_tokens=prompt_tokens, - completion_tokens=completion_tokens, - total_tokens=total_tokens, - ), - ) + def _stream_generator(): + last_chunk_text_length = 0 + chunk_id = "chat-" + str(uuid.uuid1()) + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 + inputs = self._tokenizer([prompt], return_tensors="pt") + inputs = inputs.to(self._model.device) + prompt_tokens = len(inputs["input_ids"][0]) + for chunk_text, _ in self._model.stream_chat( + self._tokenizer, prompt, chat_history, **kwargs + ): + completion_tokens = completion_tokens + 1 + total_tokens = prompt_tokens + completion_tokens + chunk_text = chunk_text[last_chunk_text_length:] + last_chunk_text_length += len(chunk_text) completion_choice = CompletionChoice( - text="", index=0, logprobs=None, finish_reason="stop" + text=chunk_text, index=0, logprobs=None, finish_reason=None ) - chunk = CompletionChunk( + yield CompletionChunk( id=chunk_id, object="text_completion", created=int(time.time()), model=self.model_uid, choices=[completion_choice], + usage=CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ), + ) + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=chunk_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + chunk["usage"] = completion_usage + yield chunk + if include_usage: + chunk = CompletionChunk( + id=chunk_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], ) - completion_usage = CompletionUsage( + chunk["usage"] = CompletionUsage( prompt_tokens=prompt_tokens, completion_tokens=completion_tokens, total_tokens=total_tokens, ) - chunk["usage"] = completion_usage yield chunk - if include_usage: - chunk = CompletionChunk( - id=chunk_id, - object="text_completion", - created=int(time.time()), - model=self.model_uid, - choices=[], - ) - chunk["usage"] = CompletionUsage( - prompt_tokens=prompt_tokens, - completion_tokens=completion_tokens, - total_tokens=total_tokens, - ) - yield chunk - return self._to_chat_completion_chunks(_stream_generator()) - else: - response, _ = self._model.chat( - self._tokenizer, prompt, chat_history, **kwargs + return self._to_chat_completion_chunks(_stream_generator()) + else: + response = self._model.chat(self._tokenizer, prompt, chat_history, **kwargs) + if tools: + return self._tool_calls_completion( + self.model_family, self.model_uid, response, tools ) + else: + content, _ = response return ChatCompletion( id="chat" + str(uuid.uuid1()), object="chat.completion", @@ -237,7 +321,7 @@ def _stream_generator(): choices=[ ChatCompletionChoice( index=0, - message={"role": "assistant", "content": response}, + message={"role": "assistant", "content": content}, finish_reason="stop", ) ], diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index d2aab93cb4..6f32dcca1f 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -42,7 +42,7 @@ from ...utils import select_device from ..core import LLM from ..llm_family import LLMFamilyV1, LLMSpecV1 -from ..utils import ChatModelMixin +from ..utils import QWEN_TOOL_CALL_FAMILY, ChatModelMixin from .utils import get_context_length, get_max_src_len logger = logging.getLogger(__name__) @@ -589,7 +589,7 @@ def chat( generate_config = self._sanitize_generate_config(generate_config) # TODO(codingl2k1): qwen hacky to set stop for function call. model_family = self.model_family.model_family or self.model_family.model_name - if tools and model_family in ["qwen-chat", "qwen1.5-chat"]: + if tools and model_family in QWEN_TOOL_CALL_FAMILY: stop = generate_config.get("stop") if isinstance(stop, str): generate_config["stop"] = [stop, "Observation:"] diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index f404eb8e24..07904b2330 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -39,6 +39,15 @@ logger = logging.getLogger(__name__) +QWEN_TOOL_CALL_FAMILY = [ + "qwen-chat", + "qwen1.5-chat", + "qwen1.5-moe-chat", + "qwen2-instruct", + "qwen2-moe-instruct", +] + + class ChatModelMixin: @staticmethod def get_prompt( @@ -661,13 +670,7 @@ def _eval_tool_arguments(cls, model_family, c, tools): content, func, args = cls._eval_gorilla_openfunctions_arguments(c, tools) elif family in ["chatglm3", "glm4-chat"]: content, func, args = cls._eval_glm_chat_arguments(c, tools) - elif family in [ - "qwen-chat", - "qwen1.5-chat", - "qwen1.5-moe-chat", - "qwen2-instruct", - "qwen2-moe-instruct", - ]: + elif family in QWEN_TOOL_CALL_FAMILY: content, func, args = cls._eval_qwen_chat_arguments(c, tools) else: raise Exception( @@ -686,13 +689,7 @@ def _tools_token_filter(cls, model_family): returns the part after "\nFinal Answer:" if found, else returns delta. """ family = model_family.model_family or model_family.model_name - if family in [ - "qwen-chat", - "qwen1.5-chat", - "qwen1.5-moe-chat", - "qwen2-instruct", - "qwen2-moe-instruct", - ]: + if family in QWEN_TOOL_CALL_FAMILY: # Encapsulating function to reset 'found' after each call found = False diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 996c70e071..d3904c8c00 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -43,7 +43,7 @@ ) from .. import LLM, LLMFamilyV1, LLMSpecV1 from ..llm_family import CustomLLMFamilyV1 -from ..utils import ChatModelMixin +from ..utils import QWEN_TOOL_CALL_FAMILY, ChatModelMixin logger = logging.getLogger(__name__) @@ -575,7 +575,7 @@ async def async_chat( generate_config = self._sanitize_chat_config(generate_config) # TODO(codingl2k1): qwen hacky to set stop for function call. model_family = self.model_family.model_family or self.model_family.model_name - if tools and model_family in ["qwen-chat", "qwen1.5-chat"]: + if tools and model_family in QWEN_TOOL_CALL_FAMILY: stop = generate_config.get("stop") if isinstance(stop, str): generate_config["stop"] = [stop, "Observation:"] From 82c07f7f35e8ec4e2d7f2e8646db4713852eed1c Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Thu, 27 Jun 2024 11:13:36 +0800 Subject: [PATCH 159/298] FEAT: [UI] Add favorite function. (#1714) --- .../launch_model/LaunchModelComponent.js | 75 +++++++++- .../ui/src/scenes/launch_model/launchLLM.js | 129 +++++++++++++++--- .../ui/src/scenes/launch_model/modelCard.js | 101 +++++++++++++- 3 files changed, 272 insertions(+), 33 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js index e2e4257ad2..132ba962ad 100644 --- a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js +++ b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js @@ -1,4 +1,11 @@ -import { Box, FormControl, InputLabel, MenuItem, Select } from '@mui/material' +import { + Box, + Chip, + FormControl, + InputLabel, + MenuItem, + Select, +} from '@mui/material' import React, { useContext, useEffect, useState } from 'react' import { ApiContext } from '../../components/apiContext' @@ -10,8 +17,10 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { let endPoint = useContext(ApiContext).endPoint const [registrationData, setRegistrationData] = useState([]) const [searchTerm, setSearchTerm] = useState('') - const [status, setStatus] = useState('all') + const [status, setStatus] = useState('') const [completeDeleteArr, setCompleteDeleteArr] = useState([]) + const [collectionArr, setCollectionArr] = useState([]) + const [filterArr, setFilterArr] = useState([]) const { isCallingApi, setIsCallingApi } = useContext(ApiContext) const { isUpdatingModel } = useContext(ApiContext) @@ -33,12 +42,23 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { : false } - if (status !== 'all') { + if (filterArr.length === 1) { + if (filterArr[0] === 'cached') { + return ( + registration.cache_status && + !completeDeleteArr.includes(registration.model_name) + ) + } else { + return collectionArr.includes(registration.model_name) + } + } else if (filterArr.length > 1) { return ( registration.cache_status && - !completeDeleteArr.includes(registration.model_name) + !completeDeleteArr.includes(registration.model_name) && + collectionArr.includes(registration.model_name) ) } + return true } @@ -65,6 +85,8 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { return v.is_builtin }) setRegistrationData(builtinModels) + const collectionData = JSON.parse(localStorage.getItem('collectionArr')) + setCollectionArr(collectionData) } catch (error) { console.error('Error:', error) } finally { @@ -76,6 +98,31 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { update() }, []) + const getCollectionArr = (data) => { + setCollectionArr(data) + } + + const handleChangeFilter = (value) => { + setStatus(value) + const arr = [ + ...filterArr.filter((item) => { + return item !== value + }), + value, + ] + setFilterArr(arr) + } + + const handleDeleteChip = (item) => { + setFilterArr( + filterArr.filter((subItem) => { + return subItem !== item + }) + ) + + if (item === status) setStatus('') + } + return ( <Box m="20px"> <div @@ -86,19 +133,19 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { margin: '30px 2rem', }} > - <FormControl variant="outlined" margin="normal"> + <FormControl sx={{ marginTop: 2, minWidth: 120 }} size="small"> <InputLabel id="select-status">Status</InputLabel> <Select id="status" labelId="select-status" label="Status" - onChange={(e) => setStatus(e.target.value)} + onChange={(e) => handleChangeFilter(e.target.value)} value={status} size="small" sx={{ width: '150px' }} > - <MenuItem value="all">all</MenuItem> <MenuItem value="cached">cached</MenuItem> + <MenuItem value="favorite">favorite</MenuItem> </Select> </FormControl> <FormControl variant="outlined" margin="normal"> @@ -113,6 +160,19 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { /> </FormControl> </div> + <div style={{ margin: '0 0 30px 30px' }}> + {filterArr.map((item, index) => ( + <Chip + key={index} + label={item} + variant="outlined" + size="small" + color="primary" + style={{ marginRight: 10 }} + onDelete={() => handleDeleteChip(item)} + /> + ))} + </div> <div style={{ display: 'grid', @@ -131,6 +191,7 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { modelType={modelType} gpuAvailable={gpuAvailable} onHandleCompleteDelete={handleCompleteDelete} + onGetCollectionArr={getCollectionArr} /> ))} </div> diff --git a/xinference/web/ui/src/scenes/launch_model/launchLLM.js b/xinference/web/ui/src/scenes/launch_model/launchLLM.js index 7f8bde7695..6d1ae81f8e 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchLLM.js +++ b/xinference/web/ui/src/scenes/launch_model/launchLLM.js @@ -1,4 +1,11 @@ -import { Box, FormControl, InputLabel, MenuItem, Select } from '@mui/material' +import { + Box, + Chip, + FormControl, + InputLabel, + MenuItem, + Select, +} from '@mui/material' import React, { useContext, useEffect, useState } from 'react' import { useCookies } from 'react-cookie' @@ -7,6 +14,8 @@ import fetcher from '../../components/fetcher' import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' +const modelAbilityArr = ['generate', 'chat', 'vision'] + const LaunchLLM = ({ gpuAvailable }) => { let endPoint = useContext(ApiContext).endPoint const { isCallingApi, setIsCallingApi } = useContext(ApiContext) @@ -17,9 +26,12 @@ const LaunchLLM = ({ gpuAvailable }) => { const [registrationData, setRegistrationData] = useState([]) // States used for filtering const [searchTerm, setSearchTerm] = useState('') - const [modelAbility, setModelAbility] = useState('all') - const [status, setStatus] = useState('all') + const [modelAbility, setModelAbility] = useState('') + const [status, setStatus] = useState('') + const [statusArr, setStatusArr] = useState([]) const [completeDeleteArr, setCompleteDeleteArr] = useState([]) + const [collectionArr, setCollectionArr] = useState([]) + const [filterArr, setFilterArr] = useState([]) const filter = (registration) => { if (searchTerm !== '') { @@ -39,10 +51,7 @@ const LaunchLLM = ({ gpuAvailable }) => { } } - if ( - modelAbility !== 'all' && - registration.model_ability.indexOf(modelAbility) < 0 - ) + if (modelAbility && registration.model_ability.indexOf(modelAbility) < 0) return false if (completeDeleteArr.includes(registration.model_name)) { @@ -50,9 +59,21 @@ const LaunchLLM = ({ gpuAvailable }) => { item.cache_status = Array.isArray(item) ? [false] : false }) } - if (status !== 'all') { + + if (statusArr.length === 1) { + if (statusArr[0] === 'cached') { + const judge = registration.model_specs.some((spec) => filterCache(spec)) + return judge && !completeDeleteArr.includes(registration.model_name) + } else { + return collectionArr.includes(registration.model_name) + } + } else if (statusArr.length > 1) { const judge = registration.model_specs.some((spec) => filterCache(spec)) - return judge && !completeDeleteArr.includes(registration.model_name) + return ( + judge && + !completeDeleteArr.includes(registration.model_name) && + collectionArr.includes(registration.model_name) + ) } return true @@ -98,6 +119,10 @@ const LaunchLLM = ({ gpuAvailable }) => { response.json().then((data) => { const builtinRegistrations = data.filter((v) => v.is_builtin) setRegistrationData(builtinRegistrations) + const collectionData = JSON.parse( + localStorage.getItem('collectionArr') + ) + setCollectionArr(collectionData) }) } }) @@ -112,11 +137,52 @@ const LaunchLLM = ({ gpuAvailable }) => { update() }, [cookie.token]) - const style = { - display: 'grid', - gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', - paddingLeft: '2rem', - gridGap: '2rem 0rem', + const getCollectionArr = (data) => { + setCollectionArr(data) + } + + const handleChangeFilter = (type, value) => { + if (type === 'modelAbility') { + setModelAbility(value) + setFilterArr([ + ...filterArr.filter((item) => { + return !modelAbilityArr.includes(item) + }), + value, + ]) + } else { + setStatus(value) + const arr = [ + ...filterArr.filter((item) => { + return item !== value + }), + value, + ] + setFilterArr(arr) + setStatusArr( + arr.filter((item) => { + return !modelAbilityArr.includes(item) + }) + ) + } + } + + const handleDeleteChip = (item) => { + setFilterArr( + filterArr.filter((subItem) => { + return subItem !== item + }) + ) + if (item === modelAbility) { + setModelAbility('') + } else { + setStatusArr( + statusArr.filter((subItem) => { + return subItem !== item + }) + ) + if (item === status) setStatus('') + } } return ( @@ -129,38 +195,38 @@ const LaunchLLM = ({ gpuAvailable }) => { margin: '30px 2rem', }} > - <FormControl variant="outlined" margin="normal"> + <FormControl sx={{ marginTop: 2, minWidth: 120 }} size="small"> <InputLabel id="ability-select-label">Model Ability</InputLabel> <Select id="ability" labelId="ability-select-label" label="Model Ability" - onChange={(e) => setModelAbility(e.target.value)} + onChange={(e) => handleChangeFilter('modelAbility', e.target.value)} value={modelAbility} size="small" sx={{ width: '150px' }} > - <MenuItem value="all">all</MenuItem> <MenuItem value="generate">generate</MenuItem> <MenuItem value="chat">chat</MenuItem> <MenuItem value="vision">vl-chat</MenuItem> </Select> </FormControl> - <FormControl variant="outlined" margin="normal"> + <FormControl sx={{ marginTop: 2, minWidth: 120 }} size="small"> <InputLabel id="select-status">Status</InputLabel> <Select id="status" labelId="select-status" label="Status" - onChange={(e) => setStatus(e.target.value)} + onChange={(e) => handleChangeFilter('status', e.target.value)} value={status} size="small" sx={{ width: '150px' }} > - <MenuItem value="all">all</MenuItem> <MenuItem value="cached">cached</MenuItem> + <MenuItem value="favorite">favorite</MenuItem> </Select> </FormControl> + <FormControl variant="outlined" margin="normal"> <HotkeyFocusTextField id="search" @@ -173,7 +239,27 @@ const LaunchLLM = ({ gpuAvailable }) => { /> </FormControl> </div> - <div style={style}> + <div style={{ margin: '0 0 30px 30px' }}> + {filterArr.map((item, index) => ( + <Chip + key={index} + label={item} + variant="outlined" + size="small" + color="primary" + style={{ marginRight: 10 }} + onDelete={() => handleDeleteChip(item)} + /> + ))} + </div> + <div + style={{ + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', + paddingLeft: '2rem', + gridGap: '2rem 0rem', + }} + > {registrationData .filter((registration) => filter(registration)) .map((filteredRegistration) => ( @@ -184,6 +270,7 @@ const LaunchLLM = ({ gpuAvailable }) => { gpuAvailable={gpuAvailable} modelType={'LLM'} onHandleCompleteDelete={handleCompleteDelete} + onGetCollectionArr={getCollectionArr} /> ))} </div> diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 3063a9d839..84b399c7d2 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -8,8 +8,10 @@ import { EditNoteOutlined, ExpandLess, ExpandMore, + Grade, HelpCenterOutlined, RocketLaunchOutlined, + StarBorder, UndoOutlined, } from '@mui/icons-material' import { @@ -61,6 +63,7 @@ const ModelCard = ({ is_custom = false, onHandleCompleteDelete, onHandlecustomDelete, + onGetCollectionArr, }) => { const [hover, setHover] = useState(false) const [selected, setSelected] = useState(false) @@ -542,10 +545,27 @@ const ModelCard = ({ navigate(`/register_model/${arr[arr.length - 1]}/${modelData.model_name}`) } + const handleCollection = (bool) => { + setHover(false) + + let collectionArr = JSON.parse(localStorage.getItem('collectionArr')) || [] + if (bool) { + collectionArr.push(modelData.model_name) + } else { + collectionArr = collectionArr.filter( + (item) => item !== modelData.model_name + ) + } + localStorage.setItem('collectionArr', JSON.stringify(collectionArr)) + + onGetCollectionArr(collectionArr) + } + // Set two different states based on mouse hover return ( <> <Paper + id={modelData.model_name} className="container" onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)} @@ -583,7 +603,6 @@ const ModelCard = ({ e.stopPropagation() setIsDeleteCustomModel(true) }} - disabled={customDeleted} > <Delete /> </IconButton> @@ -591,7 +610,40 @@ const ModelCard = ({ </div> </div> )} - {!is_custom && <TitleTypography value={modelData.model_name} />} + {!is_custom && ( + <div className="cardTitle"> + <TitleTypography value={modelData.model_name} /> + <div className="iconButtonBox"> + {JSON.parse(localStorage.getItem('collectionArr'))?.includes( + modelData.model_name + ) ? ( + <Tooltip title={'Unfavorite'} placement="top"> + <IconButton + aria-label="collection" + onClick={(e) => { + e.stopPropagation() + handleCollection(false) + }} + > + <Grade style={{ color: 'rgb(255, 206, 0)' }} /> + </IconButton> + </Tooltip> + ) : ( + <Tooltip title={'Favorite'} placement="top"> + <IconButton + aria-label="cancellation-of-collections" + onClick={(e) => { + e.stopPropagation() + handleCollection(true) + }} + > + <StarBorder /> + </IconButton> + </Tooltip> + )} + </div> + </div> + )} <Stack spacing={1} @@ -710,7 +762,41 @@ const ModelCard = ({ </div> </div> )} - {!is_custom && <TitleTypography value={modelData.model_name} />} + {!is_custom && ( + <div className="cardTitle"> + <TitleTypography value={modelData.model_name} /> + <div className="iconButtonBox"> + {JSON.parse( + localStorage.getItem('collectionArr') + )?.includes(modelData.model_name) ? ( + <Tooltip title={'Unfavorite'} placement="top"> + <IconButton + aria-label="collection" + onClick={(e) => { + e.stopPropagation() + handleCollection(false) + }} + > + <Grade style={{ color: 'rgb(255, 206, 0)' }} /> + </IconButton> + </Tooltip> + ) : ( + <Tooltip title={'Favorite'} placement="top"> + <IconButton + aria-label="cancellation-of-collections" + onClick={(e) => { + e.stopPropagation() + handleCollection(true) + }} + > + <StarBorder /> + </IconButton> + </Tooltip> + )} + </div> + </div> + )} + <Stack spacing={1} direction="row" @@ -1008,8 +1094,13 @@ const ModelCard = ({ </FormControl> </Grid> <ListItemButton onClick={() => setIsOther(!isOther)}> - <ListItemText primary="Optional Configurations" /> - {isOther ? <ExpandLess /> : <ExpandMore />} + <div style={{ display: 'flex', alignItems: 'center' }}> + <ListItemText + primary="Optional Configurations" + style={{ marginRight: 10 }} + /> + {isOther ? <ExpandLess /> : <ExpandMore />} + </div> </ListItemButton> <Collapse in={isOther} timeout="auto" unmountOnExit> <Grid item xs={12}> From 66c66b7a45a1dea855470e78958652cd039acdfe Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:01:18 +0800 Subject: [PATCH 160/298] BUG: [UI]fix favorite bug. (#1728) --- .../web/ui/src/scenes/launch_model/LaunchModelComponent.js | 4 ++-- xinference/web/ui/src/scenes/launch_model/launchLLM.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js index 132ba962ad..be6d1ce01e 100644 --- a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js +++ b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js @@ -49,13 +49,13 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { !completeDeleteArr.includes(registration.model_name) ) } else { - return collectionArr.includes(registration.model_name) + return collectionArr?.includes(registration.model_name) } } else if (filterArr.length > 1) { return ( registration.cache_status && !completeDeleteArr.includes(registration.model_name) && - collectionArr.includes(registration.model_name) + collectionArr?.includes(registration.model_name) ) } diff --git a/xinference/web/ui/src/scenes/launch_model/launchLLM.js b/xinference/web/ui/src/scenes/launch_model/launchLLM.js index 6d1ae81f8e..c9fc07484b 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchLLM.js +++ b/xinference/web/ui/src/scenes/launch_model/launchLLM.js @@ -65,14 +65,14 @@ const LaunchLLM = ({ gpuAvailable }) => { const judge = registration.model_specs.some((spec) => filterCache(spec)) return judge && !completeDeleteArr.includes(registration.model_name) } else { - return collectionArr.includes(registration.model_name) + return collectionArr?.includes(registration.model_name) } } else if (statusArr.length > 1) { const judge = registration.model_specs.some((spec) => filterCache(spec)) return ( judge && !completeDeleteArr.includes(registration.model_name) && - collectionArr.includes(registration.model_name) + collectionArr?.includes(registration.model_name) ) } From 341e008a6b757b2ea999d2a56db3085d6bd74da3 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 27 Jun 2024 16:54:55 +0800 Subject: [PATCH 161/298] FEAT: add SD3 support (#1723) --- .../models/model_abilities/image.po | 45 ++++++++++++++----- doc/source/models/builtin/image/index.rst | 2 + .../models/builtin/image/sd3-medium.rst | 19 ++++++++ doc/source/models/builtin/llm/glm-4v.rst | 2 +- doc/source/models/builtin/llm/index.rst | 4 +- .../models/builtin/llm/qwen1.5-moe-chat.rst | 2 +- .../models/builtin/llm/qwen2-moe-instruct.rst | 2 +- doc/source/models/model_abilities/image.rst | 9 ++++ xinference/model/image/model_spec.json | 6 +++ .../model/image/model_spec_modelscope.json | 7 +++ 10 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 doc/source/models/builtin/image/sd3-medium.rst diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po index f6ecd538ce..2b3bb24a45 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-01 16:47+0800\n" +"POT-Creation-Date: 2024-06-26 12:25+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/models/model_abilities/image.rst:5 msgid "Images (Experimental)" @@ -97,35 +97,60 @@ msgstr "" msgid "stable-diffusion-xl-base-1.0" msgstr "" -#: ../../source/models/model_abilities/image.rst:46 +#: ../../source/models/model_abilities/image.rst:43 +msgid "sd3-medium" +msgstr "" + +#: ../../source/models/model_abilities/image.rst:47 msgid "Quickstart" msgstr "快速入门" -#: ../../source/models/model_abilities/image.rst:49 +#: ../../source/models/model_abilities/image.rst:50 msgid "Text-to-image" msgstr "文生图" -#: ../../source/models/model_abilities/image.rst:51 +#: ../../source/models/model_abilities/image.rst:52 msgid "" "The Text-to-image API mimics OpenAI's `create images API " "<https://platform.openai.com/docs/api-reference/images/create>`_. We can " "try Text-to-image API out either via cURL, OpenAI Client, or Xinference's" " python client:" -msgstr "可以通过 cURL、OpenAI Client 或 Xinference 的方式尝试使用 Text-to-image API。" +msgstr "" +"可以通过 cURL、OpenAI Client 或 Xinference 的方式尝试使用 Text-to-image " +"API。" + +#: ../../source/models/model_abilities/image.rst:108 +msgid "" +"If you are running ``sd3-medium`` on a GPU less than 24GB and " +"encountering out of memory, consider to add an extra param for launching " +"according to `this article " +"<https://huggingface.co/docs/diffusers/v0.29.1/en/api/pipelines/stable_diffusion/stable_diffusion_3" +"#dropping-the-t5-text-encoder-during-inference>`_." +msgstr "" +"如果你在小于 24GB 的显卡上运行 ``sd3-medium`` 碰到内存不足的问题时,根据 " +"`这篇文章 <https://huggingface.co/docs/diffusers/v0.29.1/en/api/" +"pipelines/stable_diffusion/stable_diffusion_3#dropping-the-t5-text-" +"encoder-during-inference>`_ 考虑在加载模型时增加额外选项。" -#: ../../source/models/model_abilities/image.rst:107 +#: ../../source/models/model_abilities/image.rst:111 +msgid "" +"xinference launch --model-name sd3-medium --model-type image " +"--text_encoder_3 None" +msgstr "" + +#: ../../source/models/model_abilities/image.rst:114 msgid "Image-to-image" msgstr "图生图" -#: ../../source/models/model_abilities/image.rst:109 +#: ../../source/models/model_abilities/image.rst:116 msgid "You can find more examples of Images API in the tutorial notebook:" msgstr "你可以在教程笔记本中找到更多 Images API 的示例。" -#: ../../source/models/model_abilities/image.rst:113 +#: ../../source/models/model_abilities/image.rst:120 msgid "Stable Diffusion ControlNet" msgstr "" -#: ../../source/models/model_abilities/image.rst:116 +#: ../../source/models/model_abilities/image.rst:123 msgid "Learn from a Stable Diffusion ControlNet example" msgstr "学习一个 Stable Diffusion 控制网络的示例" diff --git a/doc/source/models/builtin/image/index.rst b/doc/source/models/builtin/image/index.rst index 7b15e9bcb2..94a47812bc 100644 --- a/doc/source/models/builtin/image/index.rst +++ b/doc/source/models/builtin/image/index.rst @@ -13,6 +13,8 @@ The following is a list of built-in image models in Xinference: sd-turbo + sd3-medium + sdxl-turbo stable-diffusion-v1.5 diff --git a/doc/source/models/builtin/image/sd3-medium.rst b/doc/source/models/builtin/image/sd3-medium.rst new file mode 100644 index 0000000000..a0e9b02863 --- /dev/null +++ b/doc/source/models/builtin/image/sd3-medium.rst @@ -0,0 +1,19 @@ +.. _models_builtin_sd3-medium: + +========== +sd3-medium +========== + +- **Model Name:** sd3-medium +- **Model Family:** stable_diffusion +- **Abilities:** text-to-image +- **Available ControlNet:** None + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** stabilityai/stable-diffusion-3-medium-diffusers + +Execute the following command to launch the model:: + + xinference launch --model-name sd3-medium --model-type image \ No newline at end of file diff --git a/doc/source/models/builtin/llm/glm-4v.rst b/doc/source/models/builtin/llm/glm-4v.rst index 346f873c7c..a2b9f539e0 100644 --- a/doc/source/models/builtin/llm/glm-4v.rst +++ b/doc/source/models/builtin/llm/glm-4v.rst @@ -19,7 +19,7 @@ Model Spec 1 (pytorch, 9 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 9 -- **Quantizations:** none +- **Quantizations:** 4-bit, 8-bit, none - **Engines**: Transformers - **Model ID:** THUDM/glm-4v-9b - **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/glm-4v-9b>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/glm-4v-9b>`__ diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index e2187324cc..396710c134 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -397,7 +397,7 @@ The following is a list of built-in LLM in Xinference: - Qwen1.5 is the beta version of Qwen2, a transformer-based decoder-only language model pretrained on a large amount of data. * - :ref:`qwen1.5-moe-chat <models_llm_qwen1.5-moe-chat>` - - chat + - chat, tools - 32768 - Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data. @@ -407,7 +407,7 @@ The following is a list of built-in LLM in Xinference: - Qwen2 is the new series of Qwen large language models * - :ref:`qwen2-moe-instruct <models_llm_qwen2-moe-instruct>` - - chat + - chat, tools - 32768 - Qwen2 is the new series of Qwen large language models. diff --git a/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst b/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst index c371dfbb69..c72a9dfdb4 100644 --- a/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst +++ b/doc/source/models/builtin/llm/qwen1.5-moe-chat.rst @@ -7,7 +7,7 @@ qwen1.5-moe-chat - **Context Length:** 32768 - **Model Name:** qwen1.5-moe-chat - **Languages:** en, zh -- **Abilities:** chat +- **Abilities:** chat, tools - **Description:** Qwen1.5-MoE is a transformer-based MoE decoder-only language model pretrained on a large amount of data. Specifications diff --git a/doc/source/models/builtin/llm/qwen2-moe-instruct.rst b/doc/source/models/builtin/llm/qwen2-moe-instruct.rst index c512ca2ad8..9f4e9e9542 100644 --- a/doc/source/models/builtin/llm/qwen2-moe-instruct.rst +++ b/doc/source/models/builtin/llm/qwen2-moe-instruct.rst @@ -7,7 +7,7 @@ qwen2-moe-instruct - **Context Length:** 32768 - **Model Name:** qwen2-moe-instruct - **Languages:** en, zh -- **Abilities:** chat +- **Abilities:** chat, tools - **Description:** Qwen2 is the new series of Qwen large language models. Specifications diff --git a/doc/source/models/model_abilities/image.rst b/doc/source/models/model_abilities/image.rst index e84b6f8d2d..5407d06c79 100644 --- a/doc/source/models/model_abilities/image.rst +++ b/doc/source/models/model_abilities/image.rst @@ -40,6 +40,7 @@ The Text-to-image API is supported with the following models in Xinference: * sdxl-turbo * stable-diffusion-v1.5 * stable-diffusion-xl-base-1.0 +* sd3-medium Quickstart @@ -102,6 +103,14 @@ We can try Text-to-image API out either via cURL, OpenAI Client, or Xinference's } +.. note:: + + If you are running ``sd3-medium`` on a GPU less than 24GB and encountering out of memory, + consider to add an extra param for launching according to `this article <https://huggingface.co/docs/diffusers/v0.29.1/en/api/pipelines/stable_diffusion/stable_diffusion_3#dropping-the-t5-text-encoder-during-inference>`_. + + .. code:: bash + + xinference launch --model-name sd3-medium --model-type image --text_encoder_3 None Image-to-image -------------------- diff --git a/xinference/model/image/model_spec.json b/xinference/model/image/model_spec.json index 246bad15f6..25718b15fe 100644 --- a/xinference/model/image/model_spec.json +++ b/xinference/model/image/model_spec.json @@ -1,4 +1,10 @@ [ + { + "model_name": "sd3-medium", + "model_family": "stable_diffusion", + "model_id": "stabilityai/stable-diffusion-3-medium-diffusers", + "model_revision": "ea42f8cef0f178587cf766dc8129abd379c90671" + }, { "model_name": "sd-turbo", "model_family": "stable_diffusion", diff --git a/xinference/model/image/model_spec_modelscope.json b/xinference/model/image/model_spec_modelscope.json index 794370344b..6f00e2ba82 100644 --- a/xinference/model/image/model_spec_modelscope.json +++ b/xinference/model/image/model_spec_modelscope.json @@ -1,4 +1,11 @@ [ + { + "model_name": "sd3-medium", + "model_family": "stable_diffusion", + "model_hub": "modelscope", + "model_id": "AI-ModelScope/stable-diffusion-3-medium-diffusers", + "model_revision": "master" + }, { "model_name": "sd-turbo", "model_family": "stable_diffusion", From be83ab7e9dd733313b254307291489095a6cbf2c Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:48:22 +0800 Subject: [PATCH 162/298] FEAT: [UI] Add the function of automatically obtaining the last configuration information. (#1730) --- .../scenes/launch_model/components/addPair.js | 15 +- .../ui/src/scenes/launch_model/modelCard.js | 277 ++++++++++++++++-- 2 files changed, 265 insertions(+), 27 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/components/addPair.js b/xinference/web/ui/src/scenes/launch_model/components/addPair.js index 7f11ad4d20..b7f1c0923d 100644 --- a/xinference/web/ui/src/scenes/launch_model/components/addPair.js +++ b/xinference/web/ui/src/scenes/launch_model/components/addPair.js @@ -3,7 +3,7 @@ import DeleteIcon from '@mui/icons-material/Delete' import { Alert, Box, IconButton, Snackbar, TextField } from '@mui/material' import React, { useEffect, useState } from 'react' -const AddPair = ({ customData, onGetArr, onJudgeArr }) => { +const AddPair = ({ customData, pairData, onGetArr, onJudgeArr }) => { const [openSnackbar, setOpenSnackbar] = useState(false) const [arr, setArr] = useState([]) const [arrId, setArrId] = useState(0) @@ -14,6 +14,19 @@ const AddPair = ({ customData, onGetArr, onJudgeArr }) => { onGetArr(arr) }, [arr]) + useEffect(() => { + const dataArr = [] + pairData.forEach((item, index) => { + dataArr.push({ + id: index, + [customData.key]: item[customData.key], + [customData.value]: item[customData.value], + }) + }) + setArrId(pairData.length) + setArr(dataArr) + }, [pairData]) + const updateArr = (index, type, newValue) => { setArr( arr.map((pair, subIndex) => { diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 84b399c7d2..bdfa834de0 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -55,6 +55,22 @@ import fetcher from '../../components/fetcher' import TitleTypography from '../../components/titleTypography' import AddPair from './components/addPair' +const llmAllDataKey = [ + 'model_uid', + 'model_name', + 'model_type', + 'model_engine', + 'model_format', + 'model_size_in_billions', + 'quantization', + 'n_gpu', + 'replica', + 'request_limits', + 'worker_ip', + 'gpu_idx', + 'peft_model_config', +] + const ModelCard = ({ url, modelData, @@ -109,6 +125,12 @@ const ModelCard = ({ const [page, setPage] = useState(0) const [isDeleteCustomModel, setIsDeleteCustomModel] = useState(false) const [isJsonShow, setIsJsonShow] = useState(false) + const [isHistory, setIsHistory] = useState(false) + const [customArr, setCustomArr] = useState([]) + const [loraArr, setLoraArr] = useState([]) + const [imageLoraLoadArr, setImageLoraLoadArr] = useState([]) + const [imageLoraFuseArr, setImageLoraFuseArr] = useState([]) + const [customParametersArrLength, setCustomParametersArrLength] = useState(0) const parentRef = useRef(null) @@ -130,12 +152,24 @@ const ModelCard = ({ } useEffect(() => { - setModelFormat('') + let keyArr = [] + for (let key in enginesObj) { + keyArr.push(key) + } + if (keyArr.length) { + handleLlmHistory() + } + }, [enginesObj]) + + useEffect(() => { if (modelEngine) { const format = [ ...new Set(enginesObj[modelEngine].map((item) => item.model_format)), ] setFormatOptions(format) + if (!isHistory || !format.includes(modelFormat)) { + setModelFormat('') + } if (format.length === 1) { setModelFormat(format[0]) } @@ -143,7 +177,6 @@ const ModelCard = ({ }, [modelEngine]) useEffect(() => { - setModelSize('') if (modelEngine && modelFormat) { const sizes = [ ...new Set( @@ -153,6 +186,9 @@ const ModelCard = ({ ), ] setSizeOptions(sizes) + if (!isHistory || !sizes.includes(Number(modelSize))) { + setModelSize('') + } if (sizes.length === 1) { setModelSize(sizes[0]) } @@ -160,7 +196,6 @@ const ModelCard = ({ }, [modelEngine, modelFormat]) useEffect(() => { - setQuantization('') if (modelEngine && modelFormat && modelSize) { const quants = [ ...new Set( @@ -174,6 +209,9 @@ const ModelCard = ({ ), ] setQuantizationOptions(quants) + if (!isHistory || !quants.includes(quantization)) { + setQuantization('') + } if (quants.length === 1) { setQuantization(quants[0]) } @@ -181,7 +219,11 @@ const ModelCard = ({ }, [modelEngine, modelFormat, modelSize]) useEffect(() => { - if (parentRef.current) { + setCustomParametersArrLength(customParametersArr.length) + if ( + parentRef.current && + customParametersArr.length > customParametersArrLength + ) { parentRef.current.scrollTo({ top: parentRef.current.scrollHeight, behavior: 'smooth', @@ -260,7 +302,9 @@ const ModelCard = ({ : parseInt(nGPU, 10), replica: replica, request_limits: - requestLimits.trim() === '' ? null : Number(requestLimits.trim()), + String(requestLimits).trim() === '' + ? null + : Number(String(requestLimits).trim()), worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), } @@ -348,6 +392,25 @@ const ModelCard = ({ 'runningModelType', `/running_models/${modelType}` ) + + if ( + isHistory || + ((modelType === 'embedding' || modelType === 'rerank') && + (modelUID !== '' || replica !== 1 || workerIp !== '')) || + ((modelType === 'image' || modelType === 'audio') && + modelUID !== '') || + modelType === 'LLM' + ) { + let historyArr = + JSON.parse(localStorage.getItem('historyArr')) || [] + if (!historyArr.some((item) => deepEqual(item, modelDataWithID))) { + historyArr = historyArr.filter( + (item) => item.model_name !== modelDataWithID.model_name + ) + historyArr.push(modelDataWithID) + } + localStorage.setItem('historyArr', JSON.stringify(historyArr)) + } } setIsCallingApi(false) }) @@ -406,6 +469,7 @@ const ModelCard = ({ } const handleValueType = (str) => { + str = String(str) if (str.toLowerCase() === 'none') { return null } else if (str.toLowerCase() === 'true') { @@ -419,22 +483,6 @@ const ModelCard = ({ } } - const getLoraListArr = (arr) => { - setLoraListArr(arr) - } - - const getImageLoraLoadKwargsArr = (arr) => { - setImageLoraLoadKwargsArr(arr) - } - - const getImageLoraFuseKwargsArr = (arr) => { - setImageLoraFuseKwargsArr(arr) - } - - const getCustomParametersArr = (arr) => { - setCustomParametersArr(arr) - } - const StyledTableRow = styled(TableRow)(({ theme }) => ({ '&:nth-of-type(odd)': { backgroundColor: theme.palette.action.hover, @@ -545,6 +593,122 @@ const ModelCard = ({ navigate(`/register_model/${arr[arr.length - 1]}/${modelData.model_name}`) } + const handleGetHistory = () => { + const historyArr = JSON.parse(localStorage.getItem('historyArr')) || [] + return historyArr.filter((item) => item.model_name === modelData.model_name) + } + + const handleLlmHistory = () => { + const arr = handleGetHistory() + if (arr.length) { + const { + model_engine, + model_format, + model_size_in_billions, + quantization, + n_gpu, + replica, + model_uid, + request_limits, + worker_ip, + gpu_idx, + peft_model_config, + } = arr[0] + + setModelEngine(model_engine || '') + setModelFormat(model_format || '') + setModelSize(String(model_size_in_billions) || '') + setQuantization(quantization || '') + setNGPU(n_gpu || 'auto') + setReplica(replica || 1) + setModelUID(model_uid || '') + setRequestLimits(request_limits || '') + setWorkerIp(worker_ip || '') + setGPUIdx(gpu_idx?.join(',') || '') + + let loraData = [] + peft_model_config?.lora_list?.forEach((item) => { + loraData.push({ + lora_name: item.lora_name, + local_path: item.local_path, + }) + }) + setLoraArr(loraData) + + let ImageLoraLoadData = [] + for (let key in peft_model_config?.image_lora_load_kwargs) { + ImageLoraLoadData.push({ + key: key, + value: peft_model_config?.image_lora_load_kwargs[key], + }) + } + setImageLoraLoadArr(ImageLoraLoadData) + + let ImageLoraFuseData = [] + for (let key in peft_model_config?.image_lora_fuse_kwargs) { + ImageLoraFuseData.push({ + key: key, + value: peft_model_config?.image_lora_fuse_kwargs[key], + }) + } + setImageLoraFuseArr(ImageLoraFuseData) + + let customData = [] + for (let key in arr[0]) { + !llmAllDataKey.includes(key) && + customData.push({ key: key, value: arr[0][key] }) + } + setCustomArr(customData) + + if (model_uid || request_limits || worker_ip || gpu_idx?.join(',')) + setIsOther(true) + + if ( + loraData.length || + ImageLoraLoadData.length || + ImageLoraFuseData.length + ) { + setIsOther(true) + setIsPeftModelConfig(true) + } + } + } + + const handleOtherHistory = () => { + const arr = handleGetHistory() + if (arr.length) { + if (modelType === 'embedding' || modelType === 'rerank') { + setModelUID(arr[0].model_uid || '') + setReplica(arr[0].replica || 1) + setWorkerIp(arr[0].worker_ip || '') + } else { + setModelUID(arr[0].model_uid || '') + } + } + } + + const deepEqual = (obj1, obj2) => { + if (obj1 === obj2) return true + if ( + typeof obj1 !== 'object' || + typeof obj2 !== 'object' || + obj1 == null || + obj2 == null + ) { + return false + } + + let keysA = Object.keys(obj1) + let keysB = Object.keys(obj2) + if (keysA.length !== keysB.length) return false + for (let key of keysA) { + if (!keysB.includes(key) || !deepEqual(obj1[key], obj2[key])) { + return false + } + } + return true + } + const handleCollection = (bool) => { setHover(false) @@ -561,6 +725,39 @@ const ModelCard = ({ onGetCollectionArr(collectionArr) } + const handleDeleteChip = () => { + const arr = JSON.parse(localStorage.getItem('historyArr')) + const newArr = arr.filter( + (item) => item.model_name !== modelData.model_name + ) + localStorage.setItem('historyArr', JSON.stringify(newArr)) + setIsHistory(false) + if (modelType === 'LLM') { + setModelEngine('') + setModelFormat('') + setModelSize('') + setQuantization('') + setNGPU('auto') + setReplica(1) + setModelUID('') + setRequestLimits('') + setWorkerIp('') + setGPUIdx('') + setLoraArr([]) + setImageLoraLoadArr([]) + setImageLoraFuseArr([]) + setCustomArr([]) + setIsOther(false) + setIsPeftModelConfig(false) + } else if (modelType === 'embedding' || modelType === 'rerank') { + setModelUID('') + setReplica(1) + setWorkerIp('') + } else { + setModelUID('') + } + } + // Set two different states based on mouse hover return ( <> @@ -571,9 +768,13 @@ const ModelCard = ({ onMouseLeave={() => setHover(false)} onClick={() => { if (!selected && !customDeleted) { + const arr = handleGetHistory() + if (arr.length) setIsHistory(true) setSelected(true) if (modelType === 'LLM') { getModelEngine(modelData.model_name) + } else { + handleOtherHistory() } } }} @@ -879,7 +1080,19 @@ const ModelCard = ({ anchor={'right'} > <div className="drawerCard"> - <TitleTypography value={modelData.model_name} /> + <div style={{ display: 'flex', alignItems: 'center' }}> + <TitleTypography value={modelData.model_name} /> + {isHistory && ( + <Chip + label="Last Config" + variant="outlined" + size="small" + color="primary" + onDelete={handleDeleteChip} + /> + )} + </div> + {modelType === 'LLM' ? ( <Box ref={parentRef} @@ -1192,8 +1405,11 @@ const ModelCard = ({ key: 'lora_name', value: 'local_path', }} - onGetArr={getLoraListArr} + onGetArr={(arr) => { + setLoraListArr(arr) + }} onJudgeArr={judgeArr} + pairData={loraArr} /> <AddPair customData={{ @@ -1201,8 +1417,11 @@ const ModelCard = ({ key: 'key', value: 'value', }} - onGetArr={getImageLoraLoadKwargsArr} + onGetArr={(arr) => { + setImageLoraLoadKwargsArr(arr) + }} onJudgeArr={judgeArr} + pairData={imageLoraLoadArr} /> <AddPair customData={{ @@ -1210,8 +1429,11 @@ const ModelCard = ({ key: 'key', value: 'value', }} - onGetArr={getImageLoraFuseKwargsArr} + onGetArr={(arr) => { + setImageLoraFuseKwargsArr(arr) + }} onJudgeArr={judgeArr} + pairData={imageLoraFuseArr} /> </Collapse> </Collapse> @@ -1223,8 +1445,11 @@ const ModelCard = ({ key: 'key', value: 'value', }} - onGetArr={getCustomParametersArr} + onGetArr={(arr) => { + setCustomParametersArr(arr) + }} onJudgeArr={judgeArr} + pairData={customArr} /> </Grid> </Box> From 33e8e1ea65b0afc6d1472a131b3ee551f84f9457 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 28 Jun 2024 10:55:49 +0800 Subject: [PATCH 163/298] BUG: curl with stream returns unicode chars rather than chinese character (#1732) --- xinference/core/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xinference/core/model.py b/xinference/core/model.py index 94c9f16cec..34e74386a9 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -302,7 +302,7 @@ def _to_json_generator(self, gen: types.GeneratorType): if time_to_first_token is None: time_to_first_token = (time.time() - start_time) * 1000 final_usage = v.get("usage", None) - v = dict(data=json.dumps(v)) + v = dict(data=json.dumps(v, ensure_ascii=False)) yield sse_starlette.sse.ensure_bytes(v, None) except OutOfMemoryError: logger.exception( From dc273dbb83dd9d179c5e528fa1ebd34f713cac6f Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 28 Jun 2024 11:19:17 +0800 Subject: [PATCH 164/298] FEAT: support jina-rerank-v2 (#1733) --- doc/source/models/builtin/rerank/index.rst | 2 ++ .../models/builtin/rerank/jina-reranker-v2.rst | 18 ++++++++++++++++++ setup.cfg | 4 ++-- xinference/model/rerank/core.py | 12 ++++++++++-- xinference/model/rerank/model_spec.json | 7 +++++++ 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 doc/source/models/builtin/rerank/jina-reranker-v2.rst diff --git a/doc/source/models/builtin/rerank/index.rst b/doc/source/models/builtin/rerank/index.rst index cd1e8613e7..25964db295 100644 --- a/doc/source/models/builtin/rerank/index.rst +++ b/doc/source/models/builtin/rerank/index.rst @@ -22,4 +22,6 @@ The following is a list of built-in rerank models in Xinference: bge-reranker-v2-m3 bge-reranker-v2-minicpm-layerwise + + jina-reranker-v2 \ No newline at end of file diff --git a/doc/source/models/builtin/rerank/jina-reranker-v2.rst b/doc/source/models/builtin/rerank/jina-reranker-v2.rst new file mode 100644 index 0000000000..c579898380 --- /dev/null +++ b/doc/source/models/builtin/rerank/jina-reranker-v2.rst @@ -0,0 +1,18 @@ +.. _models_builtin_jina-reranker-v2: + +================ +jina-reranker-v2 +================ + +- **Model Name:** jina-reranker-v2 +- **Languages:** en, zh, multilingual +- **Abilities:** rerank + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** jinaai/jina-reranker-v2-base-multilingual + +Execute the following command to launch the model:: + + xinference launch --model-name jina-reranker-v2 --model-type rerank \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 5c3aa46d7b..1f60457e84 100644 --- a/setup.cfg +++ b/setup.cfg @@ -93,7 +93,7 @@ all = protobuf einops tiktoken - sentence-transformers>=2.3.1 + sentence-transformers>=2.7.0 vllm>=0.2.6 ; sys_platform=='linux' diffusers controlnet_aux @@ -142,7 +142,7 @@ vllm = sglang = sglang[all] embedding = - sentence-transformers>=2.3.1 + sentence-transformers>=2.7.0 rerank = FlagEmbedding image = diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index 2f7924ebcd..73ffaa0fd8 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -20,6 +20,7 @@ from typing import Dict, List, Optional, Tuple import numpy as np +import torch from ...constants import XINFERENCE_CACHE_DIR from ...device_utils import empty_cache @@ -161,7 +162,10 @@ def load(self): raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") self._model = CrossEncoder( - self._model_path, device=self._device, **self._model_config + self._model_path, + device=self._device, + trust_remote_code=True, + **self._model_config, ) if self._use_fp16: self._model.model.half() @@ -207,7 +211,11 @@ def rerank( raise ValueError("rerank hasn't support `max_chunks_per_doc` parameter.") sentence_combinations = [[query, doc] for doc in documents] if self._model_spec.type == "normal": - similarity_scores = self._model.predict(sentence_combinations) + similarity_scores = self._model.predict( + sentence_combinations, convert_to_numpy=False, convert_to_tensor=True + ).cpu() + if similarity_scores.dtype == torch.bfloat16: + similarity_scores = similarity_scores.float() else: similarity_scores = self._model.compute_score(sentence_combinations) sim_scores_argsort = list(reversed(np.argsort(similarity_scores))) diff --git a/xinference/model/rerank/model_spec.json b/xinference/model/rerank/model_spec.json index 4ae7e3b1d4..e537a3d6d6 100644 --- a/xinference/model/rerank/model_spec.json +++ b/xinference/model/rerank/model_spec.json @@ -40,5 +40,12 @@ "language": ["en", "zh", "multilingual"], "model_id": "BAAI/bge-reranker-v2-minicpm-layerwise", "model_revision": "47b5332b296c4d8cb6ee2c60502cc62a0d708881" + }, + { + "model_name": "jina-reranker-v2", + "type": "normal", + "language": ["en", "zh", "multilingual"], + "model_id": "jinaai/jina-reranker-v2-base-multilingual", + "model_revision": "298e48cada4a9318650d7fbd795f63827f884087" } ] From cb5d1652e01cf82955651adcfcdd681fdc63ab40 Mon Sep 17 00:00:00 2001 From: Hannah Qiu <zihann.xyz@gmail.com> Date: Fri, 28 Jun 2024 11:56:43 +0800 Subject: [PATCH 165/298] FEAT: `tensorizer` integration (#1579) Co-authored-by: Zihann <marionqzh@gmail.com> Co-authored-by: ChengjieLi <chengjieli23@outlook.com> --- .github/workflows/python.yaml | 1 + setup.cfg | 2 + xinference/constants.py | 1 + xinference/core/supervisor.py | 23 +- xinference/core/worker.py | 8 + xinference/deploy/docker/cpu.Dockerfile | 2 + xinference/model/llm/pytorch/chatglm.py | 5 + xinference/model/llm/pytorch/cogvlm2.py | 5 + xinference/model/llm/pytorch/core.py | 74 +++- xinference/model/llm/pytorch/glm4v.py | 5 + xinference/model/llm/pytorch/intern_vl.py | 10 + xinference/model/llm/pytorch/internlm2.py | 5 + xinference/model/llm/pytorch/minicpmv25.py | 21 +- xinference/model/llm/pytorch/omnilmm.py | 1 - xinference/model/llm/pytorch/qwen_vl.py | 9 + .../model/llm/pytorch/tensorizer_utils.py | 342 ++++++++++++++++++ .../llm/pytorch/tests/test_tensorizer.py | 116 ++++++ xinference/types.py | 1 + 18 files changed, 620 insertions(+), 11 deletions(-) create mode 100644 xinference/model/llm/pytorch/tensorizer_utils.py create mode 100644 xinference/model/llm/pytorch/tests/test_tensorizer.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 8dd2ef18df..8b6c8d2f4b 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -128,6 +128,7 @@ jobs: pip install "tenacity>=8.2.0,<8.4.0" pip install -e ".[dev]" pip install "jinja2==3.1.2" + pip install tensorizer working-directory: . - name: Test with pytest diff --git a/setup.cfg b/setup.cfg index 1f60457e84..a2ef1422ad 100644 --- a/setup.cfg +++ b/setup.cfg @@ -114,6 +114,8 @@ all = WeTextProcessing # For ChatTTS librosa # For ChatTTS xxhash # For ChatTTS + boto3>=1.28.55,<1.28.65 # For tensorizer + tensorizer~=2.9.0 intel = torch==2.1.0a0 intel_extension_for_pytorch==2.1.10+xpu diff --git a/xinference/constants.py b/xinference/constants.py index 3fc23d2629..9fa5939603 100644 --- a/xinference/constants.py +++ b/xinference/constants.py @@ -45,6 +45,7 @@ def get_xinference_home() -> str: XINFERENCE_HOME = get_xinference_home() XINFERENCE_CACHE_DIR = os.path.join(XINFERENCE_HOME, "cache") +XINFERENCE_TENSORIZER_DIR = os.path.join(XINFERENCE_HOME, "tensorizer") XINFERENCE_MODEL_DIR = os.path.join(XINFERENCE_HOME, "model") XINFERENCE_LOG_DIR = os.path.join(XINFERENCE_HOME, "logs") XINFERENCE_IMAGE_DIR = os.path.join(XINFERENCE_HOME, "image") diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 4132cb73e0..b905a3ba76 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -756,13 +756,34 @@ async def launch_builtin_model( f"xinference will ignore this option." ) + if kwargs.get("enable_tensorizer", None) and ( + ( + model_engine is None + or model_engine.lower() != "transformers" + or model_format != "pytorch" + or quantization != "none" + or model_type != "LLM" + ) + ): + raise ValueError( + "Tensorizer can only be enabled for LLM models with Transformers engine, PyTorch format, and none quantization." + ) + + if kwargs.get("enable_tensorizer", None) and model_name in [ + "OmniLMM", + "yi-vl-chat", + "deepseek-vl-chat", + ]: + raise ValueError("Tensorizer is not supported for %s." % model_name) + if model_uid is None: model_uid = self._gen_model_uid(model_name) model_size = str(model_size_in_billions) if model_size_in_billions else "" logger.debug( f"Enter launch_builtin_model, model_uid: {model_uid}, model_name: {model_name}, model_size: {model_size}, " - f"model_format: {model_format}, quantization: {quantization}, replica: {replica}" + f"model_format: {model_format}, quantization: {quantization}, replica: {replica}, " + f"kwargs: {kwargs}" ) async def _launch_one_model(_replica_model_uid): diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 4f79393685..14e9909f8c 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -833,6 +833,14 @@ async def list_deletable_models(self, model_version: str) -> List[str]: if paths: paths.update([os.path.realpath(path) for path in paths]) + # get tensorizer path + from ..model.llm.pytorch.tensorizer_utils import get_tensorizer_dir + + tensorizer_path = get_tensorizer_dir(path) + if os.path.isdir(tensorizer_path): + files = os.listdir(tensorizer_path) + paths.update([os.path.join(tensorizer_path, file) for file in files]) + return list(paths) async def confirm_and_remove_model(self, model_version: str) -> bool: diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index ea29397264..c9b154747c 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -36,6 +36,8 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ typing_extensions \ "fsspec==2023.10.0" \ "s3fs==2023.10.0" \ + "boto3>=1.28.55,<1.28.65" \ + "tensorizer~=2.9.0" \ "modelscope>=1.10.0" \ "sse_starlette>=1.6.5" \ "openai>1" \ diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index a0cf708ab5..1e72c2b07b 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -53,6 +53,11 @@ def __init__( peft_model=peft_model, ) + def _get_model_class(self): + from transformers import AutoModel + + return AutoModel + def _load_model(self, **kwargs): try: from transformers import AutoModel, AutoTokenizer diff --git a/xinference/model/llm/pytorch/cogvlm2.py b/xinference/model/llm/pytorch/cogvlm2.py index 6d696ae60f..971d3818cb 100644 --- a/xinference/model/llm/pytorch/cogvlm2.py +++ b/xinference/model/llm/pytorch/cogvlm2.py @@ -71,6 +71,10 @@ def load(self, **kwargs): else torch.float16 ) + if self._check_tensorizer_integrity(): + self._model, self._tokenizer = self._load_tensorizer() + return + self._tokenizer = AutoTokenizer.from_pretrained( self.model_path, trust_remote_code=True, @@ -89,6 +93,7 @@ def load(self, **kwargs): self.model_path, trust_remote_code=True, ) + self._save_tensorizer() def _message_content_to_cogvlm2(self, content): def _load_image(_url): diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 6f32dcca1f..92f278f180 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -108,6 +108,7 @@ def _sanitize_model_config( pytorch_model_config.setdefault("device", "auto") pytorch_model_config.setdefault("trust_remote_code", True) pytorch_model_config.setdefault("max_num_seqs", 16) + pytorch_model_config.setdefault("enable_tensorizer", False) return pytorch_model_config def _sanitize_generate_config( @@ -124,6 +125,63 @@ def _sanitize_generate_config( generate_config["model"] = self.model_uid return generate_config + def _check_tensorizer_integrity(self): + if not self._pytorch_model_config.get("enable_tensorizer"): + return False + + from .tensorizer_utils import check_tensorizer_integrity + + integrity = check_tensorizer_integrity( + self.model_path, + [component[0] for component in self._get_components()], + ) + logger.info(f"Tensorizer files integrity: {integrity} {self.model_uid}") + return integrity + + def _load_tensorizer(self, **kwargs): + enable_tensorizer = self._pytorch_model_config.get("enable_tensorizer", None) + if enable_tensorizer: + from .tensorizer_utils import load_from_tensorizer + + component_metadata = [ + (name, type, kwargs) + for name, _, type, kwargs in self._get_components(**kwargs) + ] + model, tokenizer = load_from_tensorizer( + self.model_path, component_metadata, self._get_model_class(), **kwargs + ) + return model, tokenizer + + def _save_tensorizer(self, **kwargs): + enable_tensorizer = self._pytorch_model_config.get("enable_tensorizer", None) + if enable_tensorizer: + from .tensorizer_utils import save_to_tensorizer + + components = [(name, obj) for name, obj, _, _ in self._get_components()] + save_to_tensorizer(self.model_path, self._model, components, **kwargs) + + def _get_model_class(self): + from transformers import AutoModelForCausalLM + + return AutoModelForCausalLM + + def _get_components(self, **kwargs): + from transformers import AutoTokenizer + + return [ + ( + "tokenizer", + getattr(self, "_tokenizer", None), + AutoTokenizer, + { + "use_fast": self._use_fast_tokenizer, + "trust_remote_code": kwargs.get("trust_remote_code", True), + "revision": kwargs.get("revision"), + "code_revision": kwargs.get("code_revision", None), + }, + ) + ] + def _load_model(self, **kwargs): try: from transformers import AutoModelForCausalLM, AutoTokenizer @@ -133,7 +191,6 @@ def _load_model(self, **kwargs): "Please make sure 'transformers' is installed. ", "You can install it by `pip install transformers`\n", ] - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") tokenizer = AutoTokenizer.from_pretrained( @@ -147,6 +204,7 @@ def _load_model(self, **kwargs): low_cpu_mem_usage=True, **kwargs, ) + return model, tokenizer def _apply_lora(self): @@ -246,7 +304,10 @@ def load(self): f"Only 8-bit quantization is supported if it is not linux system or cuda device" ) else: - self._model, self._tokenizer = load_compress_model( + ( + self._model, + self._tokenizer, + ) = load_compress_model( model_path=self.model_path, device=self._device, torch_dtype=kwargs["torch_dtype"], @@ -260,11 +321,16 @@ def load(self): kwargs.update({"device_map": "auto"}) is_device_map_auto = True - self._model, self._tokenizer = self._load_model(**kwargs) - self._apply_lora() + if self._check_tensorizer_integrity(): + self._model, self._tokenizer = self._load_tensorizer(**kwargs) + else: + self._model, self._tokenizer = self._load_model(**kwargs) if not is_device_map_auto: self._model.to(self._device) + + self._save_tensorizer(**kwargs) + logger.debug(f"Model Memory: {self._model.get_memory_footprint()}") @classmethod diff --git a/xinference/model/llm/pytorch/glm4v.py b/xinference/model/llm/pytorch/glm4v.py index fa7878faf9..627463b97c 100644 --- a/xinference/model/llm/pytorch/glm4v.py +++ b/xinference/model/llm/pytorch/glm4v.py @@ -84,6 +84,10 @@ def load(self): f"Only 8-bit quantization is supported if it is not linux system or cuda device" ) + if self._check_tensorizer_integrity(): + self._model, self._tokenizer = self._load_tensorizer() + return + model = AutoModelForCausalLM.from_pretrained( self.model_path, low_cpu_mem_usage=True, @@ -97,6 +101,7 @@ def load(self): self.model_path, trust_remote_code=True ) self._tokenizer = tokenizer + self._save_tensorizer() def _message_content_to_chat(self, content): def _load_image(_url): diff --git a/xinference/model/llm/pytorch/intern_vl.py b/xinference/model/llm/pytorch/intern_vl.py index be6e1c35bb..d9155f3b4b 100644 --- a/xinference/model/llm/pytorch/intern_vl.py +++ b/xinference/model/llm/pytorch/intern_vl.py @@ -56,10 +56,19 @@ def match( return True return False + def _get_model_class(self): + from transformers import AutoModel + + return AutoModel + def load(self, **kwargs): from transformers import AutoModel, AutoTokenizer from transformers.generation import GenerationConfig + if self._check_tensorizer_integrity(): + self._model, self._tokenizer = self._load_tensorizer() + return + device = self._pytorch_model_config.get("device", "auto") device = select_device(device) # for multiple GPU, set back to auto to make multiple devices work @@ -92,6 +101,7 @@ def load(self, **kwargs): self.model_path, trust_remote_code=True, ) + self._save_tensorizer() def _message_content_to_intern(self, content): def _load_image(_url): diff --git a/xinference/model/llm/pytorch/internlm2.py b/xinference/model/llm/pytorch/internlm2.py index fa81a98a49..6d3b8d0c89 100644 --- a/xinference/model/llm/pytorch/internlm2.py +++ b/xinference/model/llm/pytorch/internlm2.py @@ -52,6 +52,11 @@ def __init__( peft_model=peft_model, ) + def _get_model_class(self): + from transformers import AutoModel + + return AutoModel + def _load_model(self, **kwargs): try: from transformers import AutoModel, AutoTokenizer diff --git a/xinference/model/llm/pytorch/minicpmv25.py b/xinference/model/llm/pytorch/minicpmv25.py index d0b9c47f9c..5ef32b93a0 100644 --- a/xinference/model/llm/pytorch/minicpmv25.py +++ b/xinference/model/llm/pytorch/minicpmv25.py @@ -56,6 +56,11 @@ def match( return True return False + def _get_model_class(self): + from transformers import AutoModel + + return AutoModel + def load(self, **kwargs): from transformers import AutoModel, AutoTokenizer from transformers.generation import GenerationConfig @@ -64,12 +69,17 @@ def load(self, **kwargs): self._device = select_device(device) self._device = "auto" if self._device == "cuda" else self._device + if "int4" in self.model_path and device == "mps": + logger.error( + "Error: running int4 model with bitsandbytes on Mac is not supported right now." + ) + exit() + + if self._check_tensorizer_integrity(): + self._model, self._tokenizer = self._load_tensorizer() + return + if "int4" in self.model_path: - if device == "mps": - print( - "Error: running int4 model with bitsandbytes on Mac is not supported right now." - ) - exit() model = AutoModel.from_pretrained(self.model_path, trust_remote_code=True) else: model = AutoModel.from_pretrained( @@ -89,6 +99,7 @@ def load(self, **kwargs): self.model_path, trust_remote_code=True, ) + self._save_tensorizer() def _message_content_to_chat(self, content): def _load_image(_url): diff --git a/xinference/model/llm/pytorch/omnilmm.py b/xinference/model/llm/pytorch/omnilmm.py index 64907fc2e1..a8e569b5dc 100644 --- a/xinference/model/llm/pytorch/omnilmm.py +++ b/xinference/model/llm/pytorch/omnilmm.py @@ -51,7 +51,6 @@ def match( def load(self): device = self._pytorch_model_config.get("device", "auto") device = select_device(device) - self._model = OmniLMMChat(self.model_path, device_map=device) def _message_content_to_OmniLMM( diff --git a/xinference/model/llm/pytorch/qwen_vl.py b/xinference/model/llm/pytorch/qwen_vl.py index cc9b954715..6301548ec8 100644 --- a/xinference/model/llm/pytorch/qwen_vl.py +++ b/xinference/model/llm/pytorch/qwen_vl.py @@ -53,6 +53,13 @@ def load(self): from transformers import AutoModelForCausalLM, AutoTokenizer from transformers.generation import GenerationConfig + if self._check_tensorizer_integrity(): + self._model, self._tokenizer = self._load_tensorizer( + code_revision=self.model_spec.model_revision + ) + self._apply_lora() + return + device = self._pytorch_model_config.get("device", "auto") device = select_device(device) # for multiple GPU, set back to auto to make multiple devices work @@ -69,6 +76,7 @@ def load(self): trust_remote_code=True, code_revision=self.model_spec.model_revision, ).eval() + # Specify hyperparameters for generation self._model.generation_config = GenerationConfig.from_pretrained( self.model_path, @@ -76,6 +84,7 @@ def load(self): code_revision=self.model_spec.model_revision, ) self._apply_lora() + self._save_tensorizer(code_revision=self.model_spec.model_revision) def _message_content_to_qwen(self, content) -> str: def _ensure_url(_url): diff --git a/xinference/model/llm/pytorch/tensorizer_utils.py b/xinference/model/llm/pytorch/tensorizer_utils.py new file mode 100644 index 0000000000..a3c322db7c --- /dev/null +++ b/xinference/model/llm/pytorch/tensorizer_utils.py @@ -0,0 +1,342 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import io +import logging +import os +import tempfile +import zipfile +from functools import partial +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple + +from ....constants import XINFERENCE_TENSORIZER_DIR +from ....device_utils import get_available_device + +logger = logging.getLogger(__name__) + +__all__ = [ + "get_tensorizer_dir", + "check_tensorizer_integrity", + "load_from_tensorizer", + "save_to_tensorizer", + "_load_pretrained_from_tensorizer", + "_load_model_from_tensorizer", + "_tensorizer_serialize_model", + "_tensorizer_serialize_pretrained", + "_file_is_non_empty", +] + + +def _filter_kwargs(kwargs): + kwargs["trust_remote_code"] = kwargs.get("trust_remote_code", True) + return { + k: v for k, v in kwargs.items() if k in ["code_revision", "trust_remote_code"] + } + + +def _file_is_non_empty( + path: str, +) -> bool: + try: + return os.stat(path).st_size > 0 + except FileNotFoundError: + return False + + +def get_tensorizer_dir(model_path: str) -> str: + model_dir = os.path.basename(model_path.rstrip("/")) + return f"{XINFERENCE_TENSORIZER_DIR}/{model_dir}" + + +def check_tensorizer_integrity( + model_path: str, + components: Optional[List[str]] = None, + model_prefix: Optional[str] = "model", +) -> bool: + tensorizer_dir = get_tensorizer_dir(model_path) + dir = tensorizer_dir.rstrip("/") + tensors_uri: str = f"{dir}/{model_prefix}.tensors" + # iterate over components and get their paths + paths = [tensors_uri] + if components is not None: + for component in components: + component_uri: str = f"{tensorizer_dir.rstrip('/')}/{component}.zip" + paths.append(component_uri) + return all(_file_is_non_empty(path) for path in paths) + + +def load_from_tensorizer( + model_path: str, + components: Optional[List[Tuple[str, Any, Dict[str, Any]]]] = None, + model_class: Any = None, + config_class: Any = None, + model_prefix: Optional[str] = "model", + **kwargs, +): + kwargs = _filter_kwargs(kwargs) + try: + from transformers import AutoConfig, AutoModel + except ImportError: + error_message = "Failed to import module 'transformers'" + installation_guide = [ + "Please make sure 'transformers' is installed. ", + "You can install it by `pip install transformers`\n", + ] + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + model_class = model_class or AutoModel + config_class = config_class or AutoConfig + + tensorizer_dir = get_tensorizer_dir(model_path) + logger.debug(f"Loading from tensorizer: {tensorizer_dir}") + + device = get_available_device() + tensorizer_model = ( + _load_model_from_tensorizer( + model_path, + tensorizer_dir, + model_class, + config_class, + model_prefix, + device, + **kwargs, + ) + .to(device) + .eval() + ) + + tensorizer_components = [] + + if components is not None: + for component, component_class, kwargs in components: + deserialized_component = _load_pretrained_from_tensorizer( + component_class, tensorizer_dir, component, **kwargs + ) + tensorizer_components.append(deserialized_component) + + return tensorizer_model, *tensorizer_components + + +def _load_pretrained_from_tensorizer( + component_class: Any, + tensorizer_dir: str, + prefix: str, + **kwargs, +): + logger.debug(f"Loading components from tensorizer: {component_class} {kwargs}") + + try: + from tensorizer import stream_io + except ImportError: + error_message = "Failed to import module 'tensorizer'" + installation_guide = [ + "Please make sure 'tensorizer' is installed.\n", + ] + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + _read_stream = partial(stream_io.open_stream, mode="rb") + + logger.debug(f"Loading pretrained from tensorizer: {tensorizer_dir}") + load_path: str = f"{tensorizer_dir.rstrip('/')}/{prefix}.zip" + logger.info(f"Loading {load_path}") + with io.BytesIO() as downloaded: + # Download to a BytesIO object first, because ZipFile doesn't play nice + # with streams that don't fully support random access + with _read_stream(load_path) as stream: + downloaded.write(stream.read()) + downloaded.seek(0) + with zipfile.ZipFile( + downloaded, mode="r" + ) as file, tempfile.TemporaryDirectory() as directory: + file.extractall(path=directory) + return component_class.from_pretrained( + directory, cache_dir=None, local_files_only=True, **kwargs + ) + + +def _load_model_from_tensorizer( + model_path: str, + tensorizer_dir: str, + model_class, + config_class, + model_prefix: Optional[str] = "model", + device=None, + dtype=None, + **kwargs, +): + logger.debug(f"Loading model from tensorizer: {tensorizer_dir} {kwargs}") + + # assert device is not None + if device is None: + raise ValueError("device must be specified") + + import time + + try: + import torch + except ImportError: + error_message = "Failed to import module 'torch'" + installation_guide = [ + "Please make sure 'torch' is installed.\n", + ] + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + try: + from transformers import PretrainedConfig + except ImportError: + error_message = "Failed to import module 'transformers'" + installation_guide = [ + "Please make sure 'transformers' is installed. ", + "You can install it by `pip install transformers`\n", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + try: + from tensorizer import TensorDeserializer, stream_io, utils + except ImportError: + error_message = "Failed to import module 'tensorizer'" + installation_guide = [ + "Please make sure 'tensorizer' is installed.\n", + ] + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + if model_prefix is None: + model_prefix = "model" + + dir: str = tensorizer_dir.rstrip("/") + tensors_uri: str = f"{dir}/{model_prefix}.tensors" + + _read_stream = partial(stream_io.open_stream, mode="rb") + + if config_class is None: + config_loader = model_class.load_config + else: + config_loader = config_class.from_pretrained + try: + config, _ = config_loader(model_path, return_unused_kwargs=True, **kwargs) + if isinstance(config, PretrainedConfig): + config.gradient_checkpointing = True + except ValueError: + config = config_loader(model_path, **kwargs) + + with utils.no_init_or_tensor(): + model_loader = getattr(model_class, "from_config", model_class) + model = model_loader(config, **kwargs) + + is_cuda: bool = torch.device(device).type == "cuda" + ram_usage = utils.get_mem_usage() + logger.info(f"Loading {tensors_uri}, {ram_usage}") + begin_load = time.perf_counter() + + with _read_stream(tensors_uri) as tensor_stream, TensorDeserializer( + tensor_stream, device=device, dtype=dtype, plaid_mode=is_cuda + ) as tensor_deserializer: + tensor_deserializer.load_into_module(model) + tensor_load_s = time.perf_counter() - begin_load + bytes_read: int = tensor_deserializer.total_bytes_read + + rate_str = utils.convert_bytes(bytes_read / tensor_load_s) + tensors_sz = utils.convert_bytes(bytes_read) + logger.info( + f"Model tensors loaded in {tensor_load_s:0.2f}s, read " + f"{tensors_sz} @ {rate_str}/s, {utils.get_mem_usage()}" + ) + + return model + + +def save_to_tensorizer( + model_path: str, + model, + components: Optional[List[Tuple[str, Any]]] = None, + model_prefix: Optional[str] = "model", + force: Optional[bool] = False, + **kwargs, +): + kwargs = _filter_kwargs(kwargs) + _tensorizer_serialize_model(model_path, model, model_prefix, force, **kwargs) + + if components is not None: + for component_prefix, component in components: + _tensorizer_serialize_pretrained(model_path, component, component_prefix) + + +def _tensorizer_serialize_model( + model_path: str, + model, + model_prefix: Optional[str] = "model", + force: Optional[bool] = False, + **kwargs, +): + try: + from tensorizer import TensorSerializer, stream_io + except ImportError: + error_message = "Failed to import module 'tensorizer'" + installation_guide = [ + "Please make sure 'tensorizer' is installed.\n", + ] + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + tensorizer_dir = get_tensorizer_dir(model_path) + tensor_path: str = f"{tensorizer_dir}/{model_prefix}.tensors" + + _write_stream = partial(stream_io.open_stream, mode="wb+") + + if os.path.exists(tensor_path): + logger.info(f"Cache {tensor_path} exists, skip tensorizer serialize model") + return + + logger.info(f"Writing tensors to {tensor_path}") + with _write_stream(tensor_path) as f: + serializer = TensorSerializer(f) + serializer.write_module(model, include_non_persistent_buffers=False) + serializer.close() + + logger.info(f"Tensorizer serialize model done: {tensor_path}") + + +def _tensorizer_serialize_pretrained( + model_path: str, component, prefix: str = "pretrained" +): + try: + from tensorizer import stream_io + except ImportError: + error_message = "Failed to import module 'tensorizer'" + installation_guide = [ + "Please make sure 'tensorizer' is installed.\n", + ] + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + tensorizer_dir = get_tensorizer_dir(model_path) + save_path: str = f"{tensorizer_dir.rstrip('/')}/{prefix}.zip" + + if os.path.exists(save_path): + logger.info(f"Cache {save_path} exists, skip tensorizer serialize pretrained") + return + + logger.info(f"Writing component to {save_path}") + _write_stream = partial(stream_io.open_stream, mode="wb+") + + with _write_stream(save_path) as stream, zipfile.ZipFile( + stream, mode="w", compression=zipfile.ZIP_DEFLATED, compresslevel=5 + ) as file, tempfile.TemporaryDirectory() as directory: + if hasattr(component, "save_pretrained"): + component.save_pretrained(directory) + else: + logger.warning("The component does not have a 'save_pretrained' method.") + for path in Path(directory).iterdir(): + file.write(filename=path, arcname=path.name) + + logger.info(f"Tensorizer serialize pretrained done: {save_path}") diff --git a/xinference/model/llm/pytorch/tests/test_tensorizer.py b/xinference/model/llm/pytorch/tests/test_tensorizer.py new file mode 100644 index 0000000000..1b440708e2 --- /dev/null +++ b/xinference/model/llm/pytorch/tests/test_tensorizer.py @@ -0,0 +1,116 @@ +import os +import shutil +from unittest.mock import MagicMock, patch + +import pytest +from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer + +from .....constants import XINFERENCE_CACHE_DIR +from ...llm_family import LLMFamilyV1, PytorchLLMSpecV1, cache +from ..tensorizer_utils import ( + _tensorizer_serialize_model, + get_tensorizer_dir, + save_to_tensorizer, +) + + +# case1: test if tensorizer_serialize_model and .tensor file exists in the correct path +class TestTensorizerSerializeModel: + @pytest.fixture(autouse=True) + def setup_and_teardown(self): + # Setup: Load the model and tokenizer + model_full_name = "qwen1.5-chat-pytorch-0_5b" + self.model_path = f"{XINFERENCE_CACHE_DIR}/{model_full_name}" + self.tensorizer_dir = get_tensorizer_dir(self.model_path) + spec = PytorchLLMSpecV1( + model_format="pytorch", + model_size_in_billions="0_5", + quantizations=["4-bit", "8-bit", "none"], + model_id="Qwen/Qwen1.5-0.5B-Chat", + model_revision=None, + ) + family = LLMFamilyV1( + version=1, + context_length=32768, + model_type="LLM", + model_name="qwen1.5-chat", + model_lang=["en", "zh"], + model_ability=["chat", "tools"], + model_specs=[spec], + prompt_style=None, + ) + + if not os.path.exists(self.model_path): + cache(llm_family=family, llm_spec=spec, quantization=None) + + self.model_config = AutoConfig.from_pretrained(self.model_path) + self.tokenizer = AutoTokenizer.from_pretrained(self.model_path, use_fast=True) + self.model = AutoModelForCausalLM.from_pretrained( + self.model_path, + low_cpu_mem_usage=True, + ) + self.model_prefix = "model" + self.force = True + yield + + # Cleanup: Remove the entire directories after the test + self._cleanup_directory(self.tensorizer_dir) + + def _cleanup_directory(self, directory): + if os.path.exists(directory): + shutil.rmtree(directory) + + # Test if model.tensor & tokenizer.zip files generated + def test_tensor_file_exists(self): + expected_tensor_file = f"{self.tensorizer_dir}/{self.model_prefix}.tensors" + expected_tokenizer_file = f"{self.tensorizer_dir}/tokenizer.zip" + + if os.path.exists(expected_tensor_file): + os.remove(expected_tensor_file) + + if os.path.exists(expected_tokenizer_file): + os.remove(expected_tokenizer_file) + + save_to_tensorizer( + self.model_path, + self.model, + [("tokenizer", self.tokenizer)], + ) + + assert os.path.exists( + expected_tensor_file + ), f"{expected_tensor_file} does not exist" + + assert os.path.exists( + expected_tokenizer_file + ), f"{expected_tokenizer_file} does not exist" + + +@pytest.fixture +def mock_environment(tmp_path): + model_path = str(tmp_path / "model") + tensorizer_dir = str(tmp_path / "tensorizer") + os.makedirs(tensorizer_dir, exist_ok=True) + tensor_path = f"{tensorizer_dir}/model.tensors" + # Create a dummy cache file to simulate cache existence + with open(tensor_path, "w") as f: + f.write("dummy content") + return model_path, tensorizer_dir, tensor_path + + +@patch("xinference.model.llm.pytorch.tensorizer_utils.get_tensorizer_dir") +@patch("xinference.model.llm.pytorch.tensorizer_utils.logger") +def test_tensorizer_serialize_model_cache_exists( + mock_logger, mock_get_tensorizer_dir, mock_environment +): + model_path, tensorizer_dir, tensor_path = mock_environment + mock_get_tensorizer_dir.return_value = tensorizer_dir + model = MagicMock() + + # Call the function with the mocked environment + _tensorizer_serialize_model(model_path, model) + + # Check if the logger.info was called with the expected message, indicating early return due to cache existence + mock_logger.info.assert_called_with( + f"Cache {tensor_path} exists, skip tensorizer serialize model" + ) diff --git a/xinference/types.py b/xinference/types.py index 3ea098c60e..616599159b 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -327,6 +327,7 @@ class PytorchModelConfig(TypedDict, total=False): gptq_act_order: bool trust_remote_code: bool max_num_seqs: int + enable_tensorizer: Optional[bool] def get_pydantic_model_from_method( From 2a64f4b0b65a94cee9958674dfba677f6ccb3e00 Mon Sep 17 00:00:00 2001 From: rickywu <rickywu1113@gmail.com> Date: Fri, 28 Jun 2024 12:22:59 +0800 Subject: [PATCH 166/298] CHORE: upgrade version fix security vulnerability (#1674) --- xinference/web/ui/package-lock.json | 585 +++++++++++----------------- 1 file changed, 230 insertions(+), 355 deletions(-) diff --git a/xinference/web/ui/package-lock.json b/xinference/web/ui/package-lock.json index ba47a1b09e..983c68dd2a 100644 --- a/xinference/web/ui/package-lock.json +++ b/xinference/web/ui/package-lock.json @@ -60,9 +60,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -88,11 +88,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -177,13 +178,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -308,31 +309,34 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -452,28 +456,28 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } @@ -513,22 +517,23 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -2021,32 +2026,32 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -2054,12 +2059,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3019,7 +3024,7 @@ "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", + "glob": "^9.0.1", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", @@ -3357,13 +3362,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -3378,9 +3383,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -3400,19 +3405,14 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -6706,20 +6706,20 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", + "content-type": "~1.0.5", + "debug": "^4.0.1", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -6736,14 +6736,6 @@ "node": ">= 0.8" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6755,11 +6747,6 @@ "node": ">=0.10.0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/bonjour-service": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", @@ -6786,11 +6773,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -7199,7 +7186,7 @@ "accepts": "~1.3.5", "bytes": "3.0.0", "compressible": "~2.0.16", - "debug": "2.6.9", + "debug": "^4.0.1", "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" @@ -7208,19 +7195,6 @@ "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -7788,14 +7762,9 @@ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", "dependencies": { - "d3-color": "1 - 2" + "d3-color": "1 - 3" } }, - "node_modules/d3-interpolate/node_modules/d3-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", - "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" - }, "node_modules/d3-path": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", @@ -7818,15 +7787,10 @@ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", "dependencies": { - "d3-color": "1 - 2", + "d3-color": "1 - 3", "d3-interpolate": "1 - 2" } }, - "node_modules/d3-scale-chromatic/node_modules/d3-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", - "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" - }, "node_modules/d3-scale/node_modules/d3-array": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", @@ -8059,7 +8023,7 @@ "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "dependencies": { "address": "^1.0.1", - "debug": "^2.6.0" + "debug": "^4.0.1" }, "bin": { "detect": "bin/detect-port", @@ -8069,19 +8033,6 @@ "node": ">= 4.2.1" } }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -8263,9 +8214,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { "jake": "^10.8.5" }, @@ -9315,18 +9266,18 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", - "debug": "2.6.9", + "debug": "^4.0.1", "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -9360,19 +9311,14 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -9507,9 +9453,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9522,7 +9468,7 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { - "debug": "2.6.9", + "debug": "^4.0.1", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", @@ -9534,19 +9480,6 @@ "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -9601,9 +9534,9 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -9639,7 +9572,7 @@ "cosmiconfig": "^6.0.0", "deepmerge": "^4.2.2", "fs-extra": "^9.0.0", - "glob": "^7.1.6", + "glob": "^9.0.1", "memfs": "^3.1.2", "minimatch": "^3.0.4", "schema-utils": "2.7.0", @@ -9999,19 +9932,17 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dependencies": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10033,6 +9964,28 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -10616,15 +10569,6 @@ "node": ">=8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -11521,7 +11465,7 @@ "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", - "glob": "^7.1.1", + "glob": "^9.0.1", "graceful-fs": "^4.2.9", "jest-circus": "^27.5.1", "jest-environment-jsdom": "^27.5.1", @@ -12357,7 +12301,7 @@ "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", - "glob": "^7.1.3", + "glob": "^9.0.1", "graceful-fs": "^4.2.9", "jest-haste-map": "^27.5.1", "jest-message-util": "^27.5.1", @@ -13585,11 +13529,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -13733,6 +13677,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -13772,9 +13724,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -14066,14 +14018,6 @@ "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -14235,14 +14179,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -14256,6 +14192,37 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -14433,9 +14400,9 @@ } }, "node_modules/postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -14451,9 +14418,9 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -15845,9 +15812,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -16750,7 +16717,7 @@ "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", "loader-utils": "^2.0.0", - "postcss": "^7.0.35", + "postcss": "^8.0.1", "source-map": "0.6.1" }, "engines": { @@ -16769,27 +16736,6 @@ } } }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16828,7 +16774,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "glob": "^7.1.3" + "glob": "^9.0.1" }, "bin": { "rimraf": "bin.js" @@ -16859,7 +16805,7 @@ "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", + "serialize-javascript": "^6.0.0", "terser": "^5.0.0" }, "peerDependencies": { @@ -16887,14 +16833,6 @@ "node": ">= 10.13.0" } }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/rollup-plugin-terser/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17121,7 +17059,7 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { - "debug": "2.6.9", + "debug": "^4.0.1", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", @@ -17139,18 +17077,11 @@ "node": ">= 0.8.0" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "extraneous": true }, "node_modules/send/node_modules/ms": { "version": "2.1.3", @@ -17158,9 +17089,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dependencies": { "randombytes": "^2.1.0" } @@ -17172,7 +17103,7 @@ "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", - "debug": "2.6.9", + "debug": "^4.0.1", "escape-html": "~1.0.3", "http-errors": "~1.6.2", "mime-types": "~2.1.17", @@ -17182,14 +17113,6 @@ "node": ">= 0.8.0" } }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -17217,11 +17140,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -17417,9 +17335,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -17764,7 +17682,7 @@ "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^9.0.1", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", @@ -17786,25 +17704,6 @@ "node": ">= 6" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -17896,20 +17795,9 @@ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", + "css-what": "^6.0.1", "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "nth-check": "^2.0.1" } }, "node_modules/svgo/node_modules/dom-serializer": { @@ -17935,14 +17823,6 @@ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -18139,7 +18019,7 @@ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", + "glob": "^9.0.1", "minimatch": "^3.0.4" }, "engines": { @@ -18773,9 +18653,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -19196,7 +19076,7 @@ "common-tags": "^1.8.0", "fast-json-stable-stringify": "^2.1.0", "fs-extra": "^9.0.1", - "glob": "^7.1.6", + "glob": "^9.0.1", "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", "rollup": "^2.43.1", @@ -19503,11 +19383,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", From 8feac9402c576a88c2e0a3c44ab63701e04d9dbf Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 28 Jun 2024 14:45:52 +0800 Subject: [PATCH 167/298] BUG: Cluster info can be accessed without authorization in the auth mode (#1731) Co-authored-by: yiboyasss <3359595624@qq.com> --- xinference/api/restful_api.py | 27 +++++++++-- xinference/conftest.py | 6 +-- xinference/core/tests/test_restful_api.py | 18 -------- .../ui/src/scenes/cluster_info/nodeInfo.js | 45 ++++++++++++++----- .../web/ui/src/scenes/launch_model/index.js | 3 +- 5 files changed, 62 insertions(+), 37 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index d4e2cb8082..1bbf45260c 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -247,13 +247,34 @@ def serve(self, logging_conf: Optional[dict] = None): methods=["GET"], ) self._router.add_api_route( - "/v1/cluster/info", self.get_cluster_device_info, methods=["GET"] + "/v1/cluster/info", + self.get_cluster_device_info, + methods=["GET"], + dependencies=( + [Security(self._auth_service, scopes=["admin"])] + if self.is_authenticated() + else None + ), ) self._router.add_api_route( - "/v1/cluster/version", self.get_cluster_version, methods=["GET"] + "/v1/cluster/version", + self.get_cluster_version, + methods=["GET"], + dependencies=( + [Security(self._auth_service, scopes=["admin"])] + if self.is_authenticated() + else None + ), ) self._router.add_api_route( - "/v1/cluster/devices", self._get_devices_count, methods=["GET"] + "/v1/cluster/devices", + self._get_devices_count, + methods=["GET"], + dependencies=( + [Security(self._auth_service, scopes=["models:list"])] + if self.is_authenticated() + else None + ), ) self._router.add_api_route("/v1/address", self.get_address, methods=["GET"]) diff --git a/xinference/conftest.py b/xinference/conftest.py index 10ec52bc1e..a03572451f 100644 --- a/xinference/conftest.py +++ b/xinference/conftest.py @@ -194,7 +194,7 @@ def setup(): local_cluster_proc = run_test_cluster_in_subprocess( supervisor_addr, TEST_LOGGING_CONF ) - if not cluster_health_check(supervisor_addr, max_attempts=10, sleep_interval=3): + if not cluster_health_check(supervisor_addr, max_attempts=10, sleep_interval=5): raise RuntimeError("Cluster is not available after multiple attempts") port = xo.utils.get_next_port() @@ -226,7 +226,7 @@ def setup_with_file_logging(): local_cluster_proc = run_test_cluster_in_subprocess( supervisor_addr, TEST_FILE_LOGGING_CONF ) - if not cluster_health_check(supervisor_addr, max_attempts=3, sleep_interval=3): + if not cluster_health_check(supervisor_addr, max_attempts=10, sleep_interval=5): raise RuntimeError("Cluster is not available after multiple attempts") port = xo.utils.get_next_port() @@ -258,7 +258,7 @@ def setup_with_auth(): local_cluster_proc = run_test_cluster_in_subprocess( supervisor_addr, TEST_LOGGING_CONF ) - if not cluster_health_check(supervisor_addr, max_attempts=10, sleep_interval=3): + if not cluster_health_check(supervisor_addr, max_attempts=10, sleep_interval=5): raise RuntimeError("Cluster is not available after multiple attempts") user1 = User( diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index 2d51b8885d..e7a09e32ea 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -1255,21 +1255,3 @@ def test_launch_model_by_version(setup): # delete again url = f"{endpoint}/v1/models/test_orca" requests.delete(url) - - -@pytest.mark.skipif(bool(os.environ.get("GITHUB_ACTIONS")), reason="Skip windows") -def test_cluster_info(setup): - endpoint, _ = setup - url = f"{endpoint}/v1/cluster/info" - - response = requests.get(url) - assert response.status_code == 200 - result = response.json() - assert isinstance(result, list) - assert len(result) == 2 - assert result[0]["node_type"] == "Supervisor" - assert result[0]["gpu_count"] == 0 - assert result[0]["gpu_vram_total"] == 0 - assert result[1]["node_type"] == "Worker" - assert result[1]["gpu_count"] == 0 - assert result[1]["gpu_vram_total"] == 0 diff --git a/xinference/web/ui/src/scenes/cluster_info/nodeInfo.js b/xinference/web/ui/src/scenes/cluster_info/nodeInfo.js index 9bd1093caa..a616a6f1eb 100644 --- a/xinference/web/ui/src/scenes/cluster_info/nodeInfo.js +++ b/xinference/web/ui/src/scenes/cluster_info/nodeInfo.js @@ -6,6 +6,7 @@ import Grid from '@mui/material/Unstable_Grid2' import PropTypes from 'prop-types' import React from 'react' +import fetcher from '../../components/fetcher' import { toReadableSize } from '../../components/utils' import { StyledTableCell, StyledTableRow } from './style' @@ -21,26 +22,46 @@ class NodeInfo extends React.Component { } refreshInfo() { - fetch(`${this.endpoint}/v1/cluster/info?detailed=true`, { method: 'GET' }) - .then((res) => res.json()) + fetcher(`${this.endpoint}/v1/cluster/info?detailed=true`, { method: 'GET' }) .then((res) => { - const { state } = this - state['info'] = res - this.setState(state) + if (!res.ok) { + res.json().then((errorData) => { + if (errorData.detail === 'Not enough permissions') { + console.log('Not enough permissions') + // window.history.back(); + } + }) + } + if (res.ok) { + res.json().then((data) => { + const { state } = this + state['info'] = data + this.setState(state) + }) + } + }) + .catch((err) => { + console.error('Error:', err) }) if (JSON.stringify(this.state.version) === '{}') { - fetch(`${this.endpoint}/v1/cluster/version`, { + fetcher(`${this.endpoint}/v1/cluster/version`, { method: 'GET', }) - .then((res) => res.json()) .then((res) => { - const { state } = this - state['version'] = { - release: 'v' + res['version'], - commit: res['full-revisionid'], + if (res.ok) { + res.json().then((data) => { + const { state } = this + state['version'] = { + release: 'v' + data['version'], + commit: data['full-revisionid'], + } + this.setState(state) + }) } - this.setState(state) + }) + .catch((err) => { + console.error('Error:', err) }) } } diff --git a/xinference/web/ui/src/scenes/launch_model/index.js b/xinference/web/ui/src/scenes/launch_model/index.js index 8fa15b74df..a6324a783a 100644 --- a/xinference/web/ui/src/scenes/launch_model/index.js +++ b/xinference/web/ui/src/scenes/launch_model/index.js @@ -6,6 +6,7 @@ import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import ErrorMessageSnackBar from '../../components/errorMessageSnackBar' +import fetcher from '../../components/fetcher' import Title from '../../components/Title' import LaunchCustom from './launchCustom' import LaunchLLM from './launchLLM' @@ -43,7 +44,7 @@ const LaunchModel = () => { } if (gpuAvailable === -1) { - fetch(endPoint + '/v1/cluster/devices', { + fetcher(endPoint + '/v1/cluster/devices', { method: 'GET', headers: { 'Content-Type': 'application/json', From 3d9c261a7d5c4941091d1711cb732ce17b34e7f1 Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Fri, 28 Jun 2024 15:25:07 +0800 Subject: [PATCH 168/298] FEAT: Delete cluster (#1719) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/api/restful_api.py | 67 +++++++++++++++++++++ xinference/client/restful/restful_client.py | 30 +++++++++ xinference/core/supervisor.py | 41 +++++++++++++ xinference/core/worker.py | 15 +++++ xinference/deploy/cmdline.py | 46 ++++++++++++++ 5 files changed, 199 insertions(+) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 1bbf45260c..7287ce3b25 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -573,6 +573,36 @@ def serve(self, logging_conf: Optional[dict] = None): else None ), ) + self._router.add_api_route( + "/v1/workers", + self.get_workers_info, + methods=["GET"], + dependencies=( + [Security(self._auth_service, scopes=["admin"])] + if self.is_authenticated() + else None + ), + ) + self._router.add_api_route( + "/v1/supervisor", + self.get_supervisor_info, + methods=["GET"], + dependencies=( + [Security(self._auth_service, scopes=["admin"])] + if self.is_authenticated() + else None + ), + ) + self._router.add_api_route( + "/v1/clusters", + self.abort_cluster, + methods=["DELETE"], + dependencies=( + [Security(self._auth_service, scopes=["admin"])] + if self.is_authenticated() + else None + ), + ) if XINFERENCE_DISABLE_METRICS: logger.info( @@ -1730,6 +1760,43 @@ async def confirm_and_remove_model( logger.error(e, exc_info=True) raise HTTPException(status_code=500, detail=str(e)) + async def get_workers_info(self) -> JSONResponse: + try: + res = await (await self._get_supervisor_ref()).get_workers_info() + return JSONResponse(content=res) + except ValueError as re: + logger.error(re, exc_info=True) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + + async def get_supervisor_info(self) -> JSONResponse: + try: + res = await (await self._get_supervisor_ref()).get_supervisor_info() + return res + except ValueError as re: + logger.error(re, exc_info=True) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + + async def abort_cluster(self) -> JSONResponse: + import os + import signal + + try: + res = await (await self._get_supervisor_ref()).abort_cluster() + os.kill(os.getpid(), signal.SIGINT) + return JSONResponse(content={"result": res}) + except ValueError as re: + logger.error(re, exc_info=True) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + def run( supervisor_address: str, diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 10d9ae8231..9a1bfe9df7 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -1324,3 +1324,33 @@ def abort_request(self, model_uid: str, request_id: str): response_data = response.json() return response_data + + def get_workers_info(self): + url = f"{self.base_url}/v1/workers" + response = requests.get(url, headers=self._headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to get workers info, detail: {_get_error_string(response)}" + ) + response_data = response.json() + return response_data + + def get_supervisor_info(self): + url = f"{self.base_url}/v1/supervisor" + response = requests.get(url, headers=self._headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to get supervisor info, detail: {_get_error_string(response)}" + ) + response_json = response.json() + return response_json + + def abort_cluster(self): + url = f"{self.base_url}/v1/clusters" + response = requests.delete(url, headers=self._headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to abort cluster, detail: {_get_error_string(response)}" + ) + response_json = response.json() + return response_json diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index b905a3ba76..88f8991e16 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -14,6 +14,8 @@ import asyncio import itertools +import os +import signal import time import typing from dataclasses import dataclass @@ -217,6 +219,17 @@ async def __post_create__(self): model_version_infos, self.address ) + # Windows does not have signal handler + if os.name != "nt": + + async def signal_handler(): + os._exit(0) + + loop = asyncio.get_running_loop() + loop.add_signal_handler( + signal.SIGTERM, lambda: asyncio.create_task(signal_handler()) + ) + @typing.no_type_check async def get_cluster_device_info(self, detailed: bool = False) -> List: import psutil @@ -1153,6 +1166,34 @@ async def confirm_and_remove_model( ) return ret + async def get_workers_info(self) -> List[Dict[str, Any]]: + ret = [] + for worker in self._worker_address_to_worker.values(): + ret.append(await worker.get_workers_info()) + return ret + + async def get_supervisor_info(self) -> Dict[str, Any]: + ret = { + "supervisor_ip": self.address, + } + return ret + + async def trigger_exit(self) -> bool: + try: + os.kill(os.getpid(), signal.SIGTERM) + except Exception as e: + logger.info(f"trigger exit error: {e}") + return False + return True + + async def abort_cluster(self) -> bool: + ret = True + for worker in self._worker_address_to_worker.values(): + ret = ret and await worker.trigger_exit() + + ret = ret and await self.trigger_exit() + return ret + @staticmethod def record_metrics(name, op, kwargs): record_metrics(name, op, kwargs) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 14e9909f8c..303550d197 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -284,6 +284,14 @@ async def signal_handler(): async def __pre_destroy__(self): self._isolation.stop() + async def trigger_exit(self) -> bool: + try: + os.kill(os.getpid(), signal.SIGINT) + except Exception as e: + logger.info(f"trigger exit error: {e}") + return False + return True + @staticmethod def get_devices_count(): from ..device_utils import gpu_count @@ -863,6 +871,13 @@ async def confirm_and_remove_model(self, model_version: str) -> bool: ) return True + async def get_workers_info(self) -> Dict[str, Any]: + ret = { + "work-ip": self.address, + "models": await self.list_models(), + } + return ret + @staticmethod def record_metrics(name, op, kwargs): record_metrics(name, op, kwargs) diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 56b6a61182..2fb84d95c9 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -1578,5 +1578,51 @@ def cal_model_mem( print(" total: %d MB (%d GB)" % (mem_info.total, total_mem_g)) +@cli.command( + "stop-cluster", + help="Stop a cluster using the Xinference framework with the given parameters.", +) +@click.option( + "--endpoint", + "-e", + type=str, + required=True, + help="Xinference endpoint.", +) +@click.option( + "--api-key", + "-ak", + default=None, + type=str, + help="API key for accessing the Xinference API with authorization.", +) +@click.option("--check", is_flag=True, help="Confirm the deletion of the cache.") +def stop_cluster(endpoint: str, api_key: Optional[str], check: bool): + endpoint = get_endpoint(endpoint) + client = RESTfulClient(base_url=endpoint, api_key=api_key) + if api_key is None: + client._set_token(get_stored_token(endpoint, client)) + + if not check: + click.echo( + f"This command will stop Xinference cluster in {endpoint}.", err=True + ) + supervisor_info = client.get_supervisor_info() + click.echo("Supervisor information: ") + click.echo(supervisor_info) + + workers_info = client.get_workers_info() + click.echo("Workers information:") + click.echo(workers_info) + + click.confirm("Continue?", abort=True) + try: + result = client.abort_cluster() + result = result.get("result") + click.echo(f"Cluster stopped: {result}") + except Exception as e: + click.echo(e) + + if __name__ == "__main__": cli() From 7384b74a4057288a121bd051fd48008439425a63 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:02:19 +0800 Subject: [PATCH 169/298] BLD: Supports Aliyun docker image (#1753) --- .github/workflows/docker-cd.yaml | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-cd.yaml b/.github/workflows/docker-cd.yaml index 5e4cb41612..e5ef82e27f 100644 --- a/.github/workflows/docker-cd.yaml +++ b/.github/workflows/docker-cd.yaml @@ -61,6 +61,7 @@ jobs: docker push "$DOCKER_ORG/xinference:${IMAGE_TAG}" docker build -t "$DOCKER_ORG/xinference:${IMAGE_TAG}-cpu" --progress=plain -f xinference/deploy/docker/cpu.Dockerfile . docker push "$DOCKER_ORG/xinference:${IMAGE_TAG}-cpu" + echo "XINFERENCE_IMAGE_TAG=${IMAGE_TAG}" >> $GITHUB_ENV done if [[ -n "$GIT_TAG" ]]; then @@ -68,12 +69,35 @@ jobs: docker push "$DOCKER_ORG/xinference:latest" docker tag "$DOCKER_ORG/xinference:${GIT_TAG}-cpu" "$DOCKER_ORG/xinference:latest-cpu" docker push "$DOCKER_ORG/xinference:latest-cpu" + echo "XINFERENCE_GIT_TAG=${GIT_TAG}" >> $GITHUB_ENV fi - - name: Clean docker image cache + - name: Log in to Aliyun Docker Hub + uses: docker/login-action@v1 + with: + registry: registry.cn-hangzhou.aliyuncs.com + username: ${{ secrets.DOCKERHUB_ALIYUN_USERNAME }} + password: ${{ secrets.DOCKERHUB_ALIYUN_PASSWORD }} + + - name: Push docker image to Aliyun shell: bash if: ${{ github.repository == 'xorbitsai/inference' }} env: - DOCKER_ORG: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKER_ORG: registry.cn-hangzhou.aliyuncs.com/xprobe_xinference + run: | + docker tag "xprobe/xinference:${XINFERENCE_IMAGE_TAG}" "${DOCKER_ORG}/xinference:${XINFERENCE_IMAGE_TAG}" + docker push "${DOCKER_ORG}/xinference:${XINFERENCE_IMAGE_TAG}" + docker tag "xprobe/xinference:${XINFERENCE_IMAGE_TAG}-cpu" "${DOCKER_ORG}/xinference:${XINFERENCE_IMAGE_TAG}-cpu" + docker push "${DOCKER_ORG}/xinference:${XINFERENCE_IMAGE_TAG}-cpu" + if [[ -n "$XINFERENCE_GIT_TAG" ]]; then + docker tag "xprobe/xinference:${XINFERENCE_GIT_TAG}" "$DOCKER_ORG/xinference:latest" + docker push "$DOCKER_ORG/xinference:latest" + docker tag "xprobe/xinference:${XINFERENCE_GIT_TAG}-cpu" "$DOCKER_ORG/xinference:latest-cpu" + docker push "$DOCKER_ORG/xinference:latest-cpu" + fi + + - name: Clean docker image cache + shell: bash + if: ${{ github.repository == 'xorbitsai/inference' }} run: | docker system prune -f -a From 7bedd677053437498339c53ba8869e8f0ea95ddd Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Tue, 2 Jul 2024 06:35:59 +0200 Subject: [PATCH 170/298] BUG: Fix glm4 tool call (#1747) --- xinference/api/restful_api.py | 12 ++++++------ xinference/model/llm/pytorch/chatglm.py | 3 ++- xinference/model/llm/utils.py | 17 +++++++++++++---- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 7287ce3b25..6fe0183c5f 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1477,14 +1477,14 @@ async def create_chat_completion(self, request: Request) -> Response: await self._report_error_event(model_uid, str(e)) raise HTTPException(status_code=500, detail=str(e)) - from ..model.llm.utils import QWEN_TOOL_CALL_FAMILY + from ..model.llm.utils import GLM4_TOOL_CALL_FAMILY, QWEN_TOOL_CALL_FAMILY model_family = desc.get("model_family", "") - function_call_models = [ - "chatglm3", - "glm4-chat", - "gorilla-openfunctions-v1", - ] + QWEN_TOOL_CALL_FAMILY + function_call_models = ( + ["chatglm3", "gorilla-openfunctions-v1"] + + QWEN_TOOL_CALL_FAMILY + + GLM4_TOOL_CALL_FAMILY + ) is_qwen = desc.get("model_format") == "ggmlv3" and "qwen-chat" == model_family diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index 1e72c2b07b..f9ae58c266 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -29,6 +29,7 @@ PytorchGenerateConfig, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import GLM4_TOOL_CALL_FAMILY from .core import PytorchChatModel, PytorchModelConfig @@ -103,7 +104,7 @@ def _handle_tools(self, chat_history, generate_config) -> bool: if tools is None: return False tool_choice = generate_config.pop("tool_choice", "none") - if self.model_family.model_name == "glm4-chat": + if self.model_family.model_name in GLM4_TOOL_CALL_FAMILY: chat_history[:] = self.process_messages( chat_history, tools=tools, tool_choice=tool_choice ) diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 07904b2330..34a7a21720 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -47,6 +47,11 @@ "qwen2-moe-instruct", ] +GLM4_TOOL_CALL_FAMILY = [ + "glm4-chat", + "glm4-chat-1m", +] + class ChatModelMixin: @staticmethod @@ -617,9 +622,13 @@ def tool_call(n, **kwargs): @staticmethod def _eval_glm_chat_arguments(c, tools): - if isinstance(c[0], str): - return c[0], None, None - return None, c[0]["name"], c[0]["parameters"] + try: + if isinstance(c[0], str): + return c[0], None, None + return None, c[0]["name"], c[0]["parameters"] + except KeyError: + logger.error("Can't parse glm output: %s", c) + return str(c), None, None @staticmethod def _eval_qwen_chat_arguments(c, tools): @@ -668,7 +677,7 @@ def _eval_tool_arguments(cls, model_family, c, tools): family = model_family.model_family or model_family.model_name if family in ["gorilla-openfunctions-v1", "gorilla-openfunctions-v2"]: content, func, args = cls._eval_gorilla_openfunctions_arguments(c, tools) - elif family in ["chatglm3", "glm4-chat"]: + elif family in ["chatglm3"] + GLM4_TOOL_CALL_FAMILY: content, func, args = cls._eval_glm_chat_arguments(c, tools) elif family in QWEN_TOOL_CALL_FAMILY: content, func, args = cls._eval_qwen_chat_arguments(c, tools) From 6c52566448b4b3beee5c1da9e8582b042595272c Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 2 Jul 2024 16:11:32 +0800 Subject: [PATCH 171/298] ENH: added gguf files for qwen2 (#1745) --- .../models/builtin/llm/qwen2-instruct.rst | 48 ++++++++ .../models/builtin/llm/qwen2-moe-instruct.rst | 16 +++ xinference/model/llm/llm_family.json | 104 +++++++++++++++++ .../model/llm/llm_family_modelscope.json | 108 ++++++++++++++++++ 4 files changed, 276 insertions(+) diff --git a/doc/source/models/builtin/llm/qwen2-instruct.rst b/doc/source/models/builtin/llm/qwen2-instruct.rst index 70f405b956..16d3baf516 100644 --- a/doc/source/models/builtin/llm/qwen2-instruct.rst +++ b/doc/source/models/builtin/llm/qwen2-instruct.rst @@ -221,3 +221,51 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format ggufv2 --quantization ${quantization} + +Model Spec 14 (ggufv2, 1_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 1_5 +- **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** Qwen/Qwen2-1.5B-Instruct-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 1_5 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 15 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** Qwen/Qwen2-7B-Instruct-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-7B-Instruct-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 16 (ggufv2, 72 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 72 +- **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** Qwen/Qwen2-72B-Instruct-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-72B-Instruct-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 72 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/qwen2-moe-instruct.rst b/doc/source/models/builtin/llm/qwen2-moe-instruct.rst index 9f4e9e9542..f839d10a1b 100644 --- a/doc/source/models/builtin/llm/qwen2-moe-instruct.rst +++ b/doc/source/models/builtin/llm/qwen2-moe-instruct.rst @@ -45,3 +45,19 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-moe-instruct --size-in-billions 14 --model-format gptq --quantization ${quantization} + +Model Spec 3 (ggufv2, 14 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 14 +- **Quantizations:** q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** Qwen/Qwen2-57B-A14B-Instruct-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct-GGUF>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-57B-A14B-Instruct-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-moe-instruct --size-in-billions 14 --model-format ggufv2 --quantization ${quantization} + diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index a5a632e303..6d51c56c81 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -2565,6 +2565,82 @@ ], "model_id": "Qwen/Qwen2-0.5B-Instruct-GGUF", "model_file_name_template": "qwen2-0_5b-instruct-{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": "1_5", + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "Qwen/Qwen2-1.5B-Instruct-GGUF", + "model_file_name_template": "qwen2-1_5b-instruct-{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "Qwen/Qwen2-7B-Instruct-GGUF", + "model_file_name_template": "qwen2-7b-instruct-{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 72, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "Qwen/Qwen2-72B-Instruct-GGUF", + "model_file_name_template": "qwen2-72b-instruct-{quantization}.gguf", + "model_file_name_split_template": "qwen2-72b-instruct-{quantization}-{part}.gguf", + "quantization_parts": { + "q5_0": [ + "00001-of-00002", + "00002-of-00002" + ], + "q5_k_m": [ + "00001-of-00002", + "00002-of-00002" + ], + "q6_k": [ + "00001-of-00002", + "00002-of-00002" + ], + "q8_0": [ + "00001-of-00002", + "00002-of-00002" + ], + "fp16": [ + "00001-of-00004", + "00002-of-00004", + "00003-of-00004", + "00004-of-00004" + ] + } } ], "prompt_style": { @@ -2618,6 +2694,34 @@ "Int4" ], "model_id": "Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 14, + "quantizations": [ + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "Qwen/Qwen2-57B-A14B-Instruct-GGUF", + "model_file_name_template": "qwen2-57b-a14b-instruct-{quantization}.gguf", + "model_file_name_split_template": "qwen2-57b-a14b-instruct-{quantization}-{part}.gguf", + "quantization_parts": { + "q8_0": [ + "00001-of-00002", + "00002-of-00002" + ], + "fp16": [ + "00001-of-00003", + "00002-of-00003", + "00003-of-00003" + ] + } } ], "prompt_style": { diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index c62afa4764..436ddc68c5 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2938,6 +2938,85 @@ "model_id": "qwen/Qwen2-0.5B-Instruct-GGUF", "model_file_name_template": "qwen2-0_5b-instruct-{quantization}.gguf", "model_hub": "modelscope" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": "1_5", + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "qwen/Qwen2-1.5B-Instruct-GGUF", + "model_file_name_template": "qwen2-1_5b-instruct-{quantization}.gguf", + "model_hub": "modelscope" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "qwen/Qwen2-7B-Instruct-GGUF", + "model_file_name_template": "qwen2-7b-instruct-{quantization}.gguf", + "model_hub": "modelscope" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 72, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "qwen/Qwen2-72B-Instruct-GGUF", + "model_hub": "modelscope", + "model_file_name_template": "qwen2-72b-instruct-{quantization}.gguf", + "model_file_name_split_template": "qwen2-72b-instruct-{quantization}-{part}.gguf", + "quantization_parts": { + "q5_0": [ + "00001-of-00002", + "00002-of-00002" + ], + "q5_k_m": [ + "00001-of-00002", + "00002-of-00002" + ], + "q6_k": [ + "00001-of-00002", + "00002-of-00002" + ], + "q8_0": [ + "00001-of-00002", + "00002-of-00002" + ], + "fp16": [ + "00001-of-00004", + "00002-of-00004", + "00003-of-00004", + "00004-of-00004" + ] + } } ], "prompt_style": { @@ -2993,6 +3072,35 @@ ], "model_id": "qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4", "model_hub": "modelscope" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 14, + "quantizations": [ + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "qwen/Qwen2-57B-A14B-Instruct-GGUF", + "model_hub": "modelscope", + "model_file_name_template": "qwen2-57b-a14b-instruct-{quantization}.gguf", + "model_file_name_split_template": "qwen2-57b-a14b-instruct-{quantization}-{part}.gguf", + "quantization_parts": { + "q8_0": [ + "00001-of-00002", + "00002-of-00002" + ], + "fp16": [ + "00001-of-00003", + "00002-of-00003", + "00003-of-00003" + ] + } } ], "prompt_style": { From fd0f49dca72750e97ca49486d15a9619296c6336 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Tue, 2 Jul 2024 17:10:42 +0800 Subject: [PATCH 172/298] BLD: GPU docker use `vllm` image as base (#1759) --- xinference/deploy/docker/Dockerfile | 24 ++++---- xinference/deploy/docker/requirements.txt | 68 +++++++++++++++++++++++ 2 files changed, 80 insertions(+), 12 deletions(-) create mode 100644 xinference/deploy/docker/requirements.txt diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index f4801676e4..9e0ac96c13 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -1,6 +1,7 @@ -FROM pytorch/pytorch:2.1.2-cuda12.1-cudnn8-devel +FROM vllm/vllm-openai:latest COPY . /opt/inference +WORKDIR /opt/inference ENV NVM_DIR /usr/local/nvm ENV NODE_VERSION 14.21.1 @@ -16,21 +17,20 @@ RUN apt-get -y update \ && apt-get -yq clean ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH +ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib/python3.10/dist-packages/nvidia/cublas/lib ARG PIP_INDEX=https://pypi.org/simple -RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ - # uninstall builtin torchvision, and let xinference decide which version to be installed - pip uninstall -y torchvision torchaudio && \ +RUN pip install --upgrade -i "$PIP_INDEX" pip && \ pip install -i "$PIP_INDEX" "diskcache>=5.6.1" "jinja2>=2.11.3" && \ # use pre-built whl package for llama-cpp-python, otherwise may core dump when init llama in some envs - pip install "llama-cpp-python" -i https://abetlen.github.io/llama-cpp-python/whl/cu121 && \ - CMAKE_ARGS="-DGGML_CUBLAS=ON" pip install -i "$PIP_INDEX" -U "chatglm-cpp<0.4.0" && \ + pip install "llama-cpp-python" -i https://abetlen.github.io/llama-cpp-python/whl/cu124 && \ + pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements.txt && \ + pip install -i "$PIP_INDEX" --no-deps sglang && \ cd /opt/inference && \ - python setup.py build_web && \ + python3 setup.py build_web && \ git restore . && \ - pip install -i "$PIP_INDEX" ".[all]" && \ - pip uninstall -y opencv-contrib-python && \ - pip install -i "$PIP_INDEX" opencv-contrib-python-headless && \ + pip install -i "$PIP_INDEX" --no-deps "." && \ # clean packages - pip cache purge && \ - conda clean --force-pkgs-dirs -y + pip cache purge + +ENTRYPOINT [] diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt new file mode 100644 index 0000000000..aea4ef4ddd --- /dev/null +++ b/xinference/deploy/docker/requirements.txt @@ -0,0 +1,68 @@ +# required +xoscar>=0.3.0 +gradio==4.26.0 +typer[all]<0.12.0 # fix typer required by gradio +pillow +click +tqdm>=4.27 +tabulate +requests +pydantic +fastapi==0.110.3 +uvicorn +huggingface-hub>=0.19.4 +typing_extensions +fsspec==2023.10.0 +s3fs==2023.10.0 +modelscope>=1.10.0 +sse_starlette>=1.6.5 # ensure_bytes API break change: https://github.com/sysid/sse-starlette/issues/65 +openai>1 # For typing +python-jose[cryptography] +passlib[bcrypt] +aioprometheus[starlette]>=23.12.0 +pynvml +async-timeout +peft +opencv-contrib-python-headless + +# all +transformers>=4.34.1 +accelerate>=0.27.2 +sentencepiece +transformers_stream_generator +bitsandbytes +protobuf +einops +tiktoken +sentence-transformers>=2.7.0 +diffusers +controlnet_aux +orjson +auto-gptq +autoawq +optimum +attrdict # For deepseek VL +timm>=0.9.16 # For deepseek VL +torchvision # For deepseek VL +FlagEmbedding # For rerank +omegaconf~=2.3.0 # For ChatTTS +vector_quantize_pytorch # For ChatTTS +vocos # For ChatTTS +nemo_text_processing # For ChatTTS +WeTextProcessing # For ChatTTS +librosa # For ChatTTS +xxhash # For ChatTTS +boto3>=1.28.55,<1.28.65 # For tensorizer +tensorizer~=2.9.0 + +# sglang +outlines>=0.0.44 +hf_transfer +packaging +interegular +zmq +rpyc +psutil +aiohttp +anthropic>=0.20.0 +litellm>=1.0.0 From 7ab624e09aba4ab05a27a9888ba9e81d01ea7786 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 3 Jul 2024 14:12:05 +0800 Subject: [PATCH 173/298] TST: Fix `llama-cpp-python` issue in CI (#1763) --- .github/workflows/python.yaml | 2 +- xinference/deploy/docker/cpu.Dockerfile | 50 ++----------------- xinference/deploy/docker/requirements_cpu.txt | 45 +++++++++++++++++ 3 files changed, 50 insertions(+), 47 deletions(-) create mode 100644 xinference/deploy/docker/requirements_cpu.txt diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 8b6c8d2f4b..921ff6e40a 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -109,7 +109,7 @@ jobs: sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" fi - pip install "llama-cpp-python>=0.2.23,!=0.2.58" --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu + pip install "llama-cpp-python==0.2.77" pip install transformers pip install attrdict pip install "timm>=0.9.16" diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index c9b154747c..3568ad2c33 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -20,53 +20,11 @@ ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ - pip install -i "$PIP_INDEX" \ - "xoscar>=0.3.0" \ - "gradio==4.26.0" \ - "typer[all]<0.12.0" \ - pillow \ - click \ - "tqdm>=4.27" \ - tabulate \ - requests \ - pydantic \ - "fastapi==0.110.3" \ - uvicorn \ - "huggingface-hub>=0.19.4" \ - typing_extensions \ - "fsspec==2023.10.0" \ - "s3fs==2023.10.0" \ - "boto3>=1.28.55,<1.28.65" \ - "tensorizer~=2.9.0" \ - "modelscope>=1.10.0" \ - "sse_starlette>=1.6.5" \ - "openai>1" \ - "python-jose[cryptography]" \ - "passlib[bcrypt]" \ - "aioprometheus[starlette]>=23.12.0" \ - pynvml \ - async-timeout \ - "transformers>=4.34.1" \ - "accelerate>=0.20.3" \ - sentencepiece \ - transformers_stream_generator \ - bitsandbytes \ - protobuf \ - einops \ - tiktoken \ - "sentence-transformers>=2.3.1" \ - FlagEmbedding \ - diffusers \ - controlnet_aux \ - orjson \ - auto-gptq \ - optimum \ - peft \ - timm \ - opencv-contrib-python-headless && \ - pip install -i "$PIP_INDEX" -U chatglm-cpp && \ + pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements_cpu.txt && \ pip install "llama-cpp-python>=0.2.25,!=0.2.58" --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu && \ cd /opt/inference && \ python setup.py build_web && \ git restore . && \ - pip install -i "$PIP_INDEX" --no-deps "." + pip install -i "$PIP_INDEX" --no-deps "." && \ + # clean packages + pip cache purge diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt new file mode 100644 index 0000000000..ee1130fbe8 --- /dev/null +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -0,0 +1,45 @@ +xoscar>=0.3.0 +gradio==4.26.0 +typer[all]<0.12.0 +pillow +click +tqdm>=4.27 +tabulate +requests +pydantic +fastapi==0.110.3 +uvicorn +huggingface-hub>=0.19.4 +typing_extensions +fsspec==2023.10.0 +s3fs==2023.10.0 +boto3>=1.28.55,<1.28.65 +tensorizer~=2.9.0 +modelscope>=1.10.0 +sse_starlette>=1.6.5 +openai>1 +python-jose[cryptography] +passlib[bcrypt] +aioprometheus[starlette]>=23.12.0 +pynvml +async-timeout +transformers>=4.34.1 +accelerate>=0.20.3 +sentencepiece +transformers_stream_generator +bitsandbytes +protobuf +einops +tiktoken +sentence-transformers>=2.3.1 +FlagEmbedding +diffusers +controlnet_aux +orjson +auto-gptq +autoawq +optimum +peft +timm +opencv-contrib-python-headless +chatglm-cpp From 7e643f1b51e2aea694e0eb232d7789d110a51b95 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 3 Jul 2024 14:16:39 +0800 Subject: [PATCH 174/298] BLD: Pin `llama-cpp-python` to `v0.2.77` in Docker for stability (#1767) --- xinference/deploy/docker/Dockerfile | 2 +- xinference/deploy/docker/cpu.Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 9e0ac96c13..95f652e63d 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -23,7 +23,7 @@ ARG PIP_INDEX=https://pypi.org/simple RUN pip install --upgrade -i "$PIP_INDEX" pip && \ pip install -i "$PIP_INDEX" "diskcache>=5.6.1" "jinja2>=2.11.3" && \ # use pre-built whl package for llama-cpp-python, otherwise may core dump when init llama in some envs - pip install "llama-cpp-python" -i https://abetlen.github.io/llama-cpp-python/whl/cu124 && \ + pip install "llama-cpp-python==0.2.77" -i https://abetlen.github.io/llama-cpp-python/whl/cu124 && \ pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements.txt && \ pip install -i "$PIP_INDEX" --no-deps sglang && \ cd /opt/inference && \ diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index 3568ad2c33..a18666adf6 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -21,7 +21,7 @@ ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements_cpu.txt && \ - pip install "llama-cpp-python>=0.2.25,!=0.2.58" --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu && \ + pip install "llama-cpp-python==0.2.77" --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu && \ cd /opt/inference && \ python setup.py build_web && \ git restore . && \ From b8110d610a1d5b03ed58b288eeed407a0366c2b1 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 4 Jul 2024 10:46:15 +0800 Subject: [PATCH 175/298] ENH: Add more log modules (#1771) --- xinference/deploy/utils.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/xinference/deploy/utils.py b/xinference/deploy/utils.py index 8d2e6c433a..8cd62214a3 100644 --- a/xinference/deploy/utils.py +++ b/xinference/deploy/utils.py @@ -79,6 +79,12 @@ def get_config_dict( "stream": "ext://sys.stderr", "filters": ["logger_name_filter"], }, + "console_handler": { + "class": "logging.StreamHandler", + "formatter": "formatter", + "level": log_level, + "stream": "ext://sys.stderr", + }, "file_handler": { "class": "logging.handlers.RotatingFileHandler", "formatter": "formatter", @@ -95,7 +101,32 @@ def get_config_dict( "handlers": ["stream_handler", "file_handler"], "level": log_level, "propagate": False, - } + }, + "uvicorn": { + "handlers": ["stream_handler", "file_handler"], + "level": log_level, + "propagate": False, + }, + "uvicorn.error": { + "handlers": ["stream_handler", "file_handler"], + "level": log_level, + "propagate": False, + }, + "uvicorn.access": { + "handlers": ["stream_handler", "file_handler"], + "level": log_level, + "propagate": False, + }, + "transformers": { + "handlers": ["console_handler", "file_handler"], + "level": log_level, + "propagate": False, + }, + "vllm": { + "handlers": ["console_handler", "file_handler"], + "level": log_level, + "propagate": False, + }, }, "root": { "level": "WARN", @@ -127,7 +158,7 @@ async def health_check_internal(): while attempts < max_attempts: time.sleep(sleep_interval) try: - from xinference.core.supervisor import SupervisorActor + from ..core.supervisor import SupervisorActor supervisor_ref: xo.ActorRefType[SupervisorActor] = await xo.actor_ref( # type: ignore address=address, uid=SupervisorActor.uid() From 48fb74428c6fbb6faf569d19f4f6691dc0145f37 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Thu, 4 Jul 2024 11:52:45 +0800 Subject: [PATCH 176/298] BUG: [UI] Fix authentication mode related bugs (#1772) --- xinference/web/ui/src/App.js | 2 + xinference/web/ui/src/components/MenuSide.js | 3 + xinference/web/ui/src/components/Title.js | 4 + .../web/ui/src/components/fetchWrapper.js | 123 +++++++++++ xinference/web/ui/src/router/index.js | 33 ++- .../web/ui/src/scenes/cluster_info/index.js | 53 ++++- .../ui/src/scenes/cluster_info/nodeInfo.js | 68 +++--- .../launch_model/LaunchModelComponent.js | 29 ++- .../web/ui/src/scenes/launch_model/index.js | 34 +-- .../src/scenes/launch_model/launchCustom.js | 24 +-- .../ui/src/scenes/launch_model/launchLLM.js | 45 ++-- .../ui/src/scenes/launch_model/modelCard.js | 201 +++++++----------- .../web/ui/src/scenes/register_model/index.js | 1 + .../scenes/register_model/registerModel.js | 71 +++---- .../web/ui/src/scenes/running_models/index.js | 84 ++++---- 15 files changed, 433 insertions(+), 342 deletions(-) create mode 100644 xinference/web/ui/src/components/fetchWrapper.js diff --git a/xinference/web/ui/src/App.js b/xinference/web/ui/src/App.js index eb587a1c4a..d716f3513a 100644 --- a/xinference/web/ui/src/App.js +++ b/xinference/web/ui/src/App.js @@ -40,6 +40,8 @@ function App() { setCookie('token', 'no_auth', { path: '/' }) } else if (data.auth && !sessionStorage.getItem('token')) { removeCookie('token', { path: '/' }) + } else if (!data.auth && sessionStorage.getItem('token')) { + sessionStorage.removeItem('token') } }) } diff --git a/xinference/web/ui/src/components/MenuSide.js b/xinference/web/ui/src/components/MenuSide.js index 1476b1abb7..d8d763dfbe 100644 --- a/xinference/web/ui/src/components/MenuSide.js +++ b/xinference/web/ui/src/components/MenuSide.js @@ -153,6 +153,7 @@ const MenuSide = () => { sessionStorage.setItem('modelType', '/launch_model/llm') navigate('/launch_model/llm') setActive(link) + sessionStorage.setItem('lastActiveUrl', link) console.log(active) } else if (link === 'cluster_information') { navigate('/cluster_info') @@ -164,6 +165,7 @@ const MenuSide = () => { '/running_models/LLM' ) setActive(link) + sessionStorage.setItem('lastActiveUrl', link) console.log(active) } else if (link === 'register_model') { sessionStorage.setItem( @@ -172,6 +174,7 @@ const MenuSide = () => { ) navigate('/register_model/llm') setActive(link) + sessionStorage.setItem('lastActiveUrl', link) console.log(active) } else { navigate(`/${link}`) diff --git a/xinference/web/ui/src/components/Title.js b/xinference/web/ui/src/components/Title.js index c622c7e46e..a1911265fa 100644 --- a/xinference/web/ui/src/components/Title.js +++ b/xinference/web/ui/src/components/Title.js @@ -13,6 +13,10 @@ const Title = ({ title }) => { const handleLogout = () => { removeCookie('token', { path: '/' }) sessionStorage.removeItem('token') + sessionStorage.removeItem('modelType') + sessionStorage.removeItem('lastActiveUrl') + sessionStorage.removeItem('runningModelType') + sessionStorage.removeItem('registerModelType') navigate('/login', { replace: true }) } diff --git a/xinference/web/ui/src/components/fetchWrapper.js b/xinference/web/ui/src/components/fetchWrapper.js new file mode 100644 index 0000000000..ecbd22b389 --- /dev/null +++ b/xinference/web/ui/src/components/fetchWrapper.js @@ -0,0 +1,123 @@ +import { Cookies } from 'react-cookie' + +const cookies = new Cookies() + +const getBaseUrl = () => { + let base_URL = '' + if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') { + base_URL = 'http://127.0.0.1:9997' + } else { + const fullUrl = window.location.href + base_URL = fullUrl.split('/ui')[0] + } + return base_URL +} + +const apiBase = getBaseUrl() + +const fetchWrapper = { + get: async (endpoint, config = {}) => { + const url = `${apiBase}${endpoint}` + const headers = { + 'Content-Type': 'application/json', + ...config.headers, + } + if (cookies.get('token') !== 'no_auth') { + headers.Authorization = 'Bearer ' + sessionStorage.getItem('token') + } + const response = await fetch(url, { + method: 'GET', + ...config, + headers, + }) + + return fetchWrapper.handleResponse(response) + }, + + post: async (endpoint, body, config = {}) => { + const url = `${apiBase}${endpoint}` + const headers = { + 'Content-Type': 'application/json', + ...config.headers, + } + if (cookies.get('token') !== 'no_auth') { + headers.Authorization = 'Bearer ' + sessionStorage.getItem('token') + } + const response = await fetch(url, { + method: 'POST', + body: JSON.stringify(body), + ...config, + headers, + }) + + return fetchWrapper.handleResponse(response) + }, + + put: async (endpoint, body, config = {}) => { + const url = `${apiBase}${endpoint}` + const headers = { + 'Content-Type': 'application/json', + ...config.headers, + } + if (cookies.get('token') !== 'no_auth') { + headers.Authorization = 'Bearer ' + sessionStorage.getItem('token') + } + const response = await fetch(url, { + method: 'PUT', + body: JSON.stringify(body), + ...config, + headers, + }) + + return fetchWrapper.handleResponse(response) + }, + + delete: async (endpoint, config = {}) => { + const url = `${apiBase}${endpoint}` + const headers = { + 'Content-Type': 'application/json', + ...config.headers, + } + if (cookies.get('token') !== 'no_auth') { + headers.Authorization = 'Bearer ' + sessionStorage.getItem('token') + } + const response = await fetch(url, { + method: 'DELETE', + ...config, + headers, + }) + + return fetchWrapper.handleResponse(response) + }, + + handleResponse: async (response) => { + if ( + response.status == 401 && + localStorage.getItem('authStatus') !== '401' + ) { + localStorage.setItem('authStatus', '401') + window.dispatchEvent(new Event('auth-status')) + } else if ( + response.status == 403 && + localStorage.getItem('authStatus') !== '403' + ) { + localStorage.setItem('authStatus', '403') + window.dispatchEvent(new Event('auth-status')) + } + + if (!response.ok) { + const errorData = await response.json() + const error = new Error( + `Server error: ${response.status} - ${ + errorData.detail || 'Unknown error' + }` + ) + error.response = response + throw error + } + const data = await response.json() + return data + }, +} + +export default fetchWrapper diff --git a/xinference/web/ui/src/router/index.js b/xinference/web/ui/src/router/index.js index 69d4de33de..6088f2ff01 100644 --- a/xinference/web/ui/src/router/index.js +++ b/xinference/web/ui/src/router/index.js @@ -1,5 +1,8 @@ +import { useContext, useEffect, useState } from 'react' import { Navigate, useRoutes } from 'react-router-dom' +import { useNavigate } from 'react-router-dom' +import { ApiContext } from '../components/apiContext' import Layout from '../scenes/_layout' import ClusterInfo from '../scenes/cluster_info' import LaunchModel from '../scenes/launch_model' @@ -7,6 +10,34 @@ import Login from '../scenes/login/login' import RegisterModel from '../scenes/register_model' import RunningModels from '../scenes/running_models' +const LoginAuth = () => { + const [authority, setAuthority] = useState(true) + + const navigate = useNavigate() + const { endPoint } = useContext(ApiContext) + + useEffect(() => { + fetch(endPoint + '/v1/cluster/auth', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }).then((res) => { + if (res.ok) { + res.json().then((data) => { + setAuthority(data.auth) + }) + } + }) + }, []) + + useEffect(() => { + if (!authority) navigate('/launch_model/llm') + }, [authority]) + + return <Login /> +} + const routes = [ { path: '/', @@ -36,7 +67,7 @@ const routes = [ }, { path: '/login', - element: <Login />, + element: <LoginAuth />, }, { path: '*', diff --git a/xinference/web/ui/src/scenes/cluster_info/index.js b/xinference/web/ui/src/scenes/cluster_info/index.js index ec80319f99..401387eaf2 100644 --- a/xinference/web/ui/src/scenes/cluster_info/index.js +++ b/xinference/web/ui/src/scenes/cluster_info/index.js @@ -1,7 +1,9 @@ import { Box } from '@mui/material' import Paper from '@mui/material/Paper' import Grid from '@mui/material/Unstable_Grid2' -import React, { useContext } from 'react' +import React, { useContext, useEffect } from 'react' +import { useCookies } from 'react-cookie' +import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import TableTitle from '../../components/tableTitle' @@ -10,14 +12,38 @@ import NodeInfo from './nodeInfo' const ClusterInfo = () => { const endPoint = useContext(ApiContext).endPoint + const [cookie] = useCookies(['token']) + const navigate = useNavigate() + + useEffect(() => { + if ( + cookie.token === '' || + cookie.token === undefined || + (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) + ) { + navigate('/login', { replace: true }) + } + }, [cookie.token]) + + const handleGoBack = () => { + const lastUrl = sessionStorage.getItem('lastActiveUrl') + if (lastUrl === 'launch_model') { + navigate(sessionStorage.getItem('modelType')) + } else if (lastUrl === 'running_models') { + navigate(sessionStorage.getItem('runningModelType')) + } else if (lastUrl === 'register_model') { + navigate(sessionStorage.getItem('registerModelType')) + } else { + navigate('/launch_model/llm') + } + } return ( <Box sx={{ height: '100%', width: '100%', - paddingLeft: '20px', - paddingTop: '20px', + padding: '20px 20px 0 20px', }} > <Title title="Cluster Information" /> @@ -32,7 +58,12 @@ const ClusterInfo = () => { }} > <TableTitle>Supervisor</TableTitle> - <NodeInfo nodeRole="Supervisor" endpoint={endPoint} /> + <NodeInfo + nodeRole="Supervisor" + endpoint={endPoint} + cookie={cookie} + handleGoBack={handleGoBack} + /> </Paper> </Grid> <Grid item xs={12}> @@ -45,7 +76,12 @@ const ClusterInfo = () => { }} > <TableTitle>Workers</TableTitle> - <NodeInfo nodeRole="Worker" endpoint={endPoint} /> + <NodeInfo + nodeRole="Worker" + endpoint={endPoint} + cookie={cookie} + handleGoBack={handleGoBack} + /> </Paper> </Grid> <Grid item xs={12}> @@ -58,7 +94,12 @@ const ClusterInfo = () => { }} > <TableTitle>Worker Details</TableTitle> - <NodeInfo nodeRole="Worker-Details" endpoint={endPoint} /> + <NodeInfo + nodeRole="Worker-Details" + endpoint={endPoint} + cookie={cookie} + handleGoBack={handleGoBack} + /> </Paper> </Grid> </Grid> diff --git a/xinference/web/ui/src/scenes/cluster_info/nodeInfo.js b/xinference/web/ui/src/scenes/cluster_info/nodeInfo.js index a616a6f1eb..826bef5c3a 100644 --- a/xinference/web/ui/src/scenes/cluster_info/nodeInfo.js +++ b/xinference/web/ui/src/scenes/cluster_info/nodeInfo.js @@ -6,7 +6,7 @@ import Grid from '@mui/material/Unstable_Grid2' import PropTypes from 'prop-types' import React from 'react' -import fetcher from '../../components/fetcher' +import fetchWrapper from '../../components/fetchWrapper' import { toReadableSize } from '../../components/utils' import { StyledTableCell, StyledTableRow } from './style' @@ -22,46 +22,44 @@ class NodeInfo extends React.Component { } refreshInfo() { - fetcher(`${this.endpoint}/v1/cluster/info?detailed=true`, { method: 'GET' }) - .then((res) => { - if (!res.ok) { - res.json().then((errorData) => { - if (errorData.detail === 'Not enough permissions') { - console.log('Not enough permissions') - // window.history.back(); - } - }) - } - if (res.ok) { - res.json().then((data) => { - const { state } = this - state['info'] = data - this.setState(state) - }) - } + if ( + this.props.cookie.token === '' || + this.props.cookie.token === undefined || + (this.props.cookie.token !== 'no_auth' && + !sessionStorage.getItem('token')) + ) { + return + } + fetchWrapper + .get('/v1/cluster/info?detailed=true') + .then((data) => { + const { state } = this + state['info'] = data + this.setState(state) }) - .catch((err) => { - console.error('Error:', err) + .catch((error) => { + console.error('Error:', error) + if (error.response.status == 403) { + this.props.handleGoBack() + } }) if (JSON.stringify(this.state.version) === '{}') { - fetcher(`${this.endpoint}/v1/cluster/version`, { - method: 'GET', - }) - .then((res) => { - if (res.ok) { - res.json().then((data) => { - const { state } = this - state['version'] = { - release: 'v' + data['version'], - commit: data['full-revisionid'], - } - this.setState(state) - }) + fetchWrapper + .get('/v1/cluster/version') + .then((data) => { + const { state } = this + state['version'] = { + release: 'v' + data['version'], + commit: data['full-revisionid'], } + this.setState(state) }) - .catch((err) => { - console.error('Error:', err) + .catch((error) => { + console.error('Error:', error) + if (error.response.status == 403) { + this.props.handleGoBack() + } }) } } diff --git a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js index be6d1ce01e..a2cdd3645b 100644 --- a/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js +++ b/xinference/web/ui/src/scenes/launch_model/LaunchModelComponent.js @@ -9,7 +9,7 @@ import { import React, { useContext, useEffect, useState } from 'react' import { ApiContext } from '../../components/apiContext' -import fetcher from '../../components/fetcher' +import fetchWrapper from '../../components/fetchWrapper' import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' @@ -72,21 +72,18 @@ const LaunchModelComponent = ({ modelType, gpuAvailable }) => { try { setIsCallingApi(true) - const response = await fetcher( - `${endPoint}/v1/model_registrations/${modelType}?detailed=true`, - { - method: 'GET', - } - ) - - const registrations = await response.json() - - const builtinModels = registrations.filter((v) => { - return v.is_builtin - }) - setRegistrationData(builtinModels) - const collectionData = JSON.parse(localStorage.getItem('collectionArr')) - setCollectionArr(collectionData) + fetchWrapper + .get(`/v1/model_registrations/${modelType}?detailed=true`) + .then((data) => { + const builtinModels = data.filter((v) => { + return v.is_builtin + }) + setRegistrationData(builtinModels) + const collectionData = JSON.parse( + localStorage.getItem('collectionArr') + ) + setCollectionArr(collectionData) + }) } catch (error) { console.error('Error:', error) } finally { diff --git a/xinference/web/ui/src/scenes/launch_model/index.js b/xinference/web/ui/src/scenes/launch_model/index.js index a6324a783a..1339e94d4f 100644 --- a/xinference/web/ui/src/scenes/launch_model/index.js +++ b/xinference/web/ui/src/scenes/launch_model/index.js @@ -6,14 +6,13 @@ import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import ErrorMessageSnackBar from '../../components/errorMessageSnackBar' -import fetcher from '../../components/fetcher' +import fetchWrapper from '../../components/fetchWrapper' import Title from '../../components/Title' import LaunchCustom from './launchCustom' import LaunchLLM from './launchLLM' import LaunchModelComponent from './LaunchModelComponent' const LaunchModel = () => { - let endPoint = useContext(ApiContext).endPoint const [value, setValue] = React.useState( sessionStorage.getItem('modelType') ? sessionStorage.getItem('modelType') @@ -36,6 +35,7 @@ const LaunchModel = () => { useEffect(() => { if (cookie.token === '' || cookie.token === undefined) { + navigate('/login', { replace: true }) return } if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { @@ -44,27 +44,15 @@ const LaunchModel = () => { } if (gpuAvailable === -1) { - fetcher(endPoint + '/v1/cluster/devices', { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }).then((res) => { - if (!res.ok) { - // Usually, if some errors happen here, check if the cluster is available - res.json().then((errorData) => { - setErrorMsg( - `Server error: ${res.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - }) - } else { - res.json().then((data) => { - setGPUAvailable(parseInt(data, 10)) - }) - } - }) + fetchWrapper + .get('/v1/cluster/devices') + .then((data) => setGPUAvailable(parseInt(data, 10))) + .catch((error) => { + console.error('Error:', error) + if (error.response.status !== 403 && error.response.status !== 401) { + setErrorMsg(error.message) + } + }) } }, [cookie.token]) diff --git a/xinference/web/ui/src/scenes/launch_model/launchCustom.js b/xinference/web/ui/src/scenes/launch_model/launchCustom.js index e807bf02a8..e81ca540b3 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchCustom.js +++ b/xinference/web/ui/src/scenes/launch_model/launchCustom.js @@ -4,7 +4,7 @@ import React, { useContext, useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' -import fetcher from '../../components/fetcher' +import fetchWrapper from '../../components/fetchWrapper' import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' @@ -51,28 +51,18 @@ const LaunchCustom = ({ gpuAvailable }) => { if (isCallingApi || isUpdatingModel) return try { setIsCallingApi(true) - const response = await fetcher( - `${endPoint}/v1/model_registrations/${type}`, - { - method: 'GET', - } - ) - const registrations = await response.json() - const customRegistrations = registrations.filter( - (data) => !data.is_builtin - ) + + const data = await fetchWrapper.get(`/v1/model_registrations/${type}`) + const customRegistrations = data.filter((data) => !data.is_builtin) const newData = await Promise.all( customRegistrations.map(async (registration) => { - const desc = await fetcher( - `${endPoint}/v1/model_registrations/${type}/${registration.model_name}`, - { - method: 'GET', - } + const desc = await fetchWrapper.get( + `/v1/model_registrations/${type}/${registration.model_name}` ) return { - ...(await desc.json()), + ...desc, is_builtin: registration.is_builtin, } }) diff --git a/xinference/web/ui/src/scenes/launch_model/launchLLM.js b/xinference/web/ui/src/scenes/launch_model/launchLLM.js index c9fc07484b..12bdf53b06 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchLLM.js +++ b/xinference/web/ui/src/scenes/launch_model/launchLLM.js @@ -10,15 +10,14 @@ import React, { useContext, useEffect, useState } from 'react' import { useCookies } from 'react-cookie' import { ApiContext } from '../../components/apiContext' -import fetcher from '../../components/fetcher' +import fetchWrapper from '../../components/fetchWrapper' import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' const modelAbilityArr = ['generate', 'chat', 'vision'] const LaunchLLM = ({ gpuAvailable }) => { - let endPoint = useContext(ApiContext).endPoint - const { isCallingApi, setIsCallingApi } = useContext(ApiContext) + const { isCallingApi, setIsCallingApi, endPoint } = useContext(ApiContext) const { isUpdatingModel } = useContext(ApiContext) const { setErrorMsg } = useContext(ApiContext) const [cookie] = useCookies(['token']) @@ -102,30 +101,22 @@ const LaunchLLM = ({ gpuAvailable }) => { try { setIsCallingApi(true) - fetcher(`${endPoint}/v1/model_registrations/LLM?detailed=true`, { - method: 'GET', - }).then((response) => { - if (!response.ok) { - response - .json() - .then((errData) => - setErrorMsg( - `Server error: ${response.status} - ${ - errData.detail || 'Unknown error' - }` - ) - ) - } else { - response.json().then((data) => { - const builtinRegistrations = data.filter((v) => v.is_builtin) - setRegistrationData(builtinRegistrations) - const collectionData = JSON.parse( - localStorage.getItem('collectionArr') - ) - setCollectionArr(collectionData) - }) - } - }) + fetchWrapper + .get('/v1/model_registrations/LLM?detailed=true') + .then((data) => { + const builtinRegistrations = data.filter((v) => v.is_builtin) + setRegistrationData(builtinRegistrations) + const collectionData = JSON.parse( + localStorage.getItem('collectionArr') + ) + setCollectionArr(collectionData) + }) + .catch((error) => { + console.error('Error:', error) + if (error.response.status !== 403 && error.response.status !== 401) { + setErrorMsg(error.message) + } + }) } catch (error) { console.error('Error:', error) } finally { diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index bdfa834de0..e5a78e79ea 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -51,7 +51,7 @@ import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import CopyComponent from '../../components/copyComponent/copyComponent' import DeleteDialog from '../../components/deleteDialog' -import fetcher from '../../components/fetcher' +import fetchWrapper from '../../components/fetchWrapper' import TitleTypography from '../../components/titleTypography' import AddPair from './components/addPair' @@ -248,37 +248,23 @@ const ModelCard = ({ } const getModelEngine = (model_name) => { - fetcher(url + `/v1/engines/${model_name}`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }) - .then((response) => { - if (!response.ok) { - // Assuming the server returns error details in JSON format - response.json().then((errorData) => { - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - }) - } else { - response.json().then((data) => { - setEnginesObj(data) - setEngineOptions(Object.keys(data)) - }) - } + fetchWrapper + .get(`/v1/engines/${model_name}`) + .then((data) => { + setEnginesObj(data) + setEngineOptions(Object.keys(data)) setIsCallingApi(false) }) .catch((error) => { console.error('Error:', error) + if (error.response.status !== 403) { + setErrorMsg(error.message) + } setIsCallingApi(false) }) } - const launchModel = (url) => { + const launchModel = () => { if (isCallingApi || isUpdatingModel) { return } @@ -369,53 +355,39 @@ const ModelCard = ({ modelType === 'LLM' ? modelDataWithID_LLM : modelDataWithID_other // First fetcher request to initiate the model - fetcher(url + '/v1/models', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(modelDataWithID), - }) - .then((response) => { - if (!response.ok) { - // Assuming the server returns error details in JSON format - response.json().then((errorData) => { - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` + fetchWrapper + .post('/v1/models', modelDataWithID) + .then(() => { + navigate(`/running_models/${modelType}`) + sessionStorage.setItem( + 'runningModelType', + `/running_models/${modelType}` + ) + + if ( + isHistory || + ((modelType === 'embedding' || modelType === 'rerank') && + (modelUID !== '' || replica !== 1 || workerIp !== '')) || + ((modelType === 'image' || modelType === 'audio') && + modelUID !== '') || + modelType === 'LLM' + ) { + let historyArr = JSON.parse(localStorage.getItem('historyArr')) || [] + if (!historyArr.some((item) => deepEqual(item, modelDataWithID))) { + historyArr = historyArr.filter( + (item) => item.model_name !== modelDataWithID.model_name ) - }) - } else { - navigate(`/running_models/${modelType}`) - sessionStorage.setItem( - 'runningModelType', - `/running_models/${modelType}` - ) - - if ( - isHistory || - ((modelType === 'embedding' || modelType === 'rerank') && - (modelUID !== '' || replica !== 1 || workerIp !== '')) || - ((modelType === 'image' || modelType === 'audio') && - modelUID !== '') || - modelType === 'LLM' - ) { - let historyArr = - JSON.parse(localStorage.getItem('historyArr')) || [] - if (!historyArr.some((item) => deepEqual(item, modelDataWithID))) { - historyArr = historyArr.filter( - (item) => item.model_name !== modelDataWithID.model_name - ) - historyArr.push(modelDataWithID) - } - localStorage.setItem('historyArr', JSON.stringify(historyArr)) + historyArr.push(modelDataWithID) } + localStorage.setItem('historyArr', JSON.stringify(historyArr)) } setIsCallingApi(false) }) .catch((error) => { console.error('Error:', error) + if (error.response.status !== 403) { + setErrorMsg(error.message) + } setIsCallingApi(false) }) } @@ -433,24 +405,23 @@ const ModelCard = ({ const subType = sessionStorage.getItem('subType').split('/') if (subType) { subType[3] - fetcher( - url + + fetchWrapper + .delete( `/v1/model_registrations/${ subType[3] === 'llm' ? 'LLM' : subType[3] - }/${modelData.model_name}`, - { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, - } - ) + }/${modelData.model_name}` + ) .then(() => { setCustomDeleted(true) onHandlecustomDelete(modelData.model_name) setIsDeleteCustomModel(false) }) - .catch(console.error) + .catch((error) => { + console.error(error) + if (error.response.status !== 403) { + setErrorMsg(error.message) + } + }) } } @@ -512,29 +483,14 @@ const ModelCard = ({ } const getCachedList = () => { - fetcher(url + `/v1/cache/models?model_name=${modelData.model_name}`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }) - .then((response) => { - if (!response.ok) { - response.json().then((errorData) => { - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - }) - } else { - response.json().then((data) => { - setCachedListArr(data.list) - }) - } - }) + fetchWrapper + .get(`/v1/cache/models?model_name=${modelData.model_name}`) + .then((data) => setCachedListArr(data.list)) .catch((error) => { - console.error('Error:', error) + console.error(error) + if (error.response.status !== 403) { + setErrorMsg(error.message) + } }) } @@ -545,41 +501,28 @@ const ModelCard = ({ } const handleDeleteCached = () => { - fetcher(url + `/v1/cache/models?model_version=${cachedModelVersion}`, { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, - }) - .then((response) => { - if (!response.ok) { - response.json().then((errorData) => { - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - }) - } else { - response.json().then(() => { - const cachedArr = cachedListArr.filter( - (item) => item.real_path !== cachedRealPath - ) - setCachedListArr(cachedArr) - setIsDeleteCached(false) - if (cachedArr.length) { - if ( - (page + 1) * 5 >= cachedListArr.length && - cachedArr.length % 5 === 0 - ) { - setPage(cachedArr.length / 5 - 1) - } - } - }) + fetchWrapper + .delete(`/v1/cache/models?model_version=${cachedModelVersion}`) + .then(() => { + const cachedArr = cachedListArr.filter( + (item) => item.real_path !== cachedRealPath + ) + setCachedListArr(cachedArr) + setIsDeleteCached(false) + if (cachedArr.length) { + if ( + (page + 1) * 5 >= cachedListArr.length && + cachedArr.length % 5 === 0 + ) { + setPage(cachedArr.length / 5 - 1) + } } }) .catch((error) => { - console.error('Error:', error) + console.error(error) + if (error.response.status !== 403) { + setErrorMsg(error.message) + } }) } diff --git a/xinference/web/ui/src/scenes/register_model/index.js b/xinference/web/ui/src/scenes/register_model/index.js index 2c07284fce..41ca4e7678 100644 --- a/xinference/web/ui/src/scenes/register_model/index.js +++ b/xinference/web/ui/src/scenes/register_model/index.js @@ -19,6 +19,7 @@ const RegisterModel = () => { useEffect(() => { if (cookie.token === '' || cookie.token === undefined) { + navigate('/login', { replace: true }) return } if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { diff --git a/xinference/web/ui/src/scenes/register_model/registerModel.js b/xinference/web/ui/src/scenes/register_model/registerModel.js index 427cff01d6..5e1bbe0759 100644 --- a/xinference/web/ui/src/scenes/register_model/registerModel.js +++ b/xinference/web/ui/src/scenes/register_model/registerModel.js @@ -27,7 +27,7 @@ import { useNavigate, useParams } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import CopyComponent from '../../components/copyComponent/copyComponent' -import fetcher from '../../components/fetcher' +import fetchWrapper from '../../components/fetchWrapper' import AddControlnet from './components/addControlnet' import AddModelSpecs from './components/addModelSpecs' import languages from './data/languages' @@ -191,6 +191,7 @@ const RegisterModelComponent = ({ modelType, customData }) => { useEffect(() => { if (cookie.token === '' || cookie.token === undefined) { + navigate('/login', { replace: true }) return } if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { @@ -333,34 +334,25 @@ const RegisterModelComponent = ({ modelType, customData }) => { } try { - const response = await fetcher( - endPoint + `/v1/model_registrations/${modelType}`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: JSON.stringify(formData), - persist: true, - }), - } - ) - if (!response.ok) { - const errorData = await response.json() // Assuming the server returns error details in JSON format - setErrorMsg( - `Server error: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - } else { - navigate(`/launch_model/custom/${modelType.toLowerCase()}`) - sessionStorage.setItem('modelType', '/launch_model/custom/llm') - sessionStorage.setItem( - 'subType', - `/launch_model/custom/${modelType.toLowerCase()}` - ) - } + fetchWrapper + .post(`/v1/model_registrations/${modelType}`, { + model: JSON.stringify(formData), + persist: true, + }) + .then(() => { + navigate(`/launch_model/custom/${modelType.toLowerCase()}`) + sessionStorage.setItem('modelType', '/launch_model/custom/llm') + sessionStorage.setItem( + 'subType', + `/launch_model/custom/${modelType.toLowerCase()}` + ) + }) + .catch((error) => { + console.error('Error:', error) + if (error.response.status !== 403 && error.response.status !== 401) { + setErrorMsg(error.message) + } + }) } catch (error) { console.error('There was a problem with the fetch operation:', error) setErrorMsg(error.message || 'An unexpected error occurred.') @@ -521,23 +513,18 @@ const RegisterModelComponent = ({ modelType, customData }) => { } const handleEdit = () => { - fetcher( - endPoint + + fetchWrapper + .delete( `/v1/model_registrations/${ registerModelType === 'llm' ? 'LLM' : registerModelType - }/${model_name}`, - { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, - } - ) - .then(() => { - handleClick() - }) + }/${model_name}` + ) + .then(() => handleClick()) .catch((error) => { console.error('Error:', error) + if (error.response.status !== 403 && error.response.status !== 401) { + setErrorMsg(error.message) + } }) } diff --git a/xinference/web/ui/src/scenes/running_models/index.js b/xinference/web/ui/src/scenes/running_models/index.js index 1e0da75bb3..c2a4e28ab2 100644 --- a/xinference/web/ui/src/scenes/running_models/index.js +++ b/xinference/web/ui/src/scenes/running_models/index.js @@ -10,6 +10,7 @@ import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import ErrorMessageSnackBar from '../../components/errorMessageSnackBar' import fetcher from '../../components/fetcher' +import fetchWrapper from '../../components/fetchWrapper' import Title from '../../components/Title' const RunningModels = () => { @@ -36,6 +37,7 @@ const RunningModels = () => { const update = (isCallingApi) => { if (cookie.token === '' || cookie.token === undefined) { + navigate('/login', { replace: true }) return } if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { @@ -58,55 +60,46 @@ const RunningModels = () => { ]) } else { setIsUpdatingModel(true) - fetcher(`${endPoint}/v1/models`, { - method: 'GET', - }) + + fetchWrapper + .get('/v1/models') .then((response) => { - if (!response.ok) { - response.json().then((errorData) => { - setErrorMsg( - `Login failed: ${response.status} - ${ - errorData.detail || 'Unknown error' - }` - ) - }) - } else { - response.json().then((response) => { - const newLlmData = [] - const newEmbeddingModelData = [] - const newImageModelData = [] - const newAudioModelData = [] - const newRerankModelData = [] - response.data.forEach((model) => { - let newValue = { - ...model, - id: model.id, - url: model.id, - } - if (newValue.model_type === 'LLM') { - newLlmData.push(newValue) - } else if (newValue.model_type === 'embedding') { - newEmbeddingModelData.push(newValue) - } else if (newValue.model_type === 'audio') { - newAudioModelData.push(newValue) - } else if (newValue.model_type === 'image') { - newImageModelData.push(newValue) - } else if (newValue.model_type === 'rerank') { - newRerankModelData.push(newValue) - } - }) - setLlmData(newLlmData) - setEmbeddingModelData(newEmbeddingModelData) - setAudioModelData(newAudioModelData) - setImageModelData(newImageModelData) - setRerankModelData(newRerankModelData) - setIsUpdatingModel(false) - }) - } + const newLlmData = [] + const newEmbeddingModelData = [] + const newImageModelData = [] + const newAudioModelData = [] + const newRerankModelData = [] + response.data.forEach((model) => { + let newValue = { + ...model, + id: model.id, + url: model.id, + } + if (newValue.model_type === 'LLM') { + newLlmData.push(newValue) + } else if (newValue.model_type === 'embedding') { + newEmbeddingModelData.push(newValue) + } else if (newValue.model_type === 'audio') { + newAudioModelData.push(newValue) + } else if (newValue.model_type === 'image') { + newImageModelData.push(newValue) + } else if (newValue.model_type === 'rerank') { + newRerankModelData.push(newValue) + } + }) + setLlmData(newLlmData) + setEmbeddingModelData(newEmbeddingModelData) + setAudioModelData(newAudioModelData) + setImageModelData(newImageModelData) + setRerankModelData(newRerankModelData) + setIsUpdatingModel(false) }) .catch((error) => { console.error('Error:', error) setIsUpdatingModel(false) + if (error.response.status !== 403 && error.response.status !== 401) { + setErrorMsg(error.message) + } }) } } @@ -632,8 +625,7 @@ const RunningModels = () => { sx={{ height: '100%', width: '100%', - paddingLeft: '20px', - paddingTop: '20px', + padding: '20px 20px 0 20px', }} > <Title title="Running Models" /> From 4a2596578137cda5020b84a4cbe931d86de2db05 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 4 Jul 2024 15:36:31 +0800 Subject: [PATCH 177/298] ENH: Continuous batching supports `vision` model ability (#1724) --- xinference/core/model.py | 25 +- xinference/core/scheduler.py | 2 + .../core/tests/test_continuous_batching.py | 7 +- xinference/model/llm/llm_family.json | 12 +- .../model/llm/llm_family_modelscope.json | 10 + xinference/model/llm/pytorch/chatglm.py | 8 - xinference/model/llm/pytorch/cogvlm2.py | 227 ++++++++++++++-- xinference/model/llm/pytorch/core.py | 253 +++++++++++++++--- xinference/model/llm/pytorch/glm4v.py | 186 +++++++++++-- xinference/model/llm/pytorch/qwen_vl.py | 175 +++++++++++- xinference/model/llm/pytorch/utils.py | 115 ++++---- 11 files changed, 859 insertions(+), 161 deletions(-) diff --git a/xinference/core/model.py b/xinference/core/model.py index 34e74386a9..0184e0de9d 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -65,6 +65,9 @@ class _OutOfMemoryError(Exception): OutOfMemoryError = _OutOfMemoryError +XINFERENCE_BATCHING_ALLOWED_VISION_MODELS = ["qwen-vl-chat", "cogvlm2", "glm-4v"] + + def request_limit(fn): """ Used by ModelActor. @@ -268,11 +271,25 @@ def allow_batching(self) -> bool: model_ability = self._model_description.get("model_ability", []) - return ( - XINFERENCE_TRANSFORMERS_ENABLE_BATCHING - and isinstance(self._model, PytorchModel) - and "vision" not in model_ability + condition = XINFERENCE_TRANSFORMERS_ENABLE_BATCHING and isinstance( + self._model, PytorchModel ) + if condition and "vision" in model_ability: + if ( + self._model.model_family.model_name + in XINFERENCE_BATCHING_ALLOWED_VISION_MODELS + or self._model.model_family.model_family + in XINFERENCE_BATCHING_ALLOWED_VISION_MODELS + ): + return True + else: + logger.warning( + f"Currently for multimodal models, " + f"xinference only supports {', '.join(XINFERENCE_BATCHING_ALLOWED_VISION_MODELS)} for batching. " + f"Your model {self._model.model_family.model_name} with model family {self._model.model_family.model_family} is disqualified." + ) + return False + return condition async def load(self): self._model.load() diff --git a/xinference/core/scheduler.py b/xinference/core/scheduler.py index a3e436ac5b..da9d4bbe28 100644 --- a/xinference/core/scheduler.py +++ b/xinference/core/scheduler.py @@ -82,6 +82,8 @@ def __init__(self, prompt, future_or_queue, is_prefill, *args, **kwargs): # Record error message when this request has error. # Must set stopped=True when this field is set. self.error_msg: Optional[str] = None + # For compatibility. Record some extra parameters for some special cases. + self.extra_kwargs = {} # check the integrity of args passed upstream self._check_args() diff --git a/xinference/core/tests/test_continuous_batching.py b/xinference/core/tests/test_continuous_batching.py index a7121ccbcc..f6db0362cf 100644 --- a/xinference/core/tests/test_continuous_batching.py +++ b/xinference/core/tests/test_continuous_batching.py @@ -71,9 +71,10 @@ def run_internal(self): assert isinstance(res, dict) choices = res["choices"] assert isinstance(choices, list) - choice = choices[0]["text"] - assert isinstance(choice, str) - assert len(choice) > 0 + choice = choices[0]["message"] + assert isinstance(choice, dict) + content = choice["content"] + assert len(content) > 0 class InferenceThreadWithError(InferenceThread): diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 6d51c56c81..17e3a87c5e 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -944,7 +944,7 @@ "none" ], "model_id": "THUDM/glm-4v-9b", - "model_revision": "e8b84fefc07e58a90c8489337675573fda95e289" + "model_revision": "6c2e4732db8443f64a48d5af04b74425a7d169c4" } ], "prompt_style": { @@ -5913,6 +5913,16 @@ "roles": [ "user", "assistant" + ], + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" ] } }, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 436ddc68c5..796248c5f9 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3510,6 +3510,16 @@ "roles": [ "user", "assistant" + ], + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" ] } }, diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index f9ae58c266..c60089898b 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -336,14 +336,6 @@ def _stream_generator(): ), ) - @staticmethod - def require_attention_mask(): - """ - GLM4 needs to use attention mask and position ids during inference. - Otherwise, the inference result would be not available. - """ - return True - def prepare_sanitize_generate_config(self, req: InferenceRequest): """ Set temperature and top_p to 0.8 by default diff --git a/xinference/model/llm/pytorch/cogvlm2.py b/xinference/model/llm/pytorch/cogvlm2.py index 971d3818cb..07f44ad47f 100644 --- a/xinference/model/llm/pytorch/cogvlm2.py +++ b/xinference/model/llm/pytorch/cogvlm2.py @@ -23,6 +23,7 @@ import torch from PIL import Image +from ....core.scheduler import InferenceRequest from ....model.utils import select_device from ....types import ( ChatCompletion, @@ -35,11 +36,30 @@ ) from ..llm_family import LLMFamilyV1, LLMSpecV1 from .core import PytorchChatModel, PytorchGenerateConfig +from .utils import get_max_src_len logger = logging.getLogger(__name__) -IMAGENET_MEAN = (0.485, 0.456, 0.406) -IMAGENET_STD = (0.229, 0.224, 0.225) + +LANGUAGE_TOKEN_TYPE = 0 +VISION_TOKEN_TYPE = 1 + + +def recur_move_to(item, tgt, criterion_func): + """ + This function is copied from https://github.com/THUDM/CogVLM2/blob/main/basic_demo/cli_demo_batch_inference.py + """ + if criterion_func(item): + device_copy = item.to(tgt) + return device_copy + elif isinstance(item, list): + return [recur_move_to(v, tgt, criterion_func) for v in item] + elif isinstance(item, tuple): + return tuple([recur_move_to(v, tgt, criterion_func) for v in item]) + elif isinstance(item, dict): + return {k: recur_move_to(v, tgt, criterion_func) for k, v in item.items()} + else: + return item class CogVLM2Model(PytorchChatModel): @@ -176,11 +196,33 @@ def _image_to_piexl_values(image): content["image_url"]["url"] ) assistant = chat_history[i + 1]["content"] - query = query + f" USER: {user} ASSISTANT:" - history.append((query, assistant)) - query = query + f" {assistant}" + history.append((user, assistant)) + query = assistant # type: ignore return query, history, [pixel_values] + def get_query_and_history( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + ): + content, image = self._message_content_to_cogvlm2(prompt) + + history = [] + history_image = None + if chat_history: + query, history, history_image = self._history_content_to_cogvlm2( + system_prompt, chat_history # type: ignore + ) + + if image and history_image: + history = [] + query = content + else: + image = image if image else history_image + query = content + return query, image, history + def chat( self, prompt: Union[str, List[Dict]], @@ -198,22 +240,9 @@ def chat( else 512, } - content, image = self._message_content_to_cogvlm2(prompt) - - history = [] - query = "" - history_image = None - if chat_history: - query, history, history_image = self._history_content_to_cogvlm2( - system_prompt, chat_history - ) - - if image and history_image: - history = [] - query = system_prompt + f" USER: {content} ASSISTANT:" - else: - image = image if image else history_image - query = query + f" USER: {content} ASSISTANT:" + query, image, history = self.get_query_and_history( + prompt, system_prompt=system_prompt, chat_history=chat_history + ) input_by_model = self._model.build_conversation_input_ids( self._tokenizer, @@ -319,3 +348,159 @@ def _streaming_chat_response( ), ) yield chunk + + @staticmethod + def build_position_ids(x, attention_mask=None): + """ + Copied from https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B-int4/blob/main/modeling_cogvlm.py + """ + # Fix: 参考官方开源代码 + if attention_mask is not None: + tmp = x.clone() + tmp[~(attention_mask.bool())] = -1 + else: + tmp = x.clone() + # image boi eoi token as LANGUAGE_TOKEN_TYPE + is_boi_eoi = torch.zeros_like(x, dtype=torch.bool) + is_boi_eoi[:, 1:] |= (tmp[:, 1:] == VISION_TOKEN_TYPE) & ( + tmp[:, :-1] == LANGUAGE_TOKEN_TYPE + ) + is_boi_eoi[:, 0] |= tmp[:, 0] == VISION_TOKEN_TYPE + is_boi_eoi[:, :-1] |= (tmp[:, :-1] == VISION_TOKEN_TYPE) & ( + tmp[:, 1:] == LANGUAGE_TOKEN_TYPE + ) + is_boi_eoi[:, -1] |= tmp[:, -1] == VISION_TOKEN_TYPE + tmp[is_boi_eoi] = LANGUAGE_TOKEN_TYPE + # final position ids + y = torch.zeros_like(x, dtype=torch.long) + y[:, 1:] = (tmp[:, 1:] == LANGUAGE_TOKEN_TYPE) | ( + (tmp[:, 1:] == VISION_TOKEN_TYPE) & (tmp[:, :-1] == LANGUAGE_TOKEN_TYPE) + ) + y = y.cumsum(dim=-1) + return y + + def get_dtype(self): + return self._torch_type + + def _get_full_prompt(self, prompt, system_prompt, chat_history, tools): + query, image, history = self.get_query_and_history( + prompt, system_prompt=system_prompt, chat_history=chat_history + ) + + input_by_model: dict = self._model.build_conversation_input_ids( + self._tokenizer, + query=query, + history=history, + images=image, + template_version="chat", + ) + return { + "input_ids": input_by_model["input_ids"], # seq_len + "token_type_ids": input_by_model["token_type_ids"], # seq_len + "attention_mask": input_by_model["attention_mask"], # seq_len + "images": input_by_model["images"], + } + + def prepare_sanitize_generate_config(self, req: InferenceRequest): + """ + See https://huggingface.co/THUDM/cogvlm2-llama3-chat-19B/blob/main/generation_config.json + """ + raw_config = req.inference_kwargs.get("raw_params", {}) + temperature = raw_config.get("temperature", None) + if temperature is None: + raw_config["temperature"] = 0.6 + top_p = raw_config.get("top_p", None) + if top_p is None: + raw_config["top_p"] = 0.9 + return raw_config + + def build_prefill_kwargs(self, prompts: List, req_list: List[InferenceRequest]): + context_len = self.get_context_len() + assert isinstance(prompts[0], dict) + images = [] + max_length = float("-inf") + for i, feature in enumerate(prompts): + req = req_list[i] + if "images" in feature: + images.append(feature.pop("images", None)) + max_src_len = get_max_src_len(context_len, req) + input_ids = feature["input_ids"][-max_src_len:] + req.prompt_tokens = input_ids.tolist() + feature["input_ids"] = input_ids + feature["token_type_ids"] = feature["token_type_ids"][-max_src_len:] + feature["attention_mask"] = feature["attention_mask"][-max_src_len:] + req.extra_kwargs["attention_mask_seq_len"] = feature[ + "attention_mask" + ].shape[0] + max_length = max(len(input_ids), max_length) + + def pad_to_max_length_internal(feature, max_len, idx): + padding_length = max_len - len(feature["input_ids"]) + req_list[idx].padding_len = padding_length + feature["input_ids"] = torch.cat( + [torch.full((padding_length,), 0), feature["input_ids"]] + ) + feature["token_type_ids"] = torch.cat( + [ + torch.zeros(padding_length, dtype=torch.long), + feature["token_type_ids"], + ] + ) + feature["attention_mask"] = torch.cat( + [ + torch.zeros(padding_length, dtype=torch.long), + feature["attention_mask"], + ] + ) + return feature + + features = [ + pad_to_max_length_internal(feature, max_length, i) + for i, feature in enumerate(prompts) + ] + batch = { + key: torch.stack([feature[key] for feature in features]) + for key in features[0].keys() + } + + position_ids = self.build_position_ids(batch["token_type_ids"]) + batch["position_ids"] = position_ids + + for i in range(len(prompts)): + req = req_list[i] + req.extra_kwargs["max_position_id"] = position_ids[i : i + 1, -1].item() + + if images: + batch["images"] = images + + batch = recur_move_to( + batch, self._device, lambda x: isinstance(x, torch.Tensor) + ) + dtype = self.get_dtype() + if dtype: + batch = recur_move_to( + batch, + dtype, + lambda x: isinstance(x, torch.Tensor) and torch.is_floating_point(x), + ) + return batch + + def build_decode_token_type_ids( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + token_type_ids = torch.full( + (batch_size, 1), fill_value=1, dtype=torch.long, device=self._device + ) + return token_type_ids + + def build_decode_position_ids( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + tmp = [] + for r in reqs: + r.extra_kwargs["max_position_id"] += 1 + tmp.append(r.extra_kwargs["max_position_id"]) + position_ids = torch.as_tensor( + tmp, device=self._device, dtype=torch.long + ).unsqueeze(1) + return position_ids diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 92f278f180..27aae9a4a5 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -18,6 +18,8 @@ from functools import lru_cache from typing import Iterable, Iterator, List, Optional, Tuple, Union +import torch + from ....core.scheduler import InferenceRequest from ....device_utils import ( get_device_preferred_dtype, @@ -43,7 +45,7 @@ from ..core import LLM from ..llm_family import LLMFamilyV1, LLMSpecV1 from ..utils import QWEN_TOOL_CALL_FAMILY, ChatModelMixin -from .utils import get_context_length, get_max_src_len +from .utils import get_context_length, get_max_src_len, pad_prefill_tokens logger = logging.getLogger(__name__) @@ -409,9 +411,171 @@ def generator_wrapper( else: return generator_wrapper(prompt, generate_config) + def build_prefill_attention_mask( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + """ + Build attention mask for prefill phase. + Padding `0` on the left. + Note that the parameter `seq_length` is from `input_ids`. + """ + data = [] + for r in reqs: + real_len = seq_length - r.padding_len + x = torch.cat( + [ + torch.full((r.padding_len,), 0, dtype=torch.long), + torch.ones((real_len,), dtype=torch.long), + ] + ) + data.append(x) + r.extra_kwargs["attention_mask_seq_len"] = real_len + return torch.stack(data).to(self._device) + + def build_decode_attention_mask( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + """ + Build attention mask for decode phase. + Note that the `seq_length` parameter is from merged kv_cache. + So we need pad `0` on the left again. + """ + data = [] + for r in reqs: + r.extra_kwargs["attention_mask_seq_len"] += 1 + attention_mask_seq_len = r.extra_kwargs["attention_mask_seq_len"] + pad_len = seq_length - attention_mask_seq_len + x = torch.cat( + [ + torch.full((pad_len,), 0, dtype=torch.long), + torch.ones((attention_mask_seq_len,), dtype=torch.long), + ] + ) + data.append(x) + return torch.stack(data).to(self._device) + + def build_prefill_position_ids( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + """ + Build position ids for prefill phase. + Padding `0` on the left. + Note that the parameter `seq_length` is from `input_ids`. + Record the `max_position_id` on request for the decode phase. + """ + res = [] + for r in reqs: + real_seq_len = seq_length - r.padding_len + res.append( + torch.cat( + [ + torch.full((r.padding_len,), 0, dtype=torch.long), + torch.arange(0, real_seq_len, dtype=torch.long), + ] + ) + ) + r.extra_kwargs["max_position_id"] = real_seq_len - 1 + return torch.stack(res).to(self._device) + + def build_decode_position_ids( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + """ + Build position ids for decode phase. + For most models, just let the `max_position_id` in previous step += 1 and use the latest `max_position_id` + """ + data = [] + for r in reqs: + r.extra_kwargs["max_position_id"] += 1 + data.append([r.extra_kwargs["max_position_id"]]) + position_ids = torch.as_tensor(data, dtype=torch.long, device=self._device) + return position_ids + + def build_prefill_token_type_ids( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + """ + Build token_type_ids for prefill phase. + For most models, this is not required. + """ + return None + + def build_decode_token_type_ids( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + """ + Build token_type_ids for decode phase. + For most models, this is not required. + """ + return None + + def build_prefill_inputs(self, prompts: List, req_list: List[InferenceRequest]): + """ + Get inputs for inference. Models may have their own impl. + """ + assert isinstance(prompts[0], str) + inputs = self._tokenizer(prompts, padding=False).input_ids + context_len = self.get_context_len() + input_ids = torch.as_tensor( + pad_prefill_tokens(inputs, context_len, req_list), device=self._device + ) + return input_ids + + def build_prefill_kwargs(self, prompts: List, req_list: List[InferenceRequest]): + """ + Get all inputs parameters for prefill phase. Models may have their own impl. + """ + input_ids = self.build_prefill_inputs(prompts, req_list) + res = {"input_ids": input_ids} + batch_size, seq_len = input_ids.shape + attention_mask = self.build_prefill_attention_mask( + batch_size, seq_len, req_list + ) + if attention_mask is not None: + res["attention_mask"] = attention_mask + position_ids = self.build_prefill_position_ids(batch_size, seq_len, req_list) + if position_ids is not None: + res["position_ids"] = position_ids + token_type_ids = self.build_prefill_token_type_ids( + batch_size, seq_len, req_list + ) + if token_type_ids is not None: + res["token_type_ids"] = token_type_ids + return res + + def build_decode_kwargs( + self, + prompts: List, + req_list: List[InferenceRequest], + batch_size: int, + seq_len: int, + ): + """ + Get all inputs parameters for decode phase. Models may have their own impl. + """ + res = {"input_ids": torch.as_tensor(prompts, device=self._device)} + attention_mask = self.build_decode_attention_mask(batch_size, seq_len, req_list) + if attention_mask is not None: + res["attention_mask"] = attention_mask + position_ids = self.build_decode_position_ids(batch_size, seq_len, req_list) + if position_ids is not None: + res["position_ids"] = position_ids + token_type_ids = self.build_decode_token_type_ids(batch_size, seq_len, req_list) + if token_type_ids is not None: + res["token_type_ids"] = token_type_ids + return res + @staticmethod - def require_attention_mask(): - return False + def get_batch_size_and_seq_len_indexes_from_kv() -> Tuple[int, int]: + """ + From huggingface transformers document, the `pask_key_values` has the shape of + `(batch_size, num_heads, sequence_length, embed_size_per_head)`. + However, for some models, the shape may be changed. + """ + return 0, 2 + + def get_dtype(self): + raise NotImplementedError("Not implemented.") @lru_cache def get_context_len(self): @@ -426,28 +590,38 @@ def prepare_sanitize_generate_config(self, req: InferenceRequest): def prepare_batch_inference(self, req_list: List[InferenceRequest]): # check some parameters for r in req_list: - if r.sanitized_generate_config is None: - r.sanitized_generate_config = self.prepare_sanitize_generate_config(r) - if r.is_prefill: - # check some generate params - max_src_len = get_max_src_len(self.get_context_len(), r) # type: ignore - if max_src_len < 0: - r.stopped = True - r.error_msg = "Max tokens exceeds model's max length" - continue - if r.stream_interval <= 0: - r.stopped = True - r.error_msg = "`stream_interval` must be greater than 0" - continue - stop_str = r.sanitized_generate_config.get("stop", None) - if stop_str and ( - not (isinstance(stop_str, str) or isinstance(stop_str, Iterable)) - ): - r.stopped = True - r.error_msg = "Invalid `stop` field type" - continue - - def _get_builtin_stop_token_ids(self) -> Tuple: + try: + if r.sanitized_generate_config is None: + r.sanitized_generate_config = self.prepare_sanitize_generate_config( + r + ) + if r.is_prefill: + # check some generate params + max_src_len = get_max_src_len(self.get_context_len(), r) # type: ignore + if max_src_len < 0: + r.stopped = True + r.error_msg = "Max tokens exceeds model's max length" + continue + if r.stream_interval <= 0: + r.stopped = True + r.error_msg = "`stream_interval` must be greater than 0" + continue + stop_str = r.sanitized_generate_config.get("stop", None) + if stop_str and ( + not ( + isinstance(stop_str, str) or isinstance(stop_str, Iterable) + ) + ): + r.stopped = True + r.error_msg = "Invalid `stop` field type" + continue + # Catch exception here. If not catch exception, the request would hang. + except Exception as e: + logger.exception(f"prepare inference error with {e}") + r.stopped = True + r.error_msg = str(e) + + def get_builtin_stop_token_ids(self) -> Tuple: return ( tuple(self.model_family.prompt_style.stop_token_ids) if self.model_family.prompt_style @@ -494,17 +668,8 @@ def batch_inference(self, req_list: List[InferenceRequest]): from .utils import batch_inference_one_step self.prepare_batch_inference(req_list) - context_len = self.get_context_len() - assert isinstance(context_len, int) batch_inference_one_step( - req_list, - self.model_uid, - self._model, - self._tokenizer, - self._device, - context_len, - self._get_builtin_stop_token_ids(), - require_attention_mask=self.require_attention_mask(), + self, req_list, self.model_uid, self._model, self._tokenizer ) self.handle_batch_inference_results(req_list) @@ -696,14 +861,20 @@ def _get_full_prompt(self, prompt, system_prompt, chat_history, tools): def prepare_batch_inference(self, req_list: List[InferenceRequest]): super().prepare_batch_inference(req_list) for r in req_list: - r.full_prompt = self._get_full_prompt( - r.prompt, r.system_prompt, r.chat_history, None - ) + try: + if not r.stopped and r.is_prefill: + r.full_prompt = self._get_full_prompt( + r.prompt, r.system_prompt, r.chat_history, None + ) + except Exception as e: + logger.exception(f"prepare inference error with {e}") + r.stopped = True + r.error_msg = str(e) def handle_batch_inference_results(self, req_list: List[InferenceRequest]): for req in req_list: - if req.stream and req.error_msg is None: - if req.completion: + if req.error_msg is None and req.completion: + if req.stream: results = [] for i, c in enumerate(req.completion): if c == "<bos_stream>": @@ -722,3 +893,5 @@ def handle_batch_inference_results(self, req_list: List[InferenceRequest]): self._get_final_chat_completion_chunk(req.completion[-1]) ) req.completion = results + else: + req.completion[0] = self._to_chat_completion(req.completion[0]) diff --git a/xinference/model/llm/pytorch/glm4v.py b/xinference/model/llm/pytorch/glm4v.py index 627463b97c..39e659934a 100644 --- a/xinference/model/llm/pytorch/glm4v.py +++ b/xinference/model/llm/pytorch/glm4v.py @@ -14,6 +14,7 @@ import base64 import logging import time +import typing import uuid from concurrent.futures import ThreadPoolExecutor from io import BytesIO @@ -24,6 +25,7 @@ import torch from PIL import Image +from ....core.scheduler import InferenceRequest from ....types import ( ChatCompletion, ChatCompletionChunk, @@ -36,6 +38,7 @@ from ...utils import select_device from ..llm_family import LLMFamilyV1, LLMSpecV1 from .core import PytorchChatModel, PytorchGenerateConfig +from .utils import get_max_src_len logger = logging.getLogger(__name__) @@ -69,7 +72,6 @@ def load(self): if quantization != "none": if self._device == "cuda" and self._is_linux(): kwargs["device_map"] = "auto" - self._device = "auto" if quantization == "4-bit": kwargs["load_in_4bit"] = True elif quantization == "8-bit": @@ -137,9 +139,6 @@ def _load_image(_url): fut = executor.submit(_load_image, image_url) image_futures.append(fut) images = [fut.result() for fut in image_futures] - # images = [] - # for image_url in image_urls: - # images.append(_load_image(image_url)) text = " ".join(texts) if len(images) == 0: return text, [] @@ -149,19 +148,11 @@ def _load_image(_url): raise RuntimeError("Only one image per message is supported") return content, [] - def chat( + def _get_chat_msgs( self, prompt: Union[str, List[Dict]], - system_prompt: Optional[str] = None, chat_history: Optional[List[ChatCompletionMessage]] = None, - generate_config: Optional[PytorchGenerateConfig] = None, - ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: - from transformers import TextIteratorStreamer - - if not generate_config: - generate_config = {} - - stream = generate_config.get("stream", False) + ): content, images_chat = self._message_content_to_chat(prompt) msgs = [] @@ -170,7 +161,7 @@ def chat( for h in chat_history or []: role = h["role"] content_h, images_tmp = self._message_content_to_chat(h["content"]) - if images_tmp != []: + if images_tmp: images_history = images_tmp if len(query_to_response) == 0 and role == "user": query_to_response.append({"role": "user", "content": content_h}) @@ -185,6 +176,22 @@ def chat( elif len(images_history) > 0: image = images_history[0] msgs.append({"role": "user", "content": content, "image": image}) + return msgs + + def chat( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[PytorchGenerateConfig] = None, + ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + from transformers import TextIteratorStreamer + + if not generate_config: + generate_config = {} + + stream = generate_config.get("stream", False) + msgs = self._get_chat_msgs(prompt, chat_history) inputs = self._tokenizer.apply_chat_template( msgs, @@ -282,3 +289,152 @@ def chat_stream(self, streamer, stop_str) -> Iterator[CompletionChunk]: ) chunk["usage"] = completion_usage yield chunk + + def _get_full_prompt(self, prompt, system_prompt, chat_history, tools): + msgs = self._get_chat_msgs(prompt, chat_history) + inputs = self._tokenizer.apply_chat_template( + msgs, + add_generation_prompt=True, + tokenize=True, + return_tensors="pt", + return_dict=True, + ) + return { + "input_ids": inputs.input_ids.squeeze(0), + "images": inputs.images.squeeze(0), + } + + def prepare_sanitize_generate_config(self, req: InferenceRequest): + """ + Refer to https://huggingface.co/THUDM/glm-4v-9b/blob/main/generation_config.json + """ + raw_config = req.inference_kwargs.get("raw_params", {}) + temperature = raw_config.get("temperature", None) + if temperature is None: + raw_config["temperature"] = 0.8 + top_p = raw_config.get("top_p", None) + if top_p is None: + raw_config["top_p"] = 0.8 + return raw_config + + def build_prefill_inputs(self, prompts: List, req_list: List[InferenceRequest]): + context_len = self.get_context_len() + assert isinstance(prompts[0], dict) + images = [] + max_length = float("-inf") + for i, feature in enumerate(prompts): + req = req_list[i] + if "images" in feature: + images.append(feature.pop("images", None)) + max_src_len = get_max_src_len(context_len, req) + input_ids = feature["input_ids"][-max_src_len:] + req.prompt_tokens = input_ids.tolist() + feature["input_ids"] = input_ids + max_length = max(len(input_ids), max_length) + + def pad_to_max_length_internal(feature, max_len, idx): + padding_length = max_len - len(feature["input_ids"]) + req_list[idx].padding_len = padding_length + feature["input_ids"] = torch.cat( + [torch.full((padding_length,), 0), feature["input_ids"]] + ) + return feature + + features = [ + pad_to_max_length_internal(feature, max_length, i) + for i, feature in enumerate(prompts) + ] + batch = { + key: torch.stack([feature[key] for feature in features]) + for key in features[0].keys() + } + if images: + batch["images"] = torch.stack(images).to(self._device) + batch["input_ids"] = batch["input_ids"].to(self._device) + return batch + + @staticmethod + def is_empty(images_list: Optional[List[List[torch.Tensor]]]): + """ + Copied from https://huggingface.co/THUDM/glm-4v-9b/blob/main/modeling_chatglm.py + """ + if images_list is None or len(images_list) == 0: + return True + for image_list in images_list: + if image_list is not None: + return False + return True + + @typing.no_type_check + def get_full_attention_mask( + self, attention_mask, input_ids, images, req_list: List[InferenceRequest] + ): + """ + Modified according to https://huggingface.co/THUDM/glm-4v-9b/blob/main/modeling_chatglm.py + """ + image_size: int = self._model.config.vision_config["image_size"] + patch_size: int = self._model.config.vision_config["patch_size"] + num_patches = (image_size // patch_size // 2) ** 2 + new_attention_masks = [] + + # if not image, use this default id + eoi_token_pos = 6 + boi_token_pos = 4 + + for i in range(len(input_ids)): + input_id = input_ids[i].tolist() + req = req_list[i] + if not self.is_empty(images): + _boi_token_pos, _eoi_token_pos = input_id.index( + self._model.config.boi_token_id + ), input_id.index(self._model.config.eoi_token_id) + else: + _boi_token_pos = boi_token_pos + req.padding_len + _eoi_token_pos = eoi_token_pos + req.padding_len + assert eoi_token_pos - boi_token_pos == 2 + new_attention_masks.append( + torch.cat( + ( + attention_mask[i, : _boi_token_pos + 1], + attention_mask.new_ones(num_patches), + attention_mask[i, _eoi_token_pos:], + ) + ) + ) + attention_mask = torch.stack(new_attention_masks, dim=0).to(self._device) + return attention_mask + + def build_prefill_kwargs(self, prompts: List, req_list: List[InferenceRequest]): + batch = self.build_prefill_inputs(prompts, req_list) + batch_size, seq_len = batch["input_ids"].shape + attention_mask = self.build_prefill_attention_mask( + batch_size, seq_len, req_list + ) + if attention_mask is not None: + full_attention_mask = self.get_full_attention_mask( + attention_mask, batch["input_ids"], batch["images"], req_list + ) + batch["attention_mask"] = full_attention_mask + for r in req_list: + r.extra_kwargs["attention_mask_seq_len"] = full_attention_mask.shape[1] + position_ids = self.build_prefill_position_ids(batch_size, seq_len, req_list) + if position_ids is not None: + batch["position_ids"] = position_ids + return batch + + def build_decode_attention_mask( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + max_seq_len = max(r.extra_kwargs["attention_mask_seq_len"] for r in reqs) + + new_attention_mask = [] + for r in reqs: + attn_mask_seq_len = r.extra_kwargs["attention_mask_seq_len"] + pad_len = max_seq_len - attn_mask_seq_len + new_attention_mask.append( + torch.cat( + [torch.full((pad_len,), 0), torch.ones((attn_mask_seq_len + 1,))] + ) + ) + r.extra_kwargs["attention_mask_seq_len"] += 1 + return torch.stack(new_attention_mask, dim=0).to(self._device) diff --git a/xinference/model/llm/pytorch/qwen_vl.py b/xinference/model/llm/pytorch/qwen_vl.py index 6301548ec8..100344441a 100644 --- a/xinference/model/llm/pytorch/qwen_vl.py +++ b/xinference/model/llm/pytorch/qwen_vl.py @@ -16,9 +16,14 @@ import operator import tempfile import time +import typing import uuid -from typing import Dict, Iterator, List, Optional, Union +from typing import Dict, Iterator, List, Optional, Tuple, Union +import torch +from transformers import PreTrainedTokenizer + +from ....core.scheduler import InferenceRequest from ....model.utils import select_device from ....types import ( ChatCompletion, @@ -31,6 +36,7 @@ ) from ..llm_family import LLMFamilyV1, LLMSpecV1 from .core import PytorchChatModel, PytorchGenerateConfig +from .utils import pad_prefill_tokens logger = logging.getLogger(__name__) @@ -40,6 +46,7 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._tokenizer = None self._model = None + self._device = None @classmethod def match( @@ -62,6 +69,7 @@ def load(self): device = self._pytorch_model_config.get("device", "auto") device = select_device(device) + self._device = device # for multiple GPU, set back to auto to make multiple devices work device = "auto" if device == "cuda" else device @@ -120,13 +128,11 @@ def _ensure_url(_url): return self._tokenizer.from_list_format(content) return content - def chat( + def _get_prompt_and_chat_history( self, prompt: Union[str, List[Dict]], - system_prompt: Optional[str] = None, chat_history: Optional[List[ChatCompletionMessage]] = None, - generate_config: Optional[PytorchGenerateConfig] = None, - ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + ): prompt = self._message_content_to_qwen(prompt) # Convert openai history to qwen vl history qwen_history = [] @@ -141,6 +147,18 @@ def chat( if len(query_to_response) == 2: qwen_history.append(query_to_response) query_to_response = [] + return prompt, qwen_history + + def chat( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[PytorchGenerateConfig] = None, + ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + prompt, qwen_history = self._get_prompt_and_chat_history( + prompt, chat_history=chat_history + ) stream = generate_config.get("stream", False) if generate_config else False stream_options = ( @@ -152,10 +170,10 @@ def chat( else False ) if stream: - it = self._generate_stream(prompt, qwen_history, include_usage) + it = self._generate_stream(prompt, qwen_history, include_usage) # type: ignore return self._to_chat_completion_chunks(it) else: - c = self._generate(prompt, qwen_history) + c = self._generate(prompt, qwen_history) # type: ignore return self._to_chat_completion(c) def _generate(self, prompt: str, qwen_history: List) -> Completion: @@ -244,3 +262,146 @@ def _generate_stream( total_tokens=total_tokens, ) yield chunk + + @staticmethod + def get_batch_size_and_seq_len_indexes_from_kv() -> Tuple[int, int]: + """ + Qwen-vl is very special for its kv_cache impl. + Its dimension is `bs * seq_len * head_num * dim`. + See https://huggingface.co/Qwen/Qwen-VL-Chat/blob/main/modeling_qwen.py + """ + return 0, 1 + + @staticmethod + @typing.no_type_check + def make_context( + tokenizer: PreTrainedTokenizer, + query: str, + history: List[Tuple[str, str]] = None, + system: str = "", + max_window_size: int = 6144, + chat_format: str = "chatml", + ): + """ + This function is from https://huggingface.co/Qwen/Qwen-VL-Chat/blob/main/qwen_generation_utils.py. + Use this function to get input_ids with image. + """ + if history is None: + history = [] + + if chat_format == "chatml": + im_start, im_end = "<|im_start|>", "<|im_end|>" + im_start_tokens = [tokenizer.im_start_id] + im_end_tokens = [tokenizer.im_end_id] + nl_tokens = tokenizer.encode("\n") + + def _tokenize_str(role, content): + return f"{role}\n{content}", tokenizer.encode( + role, allowed_special=set(tokenizer.IMAGE_ST) + ) + nl_tokens + tokenizer.encode( + content, allowed_special=set(tokenizer.IMAGE_ST) + ) + + system_text, system_tokens_part = _tokenize_str("system", system) + system_tokens = im_start_tokens + system_tokens_part + im_end_tokens + + raw_text = "" + context_tokens = [] + + for turn_query, turn_response in reversed(history): + query_text, query_tokens_part = _tokenize_str("user", turn_query) + query_tokens = im_start_tokens + query_tokens_part + im_end_tokens + if turn_response is not None: + response_text, response_tokens_part = _tokenize_str( + "assistant", turn_response + ) + response_tokens = ( + im_start_tokens + response_tokens_part + im_end_tokens + ) + + next_context_tokens = ( + nl_tokens + query_tokens + nl_tokens + response_tokens + ) + prev_chat = f"\n{im_start}{query_text}{im_end}\n{im_start}{response_text}{im_end}" + else: + next_context_tokens = nl_tokens + query_tokens + nl_tokens + prev_chat = f"\n{im_start}{query_text}{im_end}\n" + + current_context_size = ( + len(system_tokens) + len(next_context_tokens) + len(context_tokens) + ) + if current_context_size < max_window_size: + context_tokens = next_context_tokens + context_tokens + raw_text = prev_chat + raw_text + else: + break + + context_tokens = system_tokens + context_tokens + raw_text = f"{im_start}{system_text}{im_end}" + raw_text + context_tokens += ( + nl_tokens + + im_start_tokens + + _tokenize_str("user", query)[1] + + im_end_tokens + + nl_tokens + + im_start_tokens + + tokenizer.encode("assistant") + + nl_tokens + ) + raw_text += f"\n{im_start}user\n{query}{im_end}\n{im_start}assistant\n" + + elif chat_format == "raw": + raw_text = query + context_tokens = tokenizer.encode(raw_text) + else: + raise NotImplementedError(f"Unknown chat format {chat_format!r}") + + return raw_text, context_tokens + + def _get_full_prompt(self, prompt, system_prompt, chat_history, tools): + prompt, qwen_history = self._get_prompt_and_chat_history( + prompt, chat_history=chat_history + ) + _, context_tokens = self.make_context(self._tokenizer, prompt, qwen_history) + return context_tokens + + def prepare_sanitize_generate_config(self, req: InferenceRequest): + """ + Refer to https://huggingface.co/Qwen/Qwen-VL-Chat/blob/main/generation_config.json + """ + raw_config = req.inference_kwargs.get("raw_params", {}) + top_p = raw_config.get("top_p", None) + if top_p is None: + raw_config["top_p"] = 0.3 + top_k = raw_config.get("top_k", None) + if top_k is None: + raw_config["top_k"] = 0 + return raw_config + + def build_prefill_inputs(self, prompts: List, req_list: List[InferenceRequest]): + context_len = self.get_context_len() + inputs = pad_prefill_tokens(prompts, context_len, req_list) + input_ids = torch.as_tensor( + pad_prefill_tokens(inputs, context_len, req_list), device=self._device + ) + return input_ids + + def build_prefill_position_ids( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + """ + Qwen-vl fill `1` for position_ids padding + """ + res = [] + for r in reqs: + real_seq_len = seq_length - r.padding_len + res.append( + torch.cat( + [ + torch.full((r.padding_len,), 1, dtype=torch.long), + torch.arange(0, real_seq_len, dtype=torch.long), + ] + ) + ) + r.extra_kwargs["max_position_id"] = real_seq_len - 1 + return torch.stack(res).to(self._device) diff --git a/xinference/model/llm/pytorch/utils.py b/xinference/model/llm/pytorch/utils.py index fb066eec4f..3e29472880 100644 --- a/xinference/model/llm/pytorch/utils.py +++ b/xinference/model/llm/pytorch/utils.py @@ -17,7 +17,7 @@ import os import time import uuid -from typing import Dict, Iterable, Iterator, List, Optional, Tuple +from typing import TYPE_CHECKING, Dict, Iterable, Iterator, List, Optional, Tuple import torch from transformers.cache_utils import DynamicCache @@ -39,6 +39,10 @@ max_tokens_field, ) +if TYPE_CHECKING: + from ...llm.pytorch.core import PytorchModel + + logger = logging.getLogger(__name__) @@ -414,6 +418,19 @@ def get_max_src_len(context_len: int, r: InferenceRequest) -> int: return context_len - max_new_tokens - 8 +def pad_prefill_tokens( + input_ids: List[List[int]], context_len: int, req_list: List[InferenceRequest] +): + prompt_tokens = [] + for i, input_id in enumerate(input_ids): + req = req_list[i] + max_src_len = get_max_src_len(context_len, req) + req.prompt_tokens = input_id[-max_src_len:] + prompt_tokens.append(req.prompt_tokens) + _pad_seqs_inplace(prompt_tokens, req_list, 0) + return prompt_tokens + + def _get_completion_chunk( output: str, chunk_id: str, @@ -481,23 +498,33 @@ def _get_completion( return completion +def _get_pad_param(seq_len_idx: int, pad_len: int) -> Tuple: + dimensions = [0] * 8 + dimensions[-2 * (seq_len_idx + 1)] = pad_len + return tuple(dimensions) + + def _merge_kv_cache( - past_kv: Tuple[Tuple[torch.Tensor]], new_kv: Tuple[Tuple[torch.Tensor]] + xinf_model_obj: "PytorchModel", + past_kv: Tuple[Tuple[torch.Tensor]], + new_kv: Tuple[Tuple[torch.Tensor]], ): from torch.nn.functional import pad + _, seq_len_idx = xinf_model_obj.get_batch_size_and_seq_len_indexes_from_kv() past_cache = DynamicCache.from_legacy_cache(past_kv) new_cache = DynamicCache.from_legacy_cache(new_kv) - past_seq_len = past_cache.get_seq_length() - new_seq_len = new_cache.get_seq_length() + past_seq_len = past_kv[0][0].shape[seq_len_idx] + new_seq_len = new_kv[0][0].shape[seq_len_idx] if past_seq_len != new_seq_len: padding_target = new_cache if past_seq_len > new_seq_len else past_cache padding_len = abs(past_seq_len - new_seq_len) + pad_param = _get_pad_param(seq_len_idx, padding_len) for idx in range(len(padding_target)): k = padding_target.key_cache[idx] v = padding_target.value_cache[idx] - _k = pad(k, (0, 0, padding_len, 0)) - _v = pad(v, (0, 0, padding_len, 0)) + _k = pad(k, pad_param) + _v = pad(v, pad_param) padding_target.key_cache[idx] = _k padding_target.value_cache[idx] = _v @@ -509,36 +536,19 @@ def _merge_kv_cache( return ret_kv.to_legacy_cache() -def _get_attention_mask_and_position_ids(kv, reqs: List[InferenceRequest]): - batch_size, seq_length, device = ( - kv[0][0].shape[0], - kv[0][0].shape[2], - kv[0][0].device, - ) - seq_length = seq_length + 1 - position_ids = torch.as_tensor([[seq_length - 1]], dtype=torch.long, device=device) - attention_mask = torch.ones( - (batch_size, seq_length), dtype=torch.long, device=device - ) - padding_lens = torch.as_tensor([r.padding_len for r in reqs]) - mask = torch.arange(seq_length).expand( - batch_size, seq_length - ) < padding_lens.unsqueeze(1) - attention_mask[mask] = 0 - return attention_mask, position_ids +def get_batch_size_and_seq_len_from_kv_cache(kv, xinf_model_obj: "PytorchModel"): + bs_idx, seq_len_idx = xinf_model_obj.get_batch_size_and_seq_len_indexes_from_kv() + return kv[0][0].shape[bs_idx], kv[0][0].shape[seq_len_idx] + 1 @torch.inference_mode() def _batch_inference_one_step_internal( + xinf_model_obj: "PytorchModel", req_list: List[InferenceRequest], model_uid, model, tokenizer, - device, - context_len: int, - stop_tokens: Tuple[int], decode_round: int = 16, - require_attention_mask: bool = False, bos_flag: str = "<bos_stream>", eos_flag: str = "<eos_stream>", ): @@ -548,7 +558,9 @@ def _batch_inference_one_step_internal( if not valid_req_list: return generate_config_mapping: Dict[InferenceRequest, Tuple] = { - r: r.get_generate_configs(tokenizer.eos_token_id, stop_tokens) + r: r.get_generate_configs( + tokenizer.eos_token_id, xinf_model_obj.get_builtin_stop_token_ids() + ) for r in valid_req_list } s_time = time.time() @@ -564,15 +576,8 @@ def _batch_inference_one_step_internal( decode_reqs.append(r) if prompts: # prefill first - input_ids: List[List[int]] = tokenizer(prompts, padding=False).input_ids - prompt_tokens = [] - for i, input_id in enumerate(input_ids): - req = valid_req_list[i] - max_src_len = get_max_src_len(context_len, req) - req.prompt_tokens = input_id[-max_src_len:] - prompt_tokens.append(req.prompt_tokens) - _pad_seqs_inplace(prompt_tokens, valid_req_list, 0) - out = model(torch.as_tensor(prompt_tokens, device=device), use_cache=True) + prefill_kws = xinf_model_obj.build_prefill_kwargs(prompts, prefill_reqs) + out = model(**prefill_kws, use_cache=True) logits = out.logits past_key_values = out.past_key_values @@ -599,7 +604,9 @@ def _batch_inference_one_step_internal( if decode_reqs: decode_kv = decode_reqs[0].kv_cache # prefill and decode kv cache need to be merged at `batch_size` and `seq_len` dimensions. - merged_kv_cache = _merge_kv_cache(decode_kv, past_key_values) + merged_kv_cache = _merge_kv_cache( + xinf_model_obj, decode_kv, past_key_values + ) for r in valid_req_list: r.kv_cache = merged_kv_cache empty_cache() @@ -612,20 +619,14 @@ def _batch_inference_one_step_internal( output_mapping: Dict[InferenceRequest, str] = {} # here, only decode phase, just run some rounds for _i in range(decode_round): + batch_size, seq_len = get_batch_size_and_seq_len_from_kv_cache( + past_key_values, xinf_model_obj + ) decode_tokens: List[List[int]] = [[r.new_tokens[-1]] for r in valid_req_list] - inf_kws = {} - if require_attention_mask: - attention_mask, position_ids = _get_attention_mask_and_position_ids( - past_key_values, valid_req_list - ) - inf_kws["position_ids"] = position_ids - inf_kws["attention_mask"] = attention_mask - out = model( - input_ids=torch.as_tensor(decode_tokens, device=device), - use_cache=True, - past_key_values=past_key_values, - **inf_kws, + inf_kws = xinf_model_obj.build_decode_kwargs( + decode_tokens, valid_req_list, batch_size, seq_len ) + out = model(**inf_kws, use_cache=True, past_key_values=past_key_values) logits = out.logits past_key_values = out.past_key_values @@ -755,27 +756,17 @@ def _batch_inference_one_step_internal( def batch_inference_one_step( + xinf_model_obj: "PytorchModel", req_list: List[InferenceRequest], model_uid, model, tokenizer, - device, - context_len: int, - stop_token_ids: Tuple[int], - require_attention_mask: bool = False, ): from ....core.model import OutOfMemoryError try: _batch_inference_one_step_internal( - req_list, - model_uid, - model, - tokenizer, - device, - context_len, - stop_token_ids, - require_attention_mask=require_attention_mask, + xinf_model_obj, req_list, model_uid, model, tokenizer ) except OutOfMemoryError: logger.exception( From e99bc6eca05622e5f8c5d58f186cf623efbc0e5e Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Thu, 4 Jul 2024 15:41:07 +0800 Subject: [PATCH 178/298] ENH: Add guard for model launching (#1680) --- xinference/core/worker.py | 119 ++++++++++++++++++++++++-------------- 1 file changed, 74 insertions(+), 45 deletions(-) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 303550d197..dac5e3c288 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -73,6 +73,9 @@ def __init__( self._main_pool.recover_sub_pool = self.recover_sub_pool # internal states. + # temporary placeholder during model launch process: + self._model_uid_launching_guard: Dict[str, bool] = {} + # attributes maintained after model launched: self._model_uid_to_model: Dict[str, xo.ActorRefType["ModelActor"]] = {} self._model_uid_to_model_spec: Dict[str, ModelDescription] = {} self._gpu_to_model_uid: Dict[int, str] = {} @@ -594,10 +597,14 @@ async def launch_builtin_model( launch_args.pop("kwargs") launch_args.update(kwargs) - event_model_uid, _, __ = parse_replica_model_uid(model_uid) + try: + origin_uid, _, _ = parse_replica_model_uid(model_uid) + except Exception as e: + logger.exception(e) + raise try: await self._event_collector_ref.report_event( - event_model_uid, + origin_uid, Event( event_type=EventType.INFO, event_ts=int(time.time()), @@ -640,50 +647,55 @@ async def launch_builtin_model( assert model_uid not in self._model_uid_to_model self._check_model_is_valid(model_name, model_format) - subpool_address, devices = await self._create_subpool( - model_uid, model_type, n_gpu=n_gpu, gpu_idx=gpu_idx - ) + if self.get_model_launch_status(model_uid) is not None: + raise ValueError(f"{model_uid} is running") try: - origin_uid, _, _ = parse_replica_model_uid(model_uid) - model, model_description = await asyncio.to_thread( - create_model_instance, - subpool_address, - devices, - model_uid, - model_type, - model_name, - model_engine, - model_format, - model_size_in_billions, - quantization, - peft_model_config, - **kwargs, - ) - await self.update_cache_status(model_name, model_description) - model_ref = await xo.create_actor( - ModelActor, - address=subpool_address, - uid=model_uid, - worker_address=self.address, - model=model, - model_description=model_description, - request_limits=request_limits, + self._model_uid_launching_guard[model_uid] = True + subpool_address, devices = await self._create_subpool( + model_uid, model_type, n_gpu=n_gpu, gpu_idx=gpu_idx ) - await model_ref.load() - except: - logger.error(f"Failed to load model {model_uid}", exc_info=True) - self.release_devices(model_uid=model_uid) - await self._main_pool.remove_sub_pool(subpool_address) - raise - self._model_uid_to_model[model_uid] = model_ref - self._model_uid_to_model_spec[model_uid] = model_description - self._model_uid_to_addr[model_uid] = subpool_address - self._model_uid_to_recover_count.setdefault( - model_uid, MODEL_ACTOR_AUTO_RECOVER_LIMIT - ) - self._model_uid_to_launch_args[model_uid] = launch_args + try: + model, model_description = await asyncio.to_thread( + create_model_instance, + subpool_address, + devices, + model_uid, + model_type, + model_name, + model_engine, + model_format, + model_size_in_billions, + quantization, + peft_model_config, + **kwargs, + ) + await self.update_cache_status(model_name, model_description) + model_ref = await xo.create_actor( + ModelActor, + address=subpool_address, + uid=model_uid, + worker_address=self.address, + model=model, + model_description=model_description, + request_limits=request_limits, + ) + await model_ref.load() + except: + logger.error(f"Failed to load model {model_uid}", exc_info=True) + self.release_devices(model_uid=model_uid) + await self._main_pool.remove_sub_pool(subpool_address) + raise + self._model_uid_to_model[model_uid] = model_ref + self._model_uid_to_model_spec[model_uid] = model_description + self._model_uid_to_addr[model_uid] = subpool_address + self._model_uid_to_recover_count.setdefault( + model_uid, MODEL_ACTOR_AUTO_RECOVER_LIMIT + ) + self._model_uid_to_launch_args[model_uid] = launch_args + finally: + del self._model_uid_launching_guard[model_uid] # update status to READY abilities = await self._get_model_ability(model, model_type) @@ -694,10 +706,13 @@ async def launch_builtin_model( @log_async(logger=logger) async def terminate_model(self, model_uid: str): - event_model_uid, _, __ = parse_replica_model_uid(model_uid) + # Terminate model while its launching is not allow + if model_uid in self._model_uid_launching_guard: + raise ValueError(f"{model_uid} is launching") + origin_uid, _, __ = parse_replica_model_uid(model_uid) try: await self._event_collector_ref.report_event( - event_model_uid, + origin_uid, Event( event_type=EventType.INFO, event_ts=int(time.time()), @@ -708,7 +723,6 @@ async def terminate_model(self, model_uid: str): # Report callback error can be log and ignore, should not interrupt the Process logger.error("report_event error: %s" % (e)) - origin_uid, _, _ = parse_replica_model_uid(model_uid) await self._status_guard_ref.update_instance_info( origin_uid, {"status": LaunchStatus.TERMINATING.name} ) @@ -740,6 +754,21 @@ async def terminate_model(self, model_uid: str): origin_uid, {"status": LaunchStatus.TERMINATED.name} ) + # Provide an interface for future version of supervisor to call + def get_model_launch_status(self, model_uid: str) -> Optional[str]: + """ + returns: + CREATING: model is launching + RREADY: model is running + None: model is not running (launch error might have happened) + """ + + if model_uid in self._model_uid_launching_guard: + return LaunchStatus.CREATING.name + if model_uid in self._model_uid_to_model: + return LaunchStatus.READY.name + return None + @log_async(logger=logger) async def list_models(self) -> Dict[str, Dict[str, Any]]: ret = {} From 9a54bc3450811ef3084fb99f1e02ef6e10ba1b52 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 4 Jul 2024 16:16:30 +0800 Subject: [PATCH 179/298] BUG: Fix python client returns documents for rerank task by default (#1780) --- xinference/client/restful/restful_client.py | 2 -- xinference/model/rerank/tests/test_rerank.py | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 9a1bfe9df7..59547c16fa 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -182,8 +182,6 @@ def rerank( f"Failed to rerank documents, detail: {response.json()['detail']}" ) response_data = response.json() - for r in response_data["results"]: - r["document"] = documents[r["index"]] return response_data diff --git a/xinference/model/rerank/tests/test_rerank.py b/xinference/model/rerank/tests/test_rerank.py index 7314e5b964..af1ff9bb44 100644 --- a/xinference/model/rerank/tests/test_rerank.py +++ b/xinference/model/rerank/tests/test_rerank.py @@ -45,14 +45,14 @@ def test_restful_api(model_name, setup): "A cheetah is running behind its prey.", ] - scores = model.rerank(corpus, query) + scores = model.rerank(corpus, query, return_documents=True) assert scores["results"][0]["index"] == 0 - assert scores["results"][0]["document"] == corpus[0] + assert scores["results"][0]["document"]["text"] == corpus[0] - scores = model.rerank(corpus, query, top_n=3) + scores = model.rerank(corpus, query, top_n=3, return_documents=True) assert len(scores["results"]) == 3 assert scores["results"][0]["index"] == 0 - assert scores["results"][0]["document"] == corpus[0] + assert scores["results"][0]["document"]["text"] == corpus[0] scores = model.rerank(corpus, query, return_len=True) assert ( From 8fff9e7cefb3ee17ffc1f8da381554a7f29d424b Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 4 Jul 2024 16:41:26 +0800 Subject: [PATCH 180/298] DOC: Update continuous batching and docker usage (#1785) --- .../getting_started/using_docker_image.rst | 2 +- .../getting_started/using_docker_image.po | 22 ++--- .../user_guide/continuous_batching.po | 87 +++++++++++++++---- doc/source/user_guide/continuous_batching.rst | 34 +++++++- 4 files changed, 112 insertions(+), 33 deletions(-) diff --git a/doc/source/getting_started/using_docker_image.rst b/doc/source/getting_started/using_docker_image.rst index 896014bbb8..7f335e3b31 100644 --- a/doc/source/getting_started/using_docker_image.rst +++ b/doc/source/getting_started/using_docker_image.rst @@ -11,7 +11,7 @@ Prerequisites ============= * The image can only run in an environment with GPUs and CUDA installed, because Xinference in the image relies on Nvidia GPUs for acceleration. * CUDA must be successfully installed on the host machine. This can be determined by whether you can successfully execute the ``nvidia-smi`` command. -* The CUDA version in the docker image is ``12.1``, and the CUDA version on the host machine should ideally be consistent with it. Be sure to keep the CUDA version on your host machine between ``11.8`` and ``12.2``, even if it is inconsistent. +* The CUDA version in the docker image is ``12.4``, and the CUDA version on the host machine should be ``12.4`` or above, and the NVIDIA driver version should be ``550`` or above. Docker Image diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_docker_image.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_docker_image.po index f1b381d763..ae41dc7823 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_docker_image.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_docker_image.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-30 14:54+0800\n" +"POT-Creation-Date: 2024-07-04 15:14+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.14.0\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/getting_started/using_docker_image.rst:5 msgid "Xinference Docker Image" @@ -25,7 +25,7 @@ msgstr "Docker 镜像" #: ../../source/getting_started/using_docker_image.rst:7 msgid "Xinference provides official images for use on Dockerhub." -msgstr "Xinference 在 Dockerhub 中上传了官方镜像。" +msgstr "Xinference 在 Dockerhub 和 阿里云容器镜像服务 中上传了官方镜像。" #: ../../source/getting_started/using_docker_image.rst:11 msgid "Prerequisites" @@ -48,13 +48,12 @@ msgstr "保证 CUDA 在机器上正确安装。可以使用 ``nvidia-smi`` 检 #: ../../source/getting_started/using_docker_image.rst:14 msgid "" -"The CUDA version in the docker image is ``12.1``, and the CUDA version on" -" the host machine should ideally be consistent with it. Be sure to keep " -"the CUDA version on your host machine between ``11.8`` and ``12.2``, even" -" if it is inconsistent." +"The CUDA version in the docker image is ``12.4``, and the CUDA version on" +" the host machine should be ``12.4`` or above, and the NVIDIA driver " +"version should be ``550`` or above." msgstr "" -"镜像中的 CUDA 版本是 ``12.1`` ,推荐机器上的版本与之保持一致。如果不一致" -",需要保证CUDA 版本在 ``11.8`` 与 ``12.2`` 之间。" +"镜像中的 CUDA 版本为 ``12.4`` 。为了不出现预期之外的问题,请将宿主机的 CUDA 版本和 NVIDIA Driver 版本分别" +"升级到 ``12.4`` 和 ``550`` 以上。" #: ../../source/getting_started/using_docker_image.rst:18 msgid "Docker Image" @@ -65,7 +64,10 @@ msgid "" "The official image of Xinference is available on DockerHub in the " "repository ``xprobe/xinference``. Available tags include:" msgstr "" -"Xinference 的官方镜像在 Dockerhub 的 ``xprobe/xinference`` 仓库里。目前可用版本包括:" +"当前,可以通过两个渠道拉取 Xinference 的官方镜像。" +"1. 在 Dockerhub 的 ``xprobe/xinference`` 仓库里。" +"2. Dockerhub 中的镜像会同步上传一份到阿里云公共镜像仓库中,供访问 Dockerhub 有困难的用户拉取。" +"拉取命令:``docker pull registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference:<tag>`` 。目前可用的标签包括:" #: ../../source/getting_started/using_docker_image.rst:22 msgid "" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/continuous_batching.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/continuous_batching.po index b192ebc6df..427e855a09 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/continuous_batching.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/continuous_batching.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-07 14:38+0800\n" +"POT-Creation-Date: 2024-07-04 16:08+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -28,8 +28,8 @@ msgid "" " Xinference aims to provide this optimization capability when using the " "transformers engine as well." msgstr "" -"连续批处理是诸如 ``VLLM`` 这样的推理引擎中提升吞吐的重要技术。Xinference 旨在" -"通过这项技术提升 ``transformers`` 推理引擎的吞吐。" +"连续批处理是诸如 ``VLLM`` 这样的推理引擎中提升吞吐的重要技术。Xinference " +"旨在通过这项技术提升 ``transformers`` 推理引擎的吞吐。" #: ../../source/user_guide/continuous_batching.rst:11 msgid "Usage" @@ -45,35 +45,76 @@ msgid "" "``XINFERENCE_TRANSFORMERS_ENABLE_BATCHING`` to ``1`` when starting " "xinference. For example:" msgstr "" -"首先,启动 Xinference 时需要将环境变量 ``XINFERENCE_TRANSFORMERS_ENABLE_BATCHING`` 置为 ``1`` 。" +"首先,启动 Xinference 时需要将环境变量 ``XINFERENCE_TRANSFORMERS_ENABLE_" +"BATCHING`` 置为 ``1`` 。" #: ../../source/user_guide/continuous_batching.rst:21 msgid "" "Then, ensure that the ``transformers`` engine is selected when launching " "the model. For example:" -msgstr "" -"然后,启动 LLM 模型时选择 ``transformers`` 推理引擎。例如:" +msgstr "然后,启动 LLM 模型时选择 ``transformers`` 推理引擎。例如:" #: ../../source/user_guide/continuous_batching.rst:57 msgid "" -"Once this feature is enabled, all ``chat`` requests will be managed by " +"Once this feature is enabled, all requests for LLMs will be managed by " "continuous batching, and the average throughput of requests made to a " -"single model will increase. The usage of the ``chat`` interface remains " +"single model will increase. The usage of the LLM interface remains " "exactly the same as before, with no differences." msgstr "" -"一旦此功能开启,``chat`` 接口将被此功能接管,别的接口不受影响。``chat`` 接口的使用方式没有任何变化。" +"一旦此功能开启,LLM 模型的所有接口将被此功能接管。所有接口的使用方式没有" +"任何变化。" + +#: ../../source/user_guide/continuous_batching.rst:63 +msgid "Abort your request" +msgstr "中止请求" + +#: ../../source/user_guide/continuous_batching.rst:64 +msgid "In this mode, you can abort requests that are in the process of inference." +msgstr "" +"此功能中,你可以优雅地中止正在推理中的请求。" + +#: ../../source/user_guide/continuous_batching.rst:66 +msgid "First, add ``request_id`` option in ``generate_config``. For example:" +msgstr "" +"首先,在推理请求的 ``generate_config`` 中指定 ``request_id`` 选项。例如:" + +#: ../../source/user_guide/continuous_batching.rst:75 +msgid "" +"Then, abort the request using the ``request_id`` you have set. For " +"example:" +msgstr "" +"接着,带着你指定的 ``request_id`` 去中止该请求。例如:" -#: ../../source/user_guide/continuous_batching.rst:62 +#: ../../source/user_guide/continuous_batching.rst:83 +msgid "" +"Note that if your request has already finished, aborting the request will" +" be a no-op." +msgstr "" +"注意,如果你的请求已经结束,那么此操作将什么都不做。" + +#: ../../source/user_guide/continuous_batching.rst:86 msgid "Note" msgstr "注意事项" -#: ../../source/user_guide/continuous_batching.rst:64 +#: ../../source/user_guide/continuous_batching.rst:88 msgid "" -"Currently, this feature only supports the ``chat`` interface for ``LLM`` " -"models." -msgstr "当前,此功能仅支持 LLM 模型的 ``chat`` 功能。" +"Currently, this feature only supports the ``generate``, ``chat`` and " +"``vision`` tasks for ``LLM`` models. The ``tool call`` tasks are not " +"supported." +msgstr "" +"当前,此功能仅支持 LLM 模型的 ``generate``, ``chat`` 和 ``vision`` (多" +"模态) 功能。``tool call`` (工具调用)暂时不支持。" -#: ../../source/user_guide/continuous_batching.rst:66 +#: ../../source/user_guide/continuous_batching.rst:90 +msgid "" +"For ``vision`` tasks, currently only ``qwen-vl-chat``, ``cogvlm2``, and " +"``glm-4v`` models are supported. More models will be supported in the " +"future. Please let us know your requirements." +msgstr "" +"对于多模态任务,当前支持 ``qwen-vl-chat`` ,``cogvlm2`` 和 ``glm-4v`` " +"模型。未来将加入更多模型,敬请期待。" + +#: ../../source/user_guide/continuous_batching.rst:92 msgid "" "If using GPU inference, this method will consume more GPU memory. Please " "be cautious when increasing the number of concurrent requests to the same" @@ -81,13 +122,21 @@ msgid "" "parameter to adjust the concurrency level, with a default value of " "``16``." msgstr "" -"如果使用 GPU 推理,此功能对显存要求较高。因此请谨慎提高对同一个模型的并发请求量。" -"``launch_model`` 接口提供可选参数 ``max_num_seqs`` 用于调整并发度,默认值为 ``16`` 。" +"如果使用 GPU 推理,此功能对显存要求较高。因此请谨慎提高对同一个模型的并发" +"请求量。``launch_model`` 接口提供可选参数 ``max_num_seqs`` 用于调整并发度" +",默认值为 ``16`` 。" -#: ../../source/user_guide/continuous_batching.rst:69 +#: ../../source/user_guide/continuous_batching.rst:95 msgid "" "This feature is still in the experimental stage, and we welcome your " "active feedback on any issues." +msgstr "此功能仍处于实验阶段,欢迎反馈任何问题。" + +#: ../../source/user_guide/continuous_batching.rst:97 +msgid "" +"After a period of testing, this method will remain enabled by default, " +"and the original inference method will be deprecated." msgstr "" -"此功能仍处于实验阶段,欢迎反馈任何问题。" +"一段时间的测试之后,此功能将代替原来的 transformers 推理逻辑成为默认行为" +"。原来的推理逻辑将被摒弃。" diff --git a/doc/source/user_guide/continuous_batching.rst b/doc/source/user_guide/continuous_batching.rst index 7c3a468099..47269fbd0a 100644 --- a/doc/source/user_guide/continuous_batching.rst +++ b/doc/source/user_guide/continuous_batching.rst @@ -54,16 +54,44 @@ Currently, this feature can be enabled under the following conditions: print('Model uid: ' + model_uid) -Once this feature is enabled, all ``chat`` requests will be managed by continuous batching, +Once this feature is enabled, all requests for LLMs will be managed by continuous batching, and the average throughput of requests made to a single model will increase. -The usage of the ``chat`` interface remains exactly the same as before, with no differences. +The usage of the LLM interface remains exactly the same as before, with no differences. + + +Abort your request +================== +In this mode, you can abort requests that are in the process of inference. + +#. First, add ``request_id`` option in ``generate_config``. For example: + +.. code-block:: bash + + from xinference.client import Client + client = Client("http://127.0.0.1:9997") + model = client.get_model("<model_uid>") + model.chat("<prompt>", generate_config={"request_id": "<your_unique_request_id>"}) + +#. Then, abort the request using the ``request_id`` you have set. For example: + +.. code-block:: bash + + from xinference.client import Client + client = Client("http://127.0.0.1:9997") + client.abort_request("<model_uid>", "<your_unique_request_id>") + +Note that if your request has already finished, aborting the request will be a no-op. Note ==== -* Currently, this feature only supports the ``chat`` interface for ``LLM`` models. +* Currently, this feature only supports the ``generate``, ``chat`` and ``vision`` tasks for ``LLM`` models. The ``tool call`` tasks are not supported. + +* For ``vision`` tasks, currently only ``qwen-vl-chat``, ``cogvlm2``, and ``glm-4v`` models are supported. More models will be supported in the future. Please let us know your requirements. * If using GPU inference, this method will consume more GPU memory. Please be cautious when increasing the number of concurrent requests to the same model. The ``launch_model`` interface provides the ``max_num_seqs`` parameter to adjust the concurrency level, with a default value of ``16``. * This feature is still in the experimental stage, and we welcome your active feedback on any issues. + +* After a period of testing, this method will remain enabled by default, and the original inference method will be deprecated. From 3cb13678305c1d146bf8e450e8867b80c9af675a Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 5 Jul 2024 12:02:33 +0800 Subject: [PATCH 181/298] FEAT: support MLX engine (#1765) --- .github/workflows/python.yaml | 8 + .../models/builtin/llm/qwen2-instruct.rst | 72 +++- setup.cfg | 3 + xinference/model/llm/__init__.py | 5 + xinference/model/llm/llm_family.json | 32 ++ xinference/model/llm/llm_family.py | 40 +- .../model/llm/llm_family_modelscope.json | 27 ++ xinference/model/llm/mlx/__init__.py | 13 + xinference/model/llm/mlx/core.py | 408 ++++++++++++++++++ xinference/model/llm/mlx/tests/__init__.py | 13 + xinference/model/llm/mlx/tests/test_mlx.py | 41 ++ xinference/model/llm/utils.py | 12 +- 12 files changed, 661 insertions(+), 13 deletions(-) create mode 100644 xinference/model/llm/mlx/__init__.py create mode 100644 xinference/model/llm/mlx/core.py create mode 100644 xinference/model/llm/mlx/tests/__init__.py create mode 100644 xinference/model/llm/mlx/tests/test_mlx.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 921ff6e40a..5332fd3f08 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -82,6 +82,7 @@ jobs: - { os: windows-latest, python-version: 3.10 } include: - { os: self-hosted, module: gpu, python-version: 3.9} + - { os: macos-latest, module: metal, python-version: "3.10" } steps: - name: Check out code @@ -109,6 +110,9 @@ jobs: sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" fi + if [ "$MODULE" == "metal" ]; then + pip install mlx-lm + fi pip install "llama-cpp-python==0.2.77" pip install transformers pip install attrdict @@ -162,6 +166,10 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_chattts.py + elif [ "$MODULE" == "metal" ]; then + pytest --timeout=1500 \ + -W ignore::PendingDeprecationWarning \ + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/llm/mlx/tests/test_mlx.py else pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ diff --git a/doc/source/models/builtin/llm/qwen2-instruct.rst b/doc/source/models/builtin/llm/qwen2-instruct.rst index 16d3baf516..629ce9aefa 100644 --- a/doc/source/models/builtin/llm/qwen2-instruct.rst +++ b/doc/source/models/builtin/llm/qwen2-instruct.rst @@ -206,7 +206,71 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 72 --model-format awq --quantization ${quantization} -Model Spec 13 (ggufv2, 0_5 Billion) +Model Spec 13 (mlx, 0_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 0_5 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** Qwen/Qwen2-0.5B-Instruct-MLX +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-MLX>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-MLX>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format mlx --quantization ${quantization} + + +Model Spec 14 (mlx, 1_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 1_5 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** Qwen/Qwen2-1.5B-Instruct-MLX +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-MLX>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-MLX>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 1_5 --model-format mlx --quantization ${quantization} + + +Model Spec 15 (mlx, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** Qwen/Qwen2-7B-Instruct-MLX +- **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-7B-Instruct-MLX>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-MLX>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 7 --model-format mlx --quantization ${quantization} + + +Model Spec 16 (mlx, 72 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 72 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Qwen2-72B-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Qwen2-72B-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 72 --model-format mlx --quantization ${quantization} + + +Model Spec 17 (ggufv2, 0_5 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -222,7 +286,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format ggufv2 --quantization ${quantization} -Model Spec 14 (ggufv2, 1_5 Billion) +Model Spec 18 (ggufv2, 1_5 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -238,7 +302,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 1_5 --model-format ggufv2 --quantization ${quantization} -Model Spec 15 (ggufv2, 7 Billion) +Model Spec 19 (ggufv2, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -254,7 +318,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} -Model Spec 16 (ggufv2, 72 Billion) +Model Spec 20 (ggufv2, 72 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 diff --git a/setup.cfg b/setup.cfg index a2ef1422ad..b99dd6492e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -103,6 +103,7 @@ all = optimum outlines==0.0.34 # sglang errored for outlines > 0.0.34 sglang[all] ; sys_platform=='linux' + mlx-lm ; sys_platform=='darwin' and platform_machine=='arm64' attrdict # For deepseek VL timm>=0.9.16 # For deepseek VL torchvision # For deepseek VL @@ -143,6 +144,8 @@ vllm = vllm>=0.2.6 sglang = sglang[all] +mlx = + mlx-lm embedding = sentence-transformers>=2.7.0 rerank = diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index fb56d82488..1313d73196 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -34,6 +34,7 @@ BUILTIN_MODELSCOPE_LLM_FAMILIES, LLAMA_CLASSES, LLM_ENGINES, + MLX_CLASSES, SGLANG_CLASSES, SUPPORTED_ENGINES, TRANSFORMERS_CLASSES, @@ -42,6 +43,7 @@ GgmlLLMSpecV1, LLMFamilyV1, LLMSpecV1, + MLXLLMSpecV1, PromptStyleV1, PytorchLLMSpecV1, get_cache_status, @@ -112,6 +114,7 @@ def generate_engine_config_by_model_family(model_family): def _install(): from .ggml.chatglm import ChatglmCppChatModel from .ggml.llamacpp import LlamaCppChatModel, LlamaCppModel + from .mlx.core import MLXChatModel, MLXModel from .pytorch.baichuan import BaichuanPytorchChatModel from .pytorch.chatglm import ChatglmPytorchChatModel from .pytorch.cogvlm2 import CogVLM2Model @@ -147,6 +150,7 @@ def _install(): ) SGLANG_CLASSES.extend([SGLANGModel, SGLANGChatModel]) VLLM_CLASSES.extend([VLLMModel, VLLMChatModel]) + MLX_CLASSES.extend([MLXModel, MLXChatModel]) TRANSFORMERS_CLASSES.extend( [ BaichuanPytorchChatModel, @@ -176,6 +180,7 @@ def _install(): SUPPORTED_ENGINES["SGLang"] = SGLANG_CLASSES SUPPORTED_ENGINES["Transformers"] = TRANSFORMERS_CLASSES SUPPORTED_ENGINES["llama.cpp"] = LLAMA_CLASSES + SUPPORTED_ENGINES["MLX"] = MLX_CLASSES json_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "llm_family.json" diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 17e3a87c5e..b34436d974 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -2549,6 +2549,38 @@ ], "model_id": "Qwen/Qwen2-72B-Instruct-AWQ" }, + { + "model_format": "mlx", + "model_size_in_billions": "0_5", + "quantizations": [ + "4-bit" + ], + "model_id": "Qwen/Qwen2-0.5B-Instruct-MLX" + }, + { + "model_format": "mlx", + "model_size_in_billions": "1_5", + "quantizations": [ + "4-bit" + ], + "model_id": "Qwen/Qwen2-1.5B-Instruct-MLX" + }, + { + "model_format": "mlx", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit" + ], + "model_id": "Qwen/Qwen2-7B-Instruct-MLX" + }, + { + "model_format": "mlx", + "model_size_in_billions": 72, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Qwen2-72B-Instruct-4bit" + }, { "model_format": "ggufv2", "model_size_in_billions": "0_5", diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index a405d8f532..7ea575fb65 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -107,6 +107,28 @@ def validate_model_size_with_radix(cls, v: object) -> object: return v +class MLXLLMSpecV1(BaseModel): + model_format: Literal["mlx"] + # Must in order that `str` first, then `int` + model_size_in_billions: Union[str, int] + quantizations: List[str] + model_id: Optional[str] + model_hub: str = "huggingface" + model_uri: Optional[str] + model_revision: Optional[str] + + @validator("model_size_in_billions", pre=False) + def validate_model_size_with_radix(cls, v: object) -> object: + if isinstance(v, str): + if ( + "_" in v + ): # for example, "1_8" just returns "1_8", otherwise int("1_8") returns 18 + return v + else: + return int(v) + return v + + class PromptStyleV1(BaseModel): style_name: str system_prompt: str = "" @@ -226,7 +248,7 @@ def parse_raw( LLMSpecV1 = Annotated[ - Union[GgmlLLMSpecV1, PytorchLLMSpecV1], + Union[GgmlLLMSpecV1, PytorchLLMSpecV1, MLXLLMSpecV1], Field(discriminator="model_format"), ] @@ -249,6 +271,8 @@ def parse_raw( VLLM_CLASSES: List[Type[LLM]] = [] +MLX_CLASSES: List[Type[LLM]] = [] + LLM_ENGINES: Dict[str, Dict[str, List[Dict[str, Any]]]] = {} SUPPORTED_ENGINES: Dict[str, List[Type[LLM]]] = {} @@ -549,7 +573,7 @@ def _get_meta_path( return os.path.join(cache_dir, "__valid_download") else: return os.path.join(cache_dir, f"__valid_download_{model_hub}") - elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq"]: + elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "mlx"]: assert quantization is not None if model_hub == "huggingface": return os.path.join(cache_dir, f"__valid_download_{quantization}") @@ -588,7 +612,7 @@ def _skip_download( logger.warning(f"Cache {cache_dir} exists, but it was from {hub}") return True return False - elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq"]: + elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "mlx"]: assert quantization is not None return os.path.exists( _get_meta_path(cache_dir, model_format, model_hub, quantization) @@ -683,7 +707,7 @@ def cache_from_csghub( ): return cache_dir - if llm_spec.model_format in ["pytorch", "gptq", "awq"]: + if llm_spec.model_format in ["pytorch", "gptq", "awq", "mlx"]: download_dir = retry_download( snapshot_download, llm_family.model_name, @@ -751,7 +775,7 @@ def cache_from_modelscope( ): return cache_dir - if llm_spec.model_format in ["pytorch", "gptq", "awq"]: + if llm_spec.model_format in ["pytorch", "gptq", "awq", "mlx"]: download_dir = retry_download( snapshot_download, llm_family.model_name, @@ -820,8 +844,8 @@ def cache_from_huggingface( if not IS_NEW_HUGGINGFACE_HUB: use_symlinks = {"local_dir_use_symlinks": True, "local_dir": cache_dir} - if llm_spec.model_format in ["pytorch", "gptq", "awq"]: - assert isinstance(llm_spec, PytorchLLMSpecV1) + if llm_spec.model_format in ["pytorch", "gptq", "awq", "mlx"]: + assert isinstance(llm_spec, (PytorchLLMSpecV1, MLXLLMSpecV1)) download_dir = retry_download( huggingface_hub.snapshot_download, llm_family.model_name, @@ -910,7 +934,7 @@ def get_cache_status( ] return any(revisions) # just check meta file for ggml and gptq model - elif llm_spec.model_format in ["ggmlv3", "ggufv2", "gptq", "awq"]: + elif llm_spec.model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "mlx"]: ret = [] for q in llm_spec.quantizations: assert q is not None diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 796248c5f9..c9f7051d35 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2921,6 +2921,33 @@ "model_id": "qwen/Qwen2-72B-Instruct-AWQ", "model_hub": "modelscope" }, + { + "model_format": "mlx", + "model_size_in_billions": "0_5", + "quantizations": [ + "4-bit" + ], + "model_id": "qwen/Qwen2-0.5B-Instruct-MLX", + "model_hub": "modelscope" + }, + { + "model_format": "mlx", + "model_size_in_billions": "1_5", + "quantizations": [ + "4-bit" + ], + "model_id": "qwen/Qwen2-1.5B-Instruct-MLX", + "model_hub": "modelscope" + }, + { + "model_format": "mlx", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit" + ], + "model_id": "qwen/Qwen2-7B-Instruct-MLX", + "model_hub": "modelscope" + }, { "model_format": "ggufv2", "model_size_in_billions": "0_5", diff --git a/xinference/model/llm/mlx/__init__.py b/xinference/model/llm/mlx/__init__.py new file mode 100644 index 0000000000..37f6558d95 --- /dev/null +++ b/xinference/model/llm/mlx/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/xinference/model/llm/mlx/core.py b/xinference/model/llm/mlx/core.py new file mode 100644 index 0000000000..c344c2f594 --- /dev/null +++ b/xinference/model/llm/mlx/core.py @@ -0,0 +1,408 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import platform +import sys +import time +import uuid +from typing import Dict, Iterable, Iterator, List, Optional, TypedDict, Union + +from ....fields import max_tokens_field +from ....types import ( + ChatCompletion, + ChatCompletionChunk, + ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionChunk, + CompletionUsage, + LoRA, +) +from ..core import LLM +from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import ChatModelMixin + +logger = logging.getLogger(__name__) + + +class MLXModelConfig(TypedDict, total=False): + revision: Optional[str] + max_gpu_memory: str + trust_remote_code: bool + + +class MLXGenerateConfig(TypedDict, total=False): + max_tokens: int + temperature: float + repetition_penalty: Optional[float] + repetition_context_size: Optional[float] + top_p: float + logit_bias: Optional[Dict[int, float]] + stop: Optional[Union[str, List[str]]] + stop_token_ids: Optional[Union[int, List[int]]] + stream: bool + stream_options: Optional[Union[dict, None]] + + +class MLXModel(LLM): + def __init__( + self, + model_uid: str, + model_family: "LLMFamilyV1", + model_spec: "LLMSpecV1", + quantization: str, + model_path: str, + model_config: Optional[MLXModelConfig] = None, + peft_model: Optional[List[LoRA]] = None, + ): + super().__init__(model_uid, model_family, model_spec, quantization, model_path) + self._use_fast_tokenizer = True + self._model_config: MLXModelConfig = self._sanitize_model_config(model_config) + if peft_model is not None: + raise ValueError("MLX engine has not supported lora yet") + + def _sanitize_model_config( + self, model_config: Optional[MLXModelConfig] + ) -> MLXModelConfig: + if model_config is None: + model_config = MLXModelConfig() + model_config.setdefault("revision", self.model_spec.model_revision) + model_config.setdefault("trust_remote_code", True) + return model_config + + def _sanitize_generate_config( + self, + generate_config: Optional[MLXGenerateConfig], + ) -> MLXGenerateConfig: + if generate_config is None: + generate_config = MLXGenerateConfig() + + generate_config.setdefault("max_tokens", max_tokens_field.default) + # default config is adapted from + # https://github.com/ml-explore/mlx-examples/blob/f212b770d8b5143e23102eda20400ae43340f844/llms/mlx_lm/utils.py#L129 + generate_config.setdefault("temperature", 0.0) + generate_config.setdefault("repetition_penalty", None) + generate_config.setdefault("repetition_context_size", 20) + generate_config.setdefault("top_p", 1.0) + generate_config.setdefault("logit_bias", None) + return generate_config + + def _load_model(self, **kwargs): + try: + from mlx_lm import load + except ImportError: + error_message = "Failed to import module 'mlx_lm'" + installation_guide = [ + "Please make sure 'mlx_lm' is installed. ", + "You can install it by `pip install mlx_lm`\n", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + tokenizer_config = dict( + use_fast=self._use_fast_tokenizer, + trust_remote_code=kwargs["trust_remote_code"], + revision=kwargs["revision"], + ) + logger.debug( + "loading model with tokenizer config: %s, model config: %s", + tokenizer_config, + self._model_config, + ) + + return load( + self.model_path, + tokenizer_config=tokenizer_config, + model_config=self._model_config, + ) + + def load(self): + kwargs = {} + kwargs["revision"] = self._model_config.get( + "revision", self.model_spec.model_revision + ) + kwargs["trust_remote_code"] = self._model_config.get("trust_remote_code") + + self._model, self._tokenizer = self._load_model(**kwargs) + + @classmethod + def match( + cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str + ) -> bool: + if llm_spec.model_format not in ["mlx"]: + return False + if sys.platform != "darwin" or platform.processor() != "arm": + # only work for Mac M chips + return False + if "generate" not in llm_family.model_ability: + return False + return True + + def _generate_stream(self, prompt: str, kwargs: MLXGenerateConfig): + import mlx.core as mx + from mlx_lm.utils import generate_step + + model = self._model + model_uid = self.model_uid + tokenizer = self._tokenizer + max_tokens = kwargs["max_tokens"] + chunk_id = str(uuid.uuid4()) + stop_token_ids = kwargs.get("stop_token_ids", []) + stream = kwargs.get("stream", False) + stream_options = kwargs.pop("stream_options", None) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) + + prompt_tokens = mx.array(tokenizer.encode(prompt)) + input_echo_len = len(prompt_tokens) + + i = 0 + start = time.time() + output = "" + for (token, _), i in zip( + generate_step( + prompt_tokens, + model, + temp=kwargs["temperature"], + repetition_penalty=kwargs["repetition_penalty"], + repetition_context_size=kwargs["repetition_context_size"], + top_p=kwargs["top_p"], + logit_bias=kwargs["logit_bias"], + ), + range(max_tokens), + ): + if token == tokenizer.eos_token_id or token in stop_token_ids: # type: ignore + break + + # Yield the last segment if streaming + out = tokenizer.decode( + token, + skip_special_tokens=True, + spaces_between_special_tokens=False, + clean_up_tokenization_spaces=True, + ) + + if stream: + # this special character is mainly for qwen + out = out.strip("�") + output = out + else: + output += out + + completion_choice = CompletionChoice( + text=output, index=0, logprobs=None, finish_reason=None + ) + completion_chunk = CompletionChunk( + id=chunk_id, + object="text_completion", + created=int(time.time()), + model=model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=input_echo_len, + completion_tokens=i, + total_tokens=(input_echo_len + i), + ) + + yield completion_chunk, completion_usage + + logger.info( + f"Average generation speed: {i / (time.time() - start):.2f} tokens/s." + ) + + if i == max_tokens - 1: + finish_reason = "length" + else: + finish_reason = "stop" + + if stream: + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason=finish_reason + ) + else: + completion_choice = CompletionChoice( + text=output, index=0, logprobs=None, finish_reason=finish_reason + ) + + completion_chunk = CompletionChunk( + id=chunk_id, + object="text_completion", + created=int(time.time()), + model=model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=input_echo_len, + completion_tokens=i, + total_tokens=(input_echo_len + i), + ) + + yield completion_chunk, completion_usage + + if include_usage: + completion_chunk = CompletionChunk( + id=chunk_id, + object="text_completion", + created=int(time.time()), + model=model_uid, + choices=[], + ) + completion_usage = CompletionUsage( + prompt_tokens=input_echo_len, + completion_tokens=i, + total_tokens=(input_echo_len + i), + ) + yield completion_chunk, completion_usage + + def generate( + self, prompt: str, generate_config: Optional[MLXGenerateConfig] = None + ) -> Union[Completion, Iterator[CompletionChunk]]: + def generator_wrapper( + prompt: str, generate_config: MLXGenerateConfig + ) -> Iterator[CompletionChunk]: + for completion_chunk, completion_usage in self._generate_stream( + prompt, + generate_config, + ): + completion_chunk["usage"] = completion_usage + yield completion_chunk + + logger.debug( + "Enter generate, prompt: %s, generate config: %s", prompt, generate_config + ) + + generate_config = self._sanitize_generate_config(generate_config) + + assert self._model is not None + assert self._tokenizer is not None + + stream = generate_config.get("stream", False) + if not stream: + for completion_chunk, completion_usage in self._generate_stream( + prompt, + generate_config, + ): + pass + completion = Completion( + id=completion_chunk["id"], + object=completion_chunk["object"], + created=completion_chunk["created"], + model=completion_chunk["model"], + choices=completion_chunk["choices"], + usage=completion_usage, + ) + return completion + else: + return generator_wrapper(prompt, generate_config) + + +class MLXChatModel(MLXModel, ChatModelMixin): + def __init__( + self, + model_uid: str, + model_family: "LLMFamilyV1", + model_spec: "LLMSpecV1", + quantization: str, + model_path: str, + model_config: Optional[MLXModelConfig] = None, + peft_model: Optional[List[LoRA]] = None, + ): + super().__init__( + model_uid, + model_family, + model_spec, + quantization, + model_path, + model_config, + peft_model, + ) + + def _sanitize_generate_config( + self, + generate_config: Optional[MLXGenerateConfig], + ) -> MLXGenerateConfig: + generate_config = super()._sanitize_generate_config(generate_config) + if ( + (not generate_config.get("stop")) + and self.model_family.prompt_style + and self.model_family.prompt_style.stop + ): + generate_config["stop"] = self.model_family.prompt_style.stop.copy() + if ( + generate_config.get("stop_token_ids", None) is None + and self.model_family.prompt_style + and self.model_family.prompt_style.stop_token_ids + ): + generate_config[ + "stop_token_ids" + ] = self.model_family.prompt_style.stop_token_ids.copy() + + return generate_config + + @classmethod + def match( + cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str + ) -> bool: + if llm_spec.model_format not in ["mlx"]: + return False + if sys.platform != "darwin" or platform.processor() != "arm": + # only work for Mac M chips + return False + if "chat" not in llm_family.model_ability: + return False + return True + + def chat( + self, + prompt: str, + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[MLXGenerateConfig] = None, + ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + tools = generate_config.pop("tools", []) if generate_config else None # type: ignore + full_prompt = self.get_full_prompt( + self.model_family, prompt, system_prompt, chat_history, tools + ) + + generate_config = self._sanitize_generate_config(generate_config) + # TODO(codingl2k1): qwen hacky to set stop for function call. + model_family = self.model_family.model_family or self.model_family.model_name + if tools and model_family in ["qwen-chat", "qwen1.5-chat"]: + stop = generate_config.get("stop") + if isinstance(stop, str): + generate_config["stop"] = [stop, "Observation:"] + elif isinstance(stop, Iterable): + assert not isinstance(stop, str) + generate_config["stop"] = list(stop) + ["Observation:"] + else: + generate_config["stop"] = "Observation:" + + stream = generate_config.get("stream", False) + if stream: + it = self.generate(full_prompt, generate_config) + assert isinstance(it, Iterator) + return self._to_chat_completion_chunks(it) + else: + c = self.generate(full_prompt, generate_config) + assert not isinstance(c, Iterator) + if tools: + return self._tool_calls_completion( + self.model_family, self.model_uid, c, tools + ) + return self._to_chat_completion(c) diff --git a/xinference/model/llm/mlx/tests/__init__.py b/xinference/model/llm/mlx/tests/__init__.py new file mode 100644 index 0000000000..37f6558d95 --- /dev/null +++ b/xinference/model/llm/mlx/tests/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/xinference/model/llm/mlx/tests/test_mlx.py b/xinference/model/llm/mlx/tests/test_mlx.py new file mode 100644 index 0000000000..4fe69fd34f --- /dev/null +++ b/xinference/model/llm/mlx/tests/test_mlx.py @@ -0,0 +1,41 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import platform +import sys + +import pytest + +from .....client import Client + + +@pytest.mark.skipif( + sys.platform != "darwin" or platform.processor() != "arm", + reason="MLX only works for Apple silicon chip", +) +def test_load_mlx(setup): + endpoint, _ = setup + client = Client(endpoint) + + model_uid = client.launch_model( + model_name="qwen2-instruct", + model_engine="MLX", + model_size_in_billions="0_5", + model_format="mlx", + quantization="4-bit", + ) + assert len(client.list_models()) == 1 + model = client.get_model(model_uid) + completion = model.chat("write a poem.") + assert "content" in completion["choices"][0]["message"] + assert len(completion["choices"][0]["message"]["content"]) != 0 diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 34a7a21720..0ab967a344 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -765,6 +765,16 @@ def _tool_calls_completion(cls, model_family, model_uid, c, tools): "usage": usage, } + @classmethod + def get_full_prompt(cls, model_family, prompt, system_prompt, chat_history, tools): + assert model_family.prompt_style is not None + prompt_style = model_family.prompt_style.copy() + if system_prompt: + prompt_style.system_prompt = system_prompt + chat_history = chat_history or [] + full_prompt = cls.get_prompt(prompt, chat_history, prompt_style, tools=tools) + return full_prompt + def get_file_location( llm_family: LLMFamilyV1, spec: LLMSpecV1, quantization: str @@ -781,7 +791,7 @@ def get_file_location( is_cached = cache_status assert isinstance(is_cached, bool) - if spec.model_format in ["pytorch", "gptq", "awq"]: + if spec.model_format in ["pytorch", "gptq", "awq", "mlx"]: return cache_dir, is_cached elif spec.model_format in ["ggmlv3", "ggufv2"]: assert isinstance(spec, GgmlLLMSpecV1) From aa1772f97e7ff5ed1e9e0676aeb9a46bbb0e09f9 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:18:26 +0200 Subject: [PATCH 182/298] BUG: Fix LLM based reranker may raise a TypeError (#1794) --- xinference/model/rerank/core.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index 73ffaa0fd8..9c8b2662c2 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -17,6 +17,7 @@ import os import uuid from collections import defaultdict +from collections.abc import Sequence from typing import Dict, List, Optional, Tuple import numpy as np @@ -217,7 +218,11 @@ def rerank( if similarity_scores.dtype == torch.bfloat16: similarity_scores = similarity_scores.float() else: + # Related issue: https://github.com/xorbitsai/inference/issues/1775 similarity_scores = self._model.compute_score(sentence_combinations) + if not isinstance(similarity_scores, Sequence): + similarity_scores = [similarity_scores] + sim_scores_argsort = list(reversed(np.argsort(similarity_scores))) if top_n is not None: sim_scores_argsort = sim_scores_argsort[:top_n] From aada9b455f8a642dbba1e69efcdb725c2315e2f0 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 5 Jul 2024 18:18:42 +0800 Subject: [PATCH 183/298] BUG: fix deepseek-vl-chat (#1795) --- xinference/thirdparty/deepseek_vl/serve/__init__.py | 13 +++++++++++++ .../deepseek_vl/serve/app_modules/__init__.py | 13 +++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 xinference/thirdparty/deepseek_vl/serve/__init__.py create mode 100644 xinference/thirdparty/deepseek_vl/serve/app_modules/__init__.py diff --git a/xinference/thirdparty/deepseek_vl/serve/__init__.py b/xinference/thirdparty/deepseek_vl/serve/__init__.py new file mode 100644 index 0000000000..37f6558d95 --- /dev/null +++ b/xinference/thirdparty/deepseek_vl/serve/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/xinference/thirdparty/deepseek_vl/serve/app_modules/__init__.py b/xinference/thirdparty/deepseek_vl/serve/app_modules/__init__.py new file mode 100644 index 0000000000..37f6558d95 --- /dev/null +++ b/xinference/thirdparty/deepseek_vl/serve/app_modules/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. From 007408c55272bc343821dd152df780de5dc9c037 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 5 Jul 2024 18:19:09 +0800 Subject: [PATCH 184/298] FEAT: add gemma-2-it (#1774) --- xinference/model/llm/llm_family.json | 93 +++++++++++++++++++ .../model/llm/llm_family_modelscope.json | 47 ++++++++++ 2 files changed, 140 insertions(+) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index b34436d974..cb735ab0a7 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -6143,6 +6143,99 @@ ] } }, + { + "version": 1, + "context_length": 8192, + "model_name": "gemma-2-it", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "Gemma is a family of lightweight, state-of-the-art open models from Google, built from the same research and technology used to create the Gemini models.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "none", + "4-bit", + "8-bit" + ], + "model_id": "google/gemma-2-9b-it" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 27, + "quantizations": [ + "none", + "4-bit", + "8-bit" + ], + "model_id": "google/gemma-2-27b-it" + }, + { + "model_format": "mlx", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/gemma-2-9b-it-4bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 9, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/gemma-2-9b-it-8bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 9, + "quantizations": [ + "None" + ], + "model_id": "mlx-community/gemma-2-9b-it-fp16" + }, + { + "model_format": "mlx", + "model_size_in_billions": 27, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/gemma-2-27b-it-4bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 27, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/gemma-2-27b-it-8bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 27, + "quantizations": [ + "None" + ], + "model_id": "mlx-community/gemma-2-27b-it-fp16" + } + ], + "prompt_style": { + "style_name": "gemma", + "roles": [ + "user", + "model" + ], + "stop": [ + "<end_of_turn>", + "<start_of_turn>" + ] + } + }, { "version": 1, "context_length": 4096, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index c9f7051d35..e7e8fb3394 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3738,6 +3738,53 @@ ] } }, + { + "version": 1, + "context_length": 8192, + "model_name": "gemma-2-it", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "Gemma is a family of lightweight, state-of-the-art open models from Google, built from the same research and technology used to create the Gemini models.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "none", + "4-bit", + "8-bit" + ], + "model_id": "AI-ModelScope/gemma-2-9b-it", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 27, + "quantizations": [ + "none", + "4-bit", + "8-bit" + ], + "model_id": "AI-ModelScope/gemma-2-27b-it", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "gemma", + "roles": [ + "user", + "model" + ], + "stop": [ + "<end_of_turn>", + "<start_of_turn>" + ] + } + }, { "version":1, "context_length":2048, From c94c038e5b095631a474052797afc13fdf79187b Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Mon, 8 Jul 2024 03:16:02 +0200 Subject: [PATCH 185/298] ENH: Update ChatTTS (#1776) --- .github/workflows/python.yaml | 3 +- setup.cfg | 6 +- xinference/model/audio/chattts.py | 12 +- xinference/model/audio/tests/test_chattts.py | 5 +- xinference/thirdparty/ChatTTS/__init__.py | 1 - xinference/thirdparty/ChatTTS/core.py | 200 ------------- .../ChatTTS/experimental/__init__.py | 0 .../thirdparty/ChatTTS/experimental/llm.py | 40 --- .../thirdparty/ChatTTS/infer/__init__.py | 0 xinference/thirdparty/ChatTTS/infer/api.py | 125 --------- .../thirdparty/ChatTTS/model/__init__.py | 0 xinference/thirdparty/ChatTTS/model/dvae.py | 155 ---------- xinference/thirdparty/ChatTTS/model/gpt.py | 265 ------------------ .../thirdparty/ChatTTS/utils/__init__.py | 0 .../thirdparty/ChatTTS/utils/gpu_utils.py | 23 -- .../thirdparty/ChatTTS/utils/infer_utils.py | 141 ---------- .../thirdparty/ChatTTS/utils/io_utils.py | 14 - 17 files changed, 12 insertions(+), 978 deletions(-) delete mode 100644 xinference/thirdparty/ChatTTS/__init__.py delete mode 100644 xinference/thirdparty/ChatTTS/core.py delete mode 100644 xinference/thirdparty/ChatTTS/experimental/__init__.py delete mode 100644 xinference/thirdparty/ChatTTS/experimental/llm.py delete mode 100644 xinference/thirdparty/ChatTTS/infer/__init__.py delete mode 100644 xinference/thirdparty/ChatTTS/infer/api.py delete mode 100644 xinference/thirdparty/ChatTTS/model/__init__.py delete mode 100644 xinference/thirdparty/ChatTTS/model/dvae.py delete mode 100644 xinference/thirdparty/ChatTTS/model/gpt.py delete mode 100644 xinference/thirdparty/ChatTTS/utils/__init__.py delete mode 100644 xinference/thirdparty/ChatTTS/utils/gpu_utils.py delete mode 100644 xinference/thirdparty/ChatTTS/utils/infer_utils.py delete mode 100644 xinference/thirdparty/ChatTTS/utils/io_utils.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 5332fd3f08..3a5c824a3f 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -152,11 +152,10 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m conda install -c conda-forge pynini=2.1.5 ${{ env.SELF_HOST_PYTHON }} -m pip install -U nemo_text_processing ${{ env.SELF_HOST_PYTHON }} -m pip install -U omegaconf~=2.3.0 - ${{ env.SELF_HOST_PYTHON }} -m pip install -U vector_quantize_pytorch - ${{ env.SELF_HOST_PYTHON }} -m pip install -U vocos ${{ env.SELF_HOST_PYTHON }} -m pip install -U WeTextProcessing ${{ env.SELF_HOST_PYTHON }} -m pip install -U librosa ${{ env.SELF_HOST_PYTHON }} -m pip install -U xxhash + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "ChatTTS>0.1" ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/image/tests/test_stable_diffusion.py diff --git a/setup.cfg b/setup.cfg index b99dd6492e..8f2928aafb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -109,12 +109,11 @@ all = torchvision # For deepseek VL FlagEmbedding # For rerank omegaconf~=2.3.0 # For ChatTTS - vector_quantize_pytorch # For ChatTTS - vocos # For ChatTTS nemo_text_processing # For ChatTTS WeTextProcessing # For ChatTTS librosa # For ChatTTS xxhash # For ChatTTS + ChatTTS>0.1 boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 intel = @@ -155,12 +154,11 @@ image = controlnet_aux audio = omegaconf~=2.3.0 - vector_quantize_pytorch - vocos nemo_text_processing WeTextProcessing librosa xxhash + ChatTTS>0.1 doc = ipython>=6.5.0 sphinx>=3.0.0 diff --git a/xinference/model/audio/chattts.py b/xinference/model/audio/chattts.py index be9d17605e..3a77295935 100644 --- a/xinference/model/audio/chattts.py +++ b/xinference/model/audio/chattts.py @@ -38,21 +38,19 @@ def __init__( self._kwargs = kwargs def load(self): + import ChatTTS import torch - from xinference.thirdparty import ChatTTS - torch._dynamo.config.cache_size_limit = 64 torch._dynamo.config.suppress_errors = True torch.set_float32_matmul_precision("high") self._model = ChatTTS.Chat() - self._model.load_models( - source="local", local_path=self._model_path, compile=True - ) + self._model.load(source="custom", custom_path=self._model_path, compile=True) def speech( self, input: str, voice: str, response_format: str = "mp3", speed: float = 1.0 ): + import ChatTTS import numpy as np import torch import torchaudio @@ -71,7 +69,9 @@ def speech( default = 5 infer_speed = int(default * speed) - params_infer_code = {"spk_emb": rnd_spk_emb, "prompt": f"[speed_{infer_speed}]"} + params_infer_code = ChatTTS.Chat.InferCodeParams( + prompt=f"[speed_{infer_speed}]", spk_emb=rnd_spk_emb + ) assert self._model is not None wavs = self._model.infer([input], params_infer_code=params_infer_code) diff --git a/xinference/model/audio/tests/test_chattts.py b/xinference/model/audio/tests/test_chattts.py index f526ebc6fa..973d4145c1 100644 --- a/xinference/model/audio/tests/test_chattts.py +++ b/xinference/model/audio/tests/test_chattts.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - +import os.path import tempfile @@ -40,5 +40,6 @@ def test_chattts(setup): response = client.audio.speech.create( model=model_uid, input=input_string, voice="echo" ) - with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as f: + with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f: response.stream_to_file(f.name) + assert os.stat(f.name).st_size > 0 diff --git a/xinference/thirdparty/ChatTTS/__init__.py b/xinference/thirdparty/ChatTTS/__init__.py deleted file mode 100644 index 0f4c079ba7..0000000000 --- a/xinference/thirdparty/ChatTTS/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .core import Chat \ No newline at end of file diff --git a/xinference/thirdparty/ChatTTS/core.py b/xinference/thirdparty/ChatTTS/core.py deleted file mode 100644 index facfbb4d24..0000000000 --- a/xinference/thirdparty/ChatTTS/core.py +++ /dev/null @@ -1,200 +0,0 @@ - -import os -import logging -from functools import partial -from omegaconf import OmegaConf - -import torch -from vocos import Vocos -from .model.dvae import DVAE -from .model.gpt import GPT_warpper -from .utils.gpu_utils import select_device -from .utils.infer_utils import count_invalid_characters, detect_language, apply_character_map, apply_half2full_map -from .utils.io_utils import get_latest_modified_file -from .infer.api import refine_text, infer_code - -from huggingface_hub import snapshot_download - -logging.basicConfig(level = logging.INFO) - - -class Chat: - def __init__(self, ): - self.pretrain_models = {} - self.normalizer = {} - self.logger = logging.getLogger(__name__) - - def check_model(self, level = logging.INFO, use_decoder = False): - not_finish = False - check_list = ['vocos', 'gpt', 'tokenizer'] - - if use_decoder: - check_list.append('decoder') - else: - check_list.append('dvae') - - for module in check_list: - if module not in self.pretrain_models: - self.logger.log(logging.WARNING, f'{module} not initialized.') - not_finish = True - - if not not_finish: - self.logger.log(level, f'All initialized.') - - return not not_finish - - def load_models(self, source='huggingface', force_redownload=False, local_path='<LOCAL_PATH>', **kwargs): - if source == 'huggingface': - hf_home = os.getenv('HF_HOME', os.path.expanduser("~/.cache/huggingface")) - try: - download_path = get_latest_modified_file(os.path.join(hf_home, 'hub/models--2Noise--ChatTTS/snapshots')) - except: - download_path = None - if download_path is None or force_redownload: - self.logger.log(logging.INFO, f'Download from HF: https://huggingface.co/2Noise/ChatTTS') - download_path = snapshot_download(repo_id="2Noise/ChatTTS", allow_patterns=["*.pt", "*.yaml"]) - else: - self.logger.log(logging.INFO, f'Load from cache: {download_path}') - elif source == 'local': - self.logger.log(logging.INFO, f'Load from local: {local_path}') - download_path = local_path - - self._load(**{k: os.path.join(download_path, v) for k, v in OmegaConf.load(os.path.join(download_path, 'config', 'path.yaml')).items()}, **kwargs) - - def _load( - self, - vocos_config_path: str = None, - vocos_ckpt_path: str = None, - dvae_config_path: str = None, - dvae_ckpt_path: str = None, - gpt_config_path: str = None, - gpt_ckpt_path: str = None, - decoder_config_path: str = None, - decoder_ckpt_path: str = None, - tokenizer_path: str = None, - device: str = None, - compile: bool = True, - ): - if not device: - device = select_device(4096) - self.logger.log(logging.INFO, f'use {device}') - - if vocos_config_path: - vocos = Vocos.from_hparams(vocos_config_path).to(device).eval() - assert vocos_ckpt_path, 'vocos_ckpt_path should not be None' - vocos.load_state_dict(torch.load(vocos_ckpt_path)) - self.pretrain_models['vocos'] = vocos - self.logger.log(logging.INFO, 'vocos loaded.') - - if dvae_config_path: - cfg = OmegaConf.load(dvae_config_path) - dvae = DVAE(**cfg).to(device).eval() - assert dvae_ckpt_path, 'dvae_ckpt_path should not be None' - dvae.load_state_dict(torch.load(dvae_ckpt_path, map_location='cpu')) - self.pretrain_models['dvae'] = dvae - self.logger.log(logging.INFO, 'dvae loaded.') - - if gpt_config_path: - cfg = OmegaConf.load(gpt_config_path) - gpt = GPT_warpper(**cfg).to(device).eval() - assert gpt_ckpt_path, 'gpt_ckpt_path should not be None' - gpt.load_state_dict(torch.load(gpt_ckpt_path, map_location='cpu')) - if compile and 'cuda' in str(device): - gpt.gpt.forward = torch.compile(gpt.gpt.forward, backend='inductor', dynamic=True) - self.pretrain_models['gpt'] = gpt - spk_stat_path = os.path.join(os.path.dirname(gpt_ckpt_path), 'spk_stat.pt') - assert os.path.exists(spk_stat_path), f'Missing spk_stat.pt: {spk_stat_path}' - self.pretrain_models['spk_stat'] = torch.load(spk_stat_path).to(device) - self.logger.log(logging.INFO, 'gpt loaded.') - - if decoder_config_path: - cfg = OmegaConf.load(decoder_config_path) - decoder = DVAE(**cfg).to(device).eval() - assert decoder_ckpt_path, 'decoder_ckpt_path should not be None' - decoder.load_state_dict(torch.load(decoder_ckpt_path, map_location='cpu')) - self.pretrain_models['decoder'] = decoder - self.logger.log(logging.INFO, 'decoder loaded.') - - if tokenizer_path: - tokenizer = torch.load(tokenizer_path, map_location='cpu') - tokenizer.padding_side = 'left' - self.pretrain_models['tokenizer'] = tokenizer - self.logger.log(logging.INFO, 'tokenizer loaded.') - - self.check_model() - - def infer( - self, - text, - skip_refine_text=False, - refine_text_only=False, - params_refine_text={}, - params_infer_code={'prompt':'[speed_5]'}, - use_decoder=True, - do_text_normalization=True, - lang=None, - ): - - assert self.check_model(use_decoder=use_decoder) - - if not isinstance(text, list): - text = [text] - - if do_text_normalization: - for i, t in enumerate(text): - _lang = detect_language(t) if lang is None else lang - self.init_normalizer(_lang) - text[i] = self.normalizer[_lang](t) - if _lang == 'zh': - text[i] = apply_half2full_map(text[i]) - - for i, t in enumerate(text): - invalid_characters = count_invalid_characters(t) - if len(invalid_characters): - self.logger.log(logging.WARNING, f'Invalid characters found! : {invalid_characters}') - text[i] = apply_character_map(t) - - if not skip_refine_text: - text_tokens = refine_text(self.pretrain_models, text, **params_refine_text)['ids'] - text_tokens = [i[i < self.pretrain_models['tokenizer'].convert_tokens_to_ids('[break_0]')] for i in text_tokens] - text = self.pretrain_models['tokenizer'].batch_decode(text_tokens) - if refine_text_only: - return text - - text = [params_infer_code.get('prompt', '') + i for i in text] - params_infer_code.pop('prompt', '') - result = infer_code(self.pretrain_models, text, **params_infer_code, return_hidden=use_decoder) - - if use_decoder: - mel_spec = [self.pretrain_models['decoder'](i[None].permute(0,2,1)) for i in result['hiddens']] - else: - mel_spec = [self.pretrain_models['dvae'](i[None].permute(0,2,1)) for i in result['ids']] - - wav = [self.pretrain_models['vocos'].decode(i).cpu().numpy() for i in mel_spec] - - return wav - - def sample_random_speaker(self, ): - - dim = self.pretrain_models['gpt'].gpt.layers[0].mlp.gate_proj.in_features - std, mean = self.pretrain_models['spk_stat'].chunk(2) - return torch.randn(dim, device=std.device) * std + mean - - def init_normalizer(self, lang): - - if lang not in self.normalizer: - if lang == 'zh': - try: - from tn.chinese.normalizer import Normalizer - except: - self.logger.log(logging.WARNING, f'Package WeTextProcessing not found! \ - Run: conda install -c conda-forge pynini=2.1.5 && pip install WeTextProcessing') - self.normalizer[lang] = Normalizer().normalize - else: - try: - from nemo_text_processing.text_normalization.normalize import Normalizer - except: - self.logger.log(logging.WARNING, f'Package nemo_text_processing not found! \ - Run: conda install -c conda-forge pynini=2.1.5 && pip install nemo_text_processing') - self.normalizer[lang] = partial(Normalizer(input_case='cased', lang=lang).normalize, verbose=False, punct_post_process=True) - diff --git a/xinference/thirdparty/ChatTTS/experimental/__init__.py b/xinference/thirdparty/ChatTTS/experimental/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/xinference/thirdparty/ChatTTS/experimental/llm.py b/xinference/thirdparty/ChatTTS/experimental/llm.py deleted file mode 100644 index a4e5f94d8e..0000000000 --- a/xinference/thirdparty/ChatTTS/experimental/llm.py +++ /dev/null @@ -1,40 +0,0 @@ - -from openai import OpenAI - -prompt_dict = { - 'kimi': [ {"role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。"}, - {"role": "user", "content": "你好,请注意你现在生成的文字要按照人日常生活的口吻,你的回复将会后续用TTS模型转为语音,并且请把回答控制在100字以内。并且标点符号仅包含逗号和句号,将数字等转为文字回答。"}, - {"role": "assistant", "content": "好的,我现在生成的文字将按照人日常生活的口吻, 并且我会把回答控制在一百字以内, 标点符号仅包含逗号和句号,将阿拉伯数字等转为中文文字回答。下面请开始对话。"},], - 'deepseek': [ - {"role": "system", "content": "You are a helpful assistant"}, - {"role": "user", "content": "你好,请注意你现在生成的文字要按照人日常生活的口吻,你的回复将会后续用TTS模型转为语音,并且请把回答控制在100字以内。并且标点符号仅包含逗号和句号,将数字等转为文字回答。"}, - {"role": "assistant", "content": "好的,我现在生成的文字将按照人日常生活的口吻, 并且我会把回答控制在一百字以内, 标点符号仅包含逗号和句号,将阿拉伯数字等转为中文文字回答。下面请开始对话。"},], - 'deepseek_TN': [ - {"role": "system", "content": "You are a helpful assistant"}, - {"role": "user", "content": "你好,现在我们在处理TTS的文本输入,下面将会给你输入一段文本,请你将其中的阿拉伯数字等等转为文字表达,并且输出的文本里仅包含逗号和句号这两个标点符号"}, - {"role": "assistant", "content": "好的,我现在对TTS的文本输入进行处理。这一般叫做text normalization。下面请输入"}, - {"role": "user", "content": "We paid $123 for this desk."}, - {"role": "assistant", "content": "We paid one hundred and twenty three dollars for this desk."}, - {"role": "user", "content": "详询请拨打010-724654"}, - {"role": "assistant", "content": "详询请拨打零幺零,七二四六五四"}, - {"role": "user", "content": "罗森宣布将于7月24日退市,在华门店超6000家!"}, - {"role": "assistant", "content": "罗森宣布将于七月二十四日退市,在华门店超过六千家。"}, - ], -} - -class llm_api: - def __init__(self, api_key, base_url, model): - self.client = OpenAI( - api_key = api_key, - base_url = base_url, - ) - self.model = model - def call(self, user_question, temperature = 0.3, prompt_version='kimi', **kwargs): - - completion = self.client.chat.completions.create( - model = self.model, - messages = prompt_dict[prompt_version]+[{"role": "user", "content": user_question},], - temperature = temperature, - **kwargs - ) - return completion.choices[0].message.content diff --git a/xinference/thirdparty/ChatTTS/infer/__init__.py b/xinference/thirdparty/ChatTTS/infer/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/xinference/thirdparty/ChatTTS/infer/api.py b/xinference/thirdparty/ChatTTS/infer/api.py deleted file mode 100644 index 744dbbd26c..0000000000 --- a/xinference/thirdparty/ChatTTS/infer/api.py +++ /dev/null @@ -1,125 +0,0 @@ - -import torch -import torch.nn.functional as F -from transformers.generation import TopKLogitsWarper, TopPLogitsWarper -from ..utils.infer_utils import CustomRepetitionPenaltyLogitsProcessorRepeat - -def infer_code( - models, - text, - spk_emb = None, - top_P = 0.7, - top_K = 20, - temperature = 0.3, - repetition_penalty = 1.05, - max_new_token = 2048, - **kwargs -): - - device = next(models['gpt'].parameters()).device - - if not isinstance(text, list): - text = [text] - - if not isinstance(temperature, list): - temperature = [temperature] * models['gpt'].num_vq - - if spk_emb is not None: - text = [f'[Stts][spk_emb]{i}[Ptts]' for i in text] - else: - text = [f'[Stts][empty_spk]{i}[Ptts]' for i in text] - - text_token = models['tokenizer'](text, return_tensors='pt', add_special_tokens=False, padding=True).to(device) - input_ids = text_token['input_ids'][...,None].expand(-1, -1, models['gpt'].num_vq) - text_mask = torch.ones(text_token['input_ids'].shape, dtype=bool, device=device) - - inputs = { - 'input_ids': input_ids, - 'text_mask': text_mask, - 'attention_mask': text_token['attention_mask'], - } - - emb = models['gpt'].get_emb(**inputs) - if spk_emb is not None: - emb[inputs['input_ids'][..., 0] == models['tokenizer'].convert_tokens_to_ids('[spk_emb]')] = \ - F.normalize(spk_emb.to(device).to(emb.dtype)[None].expand(len(text), -1), p=2.0, dim=1, eps=1e-12) - - num_code = models['gpt'].emb_code[0].num_embeddings - 1 - - LogitsWarpers = [] - if top_P is not None: - LogitsWarpers.append(TopPLogitsWarper(top_P, min_tokens_to_keep=3)) - if top_K is not None: - LogitsWarpers.append(TopKLogitsWarper(top_K, min_tokens_to_keep=3)) - - LogitsProcessors = [] - if repetition_penalty is not None and repetition_penalty != 1: - LogitsProcessors.append(CustomRepetitionPenaltyLogitsProcessorRepeat(\ - repetition_penalty, num_code, 16)) - - result = models['gpt'].generate( - emb, inputs['input_ids'], - temperature = torch.tensor(temperature, device=device), - attention_mask = inputs['attention_mask'], - LogitsWarpers = LogitsWarpers, - LogitsProcessors = LogitsProcessors, - eos_token = num_code, - max_new_token = max_new_token, - infer_text = False, - **kwargs - ) - - return result - - -def refine_text( - models, - text, - top_P = 0.7, - top_K = 20, - temperature = 0.7, - repetition_penalty = 1.0, - max_new_token = 384, - prompt = '', - **kwargs -): - - device = next(models['gpt'].parameters()).device - - if not isinstance(text, list): - text = [text] - - assert len(text), 'text should not be empty' - - text = [f"[Sbreak]{i}[Pbreak]{prompt}" for i in text] - text_token = models['tokenizer'](text, return_tensors='pt', add_special_tokens=False, padding=True).to(device) - text_mask = torch.ones(text_token['input_ids'].shape, dtype=bool, device=device) - - inputs = { - 'input_ids': text_token['input_ids'][...,None].expand(-1, -1, models['gpt'].num_vq), - 'text_mask': text_mask, - 'attention_mask': text_token['attention_mask'], - } - - LogitsWarpers = [] - if top_P is not None: - LogitsWarpers.append(TopPLogitsWarper(top_P, min_tokens_to_keep=3)) - if top_K is not None: - LogitsWarpers.append(TopKLogitsWarper(top_K, min_tokens_to_keep=3)) - - LogitsProcessors = [] - if repetition_penalty is not None and repetition_penalty != 1: - LogitsProcessors.append(CustomRepetitionPenaltyLogitsProcessorRepeat(repetition_penalty, len(models['tokenizer']), 16)) - - result = models['gpt'].generate( - models['gpt'].get_emb(**inputs), inputs['input_ids'], - temperature = torch.tensor([temperature,], device=device), - attention_mask = inputs['attention_mask'], - LogitsWarpers = LogitsWarpers, - LogitsProcessors = LogitsProcessors, - eos_token = torch.tensor(models['tokenizer'].convert_tokens_to_ids('[Ebreak]'), device=device)[None], - max_new_token = max_new_token, - infer_text = True, - **kwargs - ) - return result \ No newline at end of file diff --git a/xinference/thirdparty/ChatTTS/model/__init__.py b/xinference/thirdparty/ChatTTS/model/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/xinference/thirdparty/ChatTTS/model/dvae.py b/xinference/thirdparty/ChatTTS/model/dvae.py deleted file mode 100644 index 336e8e16cd..0000000000 --- a/xinference/thirdparty/ChatTTS/model/dvae.py +++ /dev/null @@ -1,155 +0,0 @@ -import math -from einops import rearrange -from vector_quantize_pytorch import GroupedResidualFSQ - -import torch -import torch.nn as nn -import torch.nn.functional as F - -class ConvNeXtBlock(nn.Module): - def __init__( - self, - dim: int, - intermediate_dim: int, - kernel, dilation, - layer_scale_init_value: float = 1e-6, - ): - # ConvNeXt Block copied from Vocos. - super().__init__() - self.dwconv = nn.Conv1d(dim, dim, - kernel_size=kernel, padding=dilation*(kernel//2), - dilation=dilation, groups=dim - ) # depthwise conv - - self.norm = nn.LayerNorm(dim, eps=1e-6) - self.pwconv1 = nn.Linear(dim, intermediate_dim) # pointwise/1x1 convs, implemented with linear layers - self.act = nn.GELU() - self.pwconv2 = nn.Linear(intermediate_dim, dim) - self.gamma = ( - nn.Parameter(layer_scale_init_value * torch.ones(dim), requires_grad=True) - if layer_scale_init_value > 0 - else None - ) - - def forward(self, x: torch.Tensor, cond = None) -> torch.Tensor: - residual = x - x = self.dwconv(x) - x = x.transpose(1, 2) # (B, C, T) -> (B, T, C) - x = self.norm(x) - x = self.pwconv1(x) - x = self.act(x) - x = self.pwconv2(x) - if self.gamma is not None: - x = self.gamma * x - x = x.transpose(1, 2) # (B, T, C) -> (B, C, T) - - x = residual + x - return x - - - -class GFSQ(nn.Module): - - def __init__(self, - dim, levels, G, R, eps=1e-5, transpose = True - ): - super(GFSQ, self).__init__() - self.quantizer = GroupedResidualFSQ( - dim=dim, - levels=levels, - num_quantizers=R, - groups=G, - ) - self.n_ind = math.prod(levels) - self.eps = eps - self.transpose = transpose - self.G = G - self.R = R - - def _embed(self, x): - if self.transpose: - x = x.transpose(1,2) - x = rearrange( - x, "b t (g r) -> g b t r", g = self.G, r = self.R, - ) - feat = self.quantizer.get_output_from_indices(x) - return feat.transpose(1,2) if self.transpose else feat - - def forward(self, x,): - if self.transpose: - x = x.transpose(1,2) - feat, ind = self.quantizer(x) - ind = rearrange( - ind, "g b t r ->b t (g r)", - ) - embed_onehot = F.one_hot(ind.long(), self.n_ind).to(x.dtype) - e_mean = torch.mean(embed_onehot, dim=[0,1]) - e_mean = e_mean / (e_mean.sum(dim=1) + self.eps).unsqueeze(1) - perplexity = torch.exp(-torch.sum(e_mean * torch.log(e_mean + self.eps), dim=1)) - - return ( - torch.zeros(perplexity.shape, dtype=x.dtype, device=x.device), - feat.transpose(1,2) if self.transpose else feat, - perplexity, - None, - ind.transpose(1,2) if self.transpose else ind, - ) - -class DVAEDecoder(nn.Module): - def __init__(self, idim, odim, - n_layer = 12, bn_dim = 64, hidden = 256, - kernel = 7, dilation = 2, up = False - ): - super().__init__() - self.up = up - self.conv_in = nn.Sequential( - nn.Conv1d(idim, bn_dim, 3, 1, 1), nn.GELU(), - nn.Conv1d(bn_dim, hidden, 3, 1, 1) - ) - self.decoder_block = nn.ModuleList([ - ConvNeXtBlock(hidden, hidden* 4, kernel, dilation,) - for _ in range(n_layer)]) - self.conv_out = nn.Conv1d(hidden, odim, kernel_size=1, bias=False) - - def forward(self, input, conditioning=None): - # B, T, C - x = input.transpose(1, 2) - x = self.conv_in(x) - for f in self.decoder_block: - x = f(x, conditioning) - - x = self.conv_out(x) - return x.transpose(1, 2) - - -class DVAE(nn.Module): - def __init__( - self, decoder_config, vq_config, dim=512 - ): - super().__init__() - self.register_buffer('coef', torch.randn(1, 100, 1)) - - self.decoder = DVAEDecoder(**decoder_config) - self.out_conv = nn.Conv1d(dim, 100, 3, 1, 1, bias=False) - if vq_config is not None: - self.vq_layer = GFSQ(**vq_config) - else: - self.vq_layer = None - - def forward(self, inp): - - if self.vq_layer is not None: - vq_feats = self.vq_layer._embed(inp) - else: - vq_feats = inp.detach().clone() - - temp = torch.chunk(vq_feats, 2, dim=1) # flatten trick :) - temp = torch.stack(temp, -1) - vq_feats = temp.reshape(*temp.shape[:2], -1) - - vq_feats = vq_feats.transpose(1, 2) - dec_out = self.decoder(input=vq_feats) - dec_out = self.out_conv(dec_out.transpose(1, 2)) - mel = dec_out * self.coef - - return mel diff --git a/xinference/thirdparty/ChatTTS/model/gpt.py b/xinference/thirdparty/ChatTTS/model/gpt.py deleted file mode 100644 index de90d9b744..0000000000 --- a/xinference/thirdparty/ChatTTS/model/gpt.py +++ /dev/null @@ -1,265 +0,0 @@ -import os -os.environ["TOKENIZERS_PARALLELISM"] = "false" - -import logging -from tqdm import tqdm -from einops import rearrange -from transformers.cache_utils import Cache - -import torch -import torch.nn as nn -import torch.nn.functional as F -import torch.nn.utils.parametrize as P -from torch.nn.utils.parametrizations import weight_norm -from transformers import LlamaModel, LlamaConfig - - -class LlamaMLP(nn.Module): - def __init__(self, hidden_size, intermediate_size): - super().__init__() - self.hidden_size = hidden_size - self.intermediate_size = intermediate_size - self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) - self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) - self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) - self.act_fn = F.silu - - def forward(self, x): - down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) - return down_proj - - -class GPT_warpper(nn.Module): - def __init__( - self, - gpt_config, - num_audio_tokens, - num_text_tokens, - num_vq=4, - **kwargs, - ): - super().__init__() - - self.logger = logging.getLogger(__name__) - self.gpt = self.build_model(gpt_config) - self.model_dim = self.gpt.config.hidden_size - - self.num_vq = num_vq - self.emb_code = nn.ModuleList([nn.Embedding(num_audio_tokens, self.model_dim) for i in range(self.num_vq)]) - self.emb_text = nn.Embedding(num_text_tokens, self.model_dim) - self.head_text = weight_norm(nn.Linear(self.model_dim, num_text_tokens, bias=False), name='weight') - self.head_code = nn.ModuleList([weight_norm(nn.Linear(self.model_dim, num_audio_tokens, bias=False), name='weight') for i in range(self.num_vq)]) - - def build_model(self, config): - - configuration = LlamaConfig(**config) - model = LlamaModel(configuration) - del model.embed_tokens - - return model - - def get_emb(self, input_ids, text_mask, **kwargs): - - emb_text = self.emb_text(input_ids[text_mask][:, 0]) - - emb_code = [self.emb_code[i](input_ids[~text_mask][:, i]) for i in range(self.num_vq)] - emb_code = torch.stack(emb_code, 2).sum(2) - - emb = torch.zeros((input_ids.shape[:-1])+(emb_text.shape[-1],), device=emb_text.device, dtype=emb_text.dtype) - emb[text_mask] = emb_text - emb[~text_mask] = emb_code.to(emb.dtype) - - return emb - - def prepare_inputs_for_generation( - self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, cache_position=None, **kwargs - ): - # With static cache, the `past_key_values` is None - # TODO joao: standardize interface for the different Cache classes and remove of this if - has_static_cache = False - if past_key_values is None: - past_key_values = getattr(self.gpt.layers[0].self_attn, "past_key_value", None) - has_static_cache = past_key_values is not None - - past_length = 0 - if past_key_values is not None: - if isinstance(past_key_values, Cache): - past_length = cache_position[0] if cache_position is not None else past_key_values.get_seq_length() - max_cache_length = ( - torch.tensor(past_key_values.get_max_length(), device=input_ids.device) - if past_key_values.get_max_length() is not None - else None - ) - cache_length = past_length if max_cache_length is None else torch.min(max_cache_length, past_length) - # TODO joao: remove this `else` after `generate` prioritizes `Cache` objects - else: - cache_length = past_length = past_key_values[0][0].shape[2] - max_cache_length = None - - # Keep only the unprocessed tokens: - # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where - # some of the inputs are exclusively passed as part of the cache (e.g. when passing input_embeds as - # input) - if attention_mask is not None and attention_mask.shape[1] > input_ids.shape[1]: - input_ids = input_ids[:, -(attention_mask.shape[1] - past_length) :] - # 2 - If the past_length is smaller than input_ids', then input_ids holds all input tokens. We can discard - # input_ids based on the past_length. - elif past_length < input_ids.shape[1]: - input_ids = input_ids[:, past_length:] - # 3 - Otherwise (past_length >= input_ids.shape[1]), let's assume input_ids only has unprocessed tokens. - - # If we are about to go beyond the maximum cache length, we need to crop the input attention mask. - if ( - max_cache_length is not None - and attention_mask is not None - and cache_length + input_ids.shape[1] > max_cache_length - ): - attention_mask = attention_mask[:, -max_cache_length:] - - position_ids = kwargs.get("position_ids", None) - if attention_mask is not None and position_ids is None: - # create position_ids on the fly for batch generation - position_ids = attention_mask.long().cumsum(-1) - 1 - position_ids.masked_fill_(attention_mask == 0, 1) - if past_key_values: - position_ids = position_ids[:, -input_ids.shape[1] :] - - # if `inputs_embeds` are passed, we only want to use them in the 1st generation step - if inputs_embeds is not None and past_key_values is None: - model_inputs = {"inputs_embeds": inputs_embeds} - else: - # The `contiguous()` here is necessary to have a static stride during decoding. torchdynamo otherwise - # recompiles graphs as the stride of the inputs is a guard. Ref: https://github.com/huggingface/transformers/pull/29114 - # TODO: use `next_tokens` directly instead. - model_inputs = {"input_ids": input_ids.contiguous()} - - input_length = position_ids.shape[-1] if position_ids is not None else input_ids.shape[-1] - if cache_position is None: - cache_position = torch.arange(past_length, past_length + input_length, device=input_ids.device) - else: - cache_position = cache_position[-input_length:] - - if has_static_cache: - past_key_values = None - - model_inputs.update( - { - "position_ids": position_ids, - "cache_position": cache_position, - "past_key_values": past_key_values, - "use_cache": kwargs.get("use_cache"), - "attention_mask": attention_mask, - } - ) - return model_inputs - - def generate( - self, - emb, - inputs_ids, - temperature, - eos_token, - attention_mask = None, - max_new_token = 2048, - min_new_token = 0, - LogitsWarpers = [], - LogitsProcessors = [], - infer_text=False, - return_attn=False, - return_hidden=False, - ): - - with torch.no_grad(): - - attentions = [] - hiddens = [] - - start_idx, end_idx = inputs_ids.shape[1], torch.zeros(inputs_ids.shape[0], device=inputs_ids.device, dtype=torch.long) - finish = torch.zeros(inputs_ids.shape[0], device=inputs_ids.device).bool() - - temperature = temperature[None].expand(inputs_ids.shape[0], -1) - temperature = rearrange(temperature, "b n -> (b n) 1") - - attention_mask_cache = torch.ones((inputs_ids.shape[0], inputs_ids.shape[1]+max_new_token,), dtype=torch.bool, device=inputs_ids.device) - if attention_mask is not None: - attention_mask_cache[:, :attention_mask.shape[1]] = attention_mask - - for i in tqdm(range(max_new_token)): - - model_input = self.prepare_inputs_for_generation(inputs_ids, - outputs.past_key_values if i!=0 else None, - attention_mask_cache[:, :inputs_ids.shape[1]], use_cache=True) - - if i == 0: - model_input['inputs_embeds'] = emb - else: - if infer_text: - model_input['inputs_embeds'] = self.emb_text(model_input['input_ids'][:,:,0]) - else: - code_emb = [self.emb_code[i](model_input['input_ids'][:,:,i]) for i in range(self.num_vq)] - model_input['inputs_embeds'] = torch.stack(code_emb, 3).sum(3) - - model_input['input_ids'] = None - outputs = self.gpt.forward(**model_input, output_attentions=return_attn) - attentions.append(outputs.attentions) - hidden_states = outputs[0] # 🐻 - if return_hidden: - hiddens.append(hidden_states[:, -1]) - - with P.cached(): - if infer_text: - logits = self.head_text(hidden_states) - else: - logits = torch.stack([self.head_code[i](hidden_states) for i in range(self.num_vq)], 3) - - logits = logits[:, -1].float() - - if not infer_text: - logits = rearrange(logits, "b c n -> (b n) c") - logits_token = rearrange(inputs_ids[:, start_idx:], "b c n -> (b n) c") - else: - logits_token = inputs_ids[:, start_idx:, 0] - - logits = logits / temperature - - for logitsProcessors in LogitsProcessors: - logits = logitsProcessors(logits_token, logits) - - for logitsWarpers in LogitsWarpers: - logits = logitsWarpers(logits_token, logits) - - if i < min_new_token: - logits[:, eos_token] = -torch.inf - - scores = F.softmax(logits, dim=-1) - - idx_next = torch.multinomial(scores, num_samples=1) - - if not infer_text: - idx_next = rearrange(idx_next, "(b n) 1 -> b n", n=self.num_vq) - finish = finish | (idx_next == eos_token).any(1) - inputs_ids = torch.cat([inputs_ids, idx_next.unsqueeze(1)], 1) - else: - finish = finish | (idx_next == eos_token).any(1) - inputs_ids = torch.cat([inputs_ids, idx_next.unsqueeze(-1).expand(-1, -1, self.num_vq)], 1) - - end_idx = end_idx + (~finish).int() - - if finish.all(): - break - - inputs_ids = [inputs_ids[idx, start_idx: start_idx+i] for idx, i in enumerate(end_idx.int())] - inputs_ids = [i[:, 0] for i in inputs_ids] if infer_text else inputs_ids - - if return_hidden: - hiddens = torch.stack(hiddens, 1) - hiddens = [hiddens[idx, :i] for idx, i in enumerate(end_idx.int())] - - if not finish.all(): - self.logger.warn(f'Incomplete result. hit max_new_token: {max_new_token}') - - return { - 'ids': inputs_ids, - 'attentions': attentions, - 'hiddens':hiddens, - } \ No newline at end of file diff --git a/xinference/thirdparty/ChatTTS/utils/__init__.py b/xinference/thirdparty/ChatTTS/utils/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/xinference/thirdparty/ChatTTS/utils/gpu_utils.py b/xinference/thirdparty/ChatTTS/utils/gpu_utils.py deleted file mode 100644 index 13c7add8f0..0000000000 --- a/xinference/thirdparty/ChatTTS/utils/gpu_utils.py +++ /dev/null @@ -1,23 +0,0 @@ - -import torch -import logging - -def select_device(min_memory = 2048): - logger = logging.getLogger(__name__) - if torch.cuda.is_available(): - available_gpus = [] - for i in range(torch.cuda.device_count()): - props = torch.cuda.get_device_properties(i) - free_memory = props.total_memory - torch.cuda.memory_reserved(i) - available_gpus.append((i, free_memory)) - selected_gpu, max_free_memory = max(available_gpus, key=lambda x: x[1]) - device = torch.device(f'cuda:{selected_gpu}') - free_memory_mb = max_free_memory / (1024 * 1024) - if free_memory_mb < min_memory: - logger.log(logging.WARNING, f'GPU {selected_gpu} has {round(free_memory_mb, 2)} MB memory left.') - device = torch.device('cpu') - else: - logger.log(logging.WARNING, f'No GPU found, use CPU instead') - device = torch.device('cpu') - - return device diff --git a/xinference/thirdparty/ChatTTS/utils/infer_utils.py b/xinference/thirdparty/ChatTTS/utils/infer_utils.py deleted file mode 100644 index 74efceade6..0000000000 --- a/xinference/thirdparty/ChatTTS/utils/infer_utils.py +++ /dev/null @@ -1,141 +0,0 @@ - -import re -import torch -import torch.nn.functional as F - - -class CustomRepetitionPenaltyLogitsProcessorRepeat(): - - def __init__(self, penalty: float, max_input_ids, past_window): - if not isinstance(penalty, float) or not (penalty > 0): - raise ValueError(f"`penalty` has to be a strictly positive float, but is {penalty}") - - self.penalty = penalty - self.max_input_ids = max_input_ids - self.past_window = past_window - - def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: - - input_ids = input_ids[:, -self.past_window:] - freq = F.one_hot(input_ids, scores.size(1)).sum(1) - freq[self.max_input_ids:] = 0 - alpha = self.penalty**freq - scores = torch.where(scores < 0, scores*alpha, scores/alpha) - - return scores - -class CustomRepetitionPenaltyLogitsProcessor(): - - def __init__(self, penalty: float, max_input_ids, past_window): - if not isinstance(penalty, float) or not (penalty > 0): - raise ValueError(f"`penalty` has to be a strictly positive float, but is {penalty}") - - self.penalty = penalty - self.max_input_ids = max_input_ids - self.past_window = past_window - - def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: - - input_ids = input_ids[:, -self.past_window:] - score = torch.gather(scores, 1, input_ids) - _score = score.detach().clone() - score = torch.where(score < 0, score * self.penalty, score / self.penalty) - score[input_ids>=self.max_input_ids] = _score[input_ids>=self.max_input_ids] - scores.scatter_(1, input_ids, score) - - return scores - -def count_invalid_characters(s): - - s = re.sub(r'\[uv_break\]|\[laugh\]|\[lbreak\]', '', s) - pattern = re.compile(r'[^\u4e00-\u9fffA-Za-z,。、,\. ]') - non_alphabetic_chinese_chars = pattern.findall(s) - return set(non_alphabetic_chinese_chars) - -def detect_language(sentence): - - chinese_char_pattern = re.compile(r'[\u4e00-\u9fff]') - english_word_pattern = re.compile(r'\b[A-Za-z]+\b') - - chinese_chars = chinese_char_pattern.findall(sentence) - english_words = english_word_pattern.findall(sentence) - - if len(chinese_chars) > len(english_words): - return "zh" - else: - return "en" - - -character_map = { - ':': ',', - ';': ',', - '!': '。', - '(': ',', - ')': ',', - '【': ',', - '】': ',', - '『': ',', - '』': ',', - '「': ',', - '」': ',', - '《': ',', - '》': ',', - '-': ',', - '‘': '', - '“': '', - '’': '', - '”': '', - ':': ',', - ';': ',', - '!': '.', - '(': ',', - ')': ',', - '[': ',', - ']': ',', - '>': ',', - '<': ',', - '-': ',', -} - -halfwidth_2_fullwidth_map = { - '!': '!', - '"': '“', - "'": '‘', - '#': '#', - '$': '$', - '%': '%', - '&': '&', - '(': '(', - ')': ')', - ',': ',', - '-': '-', - '*': '*', - '+': '+', - '.': '。', - '/': '/', - ':': ':', - ';': ';', - '<': '<', - '=': '=', - '>': '>', - '?': '?', - '@': '@', - # '[': '[', - '\\': '\', - # ']': ']', - '^': '^', - # '_': '_', - '`': '`', - '{': '{', - '|': '|', - '}': '}', - '~': '~' - } - -def apply_half2full_map(text): - translation_table = str.maketrans(halfwidth_2_fullwidth_map) - return text.translate(translation_table) - -def apply_character_map(text): - translation_table = str.maketrans(character_map) - return text.translate(translation_table) \ No newline at end of file diff --git a/xinference/thirdparty/ChatTTS/utils/io_utils.py b/xinference/thirdparty/ChatTTS/utils/io_utils.py deleted file mode 100644 index b3f5eda065..0000000000 --- a/xinference/thirdparty/ChatTTS/utils/io_utils.py +++ /dev/null @@ -1,14 +0,0 @@ - -import os -import logging - -def get_latest_modified_file(directory): - logger = logging.getLogger(__name__) - - files = [os.path.join(directory, f) for f in os.listdir(directory)] - if not files: - logger.log(logging.WARNING, f'No files found in the directory: {directory}') - return None - latest_file = max(files, key=os.path.getmtime) - - return latest_file \ No newline at end of file From 51b8b87ed99c3862290e70c5c7f05ae3b5ec7256 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Mon, 8 Jul 2024 18:03:55 +0800 Subject: [PATCH 186/298] FIX: [UI] Historical parameter echo bugs. (#1810) --- .../ui/src/scenes/launch_model/modelCard.js | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index e5a78e79ea..f231d5827d 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -64,6 +64,7 @@ const llmAllDataKey = [ 'model_size_in_billions', 'quantization', 'n_gpu', + 'n_gpu_layers', 'replica', 'request_limits', 'worker_ip', @@ -186,7 +187,11 @@ const ModelCard = ({ ), ] setSizeOptions(sizes) - if (!isHistory || !sizes.includes(Number(modelSize))) { + if ( + !isHistory || + (sizeOptions.length && + JSON.stringify(sizes) !== JSON.stringify(sizeOptions)) + ) { setModelSize('') } if (sizes.length === 1) { @@ -363,24 +368,15 @@ const ModelCard = ({ 'runningModelType', `/running_models/${modelType}` ) - - if ( - isHistory || - ((modelType === 'embedding' || modelType === 'rerank') && - (modelUID !== '' || replica !== 1 || workerIp !== '')) || - ((modelType === 'image' || modelType === 'audio') && - modelUID !== '') || - modelType === 'LLM' - ) { - let historyArr = JSON.parse(localStorage.getItem('historyArr')) || [] - if (!historyArr.some((item) => deepEqual(item, modelDataWithID))) { - historyArr = historyArr.filter( - (item) => item.model_name !== modelDataWithID.model_name - ) - historyArr.push(modelDataWithID) - } - localStorage.setItem('historyArr', JSON.stringify(historyArr)) + let historyArr = JSON.parse(localStorage.getItem('historyArr')) || [] + if (!historyArr.some((item) => deepEqual(item, modelDataWithID))) { + historyArr = historyArr.filter( + (item) => item.model_name !== modelDataWithID.model_name + ) + historyArr.push(modelDataWithID) } + localStorage.setItem('historyArr', JSON.stringify(historyArr)) + setIsCallingApi(false) }) .catch((error) => { @@ -550,6 +546,7 @@ const ModelCard = ({ model_size_in_billions, quantization, n_gpu, + n_gpu_layers, replica, model_uid, request_limits, @@ -558,11 +555,20 @@ const ModelCard = ({ peft_model_config, } = arr[0] - setModelEngine(model_engine || '') + if (!engineOptions.includes(model_engine)) { + setModelEngine('') + } else { + setModelEngine(model_engine || '') + } setModelFormat(model_format || '') setModelSize(String(model_size_in_billions) || '') setQuantization(quantization || '') setNGPU(n_gpu || 'auto') + if (n_gpu_layers >= 0) { + setNGPULayers(n_gpu_layers) + } else { + setNGPULayers(-1) + } setReplica(replica || 1) setModelUID(model_uid || '') setRequestLimits(request_limits || '') From 9a04b32c358aea7335c060981a7261fc999ef956 Mon Sep 17 00:00:00 2001 From: Weaxs <459312872@qq.com> Date: Tue, 9 Jul 2024 21:10:16 +0800 Subject: [PATCH 187/298] DOC: Define a custom Rerank model (#1821) --- .../locale/ja_JP/LC_MESSAGES/models/custom.po | 168 ++++++++++++------ .../locale/zh_CN/LC_MESSAGES/models/custom.po | 62 ++++--- doc/source/models/custom.rst | 25 ++- 3 files changed, 180 insertions(+), 75 deletions(-) diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/custom.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/custom.po index ce9838b71b..0643ce8afa 100644 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/custom.po +++ b/doc/source/locale/ja_JP/LC_MESSAGES/models/custom.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-27 15:43+0800\n" +"POT-Creation-Date: 2024-07-09 14:56+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: ja_JP\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" +"Generated-By: Babel 2.15.0\n" #: ../../source/models/custom.rst:5 msgid "Custom Models" @@ -37,14 +37,15 @@ msgstr "" msgid "Define a custom LLM model based on the following template:" msgstr "" -#: ../../source/models/custom.rst:51 ../../source/models/custom.rst:179 +#: ../../source/models/custom.rst:52 ../../source/models/custom.rst:181 +#: ../../source/models/custom.rst:204 msgid "" "model_name: A string defining the name of the model. The name must start " "with a letter or a digit and can only contain letters, digits, " "underscores, or dashes." msgstr "" -#: ../../source/models/custom.rst:52 +#: ../../source/models/custom.rst:53 msgid "" "context_length: context_length: An optional integer that specifies the " "maximum context size the model was trained to accommodate, encompassing " @@ -52,39 +53,50 @@ msgid "" "2048 tokens (~1,500 words)." msgstr "" -#: ../../source/models/custom.rst:53 +#: ../../source/models/custom.rst:54 msgid "" "model_lang: A list of strings representing the supported languages for " "the model. Example: [\"en\"], which means that the model supports " "English." msgstr "" -#: ../../source/models/custom.rst:54 +#: ../../source/models/custom.rst:55 msgid "" "model_ability: A list of strings defining the abilities of the model. It " "could include options like \"embed\", \"generate\", and \"chat\". In this" " case, the model has the ability to \"generate\"." msgstr "" -#: ../../source/models/custom.rst:60 +#: ../../source/models/custom.rst:56 +msgid "" +"model_family: A required string representing the family of the model you " +"want to register. The optional values are the model names of all :ref" +":`built-in models <models_llm_index>`. If the model family you register " +"is not among the built-in models in Xinference, please fill in ``other``." +" Note that you should choose the model family based on the ability of the" +" model you want to register. For example, if you want to register the " +"``llama-2`` model, do not fill in ``llama-2-chat`` as the model family." +msgstr "" + +#: ../../source/models/custom.rst:62 msgid "" "model_specs: An array of objects defining the specifications of the " "model. These include:" msgstr "" -#: ../../source/models/custom.rst:56 +#: ../../source/models/custom.rst:58 msgid "" "model_format: A string that defines the model format, could be " "\"pytorch\" or \"ggmlv3\"." msgstr "" -#: ../../source/models/custom.rst:57 +#: ../../source/models/custom.rst:59 msgid "" "model_size_in_billions: An integer defining the size of the model in " "billions of parameters." msgstr "" -#: ../../source/models/custom.rst:58 +#: ../../source/models/custom.rst:60 msgid "" "quantizations: A list of strings defining the available quantizations for" " the model. For PyTorch models, it could be \"4-bit\", \"8-bit\", or " @@ -92,7 +104,7 @@ msgid "" "values that work with the ``model_file_name_template``." msgstr "" -#: ../../source/models/custom.rst:59 +#: ../../source/models/custom.rst:61 msgid "" "model_id: A string representing the model ID, possibly referring to an " "identifier used by Hugging Face. **If model_uri is missing, Xinference " @@ -100,7 +112,7 @@ msgid "" "here.**." msgstr "" -#: ../../source/models/custom.rst:60 +#: ../../source/models/custom.rst:62 msgid "" "model_uri: A string representing the URI where the model can be loaded " "from, such as \"file:///path/to/llama-2-7b\". **When the model format is " @@ -110,7 +122,7 @@ msgid "" " to download the model from Hugging Face with the model ID." msgstr "" -#: ../../source/models/custom.rst:61 +#: ../../source/models/custom.rst:63 msgid "" "model_file_name_template: Required by ggml/gguf models. An f-string " "template used for defining the model file name based on the quantization." @@ -119,77 +131,78 @@ msgid "" "file.**" msgstr "" -#: ../../source/models/custom.rst:62 +#: ../../source/models/custom.rst:64 msgid "" -"prompt_style: An optional field that could be required by chat models to " -"define the style of prompts. The given example has this set to None, but " -"additional details could be found in a referenced file " -"xinference/model/llm/tests/test_utils.py. You can also specify this field" -" as a string, which will use the builtin prompt style in Xinference. For " -"example:" +"prompt_style: If the ``model_family`` field is not ``other``, this field " +"does not need to be filled in. ``prompt_style`` is an optional field that" +" could be required by ``chat`` models to define the style of prompts. The" +" given example has this set to None, but additional details could be " +"found in a referenced file xinference/model/llm/tests/test_utils.py. You " +"can also specify this field as a string, which will use the builtin " +"prompt style in Xinference. For example:" msgstr "" -#: ../../source/models/custom.rst:71 +#: ../../source/models/custom.rst:73 msgid "Xinference supports these builtin prompt styles in common usage:" msgstr "" -#: ../../source/models/custom.rst:75 +#: ../../source/models/custom.rst:77 msgid "baichuan-chat" msgstr "" -#: ../../source/models/custom.rst:94 +#: ../../source/models/custom.rst:96 msgid "chatglm3" msgstr "" -#: ../../source/models/custom.rst:107 +#: ../../source/models/custom.rst:109 msgid "qwen-chat" msgstr "" -#: ../../source/models/custom.rst:124 +#: ../../source/models/custom.rst:126 msgid "llama-2-chat" msgstr "" -#: ../../source/models/custom.rst:145 +#: ../../source/models/custom.rst:147 msgid "vicuna-v1.5" msgstr "" -#: ../../source/models/custom.rst:160 +#: ../../source/models/custom.rst:162 msgid "" "The above lists some commonly used built-in prompt styles. The full list " "of supported prompt styles can be found on the Xinference web UI." msgstr "" -#: ../../source/models/custom.rst:164 +#: ../../source/models/custom.rst:166 msgid "Define a custom embedding model" msgstr "" -#: ../../source/models/custom.rst:166 +#: ../../source/models/custom.rst:168 msgid "Define a custom embedding model based on the following template:" msgstr "" -#: ../../source/models/custom.rst:180 +#: ../../source/models/custom.rst:182 msgid "dimensions: A integer that specifies the embedding dimensions." msgstr "" -#: ../../source/models/custom.rst:181 +#: ../../source/models/custom.rst:183 msgid "" "max_tokens: A integer that represents the max sequence length that the " "embedding model supports." msgstr "" -#: ../../source/models/custom.rst:182 +#: ../../source/models/custom.rst:184 ../../source/models/custom.rst:206 msgid "" "language: A list of strings representing the supported languages for the " "model. Example: [\"en\"], which means that the model supports English." msgstr "" -#: ../../source/models/custom.rst:183 +#: ../../source/models/custom.rst:185 ../../source/models/custom.rst:207 msgid "" "model_id: A string representing the model ID, possibly referring to an " "identifier used by Hugging Face." msgstr "" -#: ../../source/models/custom.rst:184 +#: ../../source/models/custom.rst:186 ../../source/models/custom.rst:208 msgid "" "model_uri: A string representing the URI where the model can be loaded " "from, such as \"file:///path/to/your_model\". If model URI is absent, " @@ -197,62 +210,76 @@ msgid "" "model ID." msgstr "" -#: ../../source/models/custom.rst:187 +#: ../../source/models/custom.rst:190 +msgid "Define a custom Rerank model" +msgstr "" + +#: ../../source/models/custom.rst:192 +msgid "Define a custom rerank model based on the following template:" +msgstr "" + +#: ../../source/models/custom.rst:205 +msgid "" +"type: A string defining the type of the model, including ``normal``, " +"``LLM-based`` and ``LLM-based layerwise``." +msgstr "" + +#: ../../source/models/custom.rst:212 msgid "Register a Custom Model" msgstr "" -#: ../../source/models/custom.rst:189 +#: ../../source/models/custom.rst:214 msgid "Register a custom model programmatically:" msgstr "" -#: ../../source/models/custom.rst:204 ../../source/models/custom.rst:222 -#: ../../source/models/custom.rst:237 ../../source/models/custom.rst:292 +#: ../../source/models/custom.rst:229 ../../source/models/custom.rst:247 +#: ../../source/models/custom.rst:262 ../../source/models/custom.rst:317 msgid "Or via CLI:" msgstr "" -#: ../../source/models/custom.rst:210 +#: ../../source/models/custom.rst:235 msgid "" -"Note that replace the ``<model_type>`` above with ``LLM`` or " -"``embedding``. The same as below." +"Note that replace the ``<model_type>`` above with ``LLM``, ``embedding`` " +"or ``rerank``. The same as below." msgstr "" -#: ../../source/models/custom.rst:214 +#: ../../source/models/custom.rst:239 msgid "List the Built-in and Custom Models" msgstr "" -#: ../../source/models/custom.rst:216 +#: ../../source/models/custom.rst:241 msgid "List built-in and custom models programmatically:" msgstr "" -#: ../../source/models/custom.rst:229 +#: ../../source/models/custom.rst:254 msgid "Launch the Custom Model" msgstr "" -#: ../../source/models/custom.rst:231 +#: ../../source/models/custom.rst:256 msgid "Launch the custom model programmatically:" msgstr "" -#: ../../source/models/custom.rst:244 +#: ../../source/models/custom.rst:269 msgid "Interact with the Custom Model" msgstr "" -#: ../../source/models/custom.rst:246 +#: ../../source/models/custom.rst:271 msgid "Invoke the model programmatically:" msgstr "" -#: ../../source/models/custom.rst:253 +#: ../../source/models/custom.rst:278 msgid "Result:" msgstr "" -#: ../../source/models/custom.rst:277 +#: ../../source/models/custom.rst:302 msgid "Or via CLI, replace ``${UID}`` with real model UID:" msgstr "" -#: ../../source/models/custom.rst:284 +#: ../../source/models/custom.rst:309 msgid "Unregister the Custom Model" msgstr "" -#: ../../source/models/custom.rst:286 +#: ../../source/models/custom.rst:311 msgid "Unregister the custom model programmatically:" msgstr "" @@ -289,3 +316,42 @@ msgstr "" #~ "xinference/model/llm/tests/test_utils.py." #~ msgstr "" +#~ msgid "" +#~ "prompt_style: An optional field that " +#~ "could be required by chat models " +#~ "to define the style of prompts. " +#~ "The given example has this set to" +#~ " None, but additional details could " +#~ "be found in a referenced file " +#~ "xinference/model/llm/tests/test_utils.py. You can " +#~ "also specify this field as a " +#~ "string, which will use the builtin " +#~ "prompt style in Xinference. For example:" +#~ msgstr "" + +#~ msgid "" +#~ "Note that replace the ``<model_type>`` " +#~ "above with ``LLM`` or ``embedding``. The" +#~ " same as below." +#~ msgstr "" + +#~ msgid "" +#~ "Define a custom rerank model based " +#~ "on the following template: .. code-" +#~ "block:: json" +#~ msgstr "" + +#~ msgid "{" +#~ msgstr "" + +#~ msgid "" +#~ "\"model_name\": \"custom-bge-reranker-v2-m3\", " +#~ "\"type\": \"normal\", \"language\": [\"en\", " +#~ "\"zh\", \"multilingual\"], \"model_id\": \"BAAI" +#~ "/bge-reranker-v2-m3\", \"model_uri\": \"file:///path/to" +#~ "/bge-reranker-v2-m3\"" +#~ msgstr "" + +#~ msgid "}" +#~ msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po index c7505111b1..50174a1f09 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-05 16:10+0800\n" +"POT-Creation-Date: 2024-07-09 14:56+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.11.0\n" +"Generated-By: Babel 2.15.0\n" #: ../../source/models/custom.rst:5 msgid "Custom Models" @@ -38,6 +38,7 @@ msgid "Define a custom LLM model based on the following template:" msgstr "基于以下模板定义一个自定义大语言模型:" #: ../../source/models/custom.rst:52 ../../source/models/custom.rst:181 +#: ../../source/models/custom.rst:204 msgid "" "model_name: A string defining the name of the model. The name must start " "with a letter or a digit and can only contain letters, digits, " @@ -217,7 +218,7 @@ msgid "" "embedding model supports." msgstr "max_tokens: 表示 embedding 模型支持的最大输入序列长度的整型值。" -#: ../../source/models/custom.rst:184 +#: ../../source/models/custom.rst:184 ../../source/models/custom.rst:206 msgid "" "language: A list of strings representing the supported languages for the " "model. Example: [\"en\"], which means that the model supports English." @@ -225,7 +226,7 @@ msgstr "" "model_lang: 一个字符串列表,表示模型支持的语言。例如:['en'],表示该模型" "支持英语。" -#: ../../source/models/custom.rst:185 +#: ../../source/models/custom.rst:185 ../../source/models/custom.rst:207 msgid "" "model_id: A string representing the model ID, possibly referring to an " "identifier used by Hugging Face." @@ -233,7 +234,7 @@ msgstr "" "model_id: 一个表示模型标识的字符串,类似 HuggingFace 或 ModelScope 使用的" "标识符。" -#: ../../source/models/custom.rst:186 +#: ../../source/models/custom.rst:186 ../../source/models/custom.rst:208 msgid "" "model_uri: A string representing the URI where the model can be loaded " "from, such as \"file:///path/to/your_model\". If model URI is absent, " @@ -244,62 +245,77 @@ msgstr "" "如果模型 URI 不存在,Xinference 将尝试使用 model_id 从 HuggingFace 或 " "ModelScope 下载模型。" -#: ../../source/models/custom.rst:189 +#: ../../source/models/custom.rst:190 +msgid "Define a custom Rerank model" +msgstr "定义自定义 rerank 模型" + +#: ../../source/models/custom.rst:192 +msgid "Define a custom rerank model based on the following template:" +msgstr "基于以下模板定义一个自定义大语言模型:" + +#: ../../source/models/custom.rst:205 +msgid "" +"type: A string defining the type of the model, including ``normal``, " +"``LLM-based`` and ``LLM-based layerwise``." +msgstr "" +"type: 表示模型的类型,可选值包括 ``normal``、``LLM-based`` 和 ``LLM-based layerwise``。" + +#: ../../source/models/custom.rst:212 msgid "Register a Custom Model" msgstr "注册一个自定义模型" -#: ../../source/models/custom.rst:191 +#: ../../source/models/custom.rst:214 msgid "Register a custom model programmatically:" msgstr "以代码的方式注册自定义模型" -#: ../../source/models/custom.rst:206 ../../source/models/custom.rst:224 -#: ../../source/models/custom.rst:239 ../../source/models/custom.rst:294 +#: ../../source/models/custom.rst:229 ../../source/models/custom.rst:247 +#: ../../source/models/custom.rst:262 ../../source/models/custom.rst:317 msgid "Or via CLI:" msgstr "以命令行的方式" -#: ../../source/models/custom.rst:212 +#: ../../source/models/custom.rst:235 msgid "" -"Note that replace the ``<model_type>`` above with ``LLM`` or " -"``embedding``. The same as below." -msgstr "注意将以下部分的 ``<model_type>`` 替换为 ``LLM`` 或者 ``embedding`` 。" +"Note that replace the ``<model_type>`` above with ``LLM``, ``embedding`` " +"or ``rerank``. The same as below." +msgstr "注意将以下部分的 ``<model_type>`` 替换为 ``LLM``、``embedding`` 或 ``rerank`` 。" -#: ../../source/models/custom.rst:216 +#: ../../source/models/custom.rst:239 msgid "List the Built-in and Custom Models" msgstr "列举内置和自定义模型" -#: ../../source/models/custom.rst:218 +#: ../../source/models/custom.rst:241 msgid "List built-in and custom models programmatically:" msgstr "以代码的方式列举内置和自定义模型" -#: ../../source/models/custom.rst:231 +#: ../../source/models/custom.rst:254 msgid "Launch the Custom Model" msgstr "启动自定义模型" -#: ../../source/models/custom.rst:233 +#: ../../source/models/custom.rst:256 msgid "Launch the custom model programmatically:" msgstr "以代码的方式启动自定义模型" -#: ../../source/models/custom.rst:246 +#: ../../source/models/custom.rst:269 msgid "Interact with the Custom Model" msgstr "使用自定义模型" -#: ../../source/models/custom.rst:248 +#: ../../source/models/custom.rst:271 msgid "Invoke the model programmatically:" msgstr "以代码的方式调用模型" -#: ../../source/models/custom.rst:255 +#: ../../source/models/custom.rst:278 msgid "Result:" msgstr "结果为:" -#: ../../source/models/custom.rst:279 +#: ../../source/models/custom.rst:302 msgid "Or via CLI, replace ``${UID}`` with real model UID:" msgstr "或者以命令行的方式,用实际的模型 UID 替换 ``${UID}``:" -#: ../../source/models/custom.rst:286 +#: ../../source/models/custom.rst:309 msgid "Unregister the Custom Model" msgstr "注销自定义模型" -#: ../../source/models/custom.rst:288 +#: ../../source/models/custom.rst:311 msgid "Unregister the custom model programmatically:" msgstr "以代码的方式注销自定义模型" diff --git a/doc/source/models/custom.rst b/doc/source/models/custom.rst index 2d5d594454..d19481929e 100644 --- a/doc/source/models/custom.rst +++ b/doc/source/models/custom.rst @@ -185,6 +185,29 @@ Define a custom embedding model based on the following template: * model_id: A string representing the model ID, possibly referring to an identifier used by Hugging Face. * model_uri: A string representing the URI where the model can be loaded from, such as "file:///path/to/your_model". If model URI is absent, Xinference will try to download the model from Hugging Face with the model ID. + +Define a custom Rerank model +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Define a custom rerank model based on the following template: + +.. code-block:: json + + { + "model_name": "custom-bge-reranker-v2-m3", + "type": "normal", + "language": ["en", "zh", "multilingual"], + "model_id": "BAAI/bge-reranker-v2-m3", + "model_uri": "file:///path/to/bge-reranker-v2-m3" + } + +* model_name: A string defining the name of the model. The name must start with a letter or a digit and can only contain letters, digits, underscores, or dashes. +* type: A string defining the type of the model, including ``normal``, ``LLM-based`` and ``LLM-based layerwise``. +* language: A list of strings representing the supported languages for the model. Example: ["en"], which means that the model supports English. +* model_id: A string representing the model ID, possibly referring to an identifier used by Hugging Face. +* model_uri: A string representing the URI where the model can be loaded from, such as "file:///path/to/your_model". If model URI is absent, Xinference will try to download the model from Hugging Face with the model ID. + + Register a Custom Model ~~~~~~~~~~~~~~~~~~~~~~~ @@ -209,7 +232,7 @@ Or via CLI: xinference register --model-type <model_type> --file model.json --persist -Note that replace the ``<model_type>`` above with ``LLM`` or ``embedding``. The same as below. +Note that replace the ``<model_type>`` above with ``LLM``, ``embedding`` or ``rerank``. The same as below. List the Built-in and Custom Models From 09d78e9d91de53d83c604576982e83d646ed24be Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 10 Jul 2024 11:37:20 +0800 Subject: [PATCH 188/298] CHORE: Close issue when it is stale (#1827) --- .github/workflows/issue.yaml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/issue.yaml diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml new file mode 100644 index 0000000000..d82afc7467 --- /dev/null +++ b/.github/workflows/issue.yaml @@ -0,0 +1,22 @@ +name: Close inactive issues +on: + schedule: + - cron: "0 19 * * *" + +jobs: + close-issues: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v5 + with: + days-before-issue-stale: 7 + days-before-issue-close: 5 + stale-issue-label: "stale" + stale-issue-message: "This issue is stale because it has been open for 7 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 5 days since being marked as stale." + days-before-pr-stale: -1 + days-before-pr-close: -1 + repo-token: ${{ secrets.GITHUB_TOKEN }} From 7fb3755d62c3901d8b1c368b2adb7d252b083d93 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:44:39 +0800 Subject: [PATCH 189/298] CHORE: Update issue template (#1833) --- .github/ISSUE_TEMPLATE/bug_report.md | 26 ------- .github/ISSUE_TEMPLATE/bug_report.yaml | 77 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ------ .github/ISSUE_TEMPLATE/feature_request.yaml | 34 +++++++++ .github/ISSUE_TEMPLATE/other.md | 10 --- .github/ISSUE_TEMPLATE/question.md | 9 --- 6 files changed, 111 insertions(+), 65 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yaml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yaml delete mode 100644 .github/ISSUE_TEMPLATE/other.md delete mode 100644 .github/ISSUE_TEMPLATE/question.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 450524693f..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: "BUG" -labels: '' -assignees: '' - ---- - -### Describe the bug -A clear and concise description of what the bug is. - -### To Reproduce -To help us to reproduce this bug, please provide information below: - -1. Your Python version. -2. The version of xinference you use. -3. Versions of crucial packages. -4. Full stack of the error. -5. Minimized code to reproduce the error. - -### Expected behavior -A clear and concise description of what you expected to happen. - -### Additional context -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 0000000000..dd62dee44a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,77 @@ +name: "Bug Report" +description: Submit a bug report to help us improve Xinference. You should provide useful information AMAP rather than simply describing what happened. / 提交一个问题报告来帮助我们改进 Xinference。你必须提供有用的信息而不只是描述发生的现象,否则将不予处理。 +body: + - type: textarea + id: system-info + attributes: + label: System Info / 系統信息 + description: Your operating environment / 您的运行环境信息 + placeholder: Includes Cuda version, transformers / llama-cpp-python / vllm version, Python version, operating system... / 包括Cuda版本,transformers / llama-cpp-python / vllm版本,Python版本,操作系统等。 + validations: + required: true + + - type: checkboxes + id: information-scripts-examples + attributes: + label: Running Xinference with Docker? / 是否使用 Docker 运行 Xinfernece? + description: 'How are you using Xinference? / 以何种方式使用 Xinference?' + options: + - label: docker / docker + - label: pip install / 通过 pip install 安装 + - label: installation from source / 从源码安装 + + - type: textarea + id: start-way + attributes: + label: Version info / 版本信息 + description: The version of Xinference you are running / Xinference 版本 + validations: + required: true + + - type: textarea + id: commandline + attributes: + label: The command used to start Xinference / 用以启动 xinference 的命令 + description: | + Please provide the command used to start Xinference. + If it is a distributed scenario, the commands for starting the supervisor and worker need to be listed separately. + If it is a Docker scenario, please provide the complete command for starting Xinference through Docker. + If it is another method, please describe it specifically. + + 请提供启动 xinference 的命令。 + 如果是分布式场景,启动 supervisor 和 worker 的命令需要分别列出。 + 如果是docker场景,请提供通过 docker 启动 xinference 的完整命令。 + 如果是其他方式,请具体描述。 + validations: + required: true + + - type: textarea + id: reproduction + validations: + required: true + attributes: + label: Reproduction / 复现过程 + description: | + Please provide a code example that reproduces the problem you encountered, preferably with a minimal reproduction unit. + If you have code snippets, error messages, stack traces, please provide them here as well. + Please format your code correctly using code tags. See https://help.github.com/en/github/writing-on-github/creating-and-highlighting-code-blocks#syntax-highlighting + Do not use screenshots, as they are difficult to read and (more importantly) do not allow others to copy and paste your code. + + 请提供能重现您遇到的问题的代码示例,最好是最小复现单元。 + 如果您有代码片段、错误信息、堆栈跟踪、涉及的命令行操作等也请在此提供。 + 请使用代码标签正确格式化您的代码。请参见 https://help.github.com/en/github/writing-on-github/creating-and-highlighting-code-blocks#syntax-highlighting + 请勿使用截图,因为截图难以阅读,而且(更重要的是)不允许他人复制粘贴您的代码。 + placeholder: | + Steps to reproduce the behavior/复现Bug的步骤: + + 1. + 2. + 3. + + - type: textarea + id: expected-behavior + validations: + required: true + attributes: + label: Expected behavior / 期待表现 + description: "A clear and concise description of what you would expect to happen. / 简单描述您期望发生的事情。" \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index a61ec537d4..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -### Is your feature request related to a problem? Please describe -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -### Describe the solution you'd like -A clear and concise description of what you want to happen. - -### Describe alternatives you've considered -A clear and concise description of any alternative solutions or features you've considered. - -### Additional context -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 0000000000..81bac43d89 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,34 @@ +name: "Feature request" +description: Submit a request for a new Xinference feature / 提交一个新的 Xinference 的功能建议 +labels: [ "feature" ] +body: + - type: textarea + id: feature-request + validations: + required: true + attributes: + label: Feature request / 功能建议 + description: | + A brief description of the functional proposal. + 对功能建议的简述。 + + - type: textarea + id: motivation + validations: + required: true + attributes: + label: Motivation / 动机 + description: | + Your motivation for making the suggestion. If that motivation is related to another GitHub issue, link to it here. + 您提出建议的动机。如果该动机与另一个 GitHub 问题有关,请在此处提供对应的链接。 + + - type: textarea + id: contribution + validations: + required: true + attributes: + label: Your contribution / 您的贡献 + description: | + + Your PR link or any other link you can help with. + 您的PR链接或者其他您能提供帮助的链接。 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/other.md b/.github/ISSUE_TEMPLATE/other.md deleted file mode 100644 index 02357a9207..0000000000 --- a/.github/ISSUE_TEMPLATE/other.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Other -about: Submit other issues here. -title: '' -labels: '' -assignees: '' - ---- - -Note that the issue tracker is NOT the place for general support. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md deleted file mode 100644 index 4510ec6419..0000000000 --- a/.github/ISSUE_TEMPLATE/question.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: Question -about: Ask a question here. -title: 'QUESTION' -labels: 'question' -assignees: '' ---- - -Note that the issue tracker is NOT the place for general support. From a1be5ddbe3b5b7ee4c9d8319bb2e9c66b2166ef6 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:31:23 +0800 Subject: [PATCH 190/298] FEAT: support choose download hub (#1841) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/api/restful_api.py | 4 ++- xinference/core/supervisor.py | 14 ++++++++- xinference/core/worker.py | 4 ++- xinference/model/audio/core.py | 38 ++++++++++++++--------- xinference/model/core.py | 11 ++++--- xinference/model/embedding/core.py | 41 +++++++++++++++---------- xinference/model/image/core.py | 32 ++++++++++--------- xinference/model/llm/core.py | 5 +-- xinference/model/llm/llm_family.py | 18 ++++++++++- xinference/model/rerank/core.py | 49 +++++++++++++++--------------- 10 files changed, 136 insertions(+), 80 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 6fe0183c5f..bd2990c732 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -772,6 +772,7 @@ async def launch_model( peft_model_config = payload.get("peft_model_config", None) worker_ip = payload.get("worker_ip", None) gpu_idx = payload.get("gpu_idx", None) + download_hub = payload.get("download_hub", None) exclude_keys = { "model_uid", @@ -787,6 +788,7 @@ async def launch_model( "peft_model_config", "worker_ip", "gpu_idx", + "download_hub", } kwargs = { @@ -834,9 +836,9 @@ async def launch_model( peft_model_config=peft_model_config, worker_ip=worker_ip, gpu_idx=gpu_idx, + download_hub=download_hub, **kwargs, ) - except ValueError as ve: logger.error(str(ve), exc_info=True) raise HTTPException(status_code=400, detail=str(ve)) diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 88f8991e16..b926e50d23 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -20,7 +20,17 @@ import typing from dataclasses import dataclass from logging import getLogger -from typing import TYPE_CHECKING, Any, Dict, Iterator, List, Optional, Tuple, Union +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Iterator, + List, + Literal, + Optional, + Tuple, + Union, +) import xoscar as xo @@ -752,6 +762,7 @@ async def launch_builtin_model( peft_model_config: Optional[PeftModelConfig] = None, worker_ip: Optional[str] = None, gpu_idx: Optional[Union[int, List[int]]] = None, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, **kwargs, ) -> str: target_ip_worker_ref = ( @@ -825,6 +836,7 @@ async def _launch_one_model(_replica_model_uid): request_limits=request_limits, peft_model_config=peft_model_config, gpu_idx=replica_gpu_idx, + download_hub=download_hub, **kwargs, ) self._replica_model_uid_to_worker[_replica_model_uid] = worker_ref diff --git a/xinference/core/worker.py b/xinference/core/worker.py index dac5e3c288..6a518f5252 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -22,7 +22,7 @@ import time from collections import defaultdict from logging import getLogger -from typing import Any, Dict, List, Optional, Set, Tuple, Union +from typing import Any, Dict, List, Literal, Optional, Set, Tuple, Union import xoscar as xo from async_timeout import timeout @@ -587,6 +587,7 @@ async def launch_builtin_model( peft_model_config: Optional[PeftModelConfig] = None, request_limits: Optional[int] = None, gpu_idx: Optional[Union[int, List[int]]] = None, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, **kwargs, ): # !!! Note that The following code must be placed at the very beginning of this function, @@ -669,6 +670,7 @@ async def launch_builtin_model( model_size_in_billions, quantization, peft_model_config, + download_hub, **kwargs, ) await self.update_cache_status(model_name, model_description) diff --git a/xinference/model/audio/core.py b/xinference/model/audio/core.py index 1e37b1cf3d..cbe86110e9 100644 --- a/xinference/model/audio/core.py +++ b/xinference/model/audio/core.py @@ -14,7 +14,7 @@ import logging import os from collections import defaultdict -from typing import Dict, List, Optional, Tuple, Union +from typing import Dict, List, Literal, Optional, Tuple, Union from ...constants import XINFERENCE_CACHE_DIR from ..core import CacheableModelSpec, ModelDescription @@ -94,7 +94,10 @@ def generate_audio_description( return res -def match_audio(model_name: str) -> AudioModelFamilyV1: +def match_audio( + model_name: str, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, +) -> AudioModelFamilyV1: from ..utils import download_from_modelscope from . import BUILTIN_AUDIO_MODELS, MODELSCOPE_AUDIO_MODELS from .custom import get_user_defined_audios @@ -103,17 +106,17 @@ def match_audio(model_name: str) -> AudioModelFamilyV1: if model_spec.model_name == model_name: return model_spec - if download_from_modelscope(): - if model_name in MODELSCOPE_AUDIO_MODELS: - logger.debug(f"Audio model {model_name} found in ModelScope.") - return MODELSCOPE_AUDIO_MODELS[model_name] - else: - logger.debug( - f"Audio model {model_name} not found in ModelScope, " - f"now try to load it via builtin way." - ) - - if model_name in BUILTIN_AUDIO_MODELS: + if download_hub == "huggingface" and model_name in BUILTIN_AUDIO_MODELS: + logger.debug(f"Audio model {model_name} found in huggingface.") + return BUILTIN_AUDIO_MODELS[model_name] + elif download_hub == "modelscope" and model_name in MODELSCOPE_AUDIO_MODELS: + logger.debug(f"Audio model {model_name} found in ModelScope.") + return MODELSCOPE_AUDIO_MODELS[model_name] + elif download_from_modelscope() and model_name in MODELSCOPE_AUDIO_MODELS: + logger.debug(f"Audio model {model_name} found in ModelScope.") + return MODELSCOPE_AUDIO_MODELS[model_name] + elif model_name in BUILTIN_AUDIO_MODELS: + logger.debug(f"Audio model {model_name} found in huggingface.") return BUILTIN_AUDIO_MODELS[model_name] else: raise ValueError( @@ -141,9 +144,14 @@ def get_cache_status( def create_audio_model_instance( - subpool_addr: str, devices: List[str], model_uid: str, model_name: str, **kwargs + subpool_addr: str, + devices: List[str], + model_uid: str, + model_name: str, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + **kwargs, ) -> Tuple[Union[WhisperModel, ChatTTSModel], AudioModelDescription]: - model_spec = match_audio(model_name) + model_spec = match_audio(model_name, download_hub) model_path = cache(model_spec) model: Union[WhisperModel, ChatTTSModel] if model_spec.model_family == "whisper": diff --git a/xinference/model/core.py b/xinference/model/core.py index 8638ae27c9..90a1c01c90 100644 --- a/xinference/model/core.py +++ b/xinference/model/core.py @@ -13,7 +13,7 @@ # limitations under the License. from abc import ABC, abstractmethod -from typing import Any, List, Optional, Tuple, Union +from typing import Any, List, Literal, Optional, Tuple, Union from .._compat import BaseModel from ..types import PeftModelConfig @@ -55,6 +55,7 @@ def create_model_instance( model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, peft_model_config: Optional[PeftModelConfig] = None, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, **kwargs, ) -> Tuple[Any, ModelDescription]: from .audio.core import create_audio_model_instance @@ -74,13 +75,14 @@ def create_model_instance( model_size_in_billions, quantization, peft_model_config, + download_hub, **kwargs, ) elif model_type == "embedding": # embedding model doesn't accept trust_remote_code kwargs.pop("trust_remote_code", None) return create_embedding_model_instance( - subpool_addr, devices, model_uid, model_name, **kwargs + subpool_addr, devices, model_uid, model_name, download_hub, **kwargs ) elif model_type == "image": kwargs.pop("trust_remote_code", None) @@ -90,17 +92,18 @@ def create_model_instance( model_uid, model_name, peft_model_config, + download_hub, **kwargs, ) elif model_type == "rerank": kwargs.pop("trust_remote_code", None) return create_rerank_model_instance( - subpool_addr, devices, model_uid, model_name, **kwargs + subpool_addr, devices, model_uid, model_name, download_hub, **kwargs ) elif model_type == "audio": kwargs.pop("trust_remote_code", None) return create_audio_model_instance( - subpool_addr, devices, model_uid, model_name, **kwargs + subpool_addr, devices, model_uid, model_name, download_hub, **kwargs ) else: raise ValueError(f"Unsupported model type: {model_type}.") diff --git a/xinference/model/embedding/core.py b/xinference/model/embedding/core.py index 331c4a8b9b..3b0b4bf3ad 100644 --- a/xinference/model/embedding/core.py +++ b/xinference/model/embedding/core.py @@ -16,7 +16,7 @@ import logging import os from collections import defaultdict -from typing import Dict, List, Optional, Tuple, Union, no_type_check +from typing import Dict, List, Literal, Optional, Tuple, Union, no_type_check import numpy as np @@ -305,7 +305,10 @@ def encode( ) -def match_embedding(model_name: str) -> EmbeddingModelSpec: +def match_embedding( + model_name: str, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, +) -> EmbeddingModelSpec: from ..utils import download_from_modelscope from . import BUILTIN_EMBEDDING_MODELS, MODELSCOPE_EMBEDDING_MODELS from .custom import get_user_defined_embeddings @@ -315,29 +318,35 @@ def match_embedding(model_name: str) -> EmbeddingModelSpec: if model_name == model_spec.model_name: return model_spec - if download_from_modelscope(): - if model_name in MODELSCOPE_EMBEDDING_MODELS: - logger.debug(f"Embedding model {model_name} found in ModelScope.") - return MODELSCOPE_EMBEDDING_MODELS[model_name] - else: - logger.debug( - f"Embedding model {model_name} not found in ModelScope, " - f"now try to load it via builtin way." - ) - - if model_name in BUILTIN_EMBEDDING_MODELS: + if download_hub == "modelscope" and model_name in MODELSCOPE_EMBEDDING_MODELS: + logger.debug(f"Embedding model {model_name} found in ModelScope.") + return MODELSCOPE_EMBEDDING_MODELS[model_name] + elif download_hub == "huggingface" and model_name in BUILTIN_EMBEDDING_MODELS: + logger.debug(f"Embedding model {model_name} found in Huggingface.") + return BUILTIN_EMBEDDING_MODELS[model_name] + elif download_from_modelscope() and model_name in MODELSCOPE_EMBEDDING_MODELS: + logger.debug(f"Embedding model {model_name} found in ModelScope.") + return MODELSCOPE_EMBEDDING_MODELS[model_name] + elif model_name in BUILTIN_EMBEDDING_MODELS: + logger.debug(f"Embedding model {model_name} found in Huggingface.") return BUILTIN_EMBEDDING_MODELS[model_name] else: raise ValueError( f"Embedding model {model_name} not found, available" - f"model list: {BUILTIN_EMBEDDING_MODELS.keys()}" + f"Huggingface: {BUILTIN_EMBEDDING_MODELS.keys()}" + f"ModelScope: {MODELSCOPE_EMBEDDING_MODELS.keys()}" ) def create_embedding_model_instance( - subpool_addr: str, devices: List[str], model_uid: str, model_name: str, **kwargs + subpool_addr: str, + devices: List[str], + model_uid: str, + model_name: str, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + **kwargs, ) -> Tuple[EmbeddingModel, EmbeddingModelDescription]: - model_spec = match_embedding(model_name) + model_spec = match_embedding(model_name, download_hub) model_path = cache(model_spec) model = EmbeddingModel(model_uid, model_path, **kwargs) model_description = EmbeddingModelDescription( diff --git a/xinference/model/image/core.py b/xinference/model/image/core.py index 25ea325b23..0ebd29ce47 100644 --- a/xinference/model/image/core.py +++ b/xinference/model/image/core.py @@ -15,7 +15,7 @@ import logging import os from collections import defaultdict -from typing import Dict, List, Optional, Tuple +from typing import Dict, List, Literal, Optional, Tuple from ...constants import XINFERENCE_CACHE_DIR from ...types import PeftModelConfig @@ -117,7 +117,10 @@ def generate_image_description( return res -def match_diffusion(model_name: str) -> ImageModelFamilyV1: +def match_diffusion( + model_name: str, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, +) -> ImageModelFamilyV1: from ..utils import download_from_modelscope from . import BUILTIN_IMAGE_MODELS, MODELSCOPE_IMAGE_MODELS from .custom import get_user_defined_images @@ -126,17 +129,17 @@ def match_diffusion(model_name: str) -> ImageModelFamilyV1: if model_spec.model_name == model_name: return model_spec - if download_from_modelscope(): - if model_name in MODELSCOPE_IMAGE_MODELS: - logger.debug(f"Image model {model_name} found in ModelScope.") - return MODELSCOPE_IMAGE_MODELS[model_name] - else: - logger.debug( - f"Image model {model_name} not found in ModelScope, " - f"now try to load it via builtin way." - ) - - if model_name in BUILTIN_IMAGE_MODELS: + if download_hub == "modelscope" and model_name in MODELSCOPE_IMAGE_MODELS: + logger.debug(f"Image model {model_name} found in ModelScope.") + return MODELSCOPE_IMAGE_MODELS[model_name] + elif download_hub == "huggingface" and model_name in BUILTIN_IMAGE_MODELS: + logger.debug(f"Image model {model_name} found in Huggingface.") + return BUILTIN_IMAGE_MODELS[model_name] + elif download_from_modelscope() and model_name in MODELSCOPE_IMAGE_MODELS: + logger.debug(f"Image model {model_name} found in ModelScope.") + return MODELSCOPE_IMAGE_MODELS[model_name] + elif model_name in BUILTIN_IMAGE_MODELS: + logger.debug(f"Image model {model_name} found in Huggingface.") return BUILTIN_IMAGE_MODELS[model_name] else: raise ValueError( @@ -183,9 +186,10 @@ def create_image_model_instance( model_uid: str, model_name: str, peft_model_config: Optional[PeftModelConfig] = None, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, **kwargs, ) -> Tuple[DiffusionModel, ImageModelDescription]: - model_spec = match_diffusion(model_name) + model_spec = match_diffusion(model_name, download_hub) controlnet = kwargs.get("controlnet") # Handle controlnet if controlnet is not None: diff --git a/xinference/model/llm/core.py b/xinference/model/llm/core.py index 53c00a7eaa..9aa0599820 100644 --- a/xinference/model/llm/core.py +++ b/xinference/model/llm/core.py @@ -20,7 +20,7 @@ from abc import abstractmethod from collections import defaultdict from functools import lru_cache -from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union +from typing import TYPE_CHECKING, Dict, List, Literal, Optional, Tuple, Union from ...core.utils import parse_replica_model_uid from ...types import PeftModelConfig @@ -193,6 +193,7 @@ def create_llm_model_instance( model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, peft_model_config: Optional[PeftModelConfig] = None, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, **kwargs, ) -> Tuple[LLM, LLMDescription]: from .llm_family import cache, check_engine_by_spec_parameters, match_llm @@ -200,7 +201,7 @@ def create_llm_model_instance( if model_engine is None: raise ValueError("model_engine is required for LLM model") match_result = match_llm( - model_name, model_format, model_size_in_billions, quantization + model_name, model_format, model_size_in_billions, quantization, download_hub ) if not match_result: diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 7ea575fb65..8116bfd8a5 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -1006,6 +1006,7 @@ def match_llm( model_format: Optional[str] = None, model_size_in_billions: Optional[Union[int, str]] = None, quantization: Optional[str] = None, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, ) -> Optional[Tuple[LLMFamilyV1, LLMSpecV1, str]]: """ Find an LLM family, spec, and quantization that satisfy given criteria. @@ -1029,7 +1030,22 @@ def _apply_format_to_model_id(spec: LLMSpecV1, q: str) -> LLMSpecV1: spec.model_id = spec.model_id.format(quantization=q) return spec - if download_from_modelscope(): + # priority: download_hub > download_from_modelscope() and download_from_csghub() + if download_hub == "modelscope": + all_families = ( + BUILTIN_MODELSCOPE_LLM_FAMILIES + + BUILTIN_LLM_FAMILIES + + user_defined_llm_families + ) + elif download_hub == "csghub": + all_families = ( + BUILTIN_CSGHUB_LLM_FAMILIES + + BUILTIN_LLM_FAMILIES + + user_defined_llm_families + ) + elif download_hub == "huggingface": + all_families = BUILTIN_LLM_FAMILIES + user_defined_llm_families + elif download_from_modelscope(): all_families = ( BUILTIN_MODELSCOPE_LLM_FAMILIES + BUILTIN_LLM_FAMILIES diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index 9c8b2662c2..3fa53e31b6 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -18,7 +18,7 @@ import uuid from collections import defaultdict from collections.abc import Sequence -from typing import Dict, List, Optional, Tuple +from typing import Dict, List, Literal, Optional, Tuple import numpy as np import torch @@ -285,7 +285,12 @@ def cache(model_spec: RerankModelSpec): def create_rerank_model_instance( - subpool_addr: str, devices: List[str], model_uid: str, model_name: str, **kwargs + subpool_addr: str, + devices: List[str], + model_uid: str, + model_name: str, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + **kwargs, ) -> Tuple[RerankModel, RerankModelDescription]: from ..utils import download_from_modelscope from . import BUILTIN_RERANK_MODELS, MODELSCOPE_RERANK_MODELS @@ -298,30 +303,24 @@ def create_rerank_model_instance( break if model_spec is None: - if download_from_modelscope(): - if model_name in MODELSCOPE_RERANK_MODELS: - logger.debug(f"Rerank model {model_name} found in ModelScope.") - model_spec = MODELSCOPE_RERANK_MODELS[model_name] - else: - logger.debug( - f"Rerank model {model_name} not found in ModelScope, " - f"now try to download from huggingface." - ) - if model_name in BUILTIN_RERANK_MODELS: - model_spec = BUILTIN_RERANK_MODELS[model_name] - else: - raise ValueError( - f"Rerank model {model_name} not found, available" - f"model list: {BUILTIN_RERANK_MODELS.keys()}" - ) + if download_hub == "huggingface" and model_name in BUILTIN_RERANK_MODELS: + logger.debug(f"Rerank model {model_name} found in Huggingface.") + model_spec = BUILTIN_RERANK_MODELS[model_name] + elif download_hub == "modelscope" and model_name in MODELSCOPE_RERANK_MODELS: + logger.debug(f"Rerank model {model_name} found in ModelScope.") + model_spec = MODELSCOPE_RERANK_MODELS[model_name] + elif download_from_modelscope() and model_name in MODELSCOPE_RERANK_MODELS: + logger.debug(f"Rerank model {model_name} found in ModelScope.") + model_spec = MODELSCOPE_RERANK_MODELS[model_name] + elif model_name in BUILTIN_RERANK_MODELS: + logger.debug(f"Rerank model {model_name} found in Huggingface.") + model_spec = BUILTIN_RERANK_MODELS[model_name] else: - if model_name in BUILTIN_RERANK_MODELS: - model_spec = BUILTIN_RERANK_MODELS[model_name] - else: - raise ValueError( - f"Rerank model {model_name} not found, available" - f"model list: {BUILTIN_RERANK_MODELS.keys()}" - ) + raise ValueError( + f"Rerank model {model_name} not found, available" + f"Huggingface: {BUILTIN_RERANK_MODELS.keys()}" + f"ModelScope: {MODELSCOPE_RERANK_MODELS.keys()}" + ) model_path = cache(model_spec) use_fp16 = kwargs.pop("use_fp16", False) From b8d3bcf0dd7e724bb362e41d7641e420d41f42e2 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Thu, 11 Jul 2024 16:05:34 +0800 Subject: [PATCH 191/298] FEAT: [UI] Specify download hub. (#1840) --- .../ui/src/scenes/launch_model/modelCard.js | 69 ++++++++++++++++++- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index f231d5827d..a9f6685bf7 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -69,9 +69,12 @@ const llmAllDataKey = [ 'request_limits', 'worker_ip', 'gpu_idx', + 'download_hub', 'peft_model_config', ] +const csghubArr = ['qwen2-instruct'] + const ModelCard = ({ url, modelData, @@ -107,6 +110,7 @@ const ModelCard = ({ const [requestLimits, setRequestLimits] = useState('') const [workerIp, setWorkerIp] = useState('') const [GPUIdx, setGPUIdx] = useState('') + const [downloadHub, setDownloadHub] = useState('') const [enginesObj, setEnginesObj] = useState({}) const [engineOptions, setEngineOptions] = useState([]) @@ -298,12 +302,14 @@ const ModelCard = ({ : Number(String(requestLimits).trim()), worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), + download_hub: downloadHub === '' ? null : downloadHub, } let modelDataWithID_other = { model_uid: modelUID.trim() === '' ? null : modelUID.trim(), model_name: modelData.model_name, model_type: modelType, + download_hub: downloadHub === '' ? null : downloadHub, } if (modelType === 'embedding' || modelType === 'rerank') { @@ -552,6 +558,7 @@ const ModelCard = ({ request_limits, worker_ip, gpu_idx, + download_hub, peft_model_config, } = arr[0] @@ -574,6 +581,7 @@ const ModelCard = ({ setRequestLimits(request_limits || '') setWorkerIp(worker_ip || '') setGPUIdx(gpu_idx?.join(',') || '') + setDownloadHub(download_hub || '') let loraData = [] peft_model_config?.lora_list?.forEach((item) => { @@ -609,7 +617,13 @@ const ModelCard = ({ } setCustomArr(customData) - if (model_uid || request_limits || worker_ip || gpu_idx?.join(',')) + if ( + model_uid || + request_limits || + worker_ip || + gpu_idx?.join(',') || + download_hub + ) setIsOther(true) if ( @@ -633,6 +647,7 @@ const ModelCard = ({ } else { setModelUID(arr[0].model_uid || '') } + setDownloadHub(arr[0].download_hub) } } @@ -1336,11 +1351,40 @@ const ModelCard = ({ )} </FormControl> </Grid> + <Grid item xs={12}> + <FormControl variant="outlined" margin="normal" fullWidth> + <InputLabel id="quantization-label"> + (Optional) Download_hub + </InputLabel> + <Select + labelId="download_hub-label" + value={downloadHub} + onChange={(e) => setDownloadHub(e.target.value)} + label="(Optional) Download_hub" + > + {(csghubArr.includes(modelData.model_name) + ? ['huggingface', 'modelscope', 'csghub'] + : ['huggingface', 'modelscope'] + ).map((item) => { + return ( + <MenuItem key={item} value={item}> + {item} + </MenuItem> + ) + })} + </Select> + </FormControl> + </Grid> <ListItemButton onClick={() => setIsPeftModelConfig(!isPeftModelConfig)} > - <ListItemText primary="Lora Config" /> - {isPeftModelConfig ? <ExpandLess /> : <ExpandMore />} + <div style={{ display: 'flex', alignItems: 'center' }}> + <ListItemText + primary="Lora Config" + style={{ marginRight: 10 }} + /> + {isPeftModelConfig ? <ExpandLess /> : <ExpandMore />} + </div> </ListItemButton> <Collapse in={isPeftModelConfig} @@ -1476,6 +1520,25 @@ const ModelCard = ({ </FormControl> </> )} + <FormControl variant="outlined" margin="normal" fullWidth> + <InputLabel id="quantization-label"> + (Optional) Download_hub + </InputLabel> + <Select + labelId="download_hub-label" + value={downloadHub} + onChange={(e) => setDownloadHub(e.target.value)} + label="(Optional) Download_hub" + > + {['huggingface', 'modelscope'].map((item) => { + return ( + <MenuItem key={item} value={item}> + {item} + </MenuItem> + ) + })} + </Select> + </FormControl> </FormControl> )} <Box className="buttonsContainer"> From 8f4cbb2cfb45b4d5038e6a59929c2d6d91910af3 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 11 Jul 2024 16:21:22 +0800 Subject: [PATCH 192/298] DOC: update readme (#1815) --- README.md | 8 ++++---- README_zh_CN.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index afd3d451af..4d75133fca 100644 --- a/README.md +++ b/README.md @@ -26,22 +26,22 @@ potential of cutting-edge AI models. ## 🔥 Hot Topics ### Framework Enhancements +- Support Continuous batching for Transformers engine: [#1724](https://github.com/xorbitsai/inference/pull/1724) +- Support MLX backend for Apple Silicon chips: [#1765](https://github.com/xorbitsai/inference/pull/1765) - Support specifying worker and GPU indexes for launching models: [#1195](https://github.com/xorbitsai/inference/pull/1195) - Support SGLang backend: [#1161](https://github.com/xorbitsai/inference/pull/1161) - Support LoRA for LLM and image models: [#1080](https://github.com/xorbitsai/inference/pull/1080) - Support speech recognition model: [#929](https://github.com/xorbitsai/inference/pull/929) - Metrics support: [#906](https://github.com/xorbitsai/inference/pull/906) -- Docker image: [#855](https://github.com/xorbitsai/inference/pull/855) -- Support multimodal: [#829](https://github.com/xorbitsai/inference/pull/829) ### New Models +- Built-in support for [Gemma-2-it](https://huggingface.co/blog/gemma2): [#1774](https://github.com/xorbitsai/inference/pull/1774) +- Built-in support for [jina-reranker-v2](https://huggingface.co/jinaai/jina-reranker-v2-base-multilingual): [#1733](https://github.com/xorbitsai/inference/pull/1733) - Built-in support for [Qwen2](https://github.com/QwenLM/Qwen2): [#1509](https://github.com/xorbitsai/inference/pull/1597) - Built-in support for [ChatTTS](https://github.com/2noise/ChatTTS): [#1578](https://github.com/xorbitsai/inference/pull/1578) - Built-in support for [GLM-4 & GLM-4V](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) - Built-in support for [Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3): [#1576](https://github.com/xorbitsai/inference/pull/1576) - Built-in support for [Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1): [#1575](https://github.com/xorbitsai/inference/pull/1575) - Built-in support for [MiniCPM-Llama3-V 2.5](https://github.com/OpenBMB/MiniCPM-V): [#1577](https://github.com/xorbitsai/inference/pull/1577) -- Built-in support for [CogVLM2](https://github.com/THUDM/CogVLM2): [#1551](https://github.com/xorbitsai/inference/pull/1551) -- Built-in support for [InternVL-Chat-V1-5](https://github.com/OpenGVLab/InternVL): [#1536](https://github.com/xorbitsai/inference/pull/1536) ### Integrations - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. diff --git a/README_zh_CN.md b/README_zh_CN.md index e2f62f43c5..5a46a10dd9 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -23,22 +23,22 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 ## 🔥 近期热点 ### 框架增强 +- 支持 Transformers 引擎的持续批处理: [#1724](https://github.com/xorbitsai/inference/pull/1724) +- 支持针对苹果芯片优化的MLX后端: [#1765](https://github.com/xorbitsai/inference/pull/1765) - 支持加载模型时指定 worker 和 GPU 索引: [#1195](https://github.com/xorbitsai/inference/pull/1195) - 支持 SGLang 后端: [#1161](https://github.com/xorbitsai/inference/pull/1161) - 支持LLM和图像模型的LoRA: [#1080](https://github.com/xorbitsai/inference/pull/1080) - 支持语音识别模型: [#929](https://github.com/xorbitsai/inference/pull/929) - 增加 Metrics 统计信息: [#906](https://github.com/xorbitsai/inference/pull/906) -- Docker 镜像支持: [#855](https://github.com/xorbitsai/inference/pull/855) -- 支持多模态模型:[#829](https://github.com/xorbitsai/inference/pull/829) ### 新模型 +- 内置 [Gemma-2-it](https://huggingface.co/blog/gemma2): [#1774](https://github.com/xorbitsai/inference/pull/1774) +- 内置 [jina-reranker-v2](https://huggingface.co/jinaai/jina-reranker-v2-base-multilingual): [#1733](https://github.com/xorbitsai/inference/pull/1733) - 内置 [Qwen2](https://github.com/QwenLM/Qwen2): [#1509](https://github.com/xorbitsai/inference/pull/1597) - 内置 [ChatTTS](https://github.com/2noise/ChatTTS): [#1578](https://github.com/xorbitsai/inference/pull/1578) - 内置 [GLM-4 & GLM-4V](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) - 内置 [Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3): [#1576](https://github.com/xorbitsai/inference/pull/1576) - 内置 [Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1): [#1575](https://github.com/xorbitsai/inference/pull/1575) - 内置 [MiniCPM-Llama3-V 2.5](https://github.com/OpenBMB/MiniCPM-V): [#1577](https://github.com/xorbitsai/inference/pull/1577) -- 内置 [CogVLM2](https://github.com/THUDM/CogVLM2): [#1551](https://github.com/xorbitsai/inference/pull/1551) -- 内置 [InternVL-Chat-V1-5](https://github.com/OpenGVLab/InternVL): [#1536](https://github.com/xorbitsai/inference/pull/1536) ### 集成 - [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 From ff17be31c6163000cc9aea1eddcb02846b3967f7 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:01:18 +0800 Subject: [PATCH 193/298] FIX: [UI] Fix download_hub bugs. (#1846) --- .../ui/src/scenes/launch_model/modelCard.js | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index a9f6685bf7..ab511fca04 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -707,6 +707,7 @@ const ModelCard = ({ setRequestLimits('') setWorkerIp('') setGPUIdx('') + setDownloadHub('') setLoraArr([]) setImageLoraLoadArr([]) setImageLoraFuseArr([]) @@ -717,8 +718,10 @@ const ModelCard = ({ setModelUID('') setReplica(1) setWorkerIp('') + setDownloadHub('') } else { setModelUID('') + setDownloadHub('') } } @@ -1359,12 +1362,16 @@ const ModelCard = ({ <Select labelId="download_hub-label" value={downloadHub} - onChange={(e) => setDownloadHub(e.target.value)} + onChange={(e) => { + e.target.value === 'none' + ? setDownloadHub('') + : setDownloadHub(e.target.value) + }} label="(Optional) Download_hub" > {(csghubArr.includes(modelData.model_name) - ? ['huggingface', 'modelscope', 'csghub'] - : ['huggingface', 'modelscope'] + ? ['none', 'huggingface', 'modelscope', 'csghub'] + : ['none', 'huggingface', 'modelscope'] ).map((item) => { return ( <MenuItem key={item} value={item}> @@ -1527,10 +1534,14 @@ const ModelCard = ({ <Select labelId="download_hub-label" value={downloadHub} - onChange={(e) => setDownloadHub(e.target.value)} + onChange={(e) => { + e.target.value === 'none' + ? setDownloadHub('') + : setDownloadHub(e.target.value) + }} label="(Optional) Download_hub" > - {['huggingface', 'modelscope'].map((item) => { + {['none', 'huggingface', 'modelscope'].map((item) => { return ( <MenuItem key={item} value={item}> {item} From 0f9c942effd45a3726b1e5de1999213f4796c1f4 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:40:43 +0800 Subject: [PATCH 194/298] REF: Remove `chatglm-cpp` and Fix latest `llama-cpp-python` issue (#1844) --- .github/workflows/python.yaml | 2 +- setup.cfg | 2 - xinference/deploy/docker/Dockerfile | 2 +- xinference/deploy/docker/requirements_cpu.txt | 1 - xinference/model/llm/__init__.py | 2 - xinference/model/llm/ggml/chatglm.py | 457 ------------------ xinference/model/llm/ggml/llamacpp.py | 11 +- .../model/llm/ggml/tests/test_chatglm.py | 247 ---------- xinference/model/llm/llm_family.json | 87 ++-- .../model/llm/llm_family_modelscope.json | 80 ++- xinference/model/llm/pytorch/core.py | 80 --- xinference/model/llm/tests/test_llm_family.py | 12 - xinference/types.py | 1 - 13 files changed, 109 insertions(+), 875 deletions(-) delete mode 100644 xinference/model/llm/ggml/chatglm.py delete mode 100644 xinference/model/llm/ggml/tests/test_chatglm.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 3a5c824a3f..16591dcbe0 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -113,7 +113,7 @@ jobs: if [ "$MODULE" == "metal" ]; then pip install mlx-lm fi - pip install "llama-cpp-python==0.2.77" + pip install "llama-cpp-python==0.2.77" --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu pip install transformers pip install attrdict pip install "timm>=0.9.16" diff --git a/setup.cfg b/setup.cfg index 8f2928aafb..6679601b9e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -82,7 +82,6 @@ dev = sphinx-tabs sphinx-design all = - chatglm-cpp>=0.3.0 llama-cpp-python>=0.2.25,!=0.2.58 transformers>=4.34.1 torch @@ -121,7 +120,6 @@ intel = intel_extension_for_pytorch==2.1.10+xpu ggml = llama-cpp-python>=0.2.25,!=0.2.58 - chatglm-cpp>=0.3.0 transformers = transformers>=4.34.1 torch diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 95f652e63d..77e5579dfd 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -23,7 +23,7 @@ ARG PIP_INDEX=https://pypi.org/simple RUN pip install --upgrade -i "$PIP_INDEX" pip && \ pip install -i "$PIP_INDEX" "diskcache>=5.6.1" "jinja2>=2.11.3" && \ # use pre-built whl package for llama-cpp-python, otherwise may core dump when init llama in some envs - pip install "llama-cpp-python==0.2.77" -i https://abetlen.github.io/llama-cpp-python/whl/cu124 && \ + pip install "llama-cpp-python>=0.2.82" -i https://abetlen.github.io/llama-cpp-python/whl/cu124 && \ pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements.txt && \ pip install -i "$PIP_INDEX" --no-deps sglang && \ cd /opt/inference && \ diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index ee1130fbe8..9249d5ae76 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -42,4 +42,3 @@ optimum peft timm opencv-contrib-python-headless -chatglm-cpp diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 1313d73196..749596fdbe 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -112,7 +112,6 @@ def generate_engine_config_by_model_family(model_family): def _install(): - from .ggml.chatglm import ChatglmCppChatModel from .ggml.llamacpp import LlamaCppChatModel, LlamaCppModel from .mlx.core import MLXChatModel, MLXModel from .pytorch.baichuan import BaichuanPytorchChatModel @@ -143,7 +142,6 @@ def _install(): # register llm classes. LLAMA_CLASSES.extend( [ - ChatglmCppChatModel, LlamaCppChatModel, LlamaCppModel, ] diff --git a/xinference/model/llm/ggml/chatglm.py b/xinference/model/llm/ggml/chatglm.py deleted file mode 100644 index a7d39014dd..0000000000 --- a/xinference/model/llm/ggml/chatglm.py +++ /dev/null @@ -1,457 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import json -import logging -import os -import time -import uuid -from pathlib import Path -from typing import TYPE_CHECKING, Any, Iterator, List, Optional, Union - -from ....types import ( - SPECIAL_TOOL_PROMPT, - ChatCompletion, - ChatCompletionChunk, - ChatCompletionMessage, - ChatglmCppGenerateConfig, - ChatglmCppModelConfig, - Completion, - CompletionChunk, -) -from .. import LLMFamilyV1, LLMSpecV1 -from ..core import LLM - -if TYPE_CHECKING: - from chatglm_cpp import Pipeline - - -logger = logging.getLogger(__name__) - - -class ChatglmCppChatModel(LLM): - def __init__( - self, - model_uid: str, - model_family: "LLMFamilyV1", - model_spec: "LLMSpecV1", - quantization: str, - model_path: str, - model_config: Optional[ChatglmCppModelConfig] = None, - ): - super().__init__(model_uid, model_family, model_spec, quantization, model_path) - self._llm: Optional["Pipeline"] = None - - # just a placeholder for now as the chatglm_cpp repo doesn't support model config. - self._model_config = model_config - - @classmethod - def _sanitize_generate_config( - cls, - chatglmcpp_generate_config: Optional[ChatglmCppGenerateConfig], - ) -> ChatglmCppGenerateConfig: - if chatglmcpp_generate_config is None: - chatglmcpp_generate_config = ChatglmCppGenerateConfig() - chatglmcpp_generate_config.setdefault("stream", False) - return chatglmcpp_generate_config - - def load(self): - try: - import chatglm_cpp - except ImportError: - error_message = "Failed to import module 'chatglm_cpp'" - installation_guide = [ - "Please make sure 'chatglm_cpp' is installed. ", - "You can install it by running the following command in the terminal:\n", - "pip install git+https://github.com/li-plus/chatglm.cpp.git@main\n\n", - "Or visit the original git repo if the above command fails:\n", - "https://github.com/li-plus/chatglm.cpp", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - model_file_path = os.path.join( - self.model_path, - self.model_spec.model_file_name_template.format( - quantization=self.quantization - ), - ) - - # handle legacy cache. - legacy_model_file_path = os.path.join(self.model_path, "model.bin") - if os.path.exists(legacy_model_file_path): - model_file_path = legacy_model_file_path - - self._llm = chatglm_cpp.Pipeline(Path(model_file_path)) - - @classmethod - def match( - cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str - ) -> bool: - if llm_spec.model_format != "ggmlv3": - return False - if "chatglm" not in llm_family.model_name: - return False - if "chat" not in llm_family.model_ability: - return False - return True - - @staticmethod - def _convert_raw_text_chunks_to_chat( - tokens: Iterator[Any], model_name: str, include_usage: bool, input_ids - ) -> Iterator[ChatCompletionChunk]: - request_id = str(uuid.uuid4()) - yield { - "id": "chat" + f"cmpl-{request_id}", - "model": model_name, - "object": "chat.completion.chunk", - "created": int(time.time()), - "choices": [ - { - "index": 0, - "delta": { - "role": "assistant", - }, - "finish_reason": None, - } - ], - } - prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 - for token in tokens: - prompt_tokens = len(input_ids) - completion_tokens = completion_tokens + 1 - total_tokens = prompt_tokens + completion_tokens - yield { - "id": "chat" + f"cmpl-{request_id}", - "model": model_name, - "object": "chat.completion.chunk", - "created": int(time.time()), - "choices": [ - { - "index": 0, - "delta": { - "content": ( - token if isinstance(token, str) else token.content - ), - }, - "finish_reason": None, - } - ], - } - # stop - yield { - "id": "chat" + f"cmpl-{request_id}", - "model": model_name, - "object": "chat.completion.chunk", - "created": int(time.time()), - "choices": [ - { - "index": 0, - "delta": { - "content": "", - }, - "finish_reason": "stop", - } - ], - } - if include_usage: - yield { - "id": "chat" + f"cmpl-{request_id}", - "model": model_name, - "object": "chat.completion.chunk", - "created": int(time.time()), - "choices": [], - "usage": { - "prompt_tokens": prompt_tokens, - "completion_tokens": completion_tokens, - "total_tokens": total_tokens, - }, - } - - @classmethod - def _convert_raw_text_completion_to_chat( - cls, text: Any, model_name: str - ) -> ChatCompletion: - _id = str(uuid.uuid4()) - return { - "id": "chat" + f"cmpl-{_id}", - "model": model_name, - "object": "chat.completion", - "created": int(time.time()), - "choices": [ - { - "index": 0, - "message": cls._message_to_json_string(_id, text), - "finish_reason": cls._finish_reason_from_msg(text), - } - ], - "usage": { - "prompt_tokens": -1, - "completion_tokens": -1, - "total_tokens": -1, - }, - } - - @staticmethod - def _finish_reason_from_msg(msg): - if isinstance(msg, str): - return None - else: - return "tool_calls" if msg.tool_calls else "stop" - - @staticmethod - def _eval_arguments(arguments): - def tool_call(**kwargs): - return kwargs - - try: - return json.dumps(eval(arguments, dict(tool_call=tool_call))) - except Exception: - return f"Invalid arguments {arguments}" - - @classmethod - def _message_to_json_string(cls, _id, msg) -> ChatCompletionMessage: - if isinstance(msg, str): - return { - "role": "assistant", - "content": msg, - } - else: - return { - "role": msg.role, - "content": msg.content, - "tool_calls": [ - { - "id": f"call_{_id}", - "type": tc.type, - "function": { - "name": tc.function.name, - "arguments": cls._eval_arguments(tc.function.arguments), - }, - } - for tc in msg.tool_calls - ], - } - - @staticmethod - def _handle_tools(generate_config) -> Optional[ChatCompletionMessage]: - """Convert openai tools to ChatGLM tools.""" - if generate_config is None: - return None - tools = generate_config.pop("tools", None) - if tools is None: - return None - chatglm_tools = [] - for elem in tools: - if elem.get("type") != "function" or "function" not in elem: - raise ValueError("ChatGLM tools only support function type.") - chatglm_tools.append(elem["function"]) - return { - "role": "system", - "content": ( - f"Answer the following questions as best as you can. You have access to the following tools:\n" - f"{json.dumps(chatglm_tools, indent=4, ensure_ascii=False)}" - ), - } - - @staticmethod - def _to_chatglm_chat_messages(history_list: List[Any]): - from chatglm_cpp import ChatMessage - - return [ChatMessage(role=v["role"], content=v["content"]) for v in history_list] - - def chat( - self, - prompt: str, - system_prompt: Optional[str] = None, - chat_history: Optional[List[ChatCompletionMessage]] = None, - generate_config: Optional[ChatglmCppGenerateConfig] = None, - ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: - chat_history_list = [] - if system_prompt is not None: - chat_history_list.append({"role": "system", "content": system_prompt}) - if chat_history is not None: - chat_history_list.extend(chat_history) # type: ignore - - tool_message = self._handle_tools(generate_config) - if tool_message is not None: - chat_history_list.insert(0, tool_message) # type: ignore - - # We drop the message which contains tool calls to walkaround the issue: - # https://github.com/li-plus/chatglm.cpp/issues/231 - chat_history_list = [m for m in chat_history_list if not m.get("tool_calls")] - for idx, m in enumerate(chat_history_list): - if m.get("role") == "tool": - # Reconstruct a simple tool message. - chat_history_list[idx] = { - "content": m["content"], - "role": "observation", - } - break - - if prompt != SPECIAL_TOOL_PROMPT: - chat_history_list.append({"role": "user", "content": prompt}) - logger.debug("Full conversation history:\n%s", str(chat_history_list)) - - generate_config = self._sanitize_generate_config(generate_config) - - params = { - "max_length": generate_config.get("max_tokens"), - "max_context_length": generate_config.get("max_tokens", 1024), - "top_k": generate_config.get("top_k"), - "top_p": generate_config.get("top_p"), - "temperature": generate_config.get("temperature"), - "stream": generate_config.get("stream", False), - } - - # Remove None values to exclude missing keys from params - params = {k: v for k, v in params.items() if v is not None} - - assert self._llm is not None - chat_history_messages = self._to_chatglm_chat_messages(chat_history_list) - - stream = generate_config.get("stream") - stream_options = generate_config.get("stream_options", None) - include_usage = ( - stream_options["include_usage"] - if isinstance(stream_options, dict) - else False - ) - - if stream: - it = self._llm.chat( - chat_history_messages, - **params, - ) - assert not isinstance(it, str) - input_ids = self._llm.tokenizer.encode_messages( - chat_history_messages, params["max_context_length"] - ) - return self._convert_raw_text_chunks_to_chat( - it, self.model_uid, include_usage, input_ids - ) - - else: - c = self._llm.chat( - chat_history_messages, - **params, - ) - assert not isinstance(c, Iterator) - return self._convert_raw_text_completion_to_chat(c, self.model_uid) - - @staticmethod - def _convert_str_to_completion(data: str, model_name: str) -> Completion: - return { - "id": "generate" + f"-{str(uuid.uuid4())}", - "model": model_name, - "object": "text_completion", - "created": int(time.time()), - "choices": [ - {"index": 0, "text": data, "finish_reason": None, "logprobs": None} - ], - "usage": { - "prompt_tokens": -1, - "completion_tokens": -1, - "total_tokens": -1, - }, - } - - @staticmethod - def _convert_str_to_completion_chunk( - tokens: Iterator[str], model_name: str, include_usage: bool, input_ids - ) -> Iterator[CompletionChunk]: - request_id = str(uuid.uuid4()) - prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 - for i, token in enumerate(tokens): - yield { - "id": "generate" + f"-{request_id}", - "model": model_name, - "object": "text_completion", - "created": int(time.time()), - "choices": [ - {"index": 0, "text": token, "finish_reason": None, "logprobs": None} - ], - } - prompt_tokens = len(input_ids) - completion_tokens = i - total_tokens = prompt_tokens + completion_tokens - # stop - yield { - "id": "chat" + f"cmpl-{request_id}", - "model": model_name, - "object": "text_completion", - "created": int(time.time()), - "choices": [ - {"index": 0, "text": "", "finish_reason": "stop", "logprobs": None} - ], - } - if include_usage: - yield { - "id": "chat" + f"cmpl-{request_id}", - "model": model_name, - "object": "text_completion", - "created": int(time.time()), - "choices": [], - "usage": { - "prompt_tokens": prompt_tokens, - "completion_tokens": completion_tokens, - "total_tokens": total_tokens, - }, - } - - def generate( - self, - prompt: str, - generate_config: Optional[ChatglmCppGenerateConfig] = None, - ) -> Union[Completion, Iterator[CompletionChunk]]: - logger.debug(f"Prompt for generate:\n{prompt}") - - generate_config = self._sanitize_generate_config(generate_config) - - params = { - "max_length": generate_config.get("max_tokens"), - "max_context_length": generate_config.get("max_tokens", 1024), - "top_k": generate_config.get("top_k"), - "top_p": generate_config.get("top_p"), - "temperature": generate_config.get("temperature"), - "stream": generate_config.get("stream", False), - } - - # Remove None values to exclude missing keys from params - params = {k: v for k, v in params.items() if v is not None} - - assert self._llm is not None - stream = generate_config.get("stream") - stream_options = generate_config.get("stream_options", None) - include_usage = ( - stream_options["include_usage"] - if isinstance(stream_options, dict) - else False - ) - if stream: - it = self._llm.generate( - prompt, - **params, - ) - assert not isinstance(it, str) - input_ids = self._llm.tokenizer.encode(prompt, params["max_context_length"]) - return self._convert_str_to_completion_chunk( - it, self.model_uid, include_usage, input_ids - ) - else: - c = self._llm.generate( - prompt, - **params, - ) - assert not isinstance(c, Iterator) - return self._convert_str_to_completion(c, self.model_uid) diff --git a/xinference/model/llm/ggml/llamacpp.py b/xinference/model/llm/ggml/llamacpp.py index be3e8f09ed..9e7edf93b9 100644 --- a/xinference/model/llm/ggml/llamacpp.py +++ b/xinference/model/llm/ggml/llamacpp.py @@ -25,7 +25,6 @@ CompletionChunk, CompletionUsage, CreateCompletionLlamaCpp, - Embedding, LlamaCppGenerateConfig, LlamaCppModelConfig, ) @@ -65,7 +64,6 @@ def _sanitize_model_config( if self.model_family.context_length: llamacpp_model_config.setdefault("n_ctx", self.model_family.context_length) - llamacpp_model_config.setdefault("embedding", True) llamacpp_model_config.setdefault("use_mmap", False) llamacpp_model_config.setdefault("use_mlock", True) @@ -185,7 +183,7 @@ def match( ) -> bool: if llm_spec.model_format not in ["ggmlv3", "ggufv2"]: return False - if "chatglm" in llm_family.model_name or "qwen" in llm_family.model_name: + if "qwen" in llm_family.model_name: return False if "generate" not in llm_family.model_ability: return False @@ -261,11 +259,6 @@ def generator_wrapper( else: return generator_wrapper(prompt, generate_config) - def create_embedding(self, input: Union[str, List[str]]) -> Embedding: - assert self._llm is not None - embedding = self._llm.create_embedding(input) - return embedding - class LlamaCppChatModel(LlamaCppModel, ChatModelMixin): def __init__( @@ -292,8 +285,6 @@ def match( ) -> bool: if llm_spec.model_format not in ["ggmlv3", "ggufv2"]: return False - if "chatglm" in llm_family.model_name: - return False if "chat" not in llm_family.model_ability: return False return True diff --git a/xinference/model/llm/ggml/tests/test_chatglm.py b/xinference/model/llm/ggml/tests/test_chatglm.py deleted file mode 100644 index c64f4bc391..0000000000 --- a/xinference/model/llm/ggml/tests/test_chatglm.py +++ /dev/null @@ -1,247 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import random -import string -from typing import Any, Iterator, List, Union - -import pytest - -from ...ggml.chatglm import ChatglmCppChatModel -from ...llm_family import GgmlLLMSpecV1, LLMFamilyV1 - - -class MockTokenizer: - def __init__(self): - pass - - def encode_messages( - self, text, max_length - ): # real signature unknown; NOTE: unreliably restored from __doc__ - """encode_messages(self: chatglm_cpp._C.BaseTokenizer, messages: List[chatglm_cpp._C.ChatMessage], max_length: int) -> List[int]""" - return [] - - def encode(self, text, max_length): # real signature unknown; restored from __doc__ - """encode(self: chatglm_cpp._C.BaseTokenizer, text: str, max_length: int) -> List[int]""" - return [] - - -class MockPipeline: - def __init__(self) -> None: - pass - - tokenizer = property( - lambda self: MockTokenizer(), lambda self, v: None, lambda self: None - ) # default - - def chat(self, *args, **kwargs) -> Union[str, Iterator[str]]: - stream = kwargs.get("stream", False) - return ( - iter([f"chatglm_test_stream_{i}" for i in range(5)]) - if stream - else "chatglm_test_chat" - ) - - def generate(self, *args, **kwargs) -> Union[str, Iterator[str]]: - stream = kwargs.get("stream", False) - return ( - "chatglm_test_generate" - if not stream - else iter([f"chatglm_test_stream_generate_{i}" for i in range(5)]) - ) - - -class MockChatglmCppChatModel(ChatglmCppChatModel): - def load(self): - self._llm = MockPipeline() - - @staticmethod - def _to_chatglm_chat_messages(history_list: List[Any]): - return [] - - -mock_model_spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=6, - quantizations=["q2_k", "q4_0"], - model_id="test_id", - model_file_name_template="TestModel.{quantization}.ggmlv3.bin", -) - -serialized = """{ - "version":1, - "context_length":2048, - "model_name":"TestModel", - "model_lang":[ - "en" - ], - "model_ability":[ - "embed", "generate" - ], - "model_specs":[ - { - "model_format":"ggmlv3", - "model_size_in_billions":6, - "quantizations": ["q2_k", "q4_0"], - "model_id":"test_id", - "model_file_name_template":"TestModel.{quantization}.ggmlv3.bin" - }, - { - "model_format":"pytorch", - "model_size_in_billions":3, - "quantizations": ["int8", "int4", "none"], - "model_id":"example/TestModel" - } - ], - "prompt_style": { - "style_name": "ADD_COLON_SINGLE", - "system_prompt": "TEST", - "roles": ["user", "assistant"], - "intra_message_sep": "\\n### ", - "inter_message_sep": "\\n### ", - "stop": null, - "stop_token_ids": null - } -}""" - -mock_model_family = LLMFamilyV1.parse_raw(serialized) - - -@pytest.mark.parametrize( - "model_spec, model_family", [(mock_model_spec, mock_model_family)] -) -def test_model_init(model_spec, model_family): - quantization = "q2_k" - uid = "".join(random.choice(string.digits) for i in range(100)) - path = "".join( - random.choice(string.ascii_letters + string.punctuation) for i in range(100) - ) - model = MockChatglmCppChatModel( - model_uid=uid, - model_family=model_family, - model_spec=model_spec, - quantization=quantization, - model_path=path, - ) - - assert model.model_uid == uid - assert model.quantization == quantization - assert model.model_path == path - - assert isinstance(model.model_spec, GgmlLLMSpecV1) - assert isinstance(model.model_family, LLMFamilyV1) - assert isinstance(model.model_family.model_specs[0], GgmlLLMSpecV1) - - assert ( - model.model_family.model_specs[0].model_format == model.model_spec.model_format - ) - assert model.model_family.model_specs[0].model_format == model_spec.model_format - assert ( - model.model_family.model_specs[0].model_size_in_billions - == model.model_spec.model_size_in_billions - ) - assert ( - model.model_family.model_specs[0].model_size_in_billions - == model_spec.model_size_in_billions - ) - assert ( - model.model_family.model_specs[0].quantizations - == model.model_spec.quantizations - ) - assert model.model_family.model_specs[0].quantizations == model_spec.quantizations - assert model.model_family.model_specs[0].model_id == model.model_spec.model_id - assert model.model_family.model_specs[0].model_id == model_spec.model_id - assert ( - model.model_family.model_specs[0].model_file_name_template - == model.model_spec.model_file_name_template - ) - assert ( - model.model_family.model_specs[0].model_file_name_template - == model_spec.model_file_name_template - ) - assert model.model_family.model_specs[0].model_uri == model.model_spec.model_uri - assert model.model_family.model_specs[0].model_uri == model_spec.model_uri - - assert model._llm is None - assert model._model_config is None - model._model_config = model._sanitize_generate_config(None) - assert not model._model_config["stream"] - - -@pytest.mark.parametrize( - "model_spec, model_family", [(mock_model_spec, mock_model_family)] -) -def test_model_chat(model_spec, model_family): - quantization = "q2_k" - uid = "".join(random.choice(string.digits) for i in range(100)) - path = "".join( - random.choice(string.ascii_letters + string.punctuation) for i in range(100) - ) - model = MockChatglmCppChatModel( - model_uid=uid, - model_family=model_family, - model_spec=model_spec, - quantization=quantization, - model_path=path, - ) - - assert model._llm is None - - model.load() - assert isinstance(model._llm, MockPipeline) - - responses_stream = list(model.chat("Hello", generate_config={"stream": True})) - assert responses_stream[0]["choices"][0]["delta"] == {"role": "assistant"} - for i in range(3): - assert responses_stream[i + 1]["choices"][0]["delta"] == { - "content": f"chatglm_test_stream_{i}" - } - - responses_non_stream = model.chat("Hello", generate_config={"stream": False}) - assert responses_non_stream["choices"][0]["message"] == { - "role": "assistant", - "content": "chatglm_test_chat", - } - - -@pytest.mark.parametrize( - "model_spec, model_family", [(mock_model_spec, mock_model_family)] -) -def test_model_generate(model_spec, model_family): - quantization = "q2_k" - uid = "".join(random.choice(string.digits) for i in range(100)) - path = "".join( - random.choice(string.ascii_letters + string.punctuation) for i in range(100) - ) - model = MockChatglmCppChatModel( - model_uid=uid, - model_family=model_family, - model_spec=model_spec, - quantization=quantization, - model_path=path, - ) - assert model._llm is None - - model.load() - assert isinstance(model._llm, MockPipeline) - - responses_stream = list(model.generate("Hello", generate_config={"stream": True})) - for i in range(5): - assert ( - responses_stream[i]["choices"][0]["text"] - == f"chatglm_test_stream_generate_{i}" - ) - - responses_non_stream = model.generate("Hello", generate_config={"stream": False}) - assert responses_non_stream["choices"][0]["text"] == "chatglm_test_generate" diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index cb735ab0a7..2b7e84e932 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -574,19 +574,6 @@ ], "model_description": "ChatGLM is an open-source General Language Model (GLM) based LLM trained on both Chinese and English data.", "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 6, - "quantizations": [ - "q4_0", - "q4_1", - "q5_0", - "q5_1", - "q8_0" - ], - "model_id": "Xorbits/chatglm-6B-GGML", - "model_file_name_template": "chatglm-ggml-{quantization}.bin" - }, { "model_format": "pytorch", "model_size_in_billions": 6, @@ -622,19 +609,6 @@ ], "model_description": "ChatGLM2 is the second generation of ChatGLM, still open-source and trained on Chinese and English data.", "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 6, - "quantizations": [ - "q4_0", - "q4_1", - "q5_0", - "q5_1", - "q8_0" - ], - "model_id": "Xorbits/chatglm2-6B-GGML", - "model_file_name_template": "chatglm2-ggml-{quantization}.bin" - }, { "model_format": "pytorch", "model_size_in_billions": 6, @@ -706,15 +680,6 @@ ], "model_description": "ChatGLM3 is the third generation of ChatGLM, still open-source and trained on Chinese and English data.", "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 6, - "quantizations": [ - "q4_0" - ], - "model_id": "Xorbits/chatglm3-6B-GGML", - "model_file_name_template": "chatglm3-ggml-{quantization}.bin" - }, { "model_format": "pytorch", "model_size_in_billions": 6, @@ -855,6 +820,32 @@ ], "model_id": "THUDM/glm-4-9b-chat", "model_revision": "b84dc74294ccd507a3d78bde8aebf628221af9bd" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "Q2_K", + "IQ3_XS", + "IQ3_S", + "IQ3_M", + "Q3_K_S", + "Q3_K_L", + "Q3_K", + "IQ4_XS", + "IQ4_NL", + "Q4_K_S", + "Q4_K", + "Q5_K_S", + "Q5_K", + "Q6_K", + "Q8_0", + "BF16", + "FP16" + ], + "model_file_name_template": "glm-4-9b-chat.{quantization}.gguf", + "model_id": "legraphista/glm-4-9b-chat-GGUF", + "model_revision": "0155a14edf0176863e9a003cdd78ce599e4d62c0" } ], "prompt_style": { @@ -900,6 +891,32 @@ ], "model_id": "THUDM/glm-4-9b-chat-1m", "model_revision": "715ddbe91082f976ff6a4ca06d59e5bbff6c3642" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "Q2_K", + "IQ3_XS", + "IQ3_S", + "IQ3_M", + "Q3_K_S", + "Q3_K_L", + "Q3_K", + "IQ4_XS", + "IQ4_NL", + "Q4_K_S", + "Q4_K", + "Q5_K_S", + "Q5_K", + "Q6_K", + "Q8_0", + "BF16", + "FP16" + ], + "model_file_name_template": "glm-4-9b-chat-1m.{quantization}.gguf", + "model_id": "legraphista/glm-4-9b-chat-1m-GGUF", + "model_revision": "782e28bd5eee3c514c07108da15e0b5e06dcf776" } ], "prompt_style": { diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index e7e8fb3394..26788ad3ca 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -304,21 +304,6 @@ ], "model_description": "ChatGLM2 is the second generation of ChatGLM, still open-source and trained on Chinese and English data.", "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 6, - "quantizations": [ - "q4_0", - "q4_1", - "q5_0", - "q5_1", - "q8_0" - ], - "model_hub": "modelscope", - "model_id": "Xorbits/chatglm2-6B-GGML", - "model_revision": "v1.0.0", - "model_file_name_template": "chatglm2-ggml-{quantization}.bin" - }, { "model_format": "pytorch", "model_size_in_billions": 6, @@ -392,17 +377,6 @@ ], "model_description": "ChatGLM3 is the third generation of ChatGLM, still open-source and trained on Chinese and English data.", "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 6, - "quantizations": [ - "q4_0" - ], - "model_hub": "modelscope", - "model_id": "Xorbits/chatglm3-ggml", - "model_revision": "v1.0.0", - "model_file_name_template": "chatglm3-ggml-{quantization}.bin" - }, { "model_format": "pytorch", "model_size_in_billions": 6, @@ -547,6 +521,33 @@ "model_hub": "modelscope", "model_id": "ZhipuAI/glm-4-9b-chat", "model_revision": "master" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "Q2_K", + "IQ3_XS", + "IQ3_S", + "IQ3_M", + "Q3_K_S", + "Q3_K_L", + "Q3_K", + "IQ4_XS", + "IQ4_NL", + "Q4_K_S", + "Q4_K", + "Q5_K_S", + "Q5_K", + "Q6_K", + "Q8_0", + "BF16", + "FP16" + ], + "model_file_name_template": "glm-4-9b-chat.{quantization}.gguf", + "model_hub": "modelscope", + "model_id": "LLM-Research/glm-4-9b-chat-GGUF", + "model_revision": "master" } ], "prompt_style": { @@ -593,6 +594,33 @@ "model_hub": "modelscope", "model_id": "ZhipuAI/glm-4-9b-chat-1m", "model_revision": "master" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "Q2_K", + "IQ3_XS", + "IQ3_S", + "IQ3_M", + "Q3_K_S", + "Q3_K_L", + "Q3_K", + "IQ4_XS", + "IQ4_NL", + "Q4_K_S", + "Q4_K", + "Q5_K_S", + "Q5_K", + "Q6_K", + "Q8_0", + "BF16", + "FP16" + ], + "model_file_name_template": "glm-4-9b-chat-1m.{quantization}.gguf", + "model_hub": "modelscope", + "model_id": "LLM-Research/glm-4-9b-chat-1m-GGUF", + "model_revision": "master" } ], "prompt_style": { diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index 27aae9a4a5..ee5eb7ff70 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -34,9 +34,6 @@ CompletionChoice, CompletionChunk, CreateCompletionTorch, - Embedding, - EmbeddingData, - EmbeddingUsage, LoRA, PytorchGenerateConfig, PytorchModelConfig, @@ -673,83 +670,6 @@ def batch_inference(self, req_list: List[InferenceRequest]): ) self.handle_batch_inference_results(req_list) - def create_embedding(self, input: Union[str, List[str]]) -> Embedding: - try: - import torch - import torch.nn.functional as F - except ImportError as e: - raise ImportError( - "Could not import torch. Please install it with `pip install torch`." - ) from e - - if isinstance(input, str): - inputs = [input] - else: - inputs = input - - tokenizer = self._tokenizer - tokenizer.pad_token = tokenizer.eos_token - is_llama = "llama" in str(type(self._model)) # llama supports batch inference - is_chatglm = "chatglm" in str(type(self._model)) - if is_llama: - encoding = tokenizer.batch_encode_plus( - inputs, padding=True, return_tensors="pt" - ) - input_ids = encoding["input_ids"].to(self._device) - attention_mask = encoding["attention_mask"].to(self._device) - model_output = self._model( - input_ids, attention_mask, output_hidden_states=True - ) - data = model_output.hidden_states[-1] - mask = attention_mask.unsqueeze(-1).expand(data.size()).float() - masked_embeddings = data * mask - sum_embeddings = torch.sum(masked_embeddings, dim=1) - seq_length = torch.sum(mask, dim=1) - embedding = sum_embeddings / seq_length - normalized_embeddings = F.normalize(embedding, p=2, dim=1) - normalized_embeddings = normalized_embeddings.tolist() - token_num = torch.sum(attention_mask).item() - - embedding_list = [] - for index, data in enumerate(normalized_embeddings): - embedding_list.append( - EmbeddingData(index=index, object="embedding", embedding=data) - ) - - usage = EmbeddingUsage(prompt_tokens=token_num, total_tokens=token_num) - - ret = Embedding( - object="list", - model=self.model_uid, - data=embedding_list, - usage=usage, - ) - - else: - embedding = [] - token_num = 0 - for index, text in enumerate(inputs): - input_ids = tokenizer.encode(text, return_tensors="pt").to(self._device) - model_output = self._model(input_ids, output_hidden_states=True) - if is_chatglm: - data = (model_output.hidden_states[-1].transpose(0, 1))[0] - else: - data = model_output.hidden_states[-1][0] - data = F.normalize(torch.mean(data, dim=0), p=2, dim=0) - data = data.tolist() - - embedding.append( - EmbeddingData(index=index, object="embedding", embedding=data) - ) - token_num += len(input_ids[0]) - - usage = EmbeddingUsage(prompt_tokens=token_num, total_tokens=token_num) - ret = Embedding( - object="list", model=self.model_uid, data=embedding, usage=usage - ) - - return ret - class PytorchChatModel(PytorchModel, ChatModelMixin): def __init__( diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index 5fce195d8e..38df03867c 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -1196,7 +1196,6 @@ def test_quert_engine_SGLang(): def test_query_engine_general(): - from ..ggml.chatglm import ChatglmCppChatModel from ..ggml.llamacpp import LlamaCppChatModel from ..llm_family import ( LLM_ENGINES, @@ -1271,17 +1270,6 @@ def test_query_engine_general(): == "Model qwen1.5-chat cannot be run on engine llama.cpp, with format ggmlv3, size 1_8 and quantization q2_k." ) - assert ( - check_engine_by_spec_parameters( - model_engine="llama.cpp", - model_name="chatglm", - model_format="ggmlv3", - model_size_in_billions=6, - quantization="q4_0", - ) - is ChatglmCppChatModel - ) - spec = GgmlLLMSpecV1( model_format="ggmlv3", model_size_in_billions=3, diff --git a/xinference/types.py b/xinference/types.py index 616599159b..a43989d579 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -285,7 +285,6 @@ class LlamaCppModelConfig(TypedDict, total=False): vocab_only: bool use_mmap: bool use_mlock: bool - embedding: bool n_threads: Optional[int] n_batch: int last_n_tokens_size: int From 9bb548a6d98a7bf145cdbff76ae032aa9ccf9db1 Mon Sep 17 00:00:00 2001 From: Wang Shenggong <wangshenggong@gmail.com> Date: Fri, 12 Jul 2024 11:43:08 +0800 Subject: [PATCH 195/298] FEAT: Add support for Flexible Model (#1671) Co-authored-by: Xuye (Chris) Qin <qinxuye@gmail.com> --- xinference/api/restful_api.py | 44 ++++ xinference/client/restful/restful_client.py | 39 +++ xinference/core/model.py | 15 ++ xinference/core/supervisor.py | 60 +++++ xinference/core/worker.py | 14 ++ xinference/model/core.py | 6 + xinference/model/flexible/__init__.py | 40 +++ xinference/model/flexible/core.py | 228 ++++++++++++++++++ .../model/flexible/launchers/__init__.py | 15 ++ .../launchers/transformers_launcher.py | 63 +++++ xinference/model/flexible/tests/__init__.py | 13 + .../flexible/tests/test_flexible_models.py | 63 +++++ xinference/model/flexible/utils.py | 33 +++ .../src/scenes/launch_model/launchCustom.js | 6 +- .../ui/src/scenes/launch_model/modelCard.js | 15 +- .../web/ui/src/scenes/register_model/index.js | 13 + .../scenes/register_model/registerModel.js | 69 +++++- .../web/ui/src/scenes/running_models/index.js | 24 ++ 18 files changed, 756 insertions(+), 4 deletions(-) create mode 100644 xinference/model/flexible/__init__.py create mode 100644 xinference/model/flexible/core.py create mode 100644 xinference/model/flexible/launchers/__init__.py create mode 100644 xinference/model/flexible/launchers/transformers_launcher.py create mode 100644 xinference/model/flexible/tests/__init__.py create mode 100644 xinference/model/flexible/tests/test_flexible_models.py create mode 100644 xinference/model/flexible/utils.py diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index bd2990c732..3c70902da2 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -501,6 +501,16 @@ def serve(self, logging_conf: Optional[dict] = None): else None ), ) + self._router.add_api_route( + "/v1/flexible/infers", + self.create_flexible_infer, + methods=["POST"], + dependencies=( + [Security(self._auth_service, scopes=["models:read"])] + if self.is_authenticated() + else None + ), + ) # for custom models self._router.add_api_route( @@ -1399,6 +1409,40 @@ async def create_variations( await self._report_error_event(model_uid, str(e)) raise HTTPException(status_code=500, detail=str(e)) + async def create_flexible_infer(self, request: Request) -> Response: + payload = await request.json() + + model_uid = payload.get("model") + + exclude = { + "model", + } + kwargs = {key: value for key, value in payload.items() if key not in exclude} + + try: + model = await (await self._get_supervisor_ref()).get_model(model_uid) + except ValueError as ve: + logger.error(str(ve), exc_info=True) + await self._report_error_event(model_uid, str(ve)) + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + logger.error(e, exc_info=True) + await self._report_error_event(model_uid, str(e)) + raise HTTPException(status_code=500, detail=str(e)) + + try: + result = await model.infer(**kwargs) + return Response(result, media_type="application/json") + except RuntimeError as re: + logger.error(re, exc_info=True) + await self._report_error_event(model_uid, str(re)) + self.handle_request_limit_error(re) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + await self._report_error_event(model_uid, str(e)) + raise HTTPException(status_code=500, detail=str(e)) + async def create_chat_completion(self, request: Request) -> Response: raw_body = await request.json() body = CreateChatCompletion.parse_obj(raw_body) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 59547c16fa..ec5b2dac04 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -730,6 +730,41 @@ def speech( return response.content +class RESTfulFlexibleModelHandle(RESTfulModelHandle): + def infer( + self, + **kwargs, + ): + """ + Call flexible model. + + Parameters + ---------- + + kwargs: dict + The inference arguments. + + + Returns + ------- + bytes + The inference result. + """ + url = f"{self._base_url}/v1/flexible/infers" + params = { + "model": self._model_uid, + } + params.update(kwargs) + + response = requests.post(url, json=params, headers=self.auth_headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to predict, detail: {_get_error_string(response)}" + ) + + return response.content + + class Client: def __init__(self, base_url, api_key: Optional[str] = None): self.base_url = base_url @@ -1009,6 +1044,10 @@ def get_model(self, model_uid: str) -> RESTfulModelHandle: return RESTfulAudioModelHandle( model_uid, self.base_url, auth_headers=self._headers ) + elif desc["model_type"] == "flexible": + return RESTfulFlexibleModelHandle( + model_uid, self.base_url, auth_headers=self._headers + ) else: raise ValueError(f"Unknown model type:{desc['model_type']}") diff --git a/xinference/core/model.py b/xinference/core/model.py index 0184e0de9d..2796ad3c8e 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -697,6 +697,21 @@ async def image_to_image( f"Model {self._model.model_spec} is not for creating image." ) + @log_async(logger=logger) + @request_limit + async def infer( + self, + **kwargs, + ): + if hasattr(self._model, "infer"): + return await self._call_wrapper( + self._model.infer, + **kwargs, + ) + raise AttributeError( + f"Model {self._model.model_spec} is not for flexible infer." + ) + async def record_metrics(self, name, op, kwargs): worker_ref = await self._get_worker_ref() await worker_ref.record_metrics(name, op, kwargs) diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index b926e50d23..db4105c8ee 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -60,6 +60,7 @@ if TYPE_CHECKING: from ..model.audio import AudioModelFamilyV1 from ..model.embedding import EmbeddingModelSpec + from ..model.flexible import FlexibleModelSpec from ..model.image import ImageModelFamilyV1 from ..model.llm import LLMFamilyV1 from ..model.rerank import RerankModelSpec @@ -163,6 +164,13 @@ async def __post_create__(self): register_embedding, unregister_embedding, ) + from ..model.flexible import ( + FlexibleModelSpec, + generate_flexible_model_description, + get_flexible_model_descriptions, + register_flexible_model, + unregister_flexible_model, + ) from ..model.image import ( CustomImageModelFamilyV1, generate_image_description, @@ -216,6 +224,12 @@ async def __post_create__(self): unregister_audio, generate_audio_description, ), + "flexible": ( + FlexibleModelSpec, + register_flexible_model, + unregister_flexible_model, + generate_flexible_model_description, + ), } # record model version @@ -225,6 +239,7 @@ async def __post_create__(self): model_version_infos.update(get_rerank_model_descriptions()) model_version_infos.update(get_image_model_descriptions()) model_version_infos.update(get_audio_model_descriptions()) + model_version_infos.update(get_flexible_model_descriptions()) await self._cache_tracker_ref.record_model_version( model_version_infos, self.address ) @@ -469,6 +484,27 @@ async def _to_audio_model_reg( res["model_instance_count"] = instance_cnt return res + async def _to_flexible_model_reg( + self, model_spec: "FlexibleModelSpec", is_builtin: bool + ) -> Dict[str, Any]: + instance_cnt = await self.get_instance_count(model_spec.model_name) + version_cnt = await self.get_model_version_count(model_spec.model_name) + + if self.is_local_deployment(): + res = { + **model_spec.dict(), + "cache_status": True, + "is_builtin": is_builtin, + } + else: + res = { + **model_spec.dict(), + "is_builtin": is_builtin, + } + res["model_version_count"] = version_cnt + res["model_instance_count"] = instance_cnt + return res + @log_async(logger=logger) async def list_model_registrations( self, model_type: str, detailed: bool = False @@ -587,6 +623,23 @@ def sort_helper(item): {"model_name": model_spec.model_name, "is_builtin": False} ) + ret.sort(key=sort_helper) + return ret + elif model_type == "flexible": + from ..model.flexible import get_flexible_models + + ret = [] + + for model_spec in get_flexible_models(): + if detailed: + ret.append( + await self._to_flexible_model_reg(model_spec, is_builtin=False) + ) + else: + ret.append( + {"model_name": model_spec.model_name, "is_builtin": False} + ) + ret.sort(key=sort_helper) return ret else: @@ -636,6 +689,13 @@ def get_model_registration(self, model_type: str, model_name: str) -> Any: if f.model_name == model_name: return f raise ValueError(f"Model {model_name} not found") + elif model_type == "flexible": + from ..model.flexible import get_flexible_models + + for f in get_flexible_models(): + if f.model_name == model_name: + return f + raise ValueError(f"Model {model_name} not found") else: raise ValueError(f"Unsupported model type: {model_type}") diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 6a518f5252..286440e1a9 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -222,6 +222,12 @@ async def __post_create__(self): register_embedding, unregister_embedding, ) + from ..model.flexible import ( + FlexibleModelSpec, + get_flexible_model_descriptions, + register_flexible_model, + unregister_flexible_model, + ) from ..model.image import ( CustomImageModelFamilyV1, get_image_model_descriptions, @@ -255,6 +261,11 @@ async def __post_create__(self): register_image, unregister_image, ), + "flexible": ( + FlexibleModelSpec, + register_flexible_model, + unregister_flexible_model, + ), } # record model version @@ -264,6 +275,7 @@ async def __post_create__(self): model_version_infos.update(get_rerank_model_descriptions()) model_version_infos.update(get_image_model_descriptions()) model_version_infos.update(get_audio_model_descriptions()) + model_version_infos.update(get_flexible_model_descriptions()) await self._cache_tracker_ref.record_model_version( model_version_infos, self.address ) @@ -551,6 +563,8 @@ async def _get_model_ability(self, model: Any, model_type: str) -> List[str]: return ["text_to_image"] elif model_type == "audio": return ["audio_to_text"] + elif model_type == "flexible": + return ["flexible"] else: assert model_type == "LLM" assert isinstance(model, LLM) diff --git a/xinference/model/core.py b/xinference/model/core.py index 90a1c01c90..d4dda89c23 100644 --- a/xinference/model/core.py +++ b/xinference/model/core.py @@ -60,6 +60,7 @@ def create_model_instance( ) -> Tuple[Any, ModelDescription]: from .audio.core import create_audio_model_instance from .embedding.core import create_embedding_model_instance + from .flexible.core import create_flexible_model_instance from .image.core import create_image_model_instance from .llm.core import create_llm_model_instance from .rerank.core import create_rerank_model_instance @@ -105,6 +106,11 @@ def create_model_instance( return create_audio_model_instance( subpool_addr, devices, model_uid, model_name, download_hub, **kwargs ) + elif model_type == "flexible": + kwargs.pop("trust_remote_code", None) + return create_flexible_model_instance( + subpool_addr, devices, model_uid, model_name, **kwargs + ) else: raise ValueError(f"Unsupported model type: {model_type}.") diff --git a/xinference/model/flexible/__init__.py b/xinference/model/flexible/__init__.py new file mode 100644 index 0000000000..049a2c6b25 --- /dev/null +++ b/xinference/model/flexible/__init__.py @@ -0,0 +1,40 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import codecs +import json +import os + +from ...constants import XINFERENCE_MODEL_DIR +from .core import ( + FLEXIBLE_MODEL_DESCRIPTIONS, + FlexibleModel, + FlexibleModelSpec, + generate_flexible_model_description, + get_flexible_model_descriptions, + get_flexible_models, + register_flexible_model, + unregister_flexible_model, +) + +model_dir = os.path.join(XINFERENCE_MODEL_DIR, "flexible") +if os.path.isdir(model_dir): + for f in os.listdir(model_dir): + with codecs.open(os.path.join(model_dir, f), encoding="utf-8") as fd: + model_spec = FlexibleModelSpec.parse_obj(json.load(fd)) + register_flexible_model(model_spec, persist=False) + +# register model description +for model in get_flexible_models(): + FLEXIBLE_MODEL_DESCRIPTIONS.update(generate_flexible_model_description(model)) diff --git a/xinference/model/flexible/core.py b/xinference/model/flexible/core.py new file mode 100644 index 0000000000..75eb3b33c7 --- /dev/null +++ b/xinference/model/flexible/core.py @@ -0,0 +1,228 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import logging +import os +from collections import defaultdict +from threading import Lock +from typing import Dict, List, Optional, Tuple + +from ...constants import XINFERENCE_CACHE_DIR, XINFERENCE_MODEL_DIR +from ..core import CacheableModelSpec, ModelDescription +from .utils import get_launcher + +logger = logging.getLogger(__name__) + +FLEXIBLE_MODEL_LOCK = Lock() + + +class FlexibleModelSpec(CacheableModelSpec): + model_id: Optional[str] # type: ignore + model_description: Optional[str] + model_uri: Optional[str] + launcher: str + launcher_args: Optional[str] + + def parser_args(self): + return json.loads(self.launcher_args) + + +class FlexibleModelDescription(ModelDescription): + def __init__( + self, + address: Optional[str], + devices: Optional[List[str]], + model_spec: FlexibleModelSpec, + model_path: Optional[str] = None, + ): + super().__init__(address, devices, model_path=model_path) + self._model_spec = model_spec + + def to_dict(self): + return { + "model_type": "flexible", + "address": self.address, + "accelerators": self.devices, + "model_name": self._model_spec.model_name, + "launcher": self._model_spec.launcher, + "launcher_args": self._model_spec.launcher_args, + } + + def get_model_version(self) -> str: + return f"{self._model_spec.model_name}" + + def to_version_info(self): + return { + "model_version": self.get_model_version(), + "cache_status": True, + "model_file_location": self._model_spec.model_uri, + "launcher": self._model_spec.launcher, + "launcher_args": self._model_spec.launcher_args, + } + + +def generate_flexible_model_description( + model_spec: FlexibleModelSpec, +) -> Dict[str, List[Dict]]: + res = defaultdict(list) + res[model_spec.model_name].append( + FlexibleModelDescription(None, None, model_spec).to_version_info() + ) + return res + + +FLEXIBLE_MODELS: List[FlexibleModelSpec] = [] +FLEXIBLE_MODEL_DESCRIPTIONS: Dict[str, List[Dict]] = defaultdict(list) + + +def get_flexible_models(): + with FLEXIBLE_MODEL_LOCK: + return FLEXIBLE_MODELS.copy() + + +def get_flexible_model_descriptions(): + import copy + + return copy.deepcopy(FLEXIBLE_MODEL_DESCRIPTIONS) + + +def register_flexible_model(model_spec: FlexibleModelSpec, persist: bool): + from ..utils import is_valid_model_name + + if not is_valid_model_name(model_spec.model_name): + raise ValueError(f"Invalid model name {model_spec.model_name}.") + + if model_spec.launcher_args: + try: + model_spec.parser_args() + except Exception: + raise ValueError(f"Invalid model launcher args {model_spec.launcher_args}.") + + with FLEXIBLE_MODEL_LOCK: + for model_name in [spec.model_name for spec in FLEXIBLE_MODELS]: + if model_spec.model_name == model_name: + raise ValueError( + f"Model name conflicts with existing model {model_spec.model_name}" + ) + FLEXIBLE_MODELS.append(model_spec) + + if persist: + persist_path = os.path.join( + XINFERENCE_MODEL_DIR, "flexible", f"{model_spec.model_name}.json" + ) + os.makedirs(os.path.dirname(persist_path), exist_ok=True) + with open(persist_path, mode="w") as fd: + fd.write(model_spec.json()) + + +def unregister_flexible_model(model_name: str, raise_error: bool = True): + with FLEXIBLE_MODEL_LOCK: + model_spec = None + for i, f in enumerate(FLEXIBLE_MODELS): + if f.model_name == model_name: + model_spec = f + break + if model_spec: + FLEXIBLE_MODELS.remove(model_spec) + + persist_path = os.path.join( + XINFERENCE_MODEL_DIR, "flexible", f"{model_spec.model_name}.json" + ) + if os.path.exists(persist_path): + os.remove(persist_path) + + cache_dir = os.path.join(XINFERENCE_CACHE_DIR, model_spec.model_name) + if os.path.exists(cache_dir): + logger.warning( + f"Remove the cache of user-defined model {model_spec.model_name}. " + f"Cache directory: {cache_dir}" + ) + if os.path.islink(cache_dir): + os.remove(cache_dir) + else: + logger.warning( + f"Cache directory is not a soft link, please remove it manually." + ) + else: + if raise_error: + raise ValueError(f"Model {model_name} not found") + else: + logger.warning(f"Model {model_name} not found") + + +class FlexibleModel: + def __init__( + self, + model_uid: str, + model_path: str, + device: Optional[str] = None, + config: Optional[Dict] = None, + ): + self._model_uid = model_uid + self._model_path = model_path + self._device = device + self._config = config + + def load(self): + """ + Load the model. + """ + + def infer(self, **kwargs): + """ + Call model to inference. + """ + raise NotImplementedError("infer method not implemented.") + + @property + def model_uid(self): + return self._model_uid + + @property + def model_path(self): + return self._model_path + + @property + def device(self): + return self._device + + @property + def config(self): + return self._config + + +def match_flexible_model(model_name): + for model_spec in get_flexible_models(): + if model_name == model_spec.model_name: + return model_spec + + +def create_flexible_model_instance( + subpool_addr: str, devices: List[str], model_uid: str, model_name: str, **kwargs +) -> Tuple[FlexibleModel, FlexibleModelDescription]: + model_spec = match_flexible_model(model_name) + model_path = model_spec.model_uri + launcher_name = model_spec.launcher + launcher_args = model_spec.parser_args() + kwargs.update(launcher_args) + + model = get_launcher(launcher_name)( + model_uid=model_uid, model_spec=model_spec, **kwargs + ) + + model_description = FlexibleModelDescription( + subpool_addr, devices, model_spec, model_path=model_path + ) + return model, model_description diff --git a/xinference/model/flexible/launchers/__init__.py b/xinference/model/flexible/launchers/__init__.py new file mode 100644 index 0000000000..29559082d2 --- /dev/null +++ b/xinference/model/flexible/launchers/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .transformers_launcher import launcher as transformers diff --git a/xinference/model/flexible/launchers/transformers_launcher.py b/xinference/model/flexible/launchers/transformers_launcher.py new file mode 100644 index 0000000000..5d92fc0620 --- /dev/null +++ b/xinference/model/flexible/launchers/transformers_launcher.py @@ -0,0 +1,63 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from transformers import pipeline + +from ..core import FlexibleModel, FlexibleModelSpec + + +class MockModel(FlexibleModel): + def infer(self, **kwargs): + return kwargs + + +class AutoModel(FlexibleModel): + def load(self): + config = self.config or {} + self._pipeline = pipeline(model=self.model_path, device=self.device, **config) + + def infer(self, **kwargs): + return self._pipeline(**kwargs) + + +class TransformersTextClassificationModel(FlexibleModel): + def load(self): + config = self.config or {} + + self._pipeline = pipeline(model=self._model_path, device=self._device, **config) + + def infer(self, **kwargs): + return self._pipeline(**kwargs) + + +def launcher(model_uid: str, model_spec: FlexibleModelSpec, **kwargs) -> FlexibleModel: + task = kwargs.get("task") + device = kwargs.get("device") + + model_path = model_spec.model_uri + if model_path is None: + raise ValueError("model_path required") + + if task == "text-classification": + return TransformersTextClassificationModel( + model_uid=model_uid, model_path=model_path, device=device, config=kwargs + ) + elif task == "mock": + return MockModel( + model_uid=model_uid, model_path=model_path, device=device, config=kwargs + ) + else: + return AutoModel( + model_uid=model_uid, model_path=model_path, device=device, config=kwargs + ) diff --git a/xinference/model/flexible/tests/__init__.py b/xinference/model/flexible/tests/__init__.py new file mode 100644 index 0000000000..09138b5b2a --- /dev/null +++ b/xinference/model/flexible/tests/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/xinference/model/flexible/tests/test_flexible_models.py b/xinference/model/flexible/tests/test_flexible_models.py new file mode 100644 index 0000000000..4018f82032 --- /dev/null +++ b/xinference/model/flexible/tests/test_flexible_models.py @@ -0,0 +1,63 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import shutil +import tempfile + + +def test_register_flexible_model(): + from ..core import ( + FlexibleModelSpec, + register_flexible_model, + unregister_flexible_model, + ) + + tmp_dir = tempfile.mkdtemp() + + model_spec = FlexibleModelSpec( + model_name="flexible_model", + model_uri=os.path.abspath(tmp_dir), + launcher="xinference.model.flexible.launchers.transformers", + ) + + register_flexible_model(model_spec, persist=False) + + unregister_flexible_model("flexible_model") + + shutil.rmtree(tmp_dir, ignore_errors=True) + + +def test_model(): + from ..core import FlexibleModelSpec + from ..utils import get_launcher + + launcher = get_launcher("xinference.model.flexible.launchers.transformers") + model = launcher( + model_uid="flexible_model", + model_spec=FlexibleModelSpec( + model_name="mock", + model_uri="mock", + launcher="xinference.model.flexible.launchers.transformers", + ), + task="mock", + ) + + model.load() + + result = model.infer(inputs="hello world") + # assert result == {"inputs": "hello world"} + assert result is not None + assert "inputs" in result + assert result["inputs"] == "hello world" diff --git a/xinference/model/flexible/utils.py b/xinference/model/flexible/utils.py new file mode 100644 index 0000000000..d58da6f907 --- /dev/null +++ b/xinference/model/flexible/utils.py @@ -0,0 +1,33 @@ +# Copyright 2022-2024 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import importlib + + +def get_launcher(launcher_name: str): + try: + i = launcher_name.rfind(".") + if i != -1: + module = importlib.import_module(launcher_name[:i]) + fn = getattr(module, launcher_name[i + 1 :]) + else: + importlib.import_module(launcher_name) + fn = locals().get(launcher_name) + + if fn is None: + raise ValueError(f"Launcher {launcher_name} not found.") + + return fn + except ImportError as e: + raise ImportError(f"Failed to import {launcher_name}: {e}") diff --git a/xinference/web/ui/src/scenes/launch_model/launchCustom.js b/xinference/web/ui/src/scenes/launch_model/launchCustom.js index e81ca540b3..60b0355065 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchCustom.js +++ b/xinference/web/ui/src/scenes/launch_model/launchCustom.js @@ -8,7 +8,7 @@ import fetchWrapper from '../../components/fetchWrapper' import HotkeyFocusTextField from '../../components/hotkeyFocusTextField' import ModelCard from './modelCard' -const customType = ['llm', 'embedding', 'rerank', 'image', 'audio'] +const customType = ['llm', 'embedding', 'rerank', 'image', 'audio', 'flexible'] const LaunchCustom = ({ gpuAvailable }) => { let endPoint = useContext(ApiContext).endPoint @@ -104,6 +104,10 @@ const LaunchCustom = ({ gpuAvailable }) => { <Tab label="Rerank Models" value="/launch_model/custom/rerank" /> <Tab label="Image Models" value="/launch_model/custom/image" /> <Tab label="Audio Models" value="/launch_model/custom/audio" /> + <Tab + label="Flexible Models" + value="/launch_model/custom/flexible" + /> </TabList> </Box> {customType.map((item) => ( diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index ab511fca04..536bf30b17 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -312,7 +312,11 @@ const ModelCard = ({ download_hub: downloadHub === '' ? null : downloadHub, } - if (modelType === 'embedding' || modelType === 'rerank') { + if ( + modelType === 'embedding' || + modelType === 'rerank' || + modelType === 'flexible' + ) { modelDataWithID_other = { ...modelDataWithID_other, replica: replica, @@ -1008,6 +1012,11 @@ const ModelCard = ({ } })()} </Stack> + {modelData.model_description && ( + <p className="p" title={modelData.model_description}> + {modelData.model_description} + </p> + )} </div> {modelData.dimensions && ( <div className="iconRow"> @@ -1461,7 +1470,9 @@ const ModelCard = ({ label="(Optional) Model UID, model name by default" onChange={(e) => setModelUID(e.target.value)} /> - {(modelType === 'embedding' || modelType === 'rerank') && ( + {(modelType === 'embedding' || + modelType === 'rerank' || + modelType === 'flexible') && ( <> <TextField style={{ marginTop: '25px' }} diff --git a/xinference/web/ui/src/scenes/register_model/index.js b/xinference/web/ui/src/scenes/register_model/index.js index 41ca4e7678..cf3c718d36 100644 --- a/xinference/web/ui/src/scenes/register_model/index.js +++ b/xinference/web/ui/src/scenes/register_model/index.js @@ -50,6 +50,7 @@ const RegisterModel = () => { <Tab label="Rerank Model" value="/register_model/rerank" /> <Tab label="Image Model" value="/register_model/image" /> <Tab label="Audio Model" value="/register_model/audio" /> + <Tab label="Flexible Model" value="/register_model/flexible" /> </TabList> </Box> <TabPanel value="/register_model/llm" sx={{ padding: 0 }}> @@ -119,6 +120,18 @@ const RegisterModel = () => { }} /> </TabPanel> + <TabPanel value="/register_model/flexible" sx={{ padding: 0 }}> + <RegisterModelComponent + modelType="flexible" + customData={{ + model_name: 'flexible-model', + model_description: 'This is a model description.', + model_uri: '/path/to/model', + launcher: 'xinference.model.flexible.launchers.transformers', + launcher_args: '{}', + }} + /> + </TabPanel> </TabContext> </Box> ) diff --git a/xinference/web/ui/src/scenes/register_model/registerModel.js b/xinference/web/ui/src/scenes/register_model/registerModel.js index 5e1bbe0759..2266fbfa3a 100644 --- a/xinference/web/ui/src/scenes/register_model/registerModel.js +++ b/xinference/web/ui/src/scenes/register_model/registerModel.js @@ -52,7 +52,8 @@ const RegisterModelComponent = ({ modelType, customData }) => { const [isMaxTokensAlert, setIsMaxTokensAlert] = useState(false) const [jsonData, setJsonData] = useState('') const [isSpecsArrError, setIsSpecsArrError] = useState(false) - + const [isValidLauncherArgsAlert, setIsValidLauncherArgsAlert] = + useState(false) const scrollRef = useRef(null) const [cookie] = useCookies(['token']) const navigate = useNavigate() @@ -184,6 +185,23 @@ const RegisterModelComponent = ({ modelType, customData }) => { } setFormData(audioData) setContrastObj(audioData) + } else if (modelType === 'flexible') { + const { + model_name, + model_uri, + model_description, + launcher, + launcher_args, + } = data + const flexibleData = { + model_name, + model_uri, + model_description, + launcher, + launcher_args, + } + setFormData(flexibleData) + setContrastObj(flexibleData) } } } @@ -913,6 +931,55 @@ const RegisterModelComponent = ({ modelType, customData }) => { <Box padding="15px"></Box> </> )} + + {/* launcher */} + {customData.launcher && ( + <> + <TextField + label="Launcher" + error={formData.launcher ? false : true} + value={formData.launcher} + size="small" + helperText="Provide the model launcher." + onChange={(event) => + setFormData({ ...formData, launcher: event.target.value }) + } + /> + <Box padding="15px"></Box> + </> + )} + + {/* launcher_args */} + {customData.launcher_args && ( + <> + <TextField + label="Launcher Arguments (Optional)" + value={formData.launcher_args} + size="small" + helperText="A JSON-formatted dictionary representing the arguments passed to the Launcher." + onChange={(event) => { + try { + JSON.parse(event.target.value) + setIsValidLauncherArgsAlert(false) + } catch { + setIsValidLauncherArgsAlert(true) + } + return setFormData({ + ...formData, + launcher_args: event.target.value, + }) + }} + multiline + rows={4} + /> + {isValidLauncherArgsAlert && ( + <Alert severity="error"> + Please enter the JSON-formatted dictionary. + </Alert> + )} + <Box padding="15px"></Box> + </> + )} </FormControl> {model_name ? ( diff --git a/xinference/web/ui/src/scenes/running_models/index.js b/xinference/web/ui/src/scenes/running_models/index.js index c2a4e28ab2..b18973bc52 100644 --- a/xinference/web/ui/src/scenes/running_models/index.js +++ b/xinference/web/ui/src/scenes/running_models/index.js @@ -22,6 +22,7 @@ const RunningModels = () => { const [imageModelData, setImageModelData] = useState([]) const [audioModelData, setAudioModelData] = useState([]) const [rerankModelData, setRerankModelData] = useState([]) + const [flexibleModelData, setFlexibleModelData] = useState([]) const { isCallingApi, setIsCallingApi } = useContext(ApiContext) const { isUpdatingModel, setIsUpdatingModel } = useContext(ApiContext) const { setErrorMsg } = useContext(ApiContext) @@ -58,6 +59,9 @@ const RunningModels = () => { setRerankModelData([ { id: 'Loading, do not refresh page...', url: 'IS_LOADING' }, ]) + setFlexibleModelData([ + { id: 'Loading, do not refresh page...', url: 'IS_LOADING' }, + ]) } else { setIsUpdatingModel(true) @@ -69,6 +73,7 @@ const RunningModels = () => { const newImageModelData = [] const newAudioModelData = [] const newRerankModelData = [] + const newFlexibleModelData = [] response.data.forEach((model) => { let newValue = { ...model, @@ -85,6 +90,8 @@ const RunningModels = () => { newImageModelData.push(newValue) } else if (newValue.model_type === 'rerank') { newRerankModelData.push(newValue) + } else if (newValue.model_type === 'flexible') { + newFlexibleModelData.push(newValue) } }) setLlmData(newLlmData) @@ -92,6 +99,7 @@ const RunningModels = () => { setAudioModelData(newAudioModelData) setImageModelData(newImageModelData) setRerankModelData(newRerankModelData) + setFlexibleModelData(newFlexibleModelData) setIsUpdatingModel(false) }) .catch((error) => { @@ -583,6 +591,7 @@ const RunningModels = () => { ] const audioModelColumns = embeddingModelColumns const rerankModelColumns = embeddingModelColumns + const flexibleModelColumns = embeddingModelColumns const dataGridStyle = { '& .MuiDataGrid-cell': { @@ -642,6 +651,7 @@ const RunningModels = () => { <Tab label="Rerank models" value="/running_models/rerank" /> <Tab label="Image models" value="/running_models/image" /> <Tab label="Audio models" value="/running_models/audio" /> + <Tab label="Flexible models" value="/running_models/flexible" /> </TabList> </Box> <TabPanel value="/running_models/LLM" sx={{ padding: 0 }}> @@ -714,6 +724,20 @@ const RunningModels = () => { /> </Box> </TabPanel> + <TabPanel value="/running_models/flexible" sx={{ padding: 0 }}> + <Box sx={{ height: '100%', width: '100%' }}> + <DataGrid + rows={flexibleModelData} + columns={flexibleModelColumns} + autoHeight={true} + sx={dataGridStyle} + slots={{ + noRowsOverlay: noRowsOverlay, + noResultsOverlay: noResultsOverlay, + }} + /> + </Box> + </TabPanel> </TabContext> </Box> ) From e916d059e1e4d500d33b50eccc47231dd4485664 Mon Sep 17 00:00:00 2001 From: Hannah Qiu <zihann.xyz@gmail.com> Date: Fri, 12 Jul 2024 13:50:34 +0800 Subject: [PATCH 196/298] BUG: cache status missing for model id with quantization placeholder (#1849) Co-authored-by: ChengjieLi <chengjieli23@outlook.com> --- xinference/model/llm/llm_family.py | 99 ++++++++++--------- .../model/llm/llm_family_modelscope.json | 2 +- xinference/model/llm/utils.py | 6 +- .../ui/src/scenes/launch_model/launchLLM.js | 6 +- .../ui/src/scenes/launch_model/modelCard.js | 18 ++-- 5 files changed, 72 insertions(+), 59 deletions(-) diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 8116bfd8a5..bcac5f7df2 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -14,7 +14,6 @@ import logging import os -import platform import shutil from threading import Lock from typing import Any, Dict, List, Optional, Set, Tuple, Type, Union @@ -541,15 +540,20 @@ def _get_cache_dir_for_model_mem( def _get_cache_dir( llm_family: LLMFamilyV1, llm_spec: "LLMSpecV1", + quantization: Optional[str] = None, create_if_not_exist=True, ): # If the model id contains quantization, then we should give each # quantization a dedicated cache dir. quant_suffix = "" - for q in llm_spec.quantizations: - if llm_spec.model_id and q in llm_spec.model_id: - quant_suffix = q - break + if llm_spec.model_id and "{" in llm_spec.model_id and quantization is not None: + quant_suffix = quantization + else: + for q in llm_spec.quantizations: + if llm_spec.model_id and q in llm_spec.model_id: + quant_suffix = q + break + cache_dir_name = ( f"{llm_family.model_name}-{llm_spec.model_format}" f"-{llm_spec.model_size_in_billions}b" @@ -900,6 +904,7 @@ def _check_revision( llm_spec: "LLMSpecV1", builtin: list, meta_path: str, + quantization: Optional[str] = None, ) -> bool: for family in builtin: if llm_family.model_name == family.model_name: @@ -908,59 +913,63 @@ def _check_revision( if ( spec.model_format == "pytorch" and spec.model_size_in_billions == llm_spec.model_size_in_billions + and (quantization is None or quantization in spec.quantizations) ): return valid_model_revision(meta_path, spec.model_revision) return False def get_cache_status( - llm_family: LLMFamilyV1, - llm_spec: "LLMSpecV1", + llm_family: LLMFamilyV1, llm_spec: "LLMSpecV1", quantization: Optional[str] = None ) -> Union[bool, List[bool]]: """ - When calling this function from above, `llm_family` is constructed only from BUILTIN_LLM_FAMILIES, - so we should check both huggingface and modelscope cache files. + Checks if a model's cache status is available based on the model format and quantization. + Supports different directories and model formats. """ - cache_dir = _get_cache_dir(llm_family, llm_spec, create_if_not_exist=False) - # check revision for pytorch model - if llm_spec.model_format == "pytorch": - hf_meta_path = _get_meta_path(cache_dir, "pytorch", "huggingface", "none") - ms_meta_path = _get_meta_path(cache_dir, "pytorch", "modelscope", "none") - revisions = [ - _check_revision(llm_family, llm_spec, BUILTIN_LLM_FAMILIES, hf_meta_path), - _check_revision( - llm_family, llm_spec, BUILTIN_MODELSCOPE_LLM_FAMILIES, ms_meta_path - ), - ] - return any(revisions) - # just check meta file for ggml and gptq model - elif llm_spec.model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "mlx"]: - ret = [] - for q in llm_spec.quantizations: - assert q is not None - hf_meta_path = _get_meta_path( - cache_dir, llm_spec.model_format, "huggingface", q - ) - ms_meta_path = _get_meta_path( - cache_dir, llm_spec.model_format, "modelscope", q - ) - results = [os.path.exists(hf_meta_path), os.path.exists(ms_meta_path)] - ret.append(any(results)) - return ret - else: - raise ValueError(f"Unsupported model format: {llm_spec.model_format}") + def check_file_status(meta_path: str) -> bool: + return os.path.exists(meta_path) -def _is_linux(): - return platform.system() == "Linux" + def check_revision_status( + meta_path: str, families: list, quantization: Optional[str] = None + ) -> bool: + return _check_revision(llm_family, llm_spec, families, meta_path, quantization) + def handle_quantization(q: Union[str, None]) -> bool: + specific_cache_dir = _get_cache_dir( + llm_family, llm_spec, q, create_if_not_exist=False + ) + meta_paths = { + "huggingface": _get_meta_path( + specific_cache_dir, llm_spec.model_format, "huggingface", q + ), + "modelscope": _get_meta_path( + specific_cache_dir, llm_spec.model_format, "modelscope", q + ), + } + if llm_spec.model_format == "pytorch": + return check_revision_status( + meta_paths["huggingface"], BUILTIN_LLM_FAMILIES, q + ) or check_revision_status( + meta_paths["modelscope"], BUILTIN_MODELSCOPE_LLM_FAMILIES, q + ) + else: + return check_file_status(meta_paths["huggingface"]) or check_file_status( + meta_paths["modelscope"] + ) -def _has_cuda_device(): - # `cuda_count` method already contains the logic for the - # number of GPUs specified by `CUDA_VISIBLE_DEVICES`. - from ...utils import cuda_count - - return cuda_count() > 0 + if llm_spec.model_id and "{" in llm_spec.model_id: + return ( + [handle_quantization(q) for q in llm_spec.quantizations] + if quantization is None + else handle_quantization(quantization) + ) + else: + return ( + [handle_quantization(q) for q in llm_spec.quantizations] + if llm_spec.model_format != "pytorch" + else handle_quantization(None) + ) def get_user_defined_llm_families(): diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 26788ad3ca..ec4b8405b0 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -4143,7 +4143,7 @@ "zh" ], "model_ability": [ - "generate" + "chat" ], "model_description": "Aquila2-chat series models are the chat models", "model_specs": [ diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 0ab967a344..f01b5d64fc 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -779,8 +779,10 @@ def get_full_prompt(cls, model_family, prompt, system_prompt, chat_history, tool def get_file_location( llm_family: LLMFamilyV1, spec: LLMSpecV1, quantization: str ) -> Tuple[str, bool]: - cache_dir = _get_cache_dir(llm_family, spec, create_if_not_exist=False) - cache_status = get_cache_status(llm_family, spec) + cache_dir = _get_cache_dir( + llm_family, spec, quantization, create_if_not_exist=False + ) + cache_status = get_cache_status(llm_family, spec, quantization) if isinstance(cache_status, list): is_cached = None for q, cs in zip(spec.quantizations, cache_status): diff --git a/xinference/web/ui/src/scenes/launch_model/launchLLM.js b/xinference/web/ui/src/scenes/launch_model/launchLLM.js index 12bdf53b06..79838b14e6 100644 --- a/xinference/web/ui/src/scenes/launch_model/launchLLM.js +++ b/xinference/web/ui/src/scenes/launch_model/launchLLM.js @@ -79,10 +79,10 @@ const LaunchLLM = ({ gpuAvailable }) => { } const filterCache = (spec) => { - if (spec.model_format === 'pytorch') { - return spec.cache_status && spec.cache_status === true + if (Array.isArray(spec.cache_status)) { + return spec.cache_status.some((cs) => cs) } else { - return spec.cache_status && spec.cache_status.some((cs) => cs) + return spec.cache_status === true } } diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 536bf30b17..7bacf63487 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -144,10 +144,10 @@ const ModelCard = ({ } const isCached = (spec) => { - if (spec.model_format === 'pytorch') { - return spec.cache_status && spec.cache_status === true + if (Array.isArray(spec.cache_status)) { + return spec.cache_status.some((cs) => cs) } else { - return spec.cache_status && spec.cache_status.some((cs) => cs) + return spec.cache_status === true } } @@ -1196,7 +1196,7 @@ const ModelCard = ({ onChange={(e) => setQuantization(e.target.value)} label="Quantization" > - {quantizationOptions.map((quant, index) => { + {quantizationOptions.map((quant) => { const specs = modelData.model_specs .filter((spec) => spec.model_format === modelFormat) .filter( @@ -1205,10 +1205,12 @@ const ModelCard = ({ convertModelSize(modelSize) ) - const cached = - modelFormat === 'pytorch' - ? specs[0]?.cache_status ?? false === true - : specs[0]?.cache_status?.[index] ?? false === true + const spec = specs.find((s) => { + return s.quantizations.includes(quant) + }) + const cached = Array.isArray(spec.cache_status) + ? spec.cache_status[spec.quantizations.indexOf(quant)] + : spec.cache_status const displayedQuant = cached ? quant + ' (cached)' From 5e3f254d48383f37d849dd16db564ad9449e5163 Mon Sep 17 00:00:00 2001 From: hainaweiben <112739514+hainaweiben@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:56:13 +0800 Subject: [PATCH 197/298] ENH: Added the parameter 'worker_ip' to the 'register' model. (#1773) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/api/restful_api.py | 4 +- xinference/client/restful/restful_client.py | 12 +- xinference/core/supervisor.py | 73 +++++++-- xinference/core/worker.py | 155 +++++++++++++++++++- xinference/deploy/cmdline.py | 5 + xinference/model/image/custom.py | 2 +- 6 files changed, 226 insertions(+), 25 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 3c70902da2..7d28ffe8b1 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -133,6 +133,7 @@ class SpeechRequest(BaseModel): class RegisterModelRequest(BaseModel): model: str + worker_ip: Optional[str] persist: bool @@ -1639,11 +1640,12 @@ async def query_engines_by_model_name(self, model_name: str) -> JSONResponse: async def register_model(self, model_type: str, request: Request) -> JSONResponse: body = RegisterModelRequest.parse_obj(await request.json()) model = body.model + worker_ip = body.worker_ip persist = body.persist try: await (await self._get_supervisor_ref()).register_model( - model_type, model, persist + model_type, model, persist, worker_ip ) except ValueError as re: logger.error(re, exc_info=True) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index ec5b2dac04..54be488748 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -1101,7 +1101,13 @@ def describe_model(self, model_uid: str): ) return response.json() - def register_model(self, model_type: str, model: str, persist: bool): + def register_model( + self, + model_type: str, + model: str, + persist: bool, + worker_ip: Optional[str] = None, + ): """ Register a custom model. @@ -1111,6 +1117,8 @@ def register_model(self, model_type: str, model: str, persist: bool): The type of model. model: str The model definition. (refer to: https://inference.readthedocs.io/en/latest/models/custom.html) + worker_ip: Optional[str] + The IP address of the worker on which the model is running. persist: bool @@ -1120,7 +1128,7 @@ def register_model(self, model_type: str, model: str, persist: bool): Report failure to register the custom model. Provide details of failure through error message. """ url = f"{self.base_url}/v1/model_registrations/{model_type}" - request_body = {"model": model, "persist": persist} + request_body = {"model": model, "worker_ip": worker_ip, "persist": persist} response = requests.post(url, json=request_body, headers=self._headers) if response.status_code != 200: raise RuntimeError( diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index db4105c8ee..873a0b6ab8 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -513,10 +513,15 @@ def sort_helper(item): assert isinstance(item["model_name"], str) return item.get("model_name").lower() + ret = [] + if not self.is_local_deployment(): + workers = list(self._worker_address_to_worker.values()) + for worker in workers: + ret.extend(await worker.list_model_registrations(model_type, detailed)) + if model_type == "LLM": from ..model.llm import BUILTIN_LLM_FAMILIES, get_user_defined_llm_families - ret = [] for family in BUILTIN_LLM_FAMILIES: if detailed: ret.append(await self._to_llm_reg(family, True)) @@ -535,7 +540,6 @@ def sort_helper(item): from ..model.embedding import BUILTIN_EMBEDDING_MODELS from ..model.embedding.custom import get_user_defined_embeddings - ret = [] for model_name, family in BUILTIN_EMBEDDING_MODELS.items(): if detailed: ret.append( @@ -560,7 +564,6 @@ def sort_helper(item): from ..model.image import BUILTIN_IMAGE_MODELS from ..model.image.custom import get_user_defined_images - ret = [] for model_name, family in BUILTIN_IMAGE_MODELS.items(): if detailed: ret.append(await self._to_image_model_reg(family, is_builtin=True)) @@ -583,7 +586,6 @@ def sort_helper(item): from ..model.audio import BUILTIN_AUDIO_MODELS from ..model.audio.custom import get_user_defined_audios - ret = [] for model_name, family in BUILTIN_AUDIO_MODELS.items(): if detailed: ret.append(await self._to_audio_model_reg(family, is_builtin=True)) @@ -606,7 +608,6 @@ def sort_helper(item): from ..model.rerank import BUILTIN_RERANK_MODELS from ..model.rerank.custom import get_user_defined_reranks - ret = [] for model_name, family in BUILTIN_RERANK_MODELS.items(): if detailed: ret.append(await self._to_rerank_model_reg(family, is_builtin=True)) @@ -646,7 +647,15 @@ def sort_helper(item): raise ValueError(f"Unsupported model type: {model_type}") @log_sync(logger=logger) - def get_model_registration(self, model_type: str, model_name: str) -> Any: + async def get_model_registration(self, model_type: str, model_name: str) -> Any: + # search in worker first + if not self.is_local_deployment(): + workers = list(self._worker_address_to_worker.values()) + for worker in workers: + f = await worker.get_model_registration(model_type, model_name) + if f is not None: + return f + if model_type == "LLM": from ..model.llm import BUILTIN_LLM_FAMILIES, get_user_defined_llm_families @@ -705,6 +714,13 @@ async def query_engines_by_model_name(self, model_name: str): from ..model.llm.llm_family import LLM_ENGINES + # search in worker first + workers = list(self._worker_address_to_worker.values()) + for worker in workers: + res = await worker.query_engines_by_model_name(model_name) + if res is not None: + return res + if model_name not in LLM_ENGINES: raise ValueError(f"Model {model_name} not found") @@ -718,7 +734,13 @@ async def query_engines_by_model_name(self, model_name: str): return engine_params @log_async(logger=logger) - async def register_model(self, model_type: str, model: str, persist: bool): + async def register_model( + self, + model_type: str, + model: str, + persist: bool, + worker_ip: Optional[str] = None, + ): if model_type in self._custom_register_type_to_cls: ( model_spec_cls, @@ -727,10 +749,21 @@ async def register_model(self, model_type: str, model: str, persist: bool): generate_fn, ) = self._custom_register_type_to_cls[model_type] - if not self.is_local_deployment(): - workers = list(self._worker_address_to_worker.values()) - for worker in workers: - await worker.register_model(model_type, model, persist) + target_ip_worker_ref = ( + self._get_worker_ref_by_ip(worker_ip) if worker_ip is not None else None + ) + if ( + worker_ip is not None + and not self.is_local_deployment() + and target_ip_worker_ref is None + ): + raise ValueError( + f"Worker ip address {worker_ip} is not in the cluster." + ) + + if target_ip_worker_ref: + await target_ip_worker_ref.register_model(model_type, model, persist) + return model_spec = model_spec_cls.parse_raw(model) try: @@ -738,6 +771,8 @@ async def register_model(self, model_type: str, model: str, persist: bool): await self._cache_tracker_ref.record_model_version( generate_fn(model_spec), self.address ) + except ValueError as e: + raise e except Exception as e: unregister_fn(model_spec.model_name, raise_error=False) raise e @@ -748,13 +783,14 @@ async def register_model(self, model_type: str, model: str, persist: bool): async def unregister_model(self, model_type: str, model_name: str): if model_type in self._custom_register_type_to_cls: _, _, unregister_fn, _ = self._custom_register_type_to_cls[model_type] - unregister_fn(model_name) - await self._cache_tracker_ref.unregister_model_version(model_name) + unregister_fn(model_name, False) if not self.is_local_deployment(): workers = list(self._worker_address_to_worker.values()) for worker in workers: - await worker.unregister_model(model_name) + await worker.unregister_model(model_type, model_name) + + await self._cache_tracker_ref.unregister_model_version(model_name) else: raise ValueError(f"Unsupported model type: {model_type}") @@ -825,6 +861,14 @@ async def launch_builtin_model( download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, **kwargs, ) -> str: + # search in worker first + if not self.is_local_deployment(): + workers = list(self._worker_address_to_worker.values()) + for worker in workers: + res = await worker.get_model_registration(model_type, model_name) + if res is not None: + worker_ip = worker.address.split(":")[0] + target_ip_worker_ref = ( self._get_worker_ref_by_ip(worker_ip) if worker_ip is not None else None ) @@ -877,6 +921,7 @@ async def _launch_one_model(_replica_model_uid): ) replica_gpu_idx = assign_replica_gpu(_replica_model_uid, gpu_idx) nonlocal model_type + worker_ref = ( target_ip_worker_ref if target_ip_worker_ref is not None diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 286440e1a9..e36d32e99e 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -212,12 +212,14 @@ async def __post_create__(self): from ..model.audio import ( CustomAudioModelFamilyV1, + generate_audio_description, get_audio_model_descriptions, register_audio, unregister_audio, ) from ..model.embedding import ( CustomEmbeddingModelSpec, + generate_embedding_description, get_embedding_model_descriptions, register_embedding, unregister_embedding, @@ -230,36 +232,56 @@ async def __post_create__(self): ) from ..model.image import ( CustomImageModelFamilyV1, + generate_image_description, get_image_model_descriptions, register_image, unregister_image, ) from ..model.llm import ( CustomLLMFamilyV1, + generate_llm_description, get_llm_model_descriptions, register_llm, unregister_llm, ) from ..model.rerank import ( CustomRerankModelSpec, + generate_rerank_description, get_rerank_model_descriptions, register_rerank, unregister_rerank, ) self._custom_register_type_to_cls: Dict[str, Tuple] = { # type: ignore - "LLM": (CustomLLMFamilyV1, register_llm, unregister_llm), + "LLM": ( + CustomLLMFamilyV1, + register_llm, + unregister_llm, + generate_llm_description, + ), "embedding": ( CustomEmbeddingModelSpec, register_embedding, unregister_embedding, + generate_embedding_description, + ), + "rerank": ( + CustomRerankModelSpec, + register_rerank, + unregister_rerank, + generate_rerank_description, ), - "rerank": (CustomRerankModelSpec, register_rerank, unregister_rerank), - "audio": (CustomAudioModelFamilyV1, register_audio, unregister_audio), "image": ( CustomImageModelFamilyV1, register_image, unregister_image, + generate_image_description, + ), + "audio": ( + CustomAudioModelFamilyV1, + register_audio, + unregister_audio, + generate_audio_description, ), "flexible": ( FlexibleModelSpec, @@ -526,17 +548,23 @@ def _check_model_is_valid(self, model_name: str, model_format: Optional[str]): raise ValueError(f"{model_name} model can't run on Darwin system.") @log_sync(logger=logger) - def register_model(self, model_type: str, model: str, persist: bool): + async def register_model(self, model_type: str, model: str, persist: bool): # TODO: centralized model registrations if model_type in self._custom_register_type_to_cls: ( model_spec_cls, register_fn, unregister_fn, + generate_fn, ) = self._custom_register_type_to_cls[model_type] model_spec = model_spec_cls.parse_raw(model) try: register_fn(model_spec, persist) + await self._cache_tracker_ref.record_model_version( + generate_fn(model_spec), self.address + ) + except ValueError as e: + raise e except Exception as e: unregister_fn(model_spec.model_name, raise_error=False) raise e @@ -544,14 +572,127 @@ def register_model(self, model_type: str, model: str, persist: bool): raise ValueError(f"Unsupported model type: {model_type}") @log_sync(logger=logger) - def unregister_model(self, model_type: str, model_name: str): + async def unregister_model(self, model_type: str, model_name: str): # TODO: centralized model registrations if model_type in self._custom_register_type_to_cls: - _, _, unregister_fn = self._custom_register_type_to_cls[model_type] - unregister_fn(model_name) + _, _, unregister_fn, _ = self._custom_register_type_to_cls[model_type] + unregister_fn(model_name, False) else: raise ValueError(f"Unsupported model type: {model_type}") + @log_async(logger=logger) + async def list_model_registrations( + self, model_type: str, detailed: bool = False + ) -> List[Dict[str, Any]]: + def sort_helper(item): + assert isinstance(item["model_name"], str) + return item.get("model_name").lower() + + if model_type == "LLM": + from ..model.llm import get_user_defined_llm_families + + ret = [] + + for family in get_user_defined_llm_families(): + ret.append({"model_name": family.model_name, "is_builtin": False}) + + ret.sort(key=sort_helper) + return ret + elif model_type == "embedding": + from ..model.embedding.custom import get_user_defined_embeddings + + ret = [] + + for model_spec in get_user_defined_embeddings(): + ret.append({"model_name": model_spec.model_name, "is_builtin": False}) + + ret.sort(key=sort_helper) + return ret + elif model_type == "image": + from ..model.image.custom import get_user_defined_images + + ret = [] + + for model_spec in get_user_defined_images(): + ret.append({"model_name": model_spec.model_name, "is_builtin": False}) + + ret.sort(key=sort_helper) + return ret + elif model_type == "audio": + from ..model.audio.custom import get_user_defined_audios + + ret = [] + + for model_spec in get_user_defined_audios(): + ret.append({"model_name": model_spec.model_name, "is_builtin": False}) + + ret.sort(key=sort_helper) + return ret + elif model_type == "rerank": + from ..model.rerank.custom import get_user_defined_reranks + + ret = [] + + for model_spec in get_user_defined_reranks(): + ret.append({"model_name": model_spec.model_name, "is_builtin": False}) + + ret.sort(key=sort_helper) + return ret + else: + raise ValueError(f"Unsupported model type: {model_type}") + + @log_sync(logger=logger) + async def get_model_registration(self, model_type: str, model_name: str) -> Any: + if model_type == "LLM": + from ..model.llm import get_user_defined_llm_families + + for f in get_user_defined_llm_families(): + if f.model_name == model_name: + return f + elif model_type == "embedding": + from ..model.embedding.custom import get_user_defined_embeddings + + for f in get_user_defined_embeddings(): + if f.model_name == model_name: + return f + elif model_type == "image": + from ..model.image.custom import get_user_defined_images + + for f in get_user_defined_images(): + if f.model_name == model_name: + return f + elif model_type == "audio": + from ..model.audio.custom import get_user_defined_audios + + for f in get_user_defined_audios(): + if f.model_name == model_name: + return f + elif model_type == "rerank": + from ..model.rerank.custom import get_user_defined_reranks + + for f in get_user_defined_reranks(): + if f.model_name == model_name: + return f + return None + + @log_async(logger=logger) + async def query_engines_by_model_name(self, model_name: str): + from copy import deepcopy + + from ..model.llm.llm_family import LLM_ENGINES + + if model_name not in LLM_ENGINES: + return None + + # filter llm_class + engine_params = deepcopy(LLM_ENGINES[model_name]) + for engine in engine_params: + params = engine_params[engine] + for param in params: + del param["llm_class"] + + return engine_params + async def _get_model_ability(self, model: Any, model_type: str) -> List[str]: from ..model.llm.core import LLM diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 2fb84d95c9..fcff9b32ac 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -370,6 +370,9 @@ def worker( help="Type of model to register (default is 'LLM').", ) @click.option("--file", "-f", type=str, help="Path to the model configuration file.") +@click.option( + "--worker-ip", "-w", type=str, help="Specify the ip address of the worker." +) @click.option( "--persist", "-p", @@ -387,6 +390,7 @@ def register_model( endpoint: Optional[str], model_type: str, file: str, + worker_ip: str, persist: bool, api_key: Optional[str], ): @@ -400,6 +404,7 @@ def register_model( client.register_model( model_type=model_type, model=model, + worker_ip=worker_ip, persist=persist, ) diff --git a/xinference/model/image/custom.py b/xinference/model/image/custom.py index b002f6ded1..ff66ff8aa7 100644 --- a/xinference/model/image/custom.py +++ b/xinference/model/image/custom.py @@ -66,7 +66,7 @@ def register_image(model_spec: CustomImageModelFamilyV1, persist: bool): raise ValueError(f"Invalid model URI {model_uri}") persist_path = os.path.join( - XINFERENCE_MODEL_DIR, "image", f"{model_spec.model_id}.json" + XINFERENCE_MODEL_DIR, "image", f"{model_spec.model_name}.json" ) os.makedirs(os.path.dirname(persist_path), exist_ok=True) with open(persist_path, "w") as f: From e80910d9ec159b04c950a47910c6630c3f16e27c Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:47:21 +0800 Subject: [PATCH 198/298] BUG: Fix stream unicode issue for chinese characters when using vllm backend (#1865) --- xinference/core/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xinference/core/model.py b/xinference/core/model.py index 2796ad3c8e..0994f325d5 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -351,7 +351,7 @@ async def _to_json_async_gen(self, gen: types.AsyncGeneratorType): if time_to_first_token is None: time_to_first_token = (time.time() - start_time) * 1000 final_usage = v.get("usage", None) - v = await asyncio.to_thread(json.dumps, v) + v = await asyncio.to_thread(json.dumps, v, ensure_ascii=False) v = dict(data=v) # noqa: F821 yield await asyncio.to_thread(sse_starlette.sse.ensure_bytes, v, None) except OutOfMemoryError: From 1035728bf530a064e20d9a7e46c35d97675db631 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 17 Jul 2024 05:38:30 +0800 Subject: [PATCH 199/298] FEAT: support sd inpainting models (#1879) --- doc/source/gen_docs.py | 1 + .../image/stable-diffusion-2-inpainting.rst | 19 +++++ .../image/stable-diffusion-inpainting.rst | 19 +++++ doc/templates/image.rst.jinja | 2 +- xinference/api/restful_api.py | 65 ++++++++++++++++ xinference/client/restful/restful_client.py | 75 +++++++++++++++++++ xinference/core/model.py | 29 +++++++ xinference/model/image/core.py | 3 + xinference/model/image/model_spec.json | 14 ++++ .../model/image/stable_diffusion/core.py | 49 ++++++++++-- .../image/tests/test_stable_diffusion.py | 42 +++++++++++ 11 files changed, 311 insertions(+), 7 deletions(-) create mode 100644 doc/source/models/builtin/image/stable-diffusion-2-inpainting.rst create mode 100644 doc/source/models/builtin/image/stable-diffusion-inpainting.rst diff --git a/doc/source/gen_docs.py b/doc/source/gen_docs.py index 881e3be6ac..48de3f83ec 100644 --- a/doc/source/gen_docs.py +++ b/doc/source/gen_docs.py @@ -193,6 +193,7 @@ def get_unique_id(spec): if not available_controlnet: available_controlnet = None model["available_controlnet"] = available_controlnet + model["model_ability"] = model.get("ability", "text-to-image") rendered = env.get_template('image.rst.jinja').render(model) output_file_path = os.path.join(output_dir, f"{model['model_name'].lower()}.rst") with open(output_file_path, 'w') as output_file: diff --git a/doc/source/models/builtin/image/stable-diffusion-2-inpainting.rst b/doc/source/models/builtin/image/stable-diffusion-2-inpainting.rst new file mode 100644 index 0000000000..6009cd37a3 --- /dev/null +++ b/doc/source/models/builtin/image/stable-diffusion-2-inpainting.rst @@ -0,0 +1,19 @@ +.. _models_builtin_stable-diffusion-2-inpainting: + +============================= +stable-diffusion-2-inpainting +============================= + +- **Model Name:** stable-diffusion-2-inpainting +- **Model Family:** stable_diffusion +- **Abilities:** inpainting +- **Available ControlNet:** None + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** stabilityai/stable-diffusion-2-inpainting + +Execute the following command to launch the model:: + + xinference launch --model-name stable-diffusion-2-inpainting --model-type image \ No newline at end of file diff --git a/doc/source/models/builtin/image/stable-diffusion-inpainting.rst b/doc/source/models/builtin/image/stable-diffusion-inpainting.rst new file mode 100644 index 0000000000..76f1274048 --- /dev/null +++ b/doc/source/models/builtin/image/stable-diffusion-inpainting.rst @@ -0,0 +1,19 @@ +.. _models_builtin_stable-diffusion-inpainting: + +=========================== +stable-diffusion-inpainting +=========================== + +- **Model Name:** stable-diffusion-inpainting +- **Model Family:** stable_diffusion +- **Abilities:** inpainting +- **Available ControlNet:** None + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** runwayml/stable-diffusion-inpainting + +Execute the following command to launch the model:: + + xinference launch --model-name stable-diffusion-inpainting --model-type image \ No newline at end of file diff --git a/doc/templates/image.rst.jinja b/doc/templates/image.rst.jinja index a14d8deee0..06379d7d56 100644 --- a/doc/templates/image.rst.jinja +++ b/doc/templates/image.rst.jinja @@ -6,7 +6,7 @@ - **Model Name:** {{ model_name }} - **Model Family:** {{ model_family }} -- **Abilities:** text-to-image +- **Abilities:** {{ model_ability }} - **Available ControlNet:** {{ available_controlnet }} Specifications diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 7d28ffe8b1..f57270284f 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -491,6 +491,17 @@ def serve(self, logging_conf: Optional[dict] = None): else None ), ) + self._router.add_api_route( + "/v1/images/inpainting", + self.create_inpainting, + methods=["POST"], + response_model=ImageList, + dependencies=( + [Security(self._auth_service, scopes=["models:read"])] + if self.is_authenticated() + else None + ), + ) self._router.add_api_route( "/v1/chat/completions", self.create_chat_completion, @@ -1410,6 +1421,60 @@ async def create_variations( await self._report_error_event(model_uid, str(e)) raise HTTPException(status_code=500, detail=str(e)) + async def create_inpainting( + self, + model: str = Form(...), + image: UploadFile = File(media_type="application/octet-stream"), + mask_image: UploadFile = File(media_type="application/octet-stream"), + prompt: Optional[Union[str, List[str]]] = Form(None), + negative_prompt: Optional[Union[str, List[str]]] = Form(None), + n: Optional[int] = Form(1), + response_format: Optional[str] = Form("url"), + size: Optional[str] = Form(None), + kwargs: Optional[str] = Form(None), + ) -> Response: + model_uid = model + try: + model_ref = await (await self._get_supervisor_ref()).get_model(model_uid) + except ValueError as ve: + logger.error(str(ve), exc_info=True) + await self._report_error_event(model_uid, str(ve)) + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + logger.error(e, exc_info=True) + await self._report_error_event(model_uid, str(e)) + raise HTTPException(status_code=500, detail=str(e)) + + try: + if kwargs is not None: + parsed_kwargs = json.loads(kwargs) + else: + parsed_kwargs = {} + im = Image.open(image.file) + mask_im = Image.open(mask_image.file) + if not size: + w, h = im.size + size = f"{w}*{h}" + image_list = await model_ref.inpainting( + image=im, + mask_image=mask_im, + prompt=prompt, + negative_prompt=negative_prompt, + n=n, + size=size, + response_format=response_format, + **parsed_kwargs, + ) + return Response(content=image_list, media_type="application/json") + except RuntimeError as re: + logger.error(re, exc_info=True) + await self._report_error_event(model_uid, str(re)) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + await self._report_error_event(model_uid, str(e)) + raise HTTPException(status_code=500, detail=str(e)) + async def create_flexible_infer(self, request: Request) -> Response: payload = await request.json() diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 54be488748..7adfa8b8d2 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -294,6 +294,81 @@ def image_to_image( response_data = response.json() return response_data + def inpainting( + self, + image: Union[str, bytes], + mask_image: Union[str, bytes], + prompt: str, + negative_prompt: Optional[str] = None, + n: int = 1, + size: Optional[str] = None, + response_format: str = "url", + **kwargs, + ) -> "ImageList": + """ + Inpaint an image by the input text. + + Parameters + ---------- + image: `Union[str, bytes]` + an image batch to be inpainted (which parts of the image to + be masked out with `mask_image` and repainted according to `prompt`). For both numpy array and pytorch + tensor, the expected value range is between `[0, 1]` If it's a tensor or a list or tensors, the + expected shape should be `(B, C, H, W)` or `(C, H, W)`. If it is a numpy array or a list of arrays, the + expected shape should be `(B, H, W, C)` or `(H, W, C)` It can also accept image latents as `image`, but + if passing latents directly it is not encoded again. + mask_image: `Union[str, bytes]` + representing an image batch to mask `image`. White pixels in the mask + are repainted while black pixels are preserved. If `mask_image` is a PIL image, it is converted to a + single channel (luminance) before use. If it's a numpy array or pytorch tensor, it should contain one + color channel (L) instead of 3, so the expected shape for pytorch tensor would be `(B, 1, H, W)`, `(B, + H, W)`, `(1, H, W)`, `(H, W)`. And for numpy array would be for `(B, H, W, 1)`, `(B, H, W)`, `(H, W, + 1)`, or `(H, W)`. + prompt: `str` or `List[str]` + The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`. + negative_prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds` instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` is + less than `1`). + n: `int`, defaults to 1 + The number of images to generate per prompt. Must be between 1 and 10. + size: `str`, defaults to None + The width*height in pixels of the generated image. + response_format: `str`, defaults to `url` + The format in which the generated images are returned. Must be one of url or b64_json. + Returns + ------- + ImageList + A list of image objects. + :param prompt: + :param image: + """ + url = f"{self._base_url}/v1/images/inpainting" + params = { + "model": self._model_uid, + "prompt": prompt, + "negative_prompt": negative_prompt, + "n": n, + "size": size, + "response_format": response_format, + "kwargs": json.dumps(kwargs), + } + files: List[Any] = [] + for key, value in params.items(): + files.append((key, (None, value))) + files.append(("image", ("image", image, "application/octet-stream"))) + files.append( + ("mask_image", ("mask_image", mask_image, "application/octet-stream")) + ) + response = requests.post(url, files=files, headers=self.auth_headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to inpaint the images, detail: {_get_error_string(response)}" + ) + + response_data = response.json() + return response_data + class RESTfulGenerateModelHandle(RESTfulModelHandle): def generate( diff --git a/xinference/core/model.py b/xinference/core/model.py index 0994f325d5..7ccc364b85 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -697,6 +697,35 @@ async def image_to_image( f"Model {self._model.model_spec} is not for creating image." ) + async def inpainting( + self, + image: "PIL.Image", + mask_image: "PIL.Image", + prompt: str, + negative_prompt: str, + n: int = 1, + size: str = "1024*1024", + response_format: str = "url", + *args, + **kwargs, + ): + if hasattr(self._model, "inpainting"): + return await self._call_wrapper( + self._model.inpainting, + image, + mask_image, + prompt, + negative_prompt, + n, + size, + response_format, + *args, + **kwargs, + ) + raise AttributeError( + f"Model {self._model.model_spec} is not for creating image." + ) + @log_async(logger=logger) @request_limit async def infer( diff --git a/xinference/model/image/core.py b/xinference/model/image/core.py index 0ebd29ce47..b2fef3baaa 100644 --- a/xinference/model/image/core.py +++ b/xinference/model/image/core.py @@ -45,6 +45,7 @@ class ImageModelFamilyV1(CacheableModelSpec): model_id: str model_revision: str model_hub: str = "huggingface" + ability: Optional[str] controlnet: Optional[List["ImageModelFamilyV1"]] @@ -71,6 +72,7 @@ def to_dict(self): "model_name": self._model_spec.model_name, "model_family": self._model_spec.model_family, "model_revision": self._model_spec.model_revision, + "ability": self._model_spec.ability, "controlnet": controlnet, } @@ -234,6 +236,7 @@ def create_image_model_instance( lora_model_paths=lora_model, lora_load_kwargs=lora_load_kwargs, lora_fuse_kwargs=lora_fuse_kwargs, + ability=model_spec.ability, **kwargs, ) model_description = ImageModelDescription( diff --git a/xinference/model/image/model_spec.json b/xinference/model/image/model_spec.json index 25718b15fe..eff9c78a0a 100644 --- a/xinference/model/image/model_spec.json +++ b/xinference/model/image/model_spec.json @@ -92,5 +92,19 @@ "model_revision": "62134b9d8e703b5d6f74f1534457287a8bba77ef" } ] + }, + { + "model_name": "stable-diffusion-inpainting", + "model_family": "stable_diffusion", + "model_id": "runwayml/stable-diffusion-inpainting", + "model_revision": "51388a731f57604945fddd703ecb5c50e8e7b49d", + "ability": "inpainting" + }, + { + "model_name": "stable-diffusion-2-inpainting", + "model_family": "stable_diffusion", + "model_id": "stabilityai/stable-diffusion-2-inpainting", + "model_revision": "81a84f49b15956b60b4272a405ad3daef3da4590", + "ability": "inpainting" } ] diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index 6d9be6ee2a..2e00743a25 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -16,6 +16,7 @@ import logging import os import re +import sys import time import uuid from concurrent.futures import ThreadPoolExecutor @@ -39,6 +40,7 @@ def __init__( lora_model: Optional[List[LoRA]] = None, lora_load_kwargs: Optional[Dict] = None, lora_fuse_kwargs: Optional[Dict] = None, + ability: Optional[str] = None, **kwargs, ): self._model_uid = model_uid @@ -48,6 +50,7 @@ def __init__( self._lora_model = lora_model self._lora_load_kwargs = lora_load_kwargs or {} self._lora_fuse_kwargs = lora_fuse_kwargs or {} + self._ability = ability self._kwargs = kwargs def _apply_lora(self): @@ -64,8 +67,14 @@ def _apply_lora(self): logger.info(f"Successfully loaded the LoRA for model {self._model_uid}.") def load(self): - # import torch - from diffusers import AutoPipelineForText2Image + import torch + + if self._ability in [None, "text2image", "image2image"]: + from diffusers import AutoPipelineForText2Image as AutoPipelineModel + elif self._ability == "inpainting": + from diffusers import AutoPipelineForInpainting as AutoPipelineModel + else: + raise ValueError(f"Unknown ability: {self._ability}") controlnet = self._kwargs.get("controlnet") if controlnet is not None: @@ -74,12 +83,16 @@ def load(self): logger.debug("Loading controlnet %s", controlnet) self._kwargs["controlnet"] = ControlNetModel.from_pretrained(controlnet) - self._model = AutoPipelineForText2Image.from_pretrained( + torch_dtype = self._kwargs.get("torch_dtype") + if sys.platform != "darwin" and torch_dtype is None: + # The following params crashes on Mac M2 + self._kwargs["torch_dtype"] = torch.float16 + self._kwargs["use_safetensors"] = True + + logger.debug("Loading model %s", AutoPipelineModel) + self._model = AutoPipelineModel.from_pretrained( self._model_path, **self._kwargs, - # The following params crashes on Mac M2 - # torch_dtype=torch.float16, - # use_safetensors=True, ) self._model = move_model_to_available_device(self._model) # Recommended if your computer has < 64 GB of RAM @@ -174,3 +187,27 @@ def image_to_image( response_format=response_format, **kwargs, ) + + def inpainting( + self, + image: bytes, + mask_image: bytes, + prompt: Optional[Union[str, List[str]]] = None, + negative_prompt: Optional[Union[str, List[str]]] = None, + n: int = 1, + size: str = "1024*1024", + response_format: str = "url", + **kwargs, + ): + width, height = map(int, re.split(r"[^\d]+", size)) + return self._call_model( + image=image, + mask_image=mask_image, + prompt=prompt, + negative_prompt=negative_prompt, + height=height, + width=width, + num_images_per_prompt=n, + response_format=response_format, + **kwargs, + ) diff --git a/xinference/model/image/tests/test_stable_diffusion.py b/xinference/model/image/tests/test_stable_diffusion.py index 010f10e590..c5b4c516b3 100644 --- a/xinference/model/image/tests/test_stable_diffusion.py +++ b/xinference/model/image/tests/test_stable_diffusion.py @@ -188,6 +188,48 @@ def test_restful_api_for_sd_turbo(setup, model_name): assert img.size == (512, 512) +@pytest.mark.skip(reason="Stable diffusion inpainting requires too many GRAM.") +def test_restful_api_for_sd_inpainting(setup): + endpoint, _ = setup + from ....client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_uid="my_inpainting", + model_name="stable-diffusion-2-inpainting", + model_type="image", + ) + model = client.get_model(model_uid) + + from diffusers.utils import load_image + + # Replace the image path for your test. + image_path = os.path.expanduser("~/raw.jpg") + logger.info("Image path: %s", image_path) + image = load_image(image_path) + bio = io.BytesIO() + image.save(bio, format="png") + mask_image_path = os.path.expanduser("~/mask.jpg") + logger.info("Mask image path: %s", mask_image_path) + mask_image = load_image(mask_image_path) + bio2 = io.BytesIO() + mask_image.save(bio2, format="png") + + r = model.inpainting( + prompt="desert, clear sky, white clouds", + image=bio.getvalue(), + mask_image=bio2.getvalue(), + num_inference_steps=10, + ) + logger.info("test result %s", r) + from PIL import Image + + with open(r["data"][0]["url"], "rb") as f: + img = Image.open(f) + assert img.size == image.size + + def test_get_cache_status(): from ..core import get_cache_status From bd932c595109c8be493328cc1a371237d80929d7 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Wed, 17 Jul 2024 06:32:41 +0200 Subject: [PATCH 200/298] FEAT: Stream ChatTTS (#1812) --- .github/workflows/python.yaml | 4 +- doc/source/getting_started/environments.rst | 5 ++ doc/source/models/model_abilities/audio.rst | 11 ++- setup.cfg | 2 + xinference/api/restful_api.py | 15 +++- xinference/client/restful/restful_client.py | 8 ++ xinference/constants.py | 4 + xinference/core/model.py | 73 +++++++++++++------ xinference/deploy/docker/Dockerfile | 2 +- xinference/deploy/docker/cpu.Dockerfile | 2 +- xinference/deploy/docker/requirements.txt | 4 +- xinference/deploy/docker/requirements_cpu.txt | 7 ++ xinference/model/audio/chattts.py | 48 ++++++++++-- xinference/model/audio/tests/test_chattts.py | 22 ++++-- 14 files changed, 161 insertions(+), 46 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 16591dcbe0..bc19d1cbd5 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -66,6 +66,7 @@ jobs: env: CONDA_ENV: test SELF_HOST_PYTHON: /root/miniconda3/envs/inference_test/bin/python + SELF_HOST_CONDA: /root/miniconda3/condabin/conda defaults: run: shell: bash -l {0} @@ -149,7 +150,8 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pip install -U "aioprometheus[starlette]" ${{ env.SELF_HOST_PYTHON }} -m pip install -U "pynvml" ${{ env.SELF_HOST_PYTHON }} -m pip install -U "transformers" - ${{ env.SELF_HOST_PYTHON }} -m conda install -c conda-forge pynini=2.1.5 + ${{ env.SELF_HOST_CONDA }} install -c conda-forge pynini=2.1.5 + ${{ env.SELF_HOST_CONDA }} install -c conda-forge "ffmpeg<7" ${{ env.SELF_HOST_PYTHON }} -m pip install -U nemo_text_processing ${{ env.SELF_HOST_PYTHON }} -m pip install -U omegaconf~=2.3.0 ${{ env.SELF_HOST_PYTHON }} -m pip install -U WeTextProcessing diff --git a/doc/source/getting_started/environments.rst b/doc/source/getting_started/environments.rst index a1766f5e9b..de7e426296 100644 --- a/doc/source/getting_started/environments.rst +++ b/doc/source/getting_started/environments.rst @@ -46,3 +46,8 @@ XINFERENCE_DISABLE_METRICS Xinference will by default enable the metrics exporter on the supervisor and worker. Setting this environment to 1 will disable the /metrics endpoint on the supervisor and the HTTP service (only provide the /metrics endpoint) on the worker. + +XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Xinference audio Speech API will use non-stream by default. Setting this environment +to 1 will use stream by default. diff --git a/doc/source/models/model_abilities/audio.rst b/doc/source/models/model_abilities/audio.rst index 22338f871d..270e880559 100644 --- a/doc/source/models/model_abilities/audio.rst +++ b/doc/source/models/model_abilities/audio.rst @@ -167,6 +167,13 @@ Speech The Speech API mimics OpenAI's `create speech API <https://platform.openai.com/docs/api-reference/audio/createSpeech>`_. We can try Speech API out either via cURL, OpenAI Client, or Xinference's python client: +Speech API use non-stream by default as + +1. The stream output of ChatTTS is not as good as the non-stream output, please refer to: https://github.com/2noise/ChatTTS/pull/564 +2. The stream requires ffmpeg<7: https://pytorch.org/audio/stable/installation.html#optional-dependencies + +User can change the default to stream by `export XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM=1` + .. tabs:: .. code-tab:: bash cURL @@ -179,6 +186,7 @@ We can try Speech API out either via cURL, OpenAI Client, or Xinference's python "model": "<MODEL_UID>", "text": "<The text to generate audio for>", "voice": "echo", + "stream": True, }' @@ -205,7 +213,8 @@ We can try Speech API out either via cURL, OpenAI Client, or Xinference's python model = client.get_model("<MODEL_UID>") model.speech( input=<The text to generate audio for>, - voice="echo" + voice="echo", + stream: True, ) diff --git a/setup.cfg b/setup.cfg index 6679601b9e..101d92a8ef 100644 --- a/setup.cfg +++ b/setup.cfg @@ -112,6 +112,7 @@ all = WeTextProcessing # For ChatTTS librosa # For ChatTTS xxhash # For ChatTTS + torchaudio # For ChatTTS ChatTTS>0.1 boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 @@ -156,6 +157,7 @@ audio = WeTextProcessing librosa xxhash + torchaudio ChatTTS>0.1 doc = ipython>=6.5.0 diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index f57270284f..17875a4c3c 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -52,7 +52,11 @@ from .._compat import BaseModel, Field from .._version import get_versions -from ..constants import XINFERENCE_DEFAULT_ENDPOINT_PORT, XINFERENCE_DISABLE_METRICS +from ..constants import ( + XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM, + XINFERENCE_DEFAULT_ENDPOINT_PORT, + XINFERENCE_DISABLE_METRICS, +) from ..core.event import Event, EventCollectorActor, EventType from ..core.supervisor import SupervisorActor from ..core.utils import json_dumps @@ -129,6 +133,7 @@ class SpeechRequest(BaseModel): voice: Optional[str] response_format: Optional[str] = "mp3" speed: Optional[float] = 1.0 + stream: Optional[bool] = XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM class RegisterModelRequest(BaseModel): @@ -1328,8 +1333,14 @@ async def create_speech(self, request: Request) -> Response: voice=body.voice, response_format=body.response_format, speed=body.speed, + stream=body.stream, ) - return Response(media_type="application/octet-stream", content=out) + if body.stream: + return EventSourceResponse( + media_type="application/octet-stream", content=out + ) + else: + return Response(media_type="application/octet-stream", content=out) except RuntimeError as re: logger.error(re, exc_info=True) await self._report_error_event(model_uid, str(re)) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 7adfa8b8d2..724df95c57 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -17,6 +17,7 @@ import requests +from ...constants import XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM from ..common import streaming_response_iterator if TYPE_CHECKING: @@ -767,6 +768,7 @@ def speech( voice: str = "", response_format: str = "mp3", speed: float = 1.0, + stream: bool = XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM, ): """ Generates audio from the input text. @@ -782,6 +784,8 @@ def speech( The format to audio in. speed: str The speed of the generated audio. + stream: bool + Use stream or not. Returns ------- @@ -795,6 +799,7 @@ def speech( "voice": voice, "response_format": response_format, "speed": speed, + "stream": stream, } response = requests.post(url, json=params, headers=self.auth_headers) if response.status_code != 200: @@ -802,6 +807,9 @@ def speech( f"Failed to speech the text, detail: {_get_error_string(response)}" ) + if stream: + return response.iter_content(chunk_size=1024) + return response.content diff --git a/xinference/constants.py b/xinference/constants.py index 9fa5939603..6695f1fd29 100644 --- a/xinference/constants.py +++ b/xinference/constants.py @@ -30,6 +30,7 @@ XINFERENCE_ENV_ENABLE_SGLANG = "XINFERENCE_ENABLE_SGLANG" XINFERENCE_ENV_DISABLE_METRICS = "XINFERENCE_DISABLE_METRICS" XINFERENCE_ENV_TRANSFORMERS_ENABLE_BATCHING = "XINFERENCE_TRANSFORMERS_ENABLE_BATCHING" +XINFERENCE_ENV_AUDIO_SPEECH_DEFAULT_STREAM = "XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM" def get_xinference_home() -> str: @@ -80,3 +81,6 @@ def get_xinference_home() -> str: XINFERENCE_TRANSFORMERS_ENABLE_BATCHING = bool( int(os.environ.get(XINFERENCE_ENV_TRANSFORMERS_ENABLE_BATCHING, 0)) ) +XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM = bool( + int(os.environ.get(XINFERENCE_ENV_AUDIO_SPEECH_DEFAULT_STREAM, 0)) +) diff --git a/xinference/core/model.py b/xinference/core/model.py index 7ccc364b85..b6baab26f5 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -310,7 +310,7 @@ def model_uid(self): ) ) - def _to_json_generator(self, gen: types.GeneratorType): + def _to_generator(self, output_type: str, gen: types.GeneratorType): start_time = time.time() time_to_first_token = None final_usage = None @@ -318,8 +318,13 @@ def _to_json_generator(self, gen: types.GeneratorType): for v in gen: if time_to_first_token is None: time_to_first_token = (time.time() - start_time) * 1000 - final_usage = v.get("usage", None) - v = dict(data=json.dumps(v, ensure_ascii=False)) + if output_type == "json": + final_usage = v.get("usage", None) + v = dict(data=json.dumps(v, ensure_ascii=False)) + else: + assert ( + output_type == "binary" + ), f"Unknown output type '{output_type}'" yield sse_starlette.sse.ensure_bytes(v, None) except OutOfMemoryError: logger.exception( @@ -342,7 +347,7 @@ def _to_json_generator(self, gen: types.GeneratorType): ) asyncio.run_coroutine_threadsafe(coro, loop=self._loop) - async def _to_json_async_gen(self, gen: types.AsyncGeneratorType): + async def _to_async_gen(self, output_type: str, gen: types.AsyncGeneratorType): start_time = time.time() time_to_first_token = None final_usage = None @@ -351,8 +356,13 @@ async def _to_json_async_gen(self, gen: types.AsyncGeneratorType): if time_to_first_token is None: time_to_first_token = (time.time() - start_time) * 1000 final_usage = v.get("usage", None) - v = await asyncio.to_thread(json.dumps, v, ensure_ascii=False) - v = dict(data=v) # noqa: F821 + if output_type == "json": + v = await asyncio.to_thread(json.dumps, v, ensure_ascii=False) + v = dict(data=v) # noqa: F821 + else: + assert ( + output_type == "binary" + ), f"Unknown output type '{output_type}'" yield await asyncio.to_thread(sse_starlette.sse.ensure_bytes, v, None) except OutOfMemoryError: logger.exception( @@ -379,8 +389,14 @@ async def _to_json_async_gen(self, gen: types.AsyncGeneratorType): ) await asyncio.gather(*coros) + async def _call_wrapper_json(self, fn: Callable, *args, **kwargs): + return await self._call_wrapper("json", fn, *args, **kwargs) + + async def _call_wrapper_binary(self, fn: Callable, *args, **kwargs): + return await self._call_wrapper("binary", fn, *args, **kwargs) + @oom_check - async def _call_wrapper(self, fn: Callable, *args, **kwargs): + async def _call_wrapper(self, output_type: str, fn: Callable, *args, **kwargs): if self._lock is None: if inspect.iscoroutinefunction(fn): ret = await fn(*args, **kwargs) @@ -397,16 +413,18 @@ async def _call_wrapper(self, fn: Callable, *args, **kwargs): raise Exception("Parallel generation is not supported by ggml.") if inspect.isgenerator(ret): - gen = self._to_json_generator(ret) + gen = self._to_generator(output_type, ret) self._current_generator = weakref.ref(gen) return gen if inspect.isasyncgen(ret): - gen = self._to_json_async_gen(ret) + gen = self._to_async_gen(output_type, ret) self._current_generator = weakref.ref(gen) return gen - if isinstance(ret, bytes): + if output_type == "json": + return await asyncio.to_thread(json_dumps, ret) + else: + assert output_type == "binary", f"Unknown output type '{output_type}'" return ret - return await asyncio.to_thread(json_dumps, ret) @log_async(logger=logger) @request_limit @@ -419,11 +437,11 @@ async def generate(self, prompt: str, *args, **kwargs): else: kwargs.pop("raw_params", None) if hasattr(self._model, "generate"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.generate, prompt, *args, **kwargs ) if hasattr(self._model, "async_generate"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.async_generate, prompt, *args, **kwargs ) raise AttributeError(f"Model {self._model.model_spec} is not for generate.") @@ -471,7 +489,7 @@ async def handle_batching_request(self, prompt: str, ability: str, *args, **kwar queue: Queue[Any] = Queue() ret = self._queue_consumer(queue) await self._scheduler_ref.add_request(prompt, queue, *args, **kwargs) - gen = self._to_json_async_gen(ret) + gen = self._to_async_gen("json", ret) self._current_generator = weakref.ref(gen) return gen else: @@ -502,12 +520,12 @@ async def chat(self, prompt: str, *args, **kwargs): else: kwargs.pop("raw_params", None) if hasattr(self._model, "chat"): - response = await self._call_wrapper( + response = await self._call_wrapper_json( self._model.chat, prompt, *args, **kwargs ) return response if hasattr(self._model, "async_chat"): - response = await self._call_wrapper( + response = await self._call_wrapper_json( self._model.async_chat, prompt, *args, **kwargs ) return response @@ -543,7 +561,7 @@ async def abort_request(self, request_id: str) -> str: @request_limit async def create_embedding(self, input: Union[str, List[str]], *args, **kwargs): if hasattr(self._model, "create_embedding"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.create_embedding, input, *args, **kwargs ) @@ -565,7 +583,7 @@ async def rerank( **kwargs, ): if hasattr(self._model, "rerank"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.rerank, documents, query, @@ -590,7 +608,7 @@ async def transcriptions( timestamp_granularities: Optional[List[str]] = None, ): if hasattr(self._model, "transcriptions"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.transcriptions, audio, language, @@ -615,7 +633,7 @@ async def translations( timestamp_granularities: Optional[List[str]] = None, ): if hasattr(self._model, "translations"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.translations, audio, language, @@ -630,16 +648,23 @@ async def translations( @log_async(logger=logger) @request_limit + @xo.generator async def speech( - self, input: str, voice: str, response_format: str = "mp3", speed: float = 1.0 + self, + input: str, + voice: str, + response_format: str = "mp3", + speed: float = 1.0, + stream: bool = False, ): if hasattr(self._model, "speech"): - return await self._call_wrapper( + return await self._call_wrapper_binary( self._model.speech, input, voice, response_format, speed, + stream, ) raise AttributeError( f"Model {self._model.model_spec} is not for creating speech." @@ -657,7 +682,7 @@ async def text_to_image( **kwargs, ): if hasattr(self._model, "text_to_image"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.text_to_image, prompt, n, @@ -682,7 +707,7 @@ async def image_to_image( **kwargs, ): if hasattr(self._model, "image_to_image"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.image_to_image, image, prompt, diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 77e5579dfd..fb652ec19f 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -7,7 +7,7 @@ ENV NVM_DIR /usr/local/nvm ENV NODE_VERSION 14.21.1 RUN apt-get -y update \ - && apt install -y curl procps git libgl1 \ + && apt install -y curl procps git libgl1 ffmpeg \ && mkdir -p $NVM_DIR \ && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash \ && . $NVM_DIR/nvm.sh \ diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index a18666adf6..8498f5f341 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -6,7 +6,7 @@ ENV NVM_DIR /usr/local/nvm ENV NODE_VERSION 14.21.1 RUN apt-get -y update \ - && apt install -y build-essential curl procps git libgl1 \ + && apt install -y build-essential curl procps git libgl1 ffmpeg \ && mkdir -p $NVM_DIR \ && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash \ && . $NVM_DIR/nvm.sh \ diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index aea4ef4ddd..20e14bb47c 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -46,11 +46,11 @@ timm>=0.9.16 # For deepseek VL torchvision # For deepseek VL FlagEmbedding # For rerank omegaconf~=2.3.0 # For ChatTTS -vector_quantize_pytorch # For ChatTTS -vocos # For ChatTTS nemo_text_processing # For ChatTTS WeTextProcessing # For ChatTTS librosa # For ChatTTS +torchaudio # For ChatTTS +ChatTTS>0.1 xxhash # For ChatTTS boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 9249d5ae76..2e1efec6f6 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -42,3 +42,10 @@ optimum peft timm opencv-contrib-python-headless +omegaconf~=2.3.0 # For ChatTTS +nemo_text_processing # For ChatTTS +WeTextProcessing # For ChatTTS +librosa # For ChatTTS +torchaudio # For ChatTTS +ChatTTS>0.1 +xxhash # For ChatTTS diff --git a/xinference/model/audio/chattts.py b/xinference/model/audio/chattts.py index 3a77295935..3abd7869cd 100644 --- a/xinference/model/audio/chattts.py +++ b/xinference/model/audio/chattts.py @@ -48,7 +48,12 @@ def load(self): self._model.load(source="custom", custom_path=self._model_path, compile=True) def speech( - self, input: str, voice: str, response_format: str = "mp3", speed: float = 1.0 + self, + input: str, + voice: str, + response_format: str = "mp3", + speed: float = 1.0, + stream: bool = False, ): import ChatTTS import numpy as np @@ -74,11 +79,38 @@ def speech( ) assert self._model is not None - wavs = self._model.infer([input], params_infer_code=params_infer_code) - - # Save the generated audio - with BytesIO() as out: - torchaudio.save( - out, torch.from_numpy(wavs[0]), 24000, format=response_format + if stream: + iter = self._model.infer( + [input], params_infer_code=params_infer_code, stream=True ) - return out.getvalue() + + def _generator(): + with BytesIO() as out: + writer = torchaudio.io.StreamWriter(out, format=response_format) + writer.add_audio_stream(sample_rate=24000, num_channels=1) + i = 0 + last_pos = 0 + with writer.open(): + for it in iter: + for itt in it: + for chunk in itt: + chunk = np.array([chunk]).transpose() + writer.write_audio_chunk(i, torch.from_numpy(chunk)) + new_last_pos = out.tell() + if new_last_pos != last_pos: + out.seek(last_pos) + encoded_bytes = out.read() + print(len(encoded_bytes)) + yield encoded_bytes + last_pos = new_last_pos + + return _generator() + else: + wavs = self._model.infer([input], params_infer_code=params_infer_code) + + # Save the generated audio + with BytesIO() as out: + torchaudio.save( + out, torch.from_numpy(wavs[0]), 24000, format=response_format + ) + return out.getvalue() diff --git a/xinference/model/audio/tests/test_chattts.py b/xinference/model/audio/tests/test_chattts.py index 973d4145c1..1e557c62e6 100644 --- a/xinference/model/audio/tests/test_chattts.py +++ b/xinference/model/audio/tests/test_chattts.py @@ -11,7 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import os.path +import inspect +import os import tempfile @@ -33,13 +34,22 @@ def test_chattts(setup): assert type(response) is bytes assert len(response) > 0 + response = model.speech(input_string, stream=True) + assert inspect.isgenerator(response) + i = 0 + for chunk in response: + i += 1 + assert type(chunk) is bytes + assert len(chunk) > 0 + assert i > 5 + # Test openai API import openai client = openai.Client(api_key="not empty", base_url=f"{endpoint}/v1") - response = client.audio.speech.create( + with client.audio.speech.with_streaming_response.create( model=model_uid, input=input_string, voice="echo" - ) - with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f: - response.stream_to_file(f.name) - assert os.stat(f.name).st_size > 0 + ) as response: + with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f: + response.stream_to_file(f.name) + assert os.stat(f.name).st_size > 0 From 4e741cf4e918c6ca18726fdb827dd28a533e1315 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 17 Jul 2024 20:53:26 +0800 Subject: [PATCH 201/298] ENH: added gguf formats for gemma-2-it (#1874) --- doc/source/models/builtin/llm/chatglm.rst | 18 +- doc/source/models/builtin/llm/chatglm2.rst | 18 +- doc/source/models/builtin/llm/chatglm3.rst | 18 +- doc/source/models/builtin/llm/gemma-2-it.rst | 175 ++++++++++++++++++ .../models/builtin/llm/glm4-chat-1m.rst | 16 ++ doc/source/models/builtin/llm/glm4-chat.rst | 16 ++ doc/source/models/builtin/llm/index.rst | 7 + xinference/model/llm/llm_family.json | 46 +++++ .../model/llm/llm_family_modelscope.json | 23 +++ 9 files changed, 286 insertions(+), 51 deletions(-) create mode 100644 doc/source/models/builtin/llm/gemma-2-it.rst diff --git a/doc/source/models/builtin/llm/chatglm.rst b/doc/source/models/builtin/llm/chatglm.rst index 87f5acea87..127c2cb33c 100644 --- a/doc/source/models/builtin/llm/chatglm.rst +++ b/doc/source/models/builtin/llm/chatglm.rst @@ -14,23 +14,7 @@ Specifications ^^^^^^^^^^^^^^ -Model Spec 1 (ggmlv3, 6 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 6 -- **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 -- **Engines**: llama.cpp -- **Model ID:** Xorbits/chatglm-6B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/Xorbits/chatglm-6B-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name chatglm --size-in-billions 6 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 2 (pytorch, 6 Billion) +Model Spec 1 (pytorch, 6 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch diff --git a/doc/source/models/builtin/llm/chatglm2.rst b/doc/source/models/builtin/llm/chatglm2.rst index b4f81bf992..ecb56a8efa 100644 --- a/doc/source/models/builtin/llm/chatglm2.rst +++ b/doc/source/models/builtin/llm/chatglm2.rst @@ -14,23 +14,7 @@ Specifications ^^^^^^^^^^^^^^ -Model Spec 1 (ggmlv3, 6 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 6 -- **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 -- **Engines**: llama.cpp -- **Model ID:** Xorbits/chatglm2-6B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/Xorbits/chatglm2-6B-GGML>`__, `ModelScope <https://modelscope.cn/models/Xorbits/chatglm2-6B-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name chatglm2 --size-in-billions 6 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 2 (pytorch, 6 Billion) +Model Spec 1 (pytorch, 6 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch diff --git a/doc/source/models/builtin/llm/chatglm3.rst b/doc/source/models/builtin/llm/chatglm3.rst index 5154158392..baf7a0fa08 100644 --- a/doc/source/models/builtin/llm/chatglm3.rst +++ b/doc/source/models/builtin/llm/chatglm3.rst @@ -14,23 +14,7 @@ Specifications ^^^^^^^^^^^^^^ -Model Spec 1 (ggmlv3, 6 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 6 -- **Quantizations:** q4_0 -- **Engines**: llama.cpp -- **Model ID:** Xorbits/chatglm3-6B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/Xorbits/chatglm3-6B-GGML>`__, `ModelScope <https://modelscope.cn/models/Xorbits/chatglm3-ggml>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name chatglm3 --size-in-billions 6 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 2 (pytorch, 6 Billion) +Model Spec 1 (pytorch, 6 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch diff --git a/doc/source/models/builtin/llm/gemma-2-it.rst b/doc/source/models/builtin/llm/gemma-2-it.rst new file mode 100644 index 0000000000..5e6047114d --- /dev/null +++ b/doc/source/models/builtin/llm/gemma-2-it.rst @@ -0,0 +1,175 @@ +.. _models_llm_gemma-2-it: + +======================================== +gemma-2-it +======================================== + +- **Context Length:** 8192 +- **Model Name:** gemma-2-it +- **Languages:** en +- **Abilities:** chat +- **Description:** Gemma is a family of lightweight, state-of-the-art open models from Google, built from the same research and technology used to create the Gemini models. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 9 +- **Quantizations:** none, 4-bit, 8-bit +- **Engines**: Transformers +- **Model ID:** google/gemma-2-9b-it +- **Model Hubs**: `Hugging Face <https://huggingface.co/google/gemma-2-9b-it>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/gemma-2-9b-it>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 27 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 27 +- **Quantizations:** none, 4-bit, 8-bit +- **Engines**: Transformers +- **Model ID:** google/gemma-2-27b-it +- **Model Hubs**: `Hugging Face <https://huggingface.co/google/gemma-2-27b-it>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/gemma-2-27b-it>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 27 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (ggufv2, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 9 +- **Quantizations:** Q2_K, Q2_K_L, Q3_K_L, Q3_K_M, Q3_K_S, Q4_K_L, Q4_K_M, Q4_K_S, Q5_K_L, Q5_K_M, Q5_K_S, Q6_K, Q6_K_L, Q8_0, f32 +- **Engines**: llama.cpp +- **Model ID:** bartowski/gemma-2-9b-it-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/bartowski/gemma-2-9b-it-GGUF>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/gemma-2-9b-it-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 4 (ggufv2, 27 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 27 +- **Quantizations:** Q2_K, Q2_K_L, Q3_K_L, Q3_K_M, Q3_K_S, Q4_K_L, Q4_K_M, Q4_K_S, Q5_K_L, Q5_K_M, Q5_K_S, Q6_K, Q6_K_L, Q8_0, f32 +- **Engines**: llama.cpp +- **Model ID:** bartowski/gemma-2-27b-it-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/bartowski/gemma-2-27b-it-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 27 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 5 (mlx, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 9 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/gemma-2-9b-it-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/gemma-2-9b-it-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format mlx --quantization ${quantization} + + +Model Spec 6 (mlx, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 9 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/gemma-2-9b-it-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/gemma-2-9b-it-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format mlx --quantization ${quantization} + + +Model Spec 7 (mlx, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 9 +- **Quantizations:** None +- **Engines**: MLX +- **Model ID:** mlx-community/gemma-2-9b-it-fp16 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/gemma-2-9b-it-fp16>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format mlx --quantization ${quantization} + + +Model Spec 8 (mlx, 27 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 27 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/gemma-2-27b-it-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/gemma-2-27b-it-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 27 --model-format mlx --quantization ${quantization} + + +Model Spec 9 (mlx, 27 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 27 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/gemma-2-27b-it-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/gemma-2-27b-it-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 27 --model-format mlx --quantization ${quantization} + + +Model Spec 10 (mlx, 27 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 27 +- **Quantizations:** None +- **Engines**: MLX +- **Model ID:** mlx-community/gemma-2-27b-it-fp16 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/gemma-2-27b-it-fp16>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 27 --model-format mlx --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/glm4-chat-1m.rst b/doc/source/models/builtin/llm/glm4-chat-1m.rst index 28c823fb85..06fa9cba74 100644 --- a/doc/source/models/builtin/llm/glm4-chat-1m.rst +++ b/doc/source/models/builtin/llm/glm4-chat-1m.rst @@ -29,3 +29,19 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name glm4-chat-1m --size-in-billions 9 --model-format pytorch --quantization ${quantization} + +Model Spec 2 (ggufv2, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 9 +- **Quantizations:** Q2_K, IQ3_XS, IQ3_S, IQ3_M, Q3_K_S, Q3_K_L, Q3_K, IQ4_XS, IQ4_NL, Q4_K_S, Q4_K, Q5_K_S, Q5_K, Q6_K, Q8_0, BF16, FP16 +- **Engines**: llama.cpp +- **Model ID:** legraphista/glm-4-9b-chat-1m-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/legraphista/glm-4-9b-chat-1m-GGUF>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/glm-4-9b-chat-1m-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name glm4-chat-1m --size-in-billions 9 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/glm4-chat.rst b/doc/source/models/builtin/llm/glm4-chat.rst index 13d8f911e8..b657bd27b3 100644 --- a/doc/source/models/builtin/llm/glm4-chat.rst +++ b/doc/source/models/builtin/llm/glm4-chat.rst @@ -29,3 +29,19 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name glm4-chat --size-in-billions 9 --model-format pytorch --quantization ${quantization} + +Model Spec 2 (ggufv2, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 9 +- **Quantizations:** Q2_K, IQ3_XS, IQ3_S, IQ3_M, Q3_K_S, Q3_K_L, Q3_K, IQ4_XS, IQ4_NL, Q4_K_S, Q4_K, Q5_K_S, Q5_K, Q6_K, Q8_0, BF16, FP16 +- **Engines**: llama.cpp +- **Model ID:** legraphista/glm-4-9b-chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/legraphista/glm-4-9b-chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/glm-4-9b-chat-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name glm4-chat --size-in-billions 9 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 396710c134..8e400e9fdb 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -171,6 +171,11 @@ The following is a list of built-in LLM in Xinference: - 2048 - Falcon-instruct is a fine-tuned version of the Falcon LLM, specializing in chatting. + * - :ref:`gemma-2-it <models_llm_gemma-2-it>` + - chat + - 8192 + - Gemma is a family of lightweight, state-of-the-art open models from Google, built from the same research and technology used to create the Gemini models. + * - :ref:`gemma-it <models_llm_gemma-it>` - chat - 8192 @@ -613,6 +618,8 @@ The following is a list of built-in LLM in Xinference: falcon-instruct + gemma-2-it + gemma-it glaive-coder diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 2b7e84e932..37738074de 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -6192,6 +6192,52 @@ ], "model_id": "google/gemma-2-27b-it" }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "Q2_K", + "Q2_K_L", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_K_L", + "Q4_K_M", + "Q4_K_S", + "Q5_K_L", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q6_K_L", + "Q8_0", + "f32" + ], + "model_id": "bartowski/gemma-2-9b-it-GGUF", + "model_file_name_template": "gemma-2-9b-it-{quantization}.gguf" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 27, + "quantizations": [ + "Q2_K", + "Q2_K_L", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_K_L", + "Q4_K_M", + "Q4_K_S", + "Q5_K_L", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q6_K_L", + "Q8_0", + "f32" + ], + "model_id": "bartowski/gemma-2-27b-it-GGUF", + "model_file_name_template": "gemma-2-27b-it-{quantization}.gguf" + }, { "model_format": "mlx", "model_size_in_billions": 9, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index ec4b8405b0..9038a87839 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3799,6 +3799,29 @@ ], "model_id": "AI-ModelScope/gemma-2-27b-it", "model_hub": "modelscope" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_K_L", + "Q4_K_M", + "Q4_K_S", + "Q5_K_L", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q6_K_L", + "Q8_0", + "f32" + ], + "model_id": "LLM-Research/gemma-2-9b-it-GGUF", + "model_file_name_template": "gemma-2-9b-it-{quantization}.gguf", + "model_hub": "modelscope" } ], "prompt_style": { From 8547c58c2eac93ec89cd4cc42945c7883eac4449 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 19 Jul 2024 10:24:31 +0800 Subject: [PATCH 202/298] FEAT: support codegeex4 (#1888) --- doc/source/getting_started/installation.rst | 1 + doc/source/models/builtin/llm/codegeex4.rst | 47 +++++++++++++++ doc/source/models/builtin/llm/index.rst | 7 +++ doc/source/user_guide/backends.rst | 1 + xinference/model/llm/llm_family.json | 59 ++++++++++++++++++ .../model/llm/llm_family_modelscope.json | 60 +++++++++++++++++++ xinference/model/llm/vllm/core.py | 1 + 7 files changed, 176 insertions(+) create mode 100644 doc/source/models/builtin/llm/codegeex4.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index eab89c3488..a86720289f 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -54,6 +54,7 @@ Currently, supported models include: - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``glm4-chat``, ``glm4-chat-1m`` +- ``codegeex4`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``qwen2-instruct``, ``qwen2-moe-instruct`` - ``gemma-it`` diff --git a/doc/source/models/builtin/llm/codegeex4.rst b/doc/source/models/builtin/llm/codegeex4.rst new file mode 100644 index 0000000000..8ab5e7248c --- /dev/null +++ b/doc/source/models/builtin/llm/codegeex4.rst @@ -0,0 +1,47 @@ +.. _models_llm_codegeex4: + +======================================== +codegeex4 +======================================== + +- **Context Length:** 131072 +- **Model Name:** codegeex4 +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** the open-source version of the latest CodeGeeX4 model series + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 9 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** THUDM/codegeex4-all-9b +- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/codegeex4-all-9b>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/codegeex4-all-9b>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name codegeex4 --size-in-billions 9 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (ggufv2, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 9 +- **Quantizations:** IQ2_M, IQ3_M, Q4_K_M, Q5_K_M, Q6_K_L, Q8_0 +- **Engines**: llama.cpp +- **Model ID:** THUDM/codegeex4-all-9b-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/codegeex4-all-9b-GGUF>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/codegeex4-all-9b-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name codegeex4 --size-in-billions 9 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 8e400e9fdb..040e097fff 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -106,6 +106,11 @@ The following is a list of built-in LLM in Xinference: - 100000 - Code-Llama-Python is a fine-tuned version of the Code-Llama LLM, specializing in Python. + * - :ref:`codegeex4 <models_llm_codegeex4>` + - chat + - 131072 + - the open-source version of the latest CodeGeeX4 model series + * - :ref:`codeqwen1.5 <models_llm_codeqwen1.5>` - generate - 65536 @@ -592,6 +597,8 @@ The following is a list of built-in LLM in Xinference: code-llama-python + codegeex4 + codeqwen1.5 codeqwen1.5-chat diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index d6edb66c48..c7d481b1b3 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -61,6 +61,7 @@ Currently, supported model includes: - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` - ``glm4-chat``, ``glm4-chat-1m`` +- ``codegeex4`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``qwen2-instruct``, ``qwen2-moe-instruct`` - ``gemma-it`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 37738074de..06473e9b75 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -983,6 +983,65 @@ ] } }, + { + "version": 1, + "context_length": 131072, + "model_name": "codegeex4", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "the open-source version of the latest CodeGeeX4 model series", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "THUDM/codegeex4-all-9b", + "model_revision": "8c4ec1d2f2888412640825a7aa23355939a8f4c6" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "IQ2_M", + "IQ3_M", + "Q4_K_M", + "Q5_K_M", + "Q6_K_L", + "Q8_0" + ], + "model_file_name_template": "codegeex4-all-9b-{quantization}.gguf", + "model_id": "THUDM/codegeex4-all-9b-GGUF", + "model_revision": "6a04071c54c943949826d4815ee00717ed8cf153" + } + ], + "prompt_style": { + "style_name": "CHATGLM3", + "system_prompt": "", + "roles": [ + "user", + "assistant" + ], + "stop_token_ids": [ + 151329, + 151336, + 151338 + ], + "stop": [ + "<|endoftext|>", + "<|user|>", + "<|observation|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 9038a87839..7829b48fe6 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -688,6 +688,66 @@ ] } }, + { + "version": 1, + "context_length": 131072, + "model_name": "codegeex4", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "the open-source version of the latest CodeGeeX4 model series", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "ZhipuAI/codegeex4-all-9b", + "model_hub": "modelscope", + "model_revision": "master" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 9, + "quantizations": [ + "IQ2_M", + "IQ3_M", + "Q4_K_M", + "Q5_K_M", + "Q6_K_L", + "Q8_0" + ], + "model_file_name_template": "codegeex4-all-9b-{quantization}.gguf", + "model_id": "ZhipuAI/codegeex4-all-9b-GGUF", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "CHATGLM3", + "system_prompt": "", + "roles": [ + "user", + "assistant" + ], + "stop_token_ids": [ + 151329, + 151336, + 151338 + ], + "stop": [ + "<|endoftext|>", + "<|user|>", + "<|observation|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index d3904c8c00..bb39c78a84 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -127,6 +127,7 @@ class VLLMGenerateConfig(TypedDict, total=False): "chatglm3-128k", "glm4-chat", "glm4-chat-1m", + "codegeex4", "deepseek-chat", "deepseek-coder-instruct", ] From d14e3fd224e34641f26aae4332497df0b0922325 Mon Sep 17 00:00:00 2001 From: wxiwnd <40122078+wxiwnd@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:22:23 +0800 Subject: [PATCH 203/298] BUG: sglang stream error while stream_option not set (#1901) Signed-off-by: wxiwnd <wxiwnd@outlook.com> --- xinference/model/llm/sglang/core.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/xinference/model/llm/sglang/core.py b/xinference/model/llm/sglang/core.py index aa6c77cfc7..8a9895097b 100644 --- a/xinference/model/llm/sglang/core.py +++ b/xinference/model/llm/sglang/core.py @@ -269,8 +269,13 @@ def pipeline(s, question): ) stream = sanitized_generate_config.pop("stream") stream_options = sanitized_generate_config.pop("stream_options") - if isinstance(stream_options, dict): - include_usage = stream_options.pop("include_usage", False) + + include_usage = ( + stream_options.pop("include_usage") + if isinstance(stream_options, dict) + else False + ) + request_id = str(uuid.uuid1()) state = pipeline.run( question=prompt, From 35c300824f1c0fd71bfa557b09bce4cfc8512841 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 19 Jul 2024 18:00:44 +0800 Subject: [PATCH 204/298] FEAT: support internlm2.5-chat & internlm2.5-chat-1m (#1887) --- doc/source/getting_started/installation.rst | 1 + doc/source/models/builtin/image/index.rst | 4 + doc/source/models/builtin/llm/index.rst | 16 ++- .../models/builtin/llm/internlm2-chat.rst | 2 +- .../builtin/llm/internlm2.5-chat-1m.rst | 63 ++++++++ .../models/builtin/llm/internlm2.5-chat.rst | 63 ++++++++ doc/source/user_guide/backends.rst | 1 + xinference/model/llm/llm_family.json | 136 +++++++++++++++++- xinference/model/llm/llm_family.py | 32 ++++- .../model/llm/llm_family_modelscope.json | 82 +++++++++++ .../llm/pytorch/tests/test_tensorizer.py | 2 +- xinference/model/llm/vllm/core.py | 2 + 12 files changed, 394 insertions(+), 10 deletions(-) create mode 100644 doc/source/models/builtin/llm/internlm2.5-chat-1m.rst create mode 100644 doc/source/models/builtin/llm/internlm2.5-chat.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index a86720289f..40fbf2a823 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -50,6 +50,7 @@ Currently, supported models include: - ``codeqwen1.5``, ``codeqwen1.5-chat`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` +- ``internlm2.5-chat``, ``internlm2.5-chat-1m`` - ``qwen-chat`` - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` diff --git a/doc/source/models/builtin/image/index.rst b/doc/source/models/builtin/image/index.rst index 94a47812bc..bf62b0c286 100644 --- a/doc/source/models/builtin/image/index.rst +++ b/doc/source/models/builtin/image/index.rst @@ -17,6 +17,10 @@ The following is a list of built-in image models in Xinference: sdxl-turbo + stable-diffusion-2-inpainting + + stable-diffusion-inpainting + stable-diffusion-v1.5 stable-diffusion-xl-base-1.0 diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 040e097fff..6801cdc6d6 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -243,9 +243,19 @@ The following is a list of built-in LLM in Xinference: * - :ref:`internlm2-chat <models_llm_internlm2-chat>` - chat - - 204800 + - 32768 - The second generation of the InternLM model, InternLM2. + * - :ref:`internlm2.5-chat <models_llm_internlm2.5-chat>` + - chat + - 32768 + - InternLM2.5 series of the InternLM model. + + * - :ref:`internlm2.5-chat-1m <models_llm_internlm2.5-chat-1m>` + - chat + - 262144 + - InternLM2.5 series of the InternLM model supports 1M long-context + * - :ref:`internvl-chat <models_llm_internvl-chat>` - chat, vision - 32768 @@ -653,6 +663,10 @@ The following is a list of built-in LLM in Xinference: internlm2-chat + internlm2.5-chat + + internlm2.5-chat-1m + internvl-chat llama-2 diff --git a/doc/source/models/builtin/llm/internlm2-chat.rst b/doc/source/models/builtin/llm/internlm2-chat.rst index d3cca8afa5..47fb28a36d 100644 --- a/doc/source/models/builtin/llm/internlm2-chat.rst +++ b/doc/source/models/builtin/llm/internlm2-chat.rst @@ -4,7 +4,7 @@ internlm2-chat ======================================== -- **Context Length:** 204800 +- **Context Length:** 32768 - **Model Name:** internlm2-chat - **Languages:** en, zh - **Abilities:** chat diff --git a/doc/source/models/builtin/llm/internlm2.5-chat-1m.rst b/doc/source/models/builtin/llm/internlm2.5-chat-1m.rst new file mode 100644 index 0000000000..b7ff7f7635 --- /dev/null +++ b/doc/source/models/builtin/llm/internlm2.5-chat-1m.rst @@ -0,0 +1,63 @@ +.. _models_llm_internlm2.5-chat-1m: + +======================================== +internlm2.5-chat-1m +======================================== + +- **Context Length:** 262144 +- **Model Name:** internlm2.5-chat-1m +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** InternLM2.5 series of the InternLM model supports 1M long-context + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** none +- **Engines**: vLLM, Transformers +- **Model ID:** internlm/internlm2_5-7b-chat-1m +- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-7b-chat-1m>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-7b-chat-1m>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat-1m --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (gptq, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 7 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** ModelCloud/internlm-2.5-7b-chat-1m-gptq-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/ModelCloud/internlm-2.5-7b-chat-1m-gptq-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat-1m --size-in-billions 7 --model-format gptq --quantization ${quantization} + + +Model Spec 3 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** internlm/internlm2_5-7b-chat-1m-gguf +- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-7b-chat-1m-gguf>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat-1m --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/internlm2.5-chat.rst b/doc/source/models/builtin/llm/internlm2.5-chat.rst new file mode 100644 index 0000000000..b3e04fb075 --- /dev/null +++ b/doc/source/models/builtin/llm/internlm2.5-chat.rst @@ -0,0 +1,63 @@ +.. _models_llm_internlm2.5-chat: + +======================================== +internlm2.5-chat +======================================== + +- **Context Length:** 32768 +- **Model Name:** internlm2.5-chat +- **Languages:** en, zh +- **Abilities:** chat +- **Description:** InternLM2.5 series of the InternLM model. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 7 +- **Quantizations:** none +- **Engines**: vLLM, Transformers +- **Model ID:** internlm/internlm2_5-7b-chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-7b-chat>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-7b-chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (gptq, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 7 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** ModelCloud/internlm-2.5-7b-chat-gptq-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/ModelCloud/internlm-2.5-7b-chat-gptq-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} + + +Model Spec 3 (ggufv2, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 7 +- **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** internlm/internlm2_5-7b-chat-gguf +- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-7b-chat-gguf>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index c7d481b1b3..a2202ba162 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -57,6 +57,7 @@ Currently, supported model includes: - ``codeqwen1.5``, ``codeqwen1.5-chat`` - ``vicuna-v1.3``, ``vicuna-v1.5`` - ``internlm2-chat`` +- ``internlm2.5-chat``, ``internlm2.5-chat-1m`` - ``qwen-chat`` - ``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1`` - ``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 06473e9b75..70892d91c3 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -5850,7 +5850,7 @@ }, { "version": 1, - "context_length": 204800, + "context_length": 32768, "model_name": "internlm2-chat", "model_lang": [ "en", @@ -5898,6 +5898,140 @@ ] } }, + { + "version": 1, + "context_length": 32768, + "model_name": "internlm2.5-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "InternLM2.5 series of the InternLM model.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "none" + ], + "model_id": "internlm/internlm2_5-7b-chat", + "model_revision": "9dc8536a922ab4954726aad1b37fa199004a291a" + }, + { + "model_format": "gptq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4" + ], + "model_id": "ModelCloud/internlm-2.5-7b-chat-gptq-4bit", + "model_revision": "2e2dda735c326544921a4035bbeb6c6e316a8254" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "internlm/internlm2_5-7b-chat-gguf", + "model_file_name_template": "internlm2_5-7b-chat-{quantization}.gguf" + } + ], + "prompt_style": { + "style_name": "INTERNLM2", + "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "stop_token_ids": [ + 2, + 92542 + ], + "stop": [ + "</s>", + "<|im_end|>" + ] + } + }, + { + "version": 1, + "context_length": 262144, + "model_name": "internlm2.5-chat-1m", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "InternLM2.5 series of the InternLM model supports 1M long-context", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "none" + ], + "model_id": "internlm/internlm2_5-7b-chat-1m", + "model_revision": "8d1a709a04d71440ef3df6ebbe204672f411c8b6" + }, + { + "model_format": "gptq", + "model_size_in_billions": 7, + "quantizations": [ + "Int4" + ], + "model_id": "ModelCloud/internlm-2.5-7b-chat-1m-gptq-4bit", + "model_revision": "022e59cb30f03b271d56178478acb038b2b9b58c" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "internlm/internlm2_5-7b-chat-1m-gguf", + "model_file_name_template": "internlm2_5-7b-chat-1m-{quantization}.gguf" + } + ], + "prompt_style": { + "style_name": "INTERNLM2", + "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "stop_token_ids": [ + 2, + 92542 + ], + "stop": [ + "</s>", + "<|im_end|>" + ] + } + }, { "version":1, "context_length":2048, diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index bcac5f7df2..07402cda7e 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -554,16 +554,36 @@ def _get_cache_dir( quant_suffix = q break - cache_dir_name = ( + # some model name includes ".", e.g. qwen1.5-chat + # if the model does not require trust_remote_code, it's OK + # because no need to import modeling_xxx.py from the path + # but when the model need to trust_remote_code, + # e.g. internlm2.5-chat, the import will fail, + # but before the model may have been downloaded, + # thus we check it first, if exist, return it, + # otherwise, we replace the "." with "_" in model name + old_cache_dir_name = ( f"{llm_family.model_name}-{llm_spec.model_format}" f"-{llm_spec.model_size_in_billions}b" ) if quant_suffix: - cache_dir_name += f"-{quant_suffix}" - cache_dir = os.path.realpath(os.path.join(XINFERENCE_CACHE_DIR, cache_dir_name)) - if create_if_not_exist and not os.path.exists(cache_dir): - os.makedirs(cache_dir, exist_ok=True) - return cache_dir + old_cache_dir_name += f"-{quant_suffix}" + old_cache_dir = os.path.realpath( + os.path.join(XINFERENCE_CACHE_DIR, old_cache_dir_name) + ) + if os.path.exists(old_cache_dir): + return old_cache_dir + else: + cache_dir_name = ( + f"{llm_family.model_name.replace('.', '_')}-{llm_spec.model_format}" + f"-{llm_spec.model_size_in_billions}b" + ) + if quant_suffix: + cache_dir_name += f"-{quant_suffix}" + cache_dir = os.path.realpath(os.path.join(XINFERENCE_CACHE_DIR, cache_dir_name)) + if create_if_not_exist and not os.path.exists(cache_dir): + os.makedirs(cache_dir, exist_ok=True) + return cache_dir def _get_meta_path( diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 7829b48fe6..99d2e81de4 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -988,6 +988,88 @@ ] } }, + { + "version": 1, + "context_length": 32768, + "model_name": "internlm2.5-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "InternLM2.5 series of the InternLM model.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "none" + ], + "model_id": "Shanghai_AI_Laboratory/internlm2_5-7b-chat", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "INTERNLM2", + "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "stop_token_ids": [ + 2, + 92542 + ], + "stop": [ + "</s>", + "<|im_end|>" + ] + } + }, + { + "version": 1, + "context_length": 262144, + "model_name": "internlm2.5-chat-1m", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat" + ], + "model_description": "InternLM2.5 series of the InternLM model supports 1M long-context", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 7, + "quantizations": [ + "none" + ], + "model_id": "Shanghai_AI_Laboratory/internlm2_5-7b-chat-1m", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "INTERNLM2", + "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "stop_token_ids": [ + 2, + 92542 + ], + "stop": [ + "</s>", + "<|im_end|>" + ] + } + }, { "version": 1, "context_length": 100000, diff --git a/xinference/model/llm/pytorch/tests/test_tensorizer.py b/xinference/model/llm/pytorch/tests/test_tensorizer.py index 1b440708e2..55709f8756 100644 --- a/xinference/model/llm/pytorch/tests/test_tensorizer.py +++ b/xinference/model/llm/pytorch/tests/test_tensorizer.py @@ -20,7 +20,7 @@ class TestTensorizerSerializeModel: def setup_and_teardown(self): # Setup: Load the model and tokenizer model_full_name = "qwen1.5-chat-pytorch-0_5b" - self.model_path = f"{XINFERENCE_CACHE_DIR}/{model_full_name}" + self.model_path = f"{XINFERENCE_CACHE_DIR}/{model_full_name.replace('.', '_')}" self.tensorizer_dir = get_tensorizer_dir(self.model_path) spec = PytorchLLMSpecV1( model_format="pytorch", diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index bb39c78a84..77b0b55b28 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -112,6 +112,8 @@ class VLLMGenerateConfig(TypedDict, total=False): "internlm-chat-8k", "internlm-chat-20b", "internlm2-chat", + "internlm2.5-chat", + "internlm2.5-chat-1m", "qwen-chat", "Yi-chat", "Yi-1.5-chat", From 880929cbbc73e5206ca069591b03d9d16dd858bf Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:15:54 +0800 Subject: [PATCH 205/298] BUG: fix client import (#1905) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/api/restful_api.py | 8 ++------ xinference/client/restful/restful_client.py | 3 +-- xinference/constants.py | 4 ---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 17875a4c3c..e80c2db5cb 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -52,11 +52,7 @@ from .._compat import BaseModel, Field from .._version import get_versions -from ..constants import ( - XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM, - XINFERENCE_DEFAULT_ENDPOINT_PORT, - XINFERENCE_DISABLE_METRICS, -) +from ..constants import XINFERENCE_DEFAULT_ENDPOINT_PORT, XINFERENCE_DISABLE_METRICS from ..core.event import Event, EventCollectorActor, EventType from ..core.supervisor import SupervisorActor from ..core.utils import json_dumps @@ -133,7 +129,7 @@ class SpeechRequest(BaseModel): voice: Optional[str] response_format: Optional[str] = "mp3" speed: Optional[float] = 1.0 - stream: Optional[bool] = XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM + stream: Optional[bool] = False class RegisterModelRequest(BaseModel): diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 724df95c57..db7c97e20c 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -17,7 +17,6 @@ import requests -from ...constants import XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM from ..common import streaming_response_iterator if TYPE_CHECKING: @@ -768,7 +767,7 @@ def speech( voice: str = "", response_format: str = "mp3", speed: float = 1.0, - stream: bool = XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM, + stream: bool = False, ): """ Generates audio from the input text. diff --git a/xinference/constants.py b/xinference/constants.py index 6695f1fd29..9fa5939603 100644 --- a/xinference/constants.py +++ b/xinference/constants.py @@ -30,7 +30,6 @@ XINFERENCE_ENV_ENABLE_SGLANG = "XINFERENCE_ENABLE_SGLANG" XINFERENCE_ENV_DISABLE_METRICS = "XINFERENCE_DISABLE_METRICS" XINFERENCE_ENV_TRANSFORMERS_ENABLE_BATCHING = "XINFERENCE_TRANSFORMERS_ENABLE_BATCHING" -XINFERENCE_ENV_AUDIO_SPEECH_DEFAULT_STREAM = "XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM" def get_xinference_home() -> str: @@ -81,6 +80,3 @@ def get_xinference_home() -> str: XINFERENCE_TRANSFORMERS_ENABLE_BATCHING = bool( int(os.environ.get(XINFERENCE_ENV_TRANSFORMERS_ENABLE_BATCHING, 0)) ) -XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM = bool( - int(os.environ.get(XINFERENCE_ENV_AUDIO_SPEECH_DEFAULT_STREAM, 0)) -) From 0a87cfb475abc0d508c3f2b573a6e5b33d6f96ba Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Mon, 22 Jul 2024 18:50:34 +0800 Subject: [PATCH 206/298] BUG: fix inpainting and flexible infer due to inner API change (#1907) --- doc/source/models/builtin/image/index.rst | 2 ++ .../image/stable-diffusion-xl-inpainting.rst | 19 +++++++++++++++++++ xinference/core/chat_interface.py | 4 ++-- xinference/core/model.py | 4 ++-- xinference/model/image/model_spec.json | 7 +++++++ .../model/image/stable_diffusion/core.py | 7 ++++++- 6 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 doc/source/models/builtin/image/stable-diffusion-xl-inpainting.rst diff --git a/doc/source/models/builtin/image/index.rst b/doc/source/models/builtin/image/index.rst index bf62b0c286..e0c43fd708 100644 --- a/doc/source/models/builtin/image/index.rst +++ b/doc/source/models/builtin/image/index.rst @@ -24,4 +24,6 @@ The following is a list of built-in image models in Xinference: stable-diffusion-v1.5 stable-diffusion-xl-base-1.0 + + stable-diffusion-xl-inpainting \ No newline at end of file diff --git a/doc/source/models/builtin/image/stable-diffusion-xl-inpainting.rst b/doc/source/models/builtin/image/stable-diffusion-xl-inpainting.rst new file mode 100644 index 0000000000..61a72cc044 --- /dev/null +++ b/doc/source/models/builtin/image/stable-diffusion-xl-inpainting.rst @@ -0,0 +1,19 @@ +.. _models_builtin_stable-diffusion-xl-inpainting: + +============================== +stable-diffusion-xl-inpainting +============================== + +- **Model Name:** stable-diffusion-xl-inpainting +- **Model Family:** stable_diffusion +- **Abilities:** inpainting +- **Available ControlNet:** None + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** diffusers/stable-diffusion-xl-1.0-inpainting-0.1 + +Execute the following command to launch the model:: + + xinference launch --model-name stable-diffusion-xl-inpainting --model-type image \ No newline at end of file diff --git a/xinference/core/chat_interface.py b/xinference/core/chat_interface.py index 90bb8179bc..e74516f3a5 100644 --- a/xinference/core/chat_interface.py +++ b/xinference/core/chat_interface.py @@ -428,7 +428,7 @@ def complete(text, hist, max_tokens, temperature, lora_name) -> Generator: } hist.append(response_content) - return { + return { # type: ignore textbox: response_content, history: hist, } @@ -467,7 +467,7 @@ def retry(text, hist, max_tokens, temperature, lora_name) -> Generator: } hist.append(response_content) - return { + return { # type: ignore textbox: response_content, history: hist, } diff --git a/xinference/core/model.py b/xinference/core/model.py index b6baab26f5..2eeec26c45 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -735,7 +735,7 @@ async def inpainting( **kwargs, ): if hasattr(self._model, "inpainting"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.inpainting, image, mask_image, @@ -758,7 +758,7 @@ async def infer( **kwargs, ): if hasattr(self._model, "infer"): - return await self._call_wrapper( + return await self._call_wrapper_json( self._model.infer, **kwargs, ) diff --git a/xinference/model/image/model_spec.json b/xinference/model/image/model_spec.json index eff9c78a0a..f9a6c7ce8d 100644 --- a/xinference/model/image/model_spec.json +++ b/xinference/model/image/model_spec.json @@ -106,5 +106,12 @@ "model_id": "stabilityai/stable-diffusion-2-inpainting", "model_revision": "81a84f49b15956b60b4272a405ad3daef3da4590", "ability": "inpainting" + }, + { + "model_name": "stable-diffusion-xl-inpainting", + "model_family": "stable_diffusion", + "model_id": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1", + "model_revision": "115134f363124c53c7d878647567d04daf26e41e", + "ability": "inpainting" } ] diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index 2e00743a25..ec1b765622 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -94,7 +94,12 @@ def load(self): self._model_path, **self._kwargs, ) - self._model = move_model_to_available_device(self._model) + if self._kwargs.get("cpu_offload", False): + logger.debug("CPU offloading model") + self._model.enable_model_cpu_offload() + else: + logger.debug("Loading model to available device") + self._model = move_model_to_available_device(self._model) # Recommended if your computer has < 64 GB of RAM self._model.enable_attention_slicing() self._apply_lora() From 2e85c71c366aa04b623ad22a6ceacf6de2158634 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:07:28 +0200 Subject: [PATCH 207/298] FEAT: GLM4 support stream tool call (#1876) --- xinference/api/restful_api.py | 8 +- xinference/core/tests/test_restful_api.py | 129 ++++++----- xinference/model/llm/llm_family.json | 2 +- xinference/model/llm/pytorch/chatglm.py | 248 +++++++++++++++++++++- xinference/model/llm/utils.py | 58 ++++- 5 files changed, 386 insertions(+), 59 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index e80c2db5cb..6d35aa3007 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1626,10 +1626,14 @@ async def create_chat_completion(self, request: Request) -> Response: if body.tools and body.stream: is_vllm = await model.is_vllm_backend() - if not is_vllm or model_family not in QWEN_TOOL_CALL_FAMILY: + if not ( + (is_vllm and model_family in QWEN_TOOL_CALL_FAMILY) + or (not is_vllm and model_family in GLM4_TOOL_CALL_FAMILY) + ): raise HTTPException( status_code=400, - detail="Streaming support for tool calls is available only when using vLLM backend and Qwen models.", + detail="Streaming support for tool calls is available only when using " + "Qwen models with vLLM backend or GLM4-chat models without vLLM backend.", ) if body.stream: diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index e7a09e32ea..cec37dd272 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - +import asyncio import json import os import os.path @@ -430,11 +430,12 @@ def _check_invalid_tool_calls(endpoint, model_uid_res): @pytest.mark.parametrize( - "model_format, quantization", [("ggmlv3", "q4_0"), ("pytorch", None)] + "model_format, quantization", + [("pytorch", None)], ) @pytest.mark.skip(reason="Cost too many resources.") def test_restful_api_for_tool_calls(setup, model_format, quantization): - model_name = "chatglm3" + model_name = "glm4-chat" endpoint, _ = setup url = f"{endpoint}/v1/models" @@ -449,7 +450,7 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): "model_uid": "test_tool", "model_engine": "transformers", "model_name": model_name, - "model_size_in_billions": 6, + "model_size_in_billions": 9, "model_format": model_format, "quantization": quantization, } @@ -464,59 +465,60 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): response_data = response.json() assert len(response_data["data"]) == 1 - tools = [ - { - "type": "function", - "function": { - "name": "get_current_weather", - "description": "获取当前天气", - "parameters": { - "type": "object", - "properties": { - "location": {"type": "string", "description": "城市,例如北京"}, - "format": { - "type": "string", - "enum": ["celsius", "fahrenheit"], - "description": "使用的温度单位。从所在的城市进行推断。", + # glm4-chat fail response: 好的,请告诉我您希望使用的温度单位是摄氏度还是华氏度? + if "glm4" not in model_name: + tools = [ + { + "type": "function", + "function": { + "name": "get_current_weather", + "description": "获取当前天气", + "parameters": { + "type": "object", + "properties": { + "location": {"type": "string", "description": "城市,例如北京"}, + "format": { + "type": "string", + "enum": ["celsius", "fahrenheit"], + "description": "使用的温度单位。从所在的城市进行推断。", + }, }, + "required": ["location", "format"], }, - "required": ["location", "format"], }, - }, + } + ] + + url = f"{endpoint}/v1/chat/completions" + payload = { + "model": model_uid_res, + "messages": [ + {"role": "system", "content": "你是一个有用的助手。不要对要函数调用的值做出假设。"}, + {"role": "user", "content": "上海现在的天气怎么样?"}, + ], + "temperature": 0.7, + "tools": tools, + "stop": ["\n"], } - ] - - url = f"{endpoint}/v1/chat/completions" - payload = { - "model": model_uid_res, - "messages": [ - {"role": "system", "content": "你是一个有用的助手。不要对要函数调用的值做出假设。"}, - {"role": "user", "content": "上海现在的天气怎么样?"}, - ], - "temperature": 0.7, - "tools": tools, - "stop": ["\n"], - } - response = requests.post(url, json=payload) - completion = response.json() - # glm4-chat fail response: 好的,请告诉我您希望使用的温度单位是摄氏度还是华氏度? - - assert ( - "get_current_weather" - == completion["choices"][0]["message"]["tool_calls"][0]["function"]["name"] - ), completion - arguments = completion["choices"][0]["message"]["tool_calls"][0]["function"][ - "arguments" - ] - arg = json.loads(arguments) - assert arg == {"location": "上海", "format": "celsius"} + response = requests.post(url, json=payload) + completion = response.json() + + assert ( + "get_current_weather" + == completion["choices"][0]["message"]["tool_calls"][0]["function"]["name"] + ), completion + arguments = completion["choices"][0]["message"]["tool_calls"][0]["function"][ + "arguments" + ] + arg = json.loads(arguments) + assert arg == {"location": "上海", "format": "celsius"} # tool tools = [ { "type": "function", "function": { - "name": "track", + "name": "track_a_long_function_name_to_test", "description": "追踪指定股票的实时价格", "parameters": { "type": "object", @@ -557,7 +559,7 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): assert "content" in completion["choices"][0]["message"] assert "tool_calls" == completion["choices"][0]["finish_reason"] assert ( - "track" + "track_a_long_function_name_to_test" == completion["choices"][0]["message"]["tool_calls"][0]["function"]["name"] ) arguments = completion["choices"][0]["message"]["tool_calls"][0]["function"][ @@ -575,7 +577,7 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): assert "content" in completion["choices"][0]["message"] assert "tool_calls" == completion["choices"][0]["finish_reason"] assert ( - "track" + "track_a_long_function_name_to_test" == completion["choices"][0]["message"]["tool_calls"][0]["function"]["name"] ) arguments = completion["choices"][0]["message"]["tool_calls"][0]["function"][ @@ -587,6 +589,30 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): # openai client import openai + async def test_stream(): + async_client = openai.AsyncClient( + api_key="not empty", base_url=f"{endpoint}/v1" + ) + chunks = [] + async_completion = async_client.chat.completions.create( + model=model_uid_res, + messages=[{"role": "user", "content": "帮我查询股票10111的价格"}], + tools=tools, + stream=True, + ) + async for chunk in await async_completion: + chunks.append(chunk) + assert len(chunks) == 2 + assert ( + chunks[1].choices[0].delta.tool_calls[0].function.name + == "track_a_long_function_name_to_test" + ) + arguments = chunks[1].choices[0].delta.tool_calls[0].function.arguments + arg = json.loads(arguments) + assert arg == {"symbol": "10111"} + + asyncio.run(test_stream()) + client = openai.Client(api_key="not empty", base_url=f"{endpoint}/v1") completion = client.chat.completions.create( model=model_uid_res, @@ -594,7 +620,10 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): tools=tools, ) assert "tool_calls" == completion.choices[0].finish_reason - assert "track" == completion.choices[0].message.tool_calls[0].function.name + assert ( + "track_a_long_function_name_to_test" + == completion.choices[0].message.tool_calls[0].function.name + ) arguments = completion.choices[0].message.tool_calls[0].function.arguments arg = json.loads(arguments) assert arg == {"symbol": "10111"} diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 70892d91c3..6ee686d0e8 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -819,7 +819,7 @@ "none" ], "model_id": "THUDM/glm-4-9b-chat", - "model_revision": "b84dc74294ccd507a3d78bde8aebf628221af9bd" + "model_revision": "76f3474a854145aa4a9ed2612fee9bc8d4a8966b" }, { "model_format": "ggufv2", diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index c60089898b..9a8b497bee 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -11,10 +11,17 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import copy +import json +import threading import time import uuid from typing import Any, Dict, Iterator, List, Optional, Union +import torch +from transformers.generation.logits_process import LogitsProcessor +from transformers.generation.utils import LogitsProcessorList + from ....core.scheduler import InferenceRequest from ....types import ( SPECIAL_TOOL_PROMPT, @@ -33,6 +40,16 @@ from .core import PytorchChatModel, PytorchModelConfig +class InvalidScoreLogitsProcessor(LogitsProcessor): + def __call__( + self, input_ids: torch.LongTensor, scores: torch.FloatTensor + ) -> torch.FloatTensor: + if torch.isnan(scores).any() or torch.isinf(scores).any(): + scores.zero_() + scores[..., 198] = 5e4 + return scores + + class ChatglmPytorchChatModel(PytorchChatModel): def __init__( self, @@ -103,9 +120,11 @@ def _handle_tools(self, chat_history, generate_config) -> bool: tools = generate_config.pop("tools", None) if tools is None: return False + # Convert a iterable to a list + tools = list(tools) tool_choice = generate_config.pop("tool_choice", "none") if self.model_family.model_name in GLM4_TOOL_CALL_FAMILY: - chat_history[:] = self.process_messages( + chat_history[:] = self._process_messages( chat_history, tools=tools, tool_choice=tool_choice ) return True @@ -124,7 +143,7 @@ def _handle_tools(self, chat_history, generate_config) -> bool: return True @staticmethod - def process_messages(messages, tools=None, tool_choice="none"): + def _process_messages(messages, tools=None, tool_choice="none"): # This method is adapted from https://github.com/THUDM/GLM-4/blob/main/basic_demo/openai_api_server.py _messages = messages processed_messages = [] @@ -210,6 +229,209 @@ def _filter_tools(_tool_choice, _tools): break return processed_messages + @staticmethod + def _process_response(output, history, tools, end=False): + # Copy from https://huggingface.co/THUDM/glm-4-9b-chat/blob/main/modeling_chatglm.py + content = "" + history = copy.deepcopy(history) + if not tools and end: + return None, None + for response in output.split("<|assistant|>"): + if "\n" in response: + metadata, content = response.split("\n", maxsplit=1) + else: + metadata, content = "", response + if not metadata.strip(): + if tools and any(t.startswith(response) for t in tools) and not end: + # Waiting for tool call complete. + return None, None + content = content.strip() + history.append( + {"role": "assistant", "metadata": metadata, "content": content} + ) + content = content.replace("[[训练时间]]", "2023年") + else: + if tools and metadata in tools and not end: + return None, None + history.append( + {"role": "assistant", "metadata": metadata, "content": content} + ) + metadata = metadata.strip() + if tools and metadata in tools and end: + try: + parameters = json.loads(content) + content = {"name": metadata.strip(), "parameters": parameters} + except json.JSONDecodeError: + content = {"name": metadata.strip(), "content": content} + else: + content = {"name": metadata.strip(), "content": content} + return content, history + + def _get_generate_args( + self, + tokenizer, + query: str, + history: Optional[List[Dict]] = None, + role: str = "user", + past_key_values=None, + max_length: int = 8192, + do_sample=True, + top_p=0.8, + temperature=0.8, + logits_processor=None, + **kwargs, + ): + # Copy from https://huggingface.co/THUDM/glm-4-9b-chat/blob/main/modeling_chatglm.py + if history is None: + history = [] + if logits_processor is None: + logits_processor = LogitsProcessorList() + logits_processor.append(InvalidScoreLogitsProcessor()) + eos_token_id = [ + tokenizer.eos_token_id, + tokenizer.convert_tokens_to_ids("<|user|>"), + tokenizer.convert_tokens_to_ids("<|observation|>"), + ] + gen_kwargs = { + "max_length": max_length, + "do_sample": do_sample, + "top_p": top_p, + "temperature": temperature, + "logits_processor": logits_processor, + **kwargs, + } + if past_key_values is None: + inputs = tokenizer.apply_chat_template( + history + [{"role": role, "content": query}], + add_generation_prompt=True, + tokenize=True, + return_tensors="pt", + return_dict=True, + ) + else: + inputs = tokenizer.apply_chat_template( + [{"role": role, "content": query}], + add_special_tokens=False, + add_generation_prompt=True, + tokenize=True, + return_tensors="pt", + return_dict=True, + ) + inputs = inputs.to(self._model.device) + if past_key_values is not None: + past_length = past_key_values[0][0].shape[2] + inputs.position_ids += past_length + attention_mask = inputs.attention_mask + attention_mask = torch.cat( + (attention_mask.new_ones(1, past_length), attention_mask), dim=1 + ) + inputs["attention_mask"] = attention_mask + history.append({"role": role, "content": query}) + tools = history[0]["role"] == "system" and history[0].get("tools") + tools = ( + [ + t.get("function", {}).get("name", "") + for t in tools + if isinstance(t, dict) + ] + if tools + else [] + ) + kwargs = dict(inputs) + kwargs["past_key_values"] = past_key_values + kwargs["eos_token_id"] = eos_token_id + kwargs.update(gen_kwargs) + return kwargs, tools + + @torch.inference_mode() + def stream_chat( + self, + tokenizer, + query: str, + history: Optional[List[Dict]] = None, + role: str = "user", + past_key_values=None, + max_length: int = 8192, + do_sample=True, + top_p=0.8, + temperature=0.8, + logits_processor=None, + **kwargs, + ): + from transformers import TextIteratorStreamer + + kwargs, tools = self._get_generate_args( + tokenizer=tokenizer, + query=query, + history=history, + role=role, + past_key_values=past_key_values, + max_length=max_length, + do_sample=do_sample, + top_p=top_p, + temperature=temperature, + logits_processor=logits_processor, + **kwargs, + ) + + streamer = TextIteratorStreamer( + tokenizer, skip_prompt=True, skip_special_tokens=True + ) + kwargs["streamer"] = streamer + thread = threading.Thread(target=self._model.generate, kwargs=kwargs) + thread.start() + + response = "" + for token in streamer: + response += token + if response and response[-1] != "�": + new_response, new_history = self._process_response( + response, history, tools, end=False + ) + if new_response is None: + continue + yield new_response, new_history + if tools: + new_response, new_history = self._process_response( + response, history, tools, end=True + ) + if new_response: + yield new_response, new_history + + @torch.inference_mode() + def non_stream_chat( + self, + tokenizer, + query: str, + history: Optional[List[Dict]] = None, + role: str = "user", + past_key_values=None, + max_length: int = 8192, + do_sample=True, + top_p=0.8, + temperature=0.8, + logits_processor=None, + **kwargs, + ): + kwargs, tools = self._get_generate_args( + tokenizer=tokenizer, + query=query, + history=history, + role=role, + past_key_values=past_key_values, + max_length=max_length, + do_sample=do_sample, + top_p=top_p, + temperature=temperature, + logits_processor=logits_processor, + **kwargs, + ) + + outputs = self._model.generate(**kwargs) + outputs = outputs[:, kwargs["input_ids"].shape[1] :] + response = tokenizer.decode(outputs[0], skip_special_tokens=True) + return self._process_response(response, history, tools, end=True) + def chat( self, prompt: str, @@ -247,7 +469,13 @@ def chat( if isinstance(stream_options, dict) else False ) - if stream and not tools: + if stream and ( + not tools or self.model_family.model_name in GLM4_TOOL_CALL_FAMILY + ): + if self.model_family.model_name in GLM4_TOOL_CALL_FAMILY: + stream_chat = self.stream_chat + else: + stream_chat = self._model.stream_chat def _stream_generator(): last_chunk_text_length = 0 @@ -256,9 +484,14 @@ def _stream_generator(): inputs = self._tokenizer([prompt], return_tensors="pt") inputs = inputs.to(self._model.device) prompt_tokens = len(inputs["input_ids"][0]) - for chunk_text, _ in self._model.stream_chat( + for chunk_text, _ in stream_chat( self._tokenizer, prompt, chat_history, **kwargs ): + if tools and isinstance(chunk_text, dict): + yield self._tool_calls_completion_chunk( + self.model_family, self.model_uid, [chunk_text, _], tools + ) + return completion_tokens = completion_tokens + 1 total_tokens = prompt_tokens + completion_tokens chunk_text = chunk_text[last_chunk_text_length:] @@ -312,7 +545,12 @@ def _stream_generator(): return self._to_chat_completion_chunks(_stream_generator()) else: - response = self._model.chat(self._tokenizer, prompt, chat_history, **kwargs) + if self.model_family.model_name in GLM4_TOOL_CALL_FAMILY: + chat = self.non_stream_chat + else: + chat = self._model.chat + + response = chat(self._tokenizer, prompt, chat_history, **kwargs) if tools: return self._tool_calls_completion( self.model_family, self.model_uid, response, tools diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index f01b5d64fc..9ba61ea78b 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -488,6 +488,14 @@ def get_role(role_name: str): @classmethod def _to_chat_completion_chunk(cls, chunk: CompletionChunk) -> ChatCompletionChunk: + choices = chunk.get("choices") + if ( + chunk.get("object") == "chat.completion.chunk" + and choices + and "delta" in choices[0] + ): + # Already a ChatCompletionChunk, we don't need to convert chunk. + return cast(ChatCompletionChunk, chunk) chat_chunk = { "id": "chat" + chunk["id"], "model": chunk["model"], @@ -497,7 +505,7 @@ def _to_chat_completion_chunk(cls, chunk: CompletionChunk) -> ChatCompletionChun { "index": i, "delta": { - "content": choice["text"], + "content": choice.get("text"), **( {"tool_calls": choice["tool_calls"]} if "tool_calls" in choice @@ -718,6 +726,54 @@ def process_tokens(tokens: str, delta: str): else: return lambda tokens, delta: delta + @classmethod + def _tool_calls_completion_chunk(cls, model_family, model_uid, c, tools): + _id = str(uuid.uuid4()) + content, func, args = cls._eval_tool_arguments(model_family, c, tools) + if func: + d = { + "role": "assistant", + "content": content, + "tool_calls": [ + { + "id": f"call_{_id}", + "type": "function", + "function": { + "name": func, + "arguments": json.dumps(args), + }, + } + ], + } + finish_reason = "tool_calls" + else: + d = {"role": "assistant", "content": content, "tool_calls": []} + finish_reason = "stop" + try: + usage = c.get("usage") + assert "prompt_tokens" in usage + except Exception: + usage = { + "prompt_tokens": -1, + "completion_tokens": -1, + "total_tokens": -1, + } + return { + "id": "chat" + f"cmpl-{_id}", + "model": model_uid, + "object": "chat.completion.chunk", + "created": int(time.time()), + "choices": [ + { + "index": 0, + "delta": d, + "logprobs": None, + "finish_reason": finish_reason, + } + ], + "usage": usage, + } + @classmethod def _tool_calls_completion(cls, model_family, model_uid, c, tools): _id = str(uuid.uuid4()) From c80f404c638d8585adc1aaa035d555cc0fd704a6 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 24 Jul 2024 15:49:41 +0800 Subject: [PATCH 208/298] FEAT: support csg-wukong-chat-v0.1 (#1916) --- .../builtin/llm/csg-wukong-chat-v0.1.rst | 47 ++++++++++++++ doc/source/models/builtin/llm/index.rst | 7 +++ xinference/model/llm/llm_family.json | 62 +++++++++++++++++++ xinference/model/llm/llm_family_csghub.json | 39 ++++++++++++ 4 files changed, 155 insertions(+) create mode 100644 doc/source/models/builtin/llm/csg-wukong-chat-v0.1.rst diff --git a/doc/source/models/builtin/llm/csg-wukong-chat-v0.1.rst b/doc/source/models/builtin/llm/csg-wukong-chat-v0.1.rst new file mode 100644 index 0000000000..027d1c6951 --- /dev/null +++ b/doc/source/models/builtin/llm/csg-wukong-chat-v0.1.rst @@ -0,0 +1,47 @@ +.. _models_llm_csg-wukong-chat-v0.1: + +======================================== +csg-wukong-chat-v0.1 +======================================== + +- **Context Length:** 32768 +- **Model Name:** csg-wukong-chat-v0.1 +- **Languages:** en +- **Abilities:** chat +- **Description:** csg-wukong-1B is a 1 billion-parameter small language model(SLM) pretrained on 1T tokens. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 1 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 1 +- **Quantizations:** none +- **Engines**: Transformers +- **Model ID:** opencsg/csg-wukong-1B-chat-v0.1 +- **Model Hubs**: `Hugging Face <https://huggingface.co/opencsg/csg-wukong-1B-chat-v0.1>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name csg-wukong-chat-v0.1 --size-in-billions 1 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (ggufv2, 1 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 1 +- **Quantizations:** Q2_K, Q3_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_1, Q4_K_S, Q4_K_M, Q5_0, Q5_1, Q5_K_S, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp +- **Model ID:** RichardErkhov/opencsg_-_csg-wukong-1B-chat-v0.1-gguf +- **Model Hubs**: `Hugging Face <https://huggingface.co/RichardErkhov/opencsg_-_csg-wukong-1B-chat-v0.1-gguf>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name csg-wukong-chat-v0.1 --size-in-billions 1 --model-format ggufv2 --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 6801cdc6d6..18fb311123 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -141,6 +141,11 @@ The following is a list of built-in LLM in Xinference: - 8192 - CogVLM2 have achieved good results in many lists compared to the previous generation of CogVLM open source models. Its excellent performance can compete with some non-open source models. + * - :ref:`csg-wukong-chat-v0.1 <models_llm_csg-wukong-chat-v0.1>` + - chat + - 32768 + - csg-wukong-1B is a 1 billion-parameter small language model(SLM) pretrained on 1T tokens. + * - :ref:`deepseek <models_llm_deepseek>` - generate - 4096 @@ -621,6 +626,8 @@ The following is a list of built-in LLM in Xinference: cogvlm2 + csg-wukong-chat-v0.1 + deepseek deepseek-chat diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 6ee686d0e8..e4efad704c 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -7387,5 +7387,67 @@ 160132 ] } + }, + { + "version": 1, + "context_length": 32768, + "model_name": "csg-wukong-chat-v0.1", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "csg-wukong-1B is a 1 billion-parameter small language model(SLM) pretrained on 1T tokens.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 1, + "quantizations": [ + "none" + ], + "model_id": "opencsg/csg-wukong-1B-chat-v0.1", + "model_revision": "2443c903d46074af0856e2ba11398dcd01d35536" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 1, + "quantizations": [ + "Q2_K", + "Q3_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_0", + "Q4_1", + "Q4_K_S", + "Q4_K_M", + "Q5_0", + "Q5_1", + "Q5_K_S", + "Q5_K_M", + "Q6_K", + "Q8_0" + ], + "model_id": "RichardErkhov/opencsg_-_csg-wukong-1B-chat-v0.1-gguf", + "model_file_name_template": "csg-wukong-1B-chat-v0.1.{quantization}.gguf" + } + ], + "prompt_style": { + "style_name": "NO_COLON_TWO", + "system_prompt": "<|system|>\nYou are a creative super artificial intelligence assistant, possessing all the knowledge of humankind. Your name is csg-wukong, developed by OpenCSG. You need to understand and infer the true intentions of users based on the topics discussed in the chat history, and respond to user questions correctly as required. You enjoy responding to users with accurate and insightful answers. Please pay attention to the appropriate style and format when replying, try to avoid repetitive words and sentences, and keep your responses as concise and profound as possible. You carefully consider the context of the discussion when replying to users. When the user says \"continue,\" please proceed with the continuation of the previous assistant's response.</s>\n", + "roles": [ + "<|user|>\n", + "<|assistant|>\n" + ], + "intra_message_sep": "</s>\n", + "inter_message_sep": "</s>\n", + "stop_token_ids": [ + 2 + ], + "stop": [ + "</s>" + ] + } } ] diff --git a/xinference/model/llm/llm_family_csghub.json b/xinference/model/llm/llm_family_csghub.json index 1aaefc8d12..dc5b9d3ba8 100644 --- a/xinference/model/llm/llm_family_csghub.json +++ b/xinference/model/llm/llm_family_csghub.json @@ -62,5 +62,44 @@ "<|im_end|>" ] } + }, + { + "version": 1, + "context_length": 32768, + "model_name": "csg-wukong-chat-v0.1", + "model_lang": [ + "en" + ], + "model_ability": [ + "chat" + ], + "model_description": "csg-wukong-1B is a 1 billion-parameter small language model(SLM) pretrained on 1T tokens.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 1, + "quantizations": [ + "none" + ], + "model_id": "OpenCSG/csg-wukong-1B-chat-v0.1", + "model_hub": "csghub" + } + ], + "prompt_style": { + "style_name": "NO_COLON_TWO", + "system_prompt": "<|system|>\nYou are a creative super artificial intelligence assistant, possessing all the knowledge of humankind. Your name is csg-wukong, developed by OpenCSG. You need to understand and infer the true intentions of users based on the topics discussed in the chat history, and respond to user questions correctly as required. You enjoy responding to users with accurate and insightful answers. Please pay attention to the appropriate style and format when replying, try to avoid repetitive words and sentences, and keep your responses as concise and profound as possible. You carefully consider the context of the discussion when replying to users. When the user says \"continue,\" please proceed with the continuation of the previous assistant's response.</s>\n", + "roles": [ + "<|user|>\n", + "<|assistant|>\n" + ], + "intra_message_sep": "</s>\n", + "inter_message_sep": "</s>\n", + "stop_token_ids": [ + 2 + ], + "stop": [ + "</s>" + ] + } } ] From a266c8d2ff9ca8a35a56b7e3b8da5e15ee6c74ab Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 24 Jul 2024 22:48:51 +0800 Subject: [PATCH 209/298] ENH: added MLX for llama-3-instruct, codestral, Yi-1.5-chat, internlm2.5-chat (#1908) --- .../builtin/llm/c4ai-command-r-v01-4bit.rst | 47 ---- .../models/builtin/llm/c4ai-command-r-v01.rst | 38 +++- .../models/builtin/llm/codestral-v0.1.rst | 32 +++ doc/source/models/builtin/llm/index.rst | 7 - .../models/builtin/llm/internlm2.5-chat.rst | 32 +++ .../models/builtin/llm/llama-3-instruct.rst | 96 ++++++++ doc/source/models/builtin/llm/yi-1.5-chat.rst | 96 ++++++++ xinference/model/llm/llm_family.json | 210 +++++++++++++----- .../model/llm/llm_family_modelscope.json | 57 +---- 9 files changed, 457 insertions(+), 158 deletions(-) delete mode 100644 doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst diff --git a/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst b/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst deleted file mode 100644 index 6148737477..0000000000 --- a/doc/source/models/builtin/llm/c4ai-command-r-v01-4bit.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. _models_llm_c4ai-command-r-v01-4bit: - -======================================== -c4ai-command-r-v01-4bit -======================================== - -- **Context Length:** 131072 -- **Model Name:** c4ai-command-r-v01-4bit -- **Languages:** en, fr, de, es, it, pt, ja, ko, zh, ar -- **Abilities:** generate -- **Description:** This model is 4bit quantized version of C4AI Command-R using bitsandbytes. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 35 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 35 -- **Quantizations:** none -- **Engines**: Transformers -- **Model ID:** CohereForAI/c4ai-command-r-v01-4bit -- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-v01-4bit>`__, `ModelScope <https://modelscope.cn/models/mirror013/c4ai-command-r-v01-4bit>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01-4bit --size-in-billions 35 --model-format pytorch --quantization ${quantization} - - -Model Spec 2 (pytorch, 104 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 104 -- **Quantizations:** none -- **Engines**: Transformers -- **Model ID:** CohereForAI/c4ai-command-r-plus-4bit -- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-plus-4bit>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01-4bit --size-in-billions 104 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/c4ai-command-r-v01.rst b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst index 468699eadc..af9eba23dc 100644 --- a/doc/source/models/builtin/llm/c4ai-command-r-v01.rst +++ b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst @@ -30,7 +30,23 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01 --size-in-billions 35 --model-format pytorch --quantization ${quantization} -Model Spec 2 (ggufv2, 35 Billion) +Model Spec 2 (pytorch, 35 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 35 +- **Quantizations:** 4-bit +- **Engines**: Transformers +- **Model ID:** CohereForAI/c4ai-command-r-v01-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-v01-4bit>`__, `ModelScope <https://modelscope.cn/models/mirror013/c4ai-command-r-v01-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01 --size-in-billions 35 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (ggufv2, 35 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -46,7 +62,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01 --size-in-billions 35 --model-format ggufv2 --quantization ${quantization} -Model Spec 3 (pytorch, 104 Billion) +Model Spec 4 (pytorch, 104 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch @@ -62,7 +78,23 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01 --size-in-billions 104 --model-format pytorch --quantization ${quantization} -Model Spec 4 (gptq, 104 Billion) +Model Spec 5 (pytorch, 104 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 104 +- **Quantizations:** 4-bit +- **Engines**: Transformers +- **Model ID:** CohereForAI/c4ai-command-r-plus-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-plus-4bit>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-plus>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name c4ai-command-r-v01 --size-in-billions 104 --model-format pytorch --quantization ${quantization} + + +Model Spec 6 (gptq, 104 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** gptq diff --git a/doc/source/models/builtin/llm/codestral-v0.1.rst b/doc/source/models/builtin/llm/codestral-v0.1.rst index 54d56517a4..dd75ffad66 100644 --- a/doc/source/models/builtin/llm/codestral-v0.1.rst +++ b/doc/source/models/builtin/llm/codestral-v0.1.rst @@ -45,3 +45,35 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name codestral-v0.1 --size-in-billions 22 --model-format ggufv2 --quantization ${quantization} + +Model Spec 3 (mlx, 22 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 22 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Codestral-22B-v0.1-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Codestral-22B-v0.1-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name codestral-v0.1 --size-in-billions 22 --model-format mlx --quantization ${quantization} + + +Model Spec 4 (mlx, 22 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 22 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Codestral-22B-v0.1-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Codestral-22B-v0.1-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name codestral-v0.1 --size-in-billions 22 --model-format mlx --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 18fb311123..2c25cd243b 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -56,11 +56,6 @@ The following is a list of built-in LLM in Xinference: - 131072 - C4AI Command-R(+) is a research release of a 35 and 104 billion parameter highly performant generative model. - * - :ref:`c4ai-command-r-v01-4bit <models_llm_c4ai-command-r-v01-4bit>` - - generate - - 131072 - - This model is 4bit quantized version of C4AI Command-R using bitsandbytes. - * - :ref:`chatglm <models_llm_chatglm>` - chat - 2048 @@ -592,8 +587,6 @@ The following is a list of built-in LLM in Xinference: c4ai-command-r-v01 - c4ai-command-r-v01-4bit - chatglm chatglm2 diff --git a/doc/source/models/builtin/llm/internlm2.5-chat.rst b/doc/source/models/builtin/llm/internlm2.5-chat.rst index b3e04fb075..6813f1669a 100644 --- a/doc/source/models/builtin/llm/internlm2.5-chat.rst +++ b/doc/source/models/builtin/llm/internlm2.5-chat.rst @@ -61,3 +61,35 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} + +Model Spec 4 (mlx, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 7 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/internlm2_5-7b-chat-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/internlm2_5-7b-chat-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format mlx --quantization ${quantization} + + +Model Spec 5 (mlx, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 7 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/internlm2_5-7b-chat-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/internlm2_5-7b-chat-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format mlx --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/llama-3-instruct.rst b/doc/source/models/builtin/llm/llama-3-instruct.rst index ef2ea9f435..bfa0ffdfe8 100644 --- a/doc/source/models/builtin/llm/llama-3-instruct.rst +++ b/doc/source/models/builtin/llm/llama-3-instruct.rst @@ -77,3 +77,99 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 70 --model-format pytorch --quantization ${quantization} + +Model Spec 5 (mlx, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 8 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3-8B-Instruct-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3-8B-Instruct-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 8 --model-format mlx --quantization ${quantization} + + +Model Spec 6 (mlx, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 8 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3-8B-Instruct-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3-8B-Instruct-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 8 --model-format mlx --quantization ${quantization} + + +Model Spec 7 (mlx, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 8 +- **Quantizations:** none +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3-8B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3-8B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 8 --model-format mlx --quantization ${quantization} + + +Model Spec 8 (mlx, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 70 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3-70B-Instruct-4bit-mlx +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3-70B-Instruct-4bit-mlx>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 70 --model-format mlx --quantization ${quantization} + + +Model Spec 9 (mlx, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 70 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3-70B-Instruct-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3-70B-Instruct-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 70 --model-format mlx --quantization ${quantization} + + +Model Spec 10 (mlx, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 70 +- **Quantizations:** none +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3-70B-Instruct-mlx-unquantized +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3-70B-Instruct-mlx-unquantized>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 70 --model-format mlx --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/yi-1.5-chat.rst b/doc/source/models/builtin/llm/yi-1.5-chat.rst index 0fa6aa4294..6bf34a6932 100644 --- a/doc/source/models/builtin/llm/yi-1.5-chat.rst +++ b/doc/source/models/builtin/llm/yi-1.5-chat.rst @@ -205,3 +205,99 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 34 --model-format awq --quantization ${quantization} + +Model Spec 13 (mlx, 6 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 6 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Yi-1.5-6B-Chat-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Yi-1.5-6B-Chat-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 6 --model-format mlx --quantization ${quantization} + + +Model Spec 14 (mlx, 6 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 6 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Yi-1.5-6B-Chat-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Yi-1.5-6B-Chat-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 6 --model-format mlx --quantization ${quantization} + + +Model Spec 15 (mlx, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 9 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Yi-1.5-9B-Chat-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Yi-1.5-9B-Chat-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 9 --model-format mlx --quantization ${quantization} + + +Model Spec 16 (mlx, 9 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 9 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Yi-1.5-9B-Chat-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Yi-1.5-9B-Chat-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 9 --model-format mlx --quantization ${quantization} + + +Model Spec 17 (mlx, 34 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 34 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Yi-1.5-34B-Chat-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Yi-1.5-34B-Chat-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 34 --model-format mlx --quantization ${quantization} + + +Model Spec 18 (mlx, 34 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 34 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Yi-1.5-34B-Chat-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Yi-1.5-34B-Chat-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name Yi-1.5-chat --size-in-billions 34 --model-format mlx --quantization ${quantization} + diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index e4efad704c..5e456bdfb9 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1652,6 +1652,54 @@ "none" ], "model_id": "meta-llama/Meta-Llama-3-70B-Instruct" + }, + { + "model_format": "mlx", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Meta-Llama-3-8B-Instruct-4bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 8, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Meta-Llama-3-8B-Instruct-8bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 8, + "quantizations": [ + "none" + ], + "model_id": "mlx-community/Meta-Llama-3-8B-Instruct" + }, + { + "model_format": "mlx", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Meta-Llama-3-70B-Instruct-4bit-mlx" + }, + { + "model_format": "mlx", + "model_size_in_billions": 70, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Meta-Llama-3-70B-Instruct-8bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 70, + "quantizations": [ + "none" + ], + "model_id": "mlx-community/Meta-Llama-3-70B-Instruct-mlx-unquantized" } ], "prompt_style": { @@ -3928,6 +3976,24 @@ ], "model_id": "bartowski/Codestral-22B-v0.1-GGUF", "model_file_name_template": "Codestral-22B-v0.1-{quantization}.gguf" + }, + { + "model_format": "mlx", + "model_size_in_billions": 22, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Codestral-22B-v0.1-4bit", + "model_revision": "544626b38eb1c9524f0fa570ec7b29550c26b78d" + }, + { + "model_format": "mlx", + "model_size_in_billions": 22, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Codestral-22B-v0.1-8bit", + "model_revision": "0399a53970663950d57010e61a2796af524a1588" } ] }, @@ -4668,6 +4734,61 @@ "model_id": "modelscope/Yi-1.5-34B-Chat-AWQ", "model_revision": "26234fea6ac49d456f32f8017289021fb1087a04" } + , + { + "model_format": "mlx", + "model_size_in_billions": 6, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Yi-1.5-6B-Chat-4bit", + "model_revision": "0177c9a12b869d6bc73f772b5a1981a7c966adb6" + }, + { + "model_format": "mlx", + "model_size_in_billions": 6, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Yi-1.5-6B-Chat-8bit", + "model_revision": "7756e65d1bf1e2e6e97aef6bc9484307225f536b" + }, + { + "model_format": "mlx", + "model_size_in_billions": 9, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Yi-1.5-9B-Chat-4bit", + "model_revision": "e15f886479c44e7d90f0ac13ace69b2319b71c2f" + }, + { + "model_format": "mlx", + "model_size_in_billions": 9, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Yi-1.5-9B-Chat-8bit", + "model_revision": "c1f742fcf3683edbe2d2c2fd1ad7ac2bb6c5ca36" + }, + { + "model_format": "mlx", + "model_size_in_billions": 34, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Yi-1.5-34B-Chat-4bit", + "model_revision": "945e3b306ef37c46ab444fdc857d1f3ea7247374" + }, + { + "model_format": "mlx", + "model_size_in_billions": 34, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Yi-1.5-34B-Chat-8bit", + "model_revision": "3c12761a2c6663f216caab6dff84b0dd29b472ac" + } ], "prompt_style": { "style_name": "CHATML", @@ -5945,6 +6066,24 @@ ], "model_id": "internlm/internlm2_5-7b-chat-gguf", "model_file_name_template": "internlm2_5-7b-chat-{quantization}.gguf" + }, + { + "model_format": "mlx", + "model_size_in_billions": 7, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/internlm2_5-7b-chat-4bit", + "model_revision": "d12097a867721978142a6048399f470a3d18beee" + }, + { + "model_format": "mlx", + "model_size_in_billions": 7, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/internlm2_5-7b-chat-8bit", + "model_revision": "0ec94d61d30ab161b49c69f9bf92ec2b9986d234" } ], "prompt_style": { @@ -7048,6 +7187,15 @@ "model_id": "CohereForAI/c4ai-command-r-v01", "model_revision": "16881ccde1c68bbc7041280e6a66637bc46bfe88" }, + { + "model_format": "pytorch", + "model_size_in_billions": 35, + "quantizations": [ + "4-bit" + ], + "model_id": "CohereForAI/c4ai-command-r-v01-4bit", + "model_revision": "f2e87936a146643c9dd143422dcafb9cb1552611" + }, { "model_format": "ggufv2", "model_size_in_billions": 35, @@ -7077,69 +7225,23 @@ "model_id": "CohereForAI/c4ai-command-r-plus", "model_revision": "ba7f1d954c9d1609013677d87e4142ab95c34e62" }, - { - "model_format": "gptq", - "model_size_in_billions": 104, - "quantizations": [ - "Int4" - ], - "model_id": "alpindale/c4ai-command-r-plus-GPTQ", - "model_revision": "35febfc08f723ac0df32480eb4af349a7d08656e" - } - ], - "prompt_style": { - "style_name": "c4ai-command-r", - "system_prompt": "You are Command-R, a brilliant, sophisticated, AI-assistant trained to assist human users by providing thorough responses. You are trained by Cohere.", - "roles": [ - "<|USER_TOKEN|>", - "<|CHATBOT_TOKEN|>" - ], - "intra_message_sep": "", - "inter_message_sep": "<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|>", - "stop_token_ids": [ - 6, - 255001 - ] - } - }, - { - "version": 1, - "context_length": 131072, - "model_name": "c4ai-command-r-v01-4bit", - "model_lang": [ - "en", - "fr", - "de", - "es", - "it", - "pt", - "ja", - "ko", - "zh", - "ar" - ], - "model_ability": [ - "generate" - ], - "model_description": "This model is 4bit quantized version of C4AI Command-R using bitsandbytes.", - "model_specs": [ { "model_format": "pytorch", - "model_size_in_billions": 35, + "model_size_in_billions": 104, "quantizations": [ - "none" + "4-bit" ], - "model_id": "CohereForAI/c4ai-command-r-v01-4bit", - "model_revision": "f2e87936a146643c9dd143422dcafb9cb1552611" + "model_id": "CohereForAI/c4ai-command-r-plus-4bit", + "model_revision": "bb63b5b7005ecedb30b0cfd0d5953b02a5817f7b" }, { - "model_format": "pytorch", + "model_format": "gptq", "model_size_in_billions": 104, "quantizations": [ - "none" + "Int4" ], - "model_id": "CohereForAI/c4ai-command-r-plus-4bit", - "model_revision": "bb63b5b7005ecedb30b0cfd0d5953b02a5817f7b" + "model_id": "alpindale/c4ai-command-r-plus-GPTQ", + "model_revision": "35febfc08f723ac0df32480eb4af349a7d08656e" } ], "prompt_style": { diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 99d2e81de4..8510beb796 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -4433,6 +4433,16 @@ "model_id": "AI-ModelScope/c4ai-command-r-v01", "model_revision": "master" }, + { + "model_format": "pytorch", + "model_size_in_billions": 35, + "quantizations": [ + "4-bit" + ], + "model_hub": "modelscope", + "model_id": "mirror013/c4ai-command-r-v01-4bit", + "model_revision": "master" + }, { "model_format": "ggufv2", "model_size_in_billions": 35, @@ -4473,53 +4483,6 @@ ] } }, - { - "version": 1, - "context_length": 131072, - "model_name": "c4ai-command-r-v01-4bit", - "model_lang": [ - "en", - "fr", - "de", - "es", - "it", - "pt", - "ja", - "ko", - "zh", - "ar" - ], - "model_ability": [ - "chat" - ], - "model_description": "This model is 4bit quantized version of C4AI Command-R using bitsandbytes.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 35, - "quantizations": [ - "none" - ], - "model_hub": "modelscope", - "model_id": "mirror013/c4ai-command-r-v01-4bit", - "model_revision": "master" - } - ], - "prompt_style": { - "style_name": "c4ai-command-r", - "system_prompt": "You are Command-R, a brilliant, sophisticated, AI-assistant trained to assist human users by providing thorough responses. You are trained by Cohere.", - "roles": [ - "<|USER_TOKEN|>", - "<|CHATBOT_TOKEN|>" - ], - "intra_message_sep": "", - "inter_message_sep": "<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|>", - "stop_token_ids": [ - 6, - 255001 - ] - } - }, { "version": 1, "context_length": 128000, From af6dfa37130d0bbce135d64bd32b1f8e505c04eb Mon Sep 17 00:00:00 2001 From: Phoenix <Phoenix500526@163.com> Date: Fri, 26 Jul 2024 00:00:45 +0800 Subject: [PATCH 210/298] ENH: add gptq for llama-3-instruct (#1934) Signed-off-by: Phoeniix Zhao <Phoenix500526@163.com> --- xinference/model/llm/llm_family.json | 16 +++++++++++++++ .../model/llm/llm_family_modelscope.json | 20 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 5e456bdfb9..73c5034f10 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1700,6 +1700,22 @@ "none" ], "model_id": "mlx-community/Meta-Llama-3-70B-Instruct-mlx-unquantized" + }, + { + "model_format": "gptq", + "model_size_in_billions": 8, + "quantizations": [ + "Int4" + ], + "model_id": "TechxGenus/Meta-Llama-3-8B-Instruct-GPTQ" + }, + { + "model_format": "gptq", + "model_size_in_billions": 70, + "quantizations": [ + "Int4" + ], + "model_id": "TechxGenus/Meta-Llama-3-70B-Instruct-GPTQ" } ], "prompt_style": { diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 8510beb796..2252982bb0 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -153,6 +153,26 @@ ], "model_id": "LLM-Research/Meta-Llama-3-70B-Instruct", "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": 8, + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "swift/Meta-Llama-3-8B-Instruct-GPTQ-{quantization}", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": 70, + "quantizations": [ + "Int4", + "Int8" + ], + "model_id": "swift/Meta-Llama-3-70B-Instruct-GPTQ-{quantization}", + "model_hub": "modelscope" } ], "prompt_style": { From d09c1e9c1e54218a9f06af2d5d8772161e6549a4 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Fri, 26 Jul 2024 14:14:13 +0800 Subject: [PATCH 211/298] FEAT: [UI]Add configuration for image and audio models. (#1922) --- .../ui/src/scenes/launch_model/modelCard.js | 157 ++++++++---------- 1 file changed, 69 insertions(+), 88 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 7bacf63487..9b125dfd68 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -309,23 +309,13 @@ const ModelCard = ({ model_uid: modelUID.trim() === '' ? null : modelUID.trim(), model_name: modelData.model_name, model_type: modelType, + replica: replica, + n_gpu: nGpu === 'GPU' ? 'auto' : null, + worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), + gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), download_hub: downloadHub === '' ? null : downloadHub, } - if ( - modelType === 'embedding' || - modelType === 'rerank' || - modelType === 'flexible' - ) { - modelDataWithID_other = { - ...modelDataWithID_other, - replica: replica, - n_gpu: nGpu === 'GPU' ? 'auto' : null, - worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), - gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), - } - } - if (nGPULayers >= 0) { modelDataWithID_LLM.n_gpu_layers = nGPULayers } @@ -644,13 +634,11 @@ const ModelCard = ({ const handleOtherHistory = () => { const arr = handleGetHistory() if (arr.length) { - if (modelType === 'embedding' || modelType === 'rerank') { - setModelUID(arr[0].model_uid || '') - setReplica(arr[0].replica || 1) - setWorkerIp(arr[0].worker_ip || '') - } else { - setModelUID(arr[0].model_uid || '') - } + setModelUID(arr[0].model_uid || '') + setReplica(arr[0].replica || 1) + setNGpu(arr[0].n_gpu === 'auto' ? 'GPU' : 'CPU') + setGPUIdx(arr[0].gpu_idx || '') + setWorkerIp(arr[0].worker_ip || '') setDownloadHub(arr[0].download_hub) } } @@ -718,14 +706,13 @@ const ModelCard = ({ setCustomArr([]) setIsOther(false) setIsPeftModelConfig(false) - } else if (modelType === 'embedding' || modelType === 'rerank') { + } else { setModelUID('') setReplica(1) + setNGpu(gpuAvailable === 0 ? 'CPU' : 'GPU') + setGPUIdx('') setWorkerIp('') setDownloadHub('') - } else { - setModelUID('') - setDownloadHub('') } } @@ -1472,74 +1459,68 @@ const ModelCard = ({ label="(Optional) Model UID, model name by default" onChange={(e) => setModelUID(e.target.value)} /> - {(modelType === 'embedding' || - modelType === 'rerank' || - modelType === 'flexible') && ( - <> + <TextField + style={{ marginTop: '25px' }} + type="number" + InputProps={{ + inputProps: { + min: 1, + }, + }} + label="Replica" + value={replica} + onChange={(e) => setReplica(parseInt(e.target.value, 10))} + /> + <FormControl variant="outlined" margin="normal" fullWidth> + <InputLabel id="n-gpu-label">Device</InputLabel> + <Select + labelId="n-gpu-label" + value={nGpu} + onChange={(e) => setNGpu(e.target.value)} + label="N-GPU" + > + {getNewNGPURange().map((v) => { + return ( + <MenuItem key={v} value={v}> + {v} + </MenuItem> + ) + })} + </Select> + </FormControl> + {nGpu === 'GPU' && ( + <FormControl variant="outlined" margin="normal" fullWidth> <TextField - style={{ marginTop: '25px' }} - type="number" - InputProps={{ - inputProps: { - min: 1, - }, + value={GPUIdx} + label="GPU Idx, Specify the GPU index where the model is located" + onChange={(e) => { + setGPUIdxAlert(false) + setGPUIdx(e.target.value) + const regular = /^\d+(?:,\d+)*$/ + if ( + e.target.value !== '' && + !regular.test(e.target.value) + ) { + setGPUIdxAlert(true) + } }} - label="Replica" - value={replica} - onChange={(e) => setReplica(parseInt(e.target.value, 10))} /> - <FormControl variant="outlined" margin="normal" fullWidth> - <InputLabel id="n-gpu-label">Device</InputLabel> - <Select - labelId="n-gpu-label" - value={nGpu} - onChange={(e) => setNGpu(e.target.value)} - label="N-GPU" - > - {getNewNGPURange().map((v) => { - return ( - <MenuItem key={v} value={v}> - {v} - </MenuItem> - ) - })} - </Select> - </FormControl> - {nGpu === 'GPU' && ( - <FormControl variant="outlined" margin="normal" fullWidth> - <TextField - value={GPUIdx} - label="GPU Idx, Specify the GPU index where the model is located" - onChange={(e) => { - setGPUIdxAlert(false) - setGPUIdx(e.target.value) - const regular = /^\d+(?:,\d+)*$/ - if ( - e.target.value !== '' && - !regular.test(e.target.value) - ) { - setGPUIdxAlert(true) - } - }} - /> - {GPUIdxAlert && ( - <Alert severity="error"> - Please enter numeric data separated by commas, for - example: 0,1,2 - </Alert> - )} - </FormControl> + {GPUIdxAlert && ( + <Alert severity="error"> + Please enter numeric data separated by commas, for + example: 0,1,2 + </Alert> )} - <FormControl variant="outlined" margin="normal" fullWidth> - <TextField - variant="outlined" - value={workerIp} - label="Worker Ip, specify the worker ip where the model is located in a distributed scenario" - onChange={(e) => setWorkerIp(e.target.value)} - /> - </FormControl> - </> + </FormControl> )} + <FormControl variant="outlined" margin="normal" fullWidth> + <TextField + variant="outlined" + value={workerIp} + label="Worker Ip, specify the worker ip where the model is located in a distributed scenario" + onChange={(e) => setWorkerIp(e.target.value)} + /> + </FormControl> <FormControl variant="outlined" margin="normal" fullWidth> <InputLabel id="quantization-label"> (Optional) Download_hub From a0a4d1e5edff2c02ade57eb87b5ec1cca5ccc32f Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 26 Jul 2024 15:00:31 +0800 Subject: [PATCH 212/298] FEAT: support mistral-nemo-instruct (#1936) --- doc/source/getting_started/installation.rst | 2 +- doc/source/models/builtin/llm/index.rst | 7 + .../builtin/llm/mistral-nemo-instruct.rst | 159 ++++++++++++++++++ doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 124 ++++++++++++++ .../model/llm/llm_family_modelscope.json | 56 ++++++ xinference/model/llm/utils.py | 21 +++ xinference/model/llm/vllm/core.py | 3 + 8 files changed, 372 insertions(+), 2 deletions(-) create mode 100644 doc/source/models/builtin/llm/mistral-nemo-instruct.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 40fbf2a823..c6562746c3 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -42,7 +42,7 @@ Currently, supported models include: - ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` -- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3`` +- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct`` - ``codestral-v0.1`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 2c25cd243b..f3673f7172 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -326,6 +326,11 @@ The following is a list of built-in LLM in Xinference: - 32768 - The Mistral-7B-Instruct-v0.2 Large Language Model (LLM) is an improved instruct fine-tuned version of Mistral-7B-Instruct-v0.1. + * - :ref:`mistral-nemo-instruct <models_llm_mistral-nemo-instruct>` + - chat + - 1024000 + - The Mistral-Nemo-Instruct-2407 Large Language Model (LLM) is an instruct fine-tuned version of the Mistral-Nemo-Base-2407 + * - :ref:`mistral-v0.1 <models_llm_mistral-v0.1>` - generate - 8192 @@ -695,6 +700,8 @@ The following is a list of built-in LLM in Xinference: mistral-instruct-v0.3 + mistral-nemo-instruct + mistral-v0.1 mixtral-8x22b-instruct-v0.1 diff --git a/doc/source/models/builtin/llm/mistral-nemo-instruct.rst b/doc/source/models/builtin/llm/mistral-nemo-instruct.rst new file mode 100644 index 0000000000..d863e09304 --- /dev/null +++ b/doc/source/models/builtin/llm/mistral-nemo-instruct.rst @@ -0,0 +1,159 @@ +.. _models_llm_mistral-nemo-instruct: + +======================================== +mistral-nemo-instruct +======================================== + +- **Context Length:** 1024000 +- **Model Name:** mistral-nemo-instruct +- **Languages:** en, fr, de, es, it, pt, zh, ru, ja +- **Abilities:** chat +- **Description:** The Mistral-Nemo-Instruct-2407 Large Language Model (LLM) is an instruct fine-tuned version of the Mistral-Nemo-Base-2407 + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 12 +- **Quantizations:** none +- **Engines**: vLLM, Transformers +- **Model ID:** mistralai/Mistral-Nemo-Instruct-2407 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-Nemo-Instruct-2407>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Mistral-Nemo-Instruct-2407>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-nemo-instruct --size-in-billions 12 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 12 +- **Quantizations:** 4-bit +- **Engines**: Transformers +- **Model ID:** unsloth/Mistral-Nemo-Instruct-2407-bnb-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/unsloth/Mistral-Nemo-Instruct-2407-bnb-4bit>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Mistral-Nemo-Instruct-2407>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-nemo-instruct --size-in-billions 12 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (pytorch, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 12 +- **Quantizations:** 8-bit +- **Engines**: Transformers +- **Model ID:** afrizalha/Mistral-Nemo-Instruct-2407-bnb-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/afrizalha/Mistral-Nemo-Instruct-2407-bnb-8bit>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Mistral-Nemo-Instruct-2407>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-nemo-instruct --size-in-billions 12 --model-format pytorch --quantization ${quantization} + + +Model Spec 4 (gptq, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 12 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** ModelCloud/Mistral-Nemo-Instruct-2407-gptq-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/ModelCloud/Mistral-Nemo-Instruct-2407-gptq-4bit>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Mistral-Nemo-Instruct-2407-gptq-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-nemo-instruct --size-in-billions 12 --model-format gptq --quantization ${quantization} + + +Model Spec 5 (awq, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 12 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** casperhansen/mistral-nemo-instruct-2407-awq +- **Model Hubs**: `Hugging Face <https://huggingface.co/casperhansen/mistral-nemo-instruct-2407-awq>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-nemo-instruct --size-in-billions 12 --model-format awq --quantization ${quantization} + + +Model Spec 6 (ggufv2, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 12 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_K_S, Q4_K_M, Q5_K_S, Q5_K_M, Q6_K, Q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** MaziyarPanahi/Mistral-Nemo-Instruct-2407-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/MaziyarPanahi/Mistral-Nemo-Instruct-2407-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-nemo-instruct --size-in-billions 12 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 7 (mlx, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 12 +- **Quantizations:** none +- **Engines**: MLX +- **Model ID:** mlx-community/Mistral-Nemo-Instruct-2407-bf16 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Mistral-Nemo-Instruct-2407-bf16>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-nemo-instruct --size-in-billions 12 --model-format mlx --quantization ${quantization} + + +Model Spec 8 (mlx, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 12 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Mistral-Nemo-Instruct-2407-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Mistral-Nemo-Instruct-2407-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-nemo-instruct --size-in-billions 12 --model-format mlx --quantization ${quantization} + + +Model Spec 9 (mlx, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 12 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Mistral-Nemo-Instruct-2407-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Mistral-Nemo-Instruct-2407-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-nemo-instruct --size-in-billions 12 --model-format mlx --quantization ${quantization} + diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index a2202ba162..7d00b22e18 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -49,7 +49,7 @@ Currently, supported model includes: - ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` -- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3`` +- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct`` - ``codestral-v0.1`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 73c5034f10..59d9d38a7b 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -3952,6 +3952,130 @@ ] } }, + { + "version": 1, + "context_length": 1024000, + "model_name": "mistral-nemo-instruct", + "model_lang": [ + "en", + "fr", + "de", + "es", + "it", + "pt", + "zh", + "ru", + "ja" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Mistral-Nemo-Instruct-2407 Large Language Model (LLM) is an instruct fine-tuned version of the Mistral-Nemo-Base-2407", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 12, + "quantizations": [ + "none" + ], + "model_id": "mistralai/Mistral-Nemo-Instruct-2407", + "model_revision": "05b1e4f3e189ec1b5189fb3c973d4cf3369c27af" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 12, + "quantizations": [ + "4-bit" + ], + "model_id": "unsloth/Mistral-Nemo-Instruct-2407-bnb-4bit", + "model_revision": "1d85adc9e0fff0b8e4479a037bd75fe1346333ca" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 12, + "quantizations": [ + "8-bit" + ], + "model_id": "afrizalha/Mistral-Nemo-Instruct-2407-bnb-8bit", + "model_revision": "1d2dacf18a486c745219317d1507441406bc7e25" + }, + { + "model_format": "gptq", + "model_size_in_billions": 12, + "quantizations": [ + "Int4" + ], + "model_id": "ModelCloud/Mistral-Nemo-Instruct-2407-gptq-4bit" + }, + { + "model_format": "awq", + "model_size_in_billions": 12, + "quantizations": [ + "Int4" + ], + "model_id": "casperhansen/mistral-nemo-instruct-2407-awq" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 12, + "quantizations": [ + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_K_S", + "Q4_K_M", + "Q5_K_S", + "Q5_K_M", + "Q6_K", + "Q8_0", + "fp16" + ], + "model_id": "MaziyarPanahi/Mistral-Nemo-Instruct-2407-GGUF", + "model_file_name_template": "Mistral-Nemo-Instruct-2407.{quantization}.gguf" + }, + { + "model_format": "mlx", + "model_size_in_billions": 12, + "quantizations": [ + "none" + ], + "model_id": "mlx-community/Mistral-Nemo-Instruct-2407-bf16" + }, + { + "model_format": "mlx", + "model_size_in_billions": 12, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Mistral-Nemo-Instruct-2407-4bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 12, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Mistral-Nemo-Instruct-2407-8bit" + } + ], + "prompt_style": { + "style_name": "mistral-nemo", + "system_prompt": "", + "roles": [ + "[INST]", + "[/INST]" + ], + "intra_message_sep": "", + "inter_message_sep": "</s>", + "stop_token_ids": [ + 2 + ], + "stop": [ + "</s>" + ] + } + }, { "version": 1, "context_length": 32768, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 2252982bb0..aea0d0c795 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2098,6 +2098,62 @@ ] } }, + { + "version": 1, + "context_length": 1024000, + "model_name": "mistral-nemo-instruct", + "model_lang": [ + "en", + "fr", + "de", + "es", + "it", + "pt", + "zh", + "ru", + "ja" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Mistral-Nemo-Instruct-2407 Large Language Model (LLM) is an instruct fine-tuned version of the Mistral-Nemo-Base-2407", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 12, + "quantizations": [ + "none" + ], + "model_id": "AI-ModelScope/Mistral-Nemo-Instruct-2407", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": 12, + "quantizations": [ + "Int4" + ], + "model_id": "LLM-Research/Mistral-Nemo-Instruct-2407-gptq-4bit", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "mistral-nemo", + "system_prompt": "", + "roles": [ + "[INST]", + "[/INST]" + ], + "intra_message_sep": "", + "inter_message_sep": "</s>", + "stop_token_ids": [ + 2 + ], + "stop": [ + "</s>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 9ba61ea78b..aadcbf9471 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -483,6 +483,27 @@ def get_role(role_name: str): else: ret += role return ret + elif prompt_style.style_name == "mistral-nemo": + seps = [prompt_style.intra_message_sep, prompt_style.inter_message_sep] + ret = "<s>" + for i, message in enumerate(chat_history): + role = get_role(message["role"]) + content = message["content"] + if content: + if i == len(chat_history) - 2 and prompt_style.system_prompt: + ret += ( + role + + " " + + prompt_style.system_prompt + + "\n\n" + + content + + seps[i % 2] + ) + else: + ret += role + " " + content + seps[i % 2] + else: + ret += role + return ret else: raise ValueError(f"Invalid prompt style: {prompt_style.style_name}") diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 77b0b55b28..bffdf22ecc 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -151,6 +151,9 @@ class VLLMGenerateConfig(TypedDict, total=False): VLLM_SUPPORTED_CHAT_MODELS.append("qwen2-moe-instruct") VLLM_SUPPORTED_CHAT_MODELS.append("c4ai-command-r-v01") +if VLLM_INSTALLED and vllm.__version__ >= "0.5.3": + VLLM_SUPPORTED_CHAT_MODELS.append("mistral-nemo-instruct") + class VLLMModel(LLM): def __init__( From 52139c54f29b6a754fb611c0d1909049e7814663 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 26 Jul 2024 09:17:00 +0200 Subject: [PATCH 213/298] FEAT: CosyVoice speech (#1881) --- .github/workflows/python.yaml | 10 +- .../builtin/audio/cosyvoice-300m-instruct.rst | 19 + .../builtin/audio/cosyvoice-300m-sft.rst | 19 + .../models/builtin/audio/cosyvoice-300m.rst | 19 + doc/source/models/builtin/audio/index.rst | 6 + doc/source/models/model_abilities/audio.rst | 3 +- setup.cfg | 8 + xinference/__init__.py | 1 - xinference/api/restful_api.py | 22 +- xinference/client/restful/restful_client.py | 17 +- xinference/core/model.py | 7 +- xinference/deploy/docker/requirements.txt | 5 + xinference/deploy/docker/requirements_cpu.txt | 5 + xinference/model/audio/core.py | 7 +- xinference/model/audio/cosyvoice.py | 136 ++++ xinference/model/audio/model_spec.json | 24 + .../model/audio/model_spec_modelscope.json | 27 + .../audio/tests/cross_lingual_prompt.wav | Bin 0 -> 606404 bytes .../model/audio/tests/test_cosyvoice.py | 120 +++ .../model/audio/tests/zero_shot_prompt.wav | Bin 0 -> 111496 bytes xinference/thirdparty/cosyvoice/__init__.py | 0 .../thirdparty/cosyvoice/bin/__init__.py | 0 .../thirdparty/cosyvoice/bin/inference.py | 114 +++ xinference/thirdparty/cosyvoice/bin/train.py | 136 ++++ .../thirdparty/cosyvoice/cli/__init__.py | 0 .../thirdparty/cosyvoice/cli/cosyvoice.py | 83 ++ .../thirdparty/cosyvoice/cli/frontend.py | 168 ++++ xinference/thirdparty/cosyvoice/cli/model.py | 60 ++ .../thirdparty/cosyvoice/dataset/__init__.py | 0 .../thirdparty/cosyvoice/dataset/dataset.py | 160 ++++ .../thirdparty/cosyvoice/dataset/processor.py | 369 +++++++++ .../thirdparty/cosyvoice/flow/__init__.py | 0 .../thirdparty/cosyvoice/flow/decoder.py | 222 ++++++ xinference/thirdparty/cosyvoice/flow/flow.py | 135 ++++ .../cosyvoice/flow/flow_matching.py | 138 ++++ .../cosyvoice/flow/length_regulator.py | 49 ++ .../thirdparty/cosyvoice/hifigan/__init__.py | 0 .../cosyvoice/hifigan/f0_predictor.py | 55 ++ .../thirdparty/cosyvoice/hifigan/generator.py | 391 +++++++++ .../thirdparty/cosyvoice/llm/__init__.py | 0 xinference/thirdparty/cosyvoice/llm/llm.py | 206 +++++ .../cosyvoice/transformer/__init__.py | 0 .../cosyvoice/transformer/activation.py | 84 ++ .../cosyvoice/transformer/attention.py | 326 ++++++++ .../cosyvoice/transformer/convolution.py | 145 ++++ .../cosyvoice/transformer/decoder.py | 396 ++++++++++ .../cosyvoice/transformer/decoder_layer.py | 132 ++++ .../cosyvoice/transformer/embedding.py | 293 +++++++ .../cosyvoice/transformer/encoder.py | 472 +++++++++++ .../cosyvoice/transformer/encoder_layer.py | 236 ++++++ .../transformer/label_smoothing_loss.py | 96 +++ .../transformer/positionwise_feed_forward.py | 115 +++ .../cosyvoice/transformer/subsampling.py | 383 +++++++++ .../thirdparty/cosyvoice/utils/__init__.py | 0 .../thirdparty/cosyvoice/utils/class_utils.py | 70 ++ .../thirdparty/cosyvoice/utils/common.py | 103 +++ .../thirdparty/cosyvoice/utils/executor.py | 110 +++ .../thirdparty/cosyvoice/utils/file_utils.py | 41 + .../cosyvoice/utils/frontend_utils.py | 125 +++ xinference/thirdparty/cosyvoice/utils/mask.py | 227 ++++++ .../thirdparty/cosyvoice/utils/scheduler.py | 739 ++++++++++++++++++ .../thirdparty/cosyvoice/utils/train_utils.py | 289 +++++++ 62 files changed, 7113 insertions(+), 10 deletions(-) create mode 100644 doc/source/models/builtin/audio/cosyvoice-300m-instruct.rst create mode 100644 doc/source/models/builtin/audio/cosyvoice-300m-sft.rst create mode 100644 doc/source/models/builtin/audio/cosyvoice-300m.rst create mode 100644 xinference/model/audio/cosyvoice.py create mode 100644 xinference/model/audio/tests/cross_lingual_prompt.wav create mode 100644 xinference/model/audio/tests/test_cosyvoice.py create mode 100644 xinference/model/audio/tests/zero_shot_prompt.wav create mode 100644 xinference/thirdparty/cosyvoice/__init__.py create mode 100644 xinference/thirdparty/cosyvoice/bin/__init__.py create mode 100644 xinference/thirdparty/cosyvoice/bin/inference.py create mode 100644 xinference/thirdparty/cosyvoice/bin/train.py create mode 100644 xinference/thirdparty/cosyvoice/cli/__init__.py create mode 100644 xinference/thirdparty/cosyvoice/cli/cosyvoice.py create mode 100644 xinference/thirdparty/cosyvoice/cli/frontend.py create mode 100644 xinference/thirdparty/cosyvoice/cli/model.py create mode 100644 xinference/thirdparty/cosyvoice/dataset/__init__.py create mode 100644 xinference/thirdparty/cosyvoice/dataset/dataset.py create mode 100644 xinference/thirdparty/cosyvoice/dataset/processor.py create mode 100644 xinference/thirdparty/cosyvoice/flow/__init__.py create mode 100755 xinference/thirdparty/cosyvoice/flow/decoder.py create mode 100644 xinference/thirdparty/cosyvoice/flow/flow.py create mode 100755 xinference/thirdparty/cosyvoice/flow/flow_matching.py create mode 100755 xinference/thirdparty/cosyvoice/flow/length_regulator.py create mode 100644 xinference/thirdparty/cosyvoice/hifigan/__init__.py create mode 100755 xinference/thirdparty/cosyvoice/hifigan/f0_predictor.py create mode 100644 xinference/thirdparty/cosyvoice/hifigan/generator.py create mode 100644 xinference/thirdparty/cosyvoice/llm/__init__.py create mode 100644 xinference/thirdparty/cosyvoice/llm/llm.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/__init__.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/activation.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/attention.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/convolution.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/decoder.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/decoder_layer.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/embedding.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/encoder.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/encoder_layer.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/label_smoothing_loss.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/positionwise_feed_forward.py create mode 100644 xinference/thirdparty/cosyvoice/transformer/subsampling.py create mode 100644 xinference/thirdparty/cosyvoice/utils/__init__.py create mode 100644 xinference/thirdparty/cosyvoice/utils/class_utils.py create mode 100644 xinference/thirdparty/cosyvoice/utils/common.py create mode 100644 xinference/thirdparty/cosyvoice/utils/executor.py create mode 100644 xinference/thirdparty/cosyvoice/utils/file_utils.py create mode 100644 xinference/thirdparty/cosyvoice/utils/frontend_utils.py create mode 100644 xinference/thirdparty/cosyvoice/utils/mask.py create mode 100644 xinference/thirdparty/cosyvoice/utils/scheduler.py create mode 100644 xinference/thirdparty/cosyvoice/utils/train_utils.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index bc19d1cbd5..87b4511a53 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -158,6 +158,11 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pip install -U librosa ${{ env.SELF_HOST_PYTHON }} -m pip install -U xxhash ${{ env.SELF_HOST_PYTHON }} -m pip install -U "ChatTTS>0.1" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U HyperPyYAML + ${{ env.SELF_HOST_PYTHON }} -m pip install -U matcha-tts + ${{ env.SELF_HOST_PYTHON }} -m pip install -U onnxruntime-gpu==1.16.0; sys_platform == 'linux' + ${{ env.SELF_HOST_PYTHON }} -m pip install -U openai-whisper + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "torch==2.1.0" "torchaudio==2.1.0" ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/image/tests/test_stable_diffusion.py @@ -167,6 +172,9 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_chattts.py + ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ + -W ignore::PendingDeprecationWarning \ + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_cosyvoice.py elif [ "$MODULE" == "metal" ]; then pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ @@ -177,6 +185,6 @@ jobs: --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/client/tests/test_client.py pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ - --cov-config=setup.cfg --cov-report=xml --cov=xinference --ignore xinference/client/tests/test_client.py --ignore xinference/model/image/tests/test_stable_diffusion.py --ignore xinference/model/audio/tests/test_whisper.py --ignore xinference/model/audio/tests/test_chattts.py xinference + --cov-config=setup.cfg --cov-report=xml --cov=xinference --ignore xinference/client/tests/test_client.py --ignore xinference/model/image/tests/test_stable_diffusion.py --ignore xinference/model/audio/tests/test_whisper.py --ignore xinference/model/audio/tests/test_chattts.py --ignore xinference/model/audio/tests/test_cosyvoice.py xinference fi working-directory: . diff --git a/doc/source/models/builtin/audio/cosyvoice-300m-instruct.rst b/doc/source/models/builtin/audio/cosyvoice-300m-instruct.rst new file mode 100644 index 0000000000..9e438f04d5 --- /dev/null +++ b/doc/source/models/builtin/audio/cosyvoice-300m-instruct.rst @@ -0,0 +1,19 @@ +.. _models_builtin_cosyvoice-300m-instruct: + +======================= +CosyVoice-300M-Instruct +======================= + +- **Model Name:** CosyVoice-300M-Instruct +- **Model Family:** CosyVoice +- **Abilities:** text-to-audio +- **Multilingual:** True + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** model-scope/CosyVoice-300M-Instruct + +Execute the following command to launch the model:: + + xinference launch --model-name CosyVoice-300M-Instruct --model-type audio \ No newline at end of file diff --git a/doc/source/models/builtin/audio/cosyvoice-300m-sft.rst b/doc/source/models/builtin/audio/cosyvoice-300m-sft.rst new file mode 100644 index 0000000000..4aa6864d31 --- /dev/null +++ b/doc/source/models/builtin/audio/cosyvoice-300m-sft.rst @@ -0,0 +1,19 @@ +.. _models_builtin_cosyvoice-300m-sft: + +================== +CosyVoice-300M-SFT +================== + +- **Model Name:** CosyVoice-300M-SFT +- **Model Family:** CosyVoice +- **Abilities:** text-to-audio +- **Multilingual:** True + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** model-scope/CosyVoice-300M-SFT + +Execute the following command to launch the model:: + + xinference launch --model-name CosyVoice-300M-SFT --model-type audio \ No newline at end of file diff --git a/doc/source/models/builtin/audio/cosyvoice-300m.rst b/doc/source/models/builtin/audio/cosyvoice-300m.rst new file mode 100644 index 0000000000..f667546dbd --- /dev/null +++ b/doc/source/models/builtin/audio/cosyvoice-300m.rst @@ -0,0 +1,19 @@ +.. _models_builtin_cosyvoice-300m: + +============== +CosyVoice-300M +============== + +- **Model Name:** CosyVoice-300M +- **Model Family:** CosyVoice +- **Abilities:** audio-to-audio +- **Multilingual:** True + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** model-scope/CosyVoice-300M + +Execute the following command to launch the model:: + + xinference launch --model-name CosyVoice-300M --model-type audio \ No newline at end of file diff --git a/doc/source/models/builtin/audio/index.rst b/doc/source/models/builtin/audio/index.rst index 5e98b13c21..a380343b04 100644 --- a/doc/source/models/builtin/audio/index.rst +++ b/doc/source/models/builtin/audio/index.rst @@ -19,6 +19,12 @@ The following is a list of built-in audio models in Xinference: chattts + cosyvoice-300m + + cosyvoice-300m-instruct + + cosyvoice-300m-sft + whisper-base whisper-base.en diff --git a/doc/source/models/model_abilities/audio.rst b/doc/source/models/model_abilities/audio.rst index 270e880559..98cdfaf428 100644 --- a/doc/source/models/model_abilities/audio.rst +++ b/doc/source/models/model_abilities/audio.rst @@ -52,6 +52,7 @@ The audio API is supported with the following models in Xinference: * Belle-whisper-large-v2-zh * Belle-whisper-large-v3-zh * ChatTTS +* CosyVoice Quickstart =================== @@ -172,8 +173,6 @@ Speech API use non-stream by default as 1. The stream output of ChatTTS is not as good as the non-stream output, please refer to: https://github.com/2noise/ChatTTS/pull/564 2. The stream requires ffmpeg<7: https://pytorch.org/audio/stable/installation.html#optional-dependencies -User can change the default to stream by `export XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM=1` - .. tabs:: .. code-tab:: bash cURL diff --git a/setup.cfg b/setup.cfg index 101d92a8ef..599be2c821 100644 --- a/setup.cfg +++ b/setup.cfg @@ -114,6 +114,10 @@ all = xxhash # For ChatTTS torchaudio # For ChatTTS ChatTTS>0.1 + HyperPyYAML # For CosyVoice + matcha-tts # For CosyVoice + onnxruntime==1.16.0 # For CosyVoice, use onnxruntime-gpu==1.16.0 if possible + openai-whisper # For CosyVoice boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 intel = @@ -159,6 +163,10 @@ audio = xxhash torchaudio ChatTTS>0.1 + HyperPyYAML # For CosyVoice + matcha-tts # For CosyVoice + onnxruntime==1.16.0 # For CosyVoice, use onnxruntime-gpu==1.16.0 if possible + openai-whisper # For CosyVoice doc = ipython>=6.5.0 sphinx>=3.0.0 diff --git a/xinference/__init__.py b/xinference/__init__.py index 096e24f6c0..eb1fe93d66 100644 --- a/xinference/__init__.py +++ b/xinference/__init__.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - from . import _version __version__ = _version.get_versions()["version"] diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 6d35aa3007..4fb82312d0 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -130,6 +130,7 @@ class SpeechRequest(BaseModel): response_format: Optional[str] = "mp3" speed: Optional[float] = 1.0 stream: Optional[bool] = False + kwargs: Optional[str] = None class RegisterModelRequest(BaseModel): @@ -1309,8 +1310,18 @@ async def create_translations( await self._report_error_event(model_uid, str(e)) raise HTTPException(status_code=500, detail=str(e)) - async def create_speech(self, request: Request) -> Response: - body = SpeechRequest.parse_obj(await request.json()) + async def create_speech( + self, + request: Request, + prompt_speech: Optional[UploadFile] = File( + None, media_type="application/octet-stream" + ), + ) -> Response: + if prompt_speech: + f = await request.form() + else: + f = await request.json() + body = SpeechRequest.parse_obj(f) model_uid = body.model try: model = await (await self._get_supervisor_ref()).get_model(model_uid) @@ -1324,12 +1335,19 @@ async def create_speech(self, request: Request) -> Response: raise HTTPException(status_code=500, detail=str(e)) try: + if body.kwargs is not None: + parsed_kwargs = json.loads(body.kwargs) + else: + parsed_kwargs = {} + if prompt_speech is not None: + parsed_kwargs["prompt_speech"] = await prompt_speech.read() out = await model.speech( input=body.input, voice=body.voice, response_format=body.response_format, speed=body.speed, stream=body.stream, + **parsed_kwargs, ) if body.stream: return EventSourceResponse( diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index db7c97e20c..6fc0297e9b 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -768,6 +768,8 @@ def speech( response_format: str = "mp3", speed: float = 1.0, stream: bool = False, + prompt_speech: Optional[bytes] = None, + **kwargs, ): """ Generates audio from the input text. @@ -799,8 +801,21 @@ def speech( "response_format": response_format, "speed": speed, "stream": stream, + "kwargs": json.dumps(kwargs), } - response = requests.post(url, json=params, headers=self.auth_headers) + if prompt_speech: + files: List[Any] = [] + files.append( + ( + "prompt_speech", + ("prompt_speech", prompt_speech, "application/octet-stream"), + ) + ) + response = requests.post( + url, data=params, files=files, headers=self.auth_headers + ) + else: + response = requests.post(url, json=params, headers=self.auth_headers) if response.status_code != 200: raise RuntimeError( f"Failed to speech the text, detail: {_get_error_string(response)}" diff --git a/xinference/core/model.py b/xinference/core/model.py index 2eeec26c45..f5bf4c14f8 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -646,7 +646,10 @@ async def translations( f"Model {self._model.model_spec} is not for creating translations." ) - @log_async(logger=logger) + @log_async( + logger=logger, + args_formatter=lambda _, kwargs: kwargs.pop("prompt_speech", None), + ) @request_limit @xo.generator async def speech( @@ -656,6 +659,7 @@ async def speech( response_format: str = "mp3", speed: float = 1.0, stream: bool = False, + **kwargs, ): if hasattr(self._model, "speech"): return await self._call_wrapper_binary( @@ -665,6 +669,7 @@ async def speech( response_format, speed, stream, + **kwargs, ) raise AttributeError( f"Model {self._model.model_spec} is not for creating speech." diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 20e14bb47c..49a3653601 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -52,6 +52,11 @@ librosa # For ChatTTS torchaudio # For ChatTTS ChatTTS>0.1 xxhash # For ChatTTS +HyperPyYAML # For CosyVoice +matcha-tts # For CosyVoice +onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice +onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice +openai-whisper # For CosyVoice boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 2e1efec6f6..7260824863 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -49,3 +49,8 @@ librosa # For ChatTTS torchaudio # For ChatTTS ChatTTS>0.1 xxhash # For ChatTTS +HyperPyYAML # For CosyVoice +matcha-tts # For CosyVoice +onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice +onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice +openai-whisper # For CosyVoice diff --git a/xinference/model/audio/core.py b/xinference/model/audio/core.py index cbe86110e9..f16f09d431 100644 --- a/xinference/model/audio/core.py +++ b/xinference/model/audio/core.py @@ -20,6 +20,7 @@ from ..core import CacheableModelSpec, ModelDescription from ..utils import valid_model_revision from .chattts import ChatTTSModel +from .cosyvoice import CosyVoiceModel from .whisper import WhisperModel MAX_ATTEMPTS = 3 @@ -150,14 +151,16 @@ def create_audio_model_instance( model_name: str, download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, **kwargs, -) -> Tuple[Union[WhisperModel, ChatTTSModel], AudioModelDescription]: +) -> Tuple[Union[WhisperModel, ChatTTSModel, CosyVoiceModel], AudioModelDescription]: model_spec = match_audio(model_name, download_hub) model_path = cache(model_spec) - model: Union[WhisperModel, ChatTTSModel] + model: Union[WhisperModel, ChatTTSModel, CosyVoiceModel] if model_spec.model_family == "whisper": model = WhisperModel(model_uid, model_path, model_spec, **kwargs) elif model_spec.model_family == "ChatTTS": model = ChatTTSModel(model_uid, model_path, model_spec, **kwargs) + elif model_spec.model_family == "CosyVoice": + model = CosyVoiceModel(model_uid, model_path, model_spec, **kwargs) else: raise Exception(f"Unsupported audio model family: {model_spec.model_family}") model_description = AudioModelDescription( diff --git a/xinference/model/audio/cosyvoice.py b/xinference/model/audio/cosyvoice.py new file mode 100644 index 0000000000..fcd5605245 --- /dev/null +++ b/xinference/model/audio/cosyvoice.py @@ -0,0 +1,136 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import io +import logging +from io import BytesIO +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + from .core import AudioModelFamilyV1 + +logger = logging.getLogger(__name__) + + +class CosyVoiceModel: + def __init__( + self, + model_uid: str, + model_path: str, + model_spec: "AudioModelFamilyV1", + device: Optional[str] = None, + **kwargs, + ): + self._model_uid = model_uid + self._model_path = model_path + self._model_spec = model_spec + self._device = device + self._model = None + self._kwargs = kwargs + + def load(self): + import os + import sys + + # The yaml config loaded from model has hard-coded the import paths. please refer to: load_hyperpyyaml + sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../thirdparty")) + + from cosyvoice.cli.cosyvoice import CosyVoice + + self._model = CosyVoice(self._model_path) + + def speech( + self, + input: str, + voice: str, + response_format: str = "mp3", + speed: float = 1.0, + stream: bool = False, + **kwargs, + ): + if stream: + raise Exception("CosyVoiceModel does not support stream.") + + import torchaudio + from cosyvoice.utils.file_utils import load_wav + + prompt_speech: Optional[bytes] = kwargs.pop("prompt_speech", None) + prompt_text: Optional[str] = kwargs.pop("prompt_text", None) + instruct_text: Optional[str] = kwargs.pop("instruct_text", None) + + if "SFT" in self._model_spec.model_name: + # inference_sft + assert ( + prompt_speech is None + ), "CosyVoice SFT model does not support prompt_speech" + assert ( + prompt_text is None + ), "CosyVoice SFT model does not support prompt_text" + assert ( + instruct_text is None + ), "CosyVoice SFT model does not support instruct_text" + elif "Instruct" in self._model_spec.model_name: + # inference_instruct + assert ( + prompt_speech is None + ), "CosyVoice Instruct model does not support prompt_speech" + assert ( + prompt_text is None + ), "CosyVoice Instruct model does not support prompt_text" + assert ( + instruct_text is not None + ), "CosyVoice Instruct model expect a instruct_text" + else: + # inference_zero_shot + # inference_cross_lingual + assert prompt_speech is not None, "CosyVoice model expect a prompt_speech" + assert ( + instruct_text is None + ), "CosyVoice model does not support instruct_text" + + assert self._model is not None + if prompt_speech: + assert not voice, "voice can't be set with prompt speech." + with io.BytesIO(prompt_speech) as prompt_speech_io: + prompt_speech_16k = load_wav(prompt_speech_io, 16000) + if prompt_text: + logger.info("CosyVoice inference_zero_shot") + output = self._model.inference_zero_shot( + input, prompt_text, prompt_speech_16k + ) + else: + logger.info("CosyVoice inference_cross_lingual") + output = self._model.inference_cross_lingual( + input, prompt_speech_16k + ) + else: + available_speakers = self._model.list_avaliable_spks() + if not voice: + voice = available_speakers[0] + else: + assert ( + voice in available_speakers + ), f"Invalid voice {voice}, CosyVoice available speakers: {available_speakers}" + if instruct_text: + logger.info("CosyVoice inference_instruct") + output = self._model.inference_instruct( + input, voice, instruct_text=instruct_text + ) + else: + logger.info("CosyVoice inference_sft") + output = self._model.inference_sft(input, voice) + + # Save the generated audio + with BytesIO() as out: + torchaudio.save(out, output["tts_speech"], 22050, format=response_format) + return out.getvalue() diff --git a/xinference/model/audio/model_spec.json b/xinference/model/audio/model_spec.json index 2174b59ab7..fa6e5db689 100644 --- a/xinference/model/audio/model_spec.json +++ b/xinference/model/audio/model_spec.json @@ -102,5 +102,29 @@ "model_revision": "ce5913842aebd78e4a01a02d47244b8d62ac4ee3", "ability": "text-to-audio", "multilingual": true + }, + { + "model_name": "CosyVoice-300M", + "model_family": "CosyVoice", + "model_id": "model-scope/CosyVoice-300M", + "model_revision": "ca4e036d2db2aa4731cc1747859a68044b6a4694", + "ability": "audio-to-audio", + "multilingual": true + }, + { + "model_name": "CosyVoice-300M-SFT", + "model_family": "CosyVoice", + "model_id": "model-scope/CosyVoice-300M-SFT", + "model_revision": "ab918940c6c134b1fc1f069246e67bad6b66abcb", + "ability": "text-to-audio", + "multilingual": true + }, + { + "model_name": "CosyVoice-300M-Instruct", + "model_family": "CosyVoice", + "model_id": "model-scope/CosyVoice-300M-Instruct", + "model_revision": "fb5f676733139f35670bed9b59a77d476b1aa898", + "ability": "text-to-audio", + "multilingual": true } ] diff --git a/xinference/model/audio/model_spec_modelscope.json b/xinference/model/audio/model_spec_modelscope.json index 564be61090..29a59c87e8 100644 --- a/xinference/model/audio/model_spec_modelscope.json +++ b/xinference/model/audio/model_spec_modelscope.json @@ -16,5 +16,32 @@ "model_revision": "master", "ability": "text-to-audio", "multilingual": true + }, + { + "model_name": "CosyVoice-300M", + "model_family": "CosyVoice", + "model_hub": "modelscope", + "model_id": "iic/CosyVoice-300M", + "model_revision": "master", + "ability": "audio-to-audio", + "multilingual": true + }, + { + "model_name": "CosyVoice-300M-SFT", + "model_family": "CosyVoice", + "model_hub": "modelscope", + "model_id": "iic/CosyVoice-300M-SFT", + "model_revision": "master", + "ability": "text-to-audio", + "multilingual": true + }, + { + "model_name": "CosyVoice-300M-Instruct", + "model_family": "CosyVoice", + "model_hub": "modelscope", + "model_id": "iic/CosyVoice-300M-Instruct", + "model_revision": "master", + "ability": "text-to-audio", + "multilingual": true } ] diff --git a/xinference/model/audio/tests/cross_lingual_prompt.wav b/xinference/model/audio/tests/cross_lingual_prompt.wav new file mode 100644 index 0000000000000000000000000000000000000000..35d6d4eed08b24ca379fea873c4925bdb0b58d1e GIT binary patch literal 606404 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%0A^C9KVzrg2h`@e2luhF`!cWjuUSwFJ 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%0AEehx?XyO;9O10*IBZW#i>e`DO(d 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 P=m>NKIszSm|B1kVGR9`T literal 0 HcmV?d00001 diff --git a/xinference/model/audio/tests/test_cosyvoice.py b/xinference/model/audio/tests/test_cosyvoice.py new file mode 100644 index 0000000000..481dc767a4 --- /dev/null +++ b/xinference/model/audio/tests/test_cosyvoice.py @@ -0,0 +1,120 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import os.path +import tempfile + + +def test_cosyvoice_sft(setup): + endpoint, _ = setup + from ....client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_name="CosyVoice-300M-SFT", + model_type="audio", + ) + model = client.get_model(model_uid) + input_string = "你好,我是通义生成式语音大模型,请问有什么可以帮您的吗?" + + # inference_sft + response = model.speech(input_string) + assert type(response) is bytes + assert len(response) > 0 + + # Test openai API + import openai + + client = openai.Client(api_key="not empty", base_url=f"{endpoint}/v1") + # ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女'] + response = client.audio.speech.create( + model=model_uid, input=input_string, voice="英文女" + ) + with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f: + response.stream_to_file(f.name) + assert os.stat(f.name).st_size > 0 + + +def test_cosyvoice(setup): + endpoint, _ = setup + from ....client import Client + + zero_shot_prompt_file = os.path.join( + os.path.dirname(__file__), "zero_shot_prompt.wav" + ) + cross_lingual_prompt_file = os.path.join( + os.path.dirname(__file__), "cross_lingual_prompt.wav" + ) + + client = Client(endpoint) + + model_uid = client.launch_model( + model_name="CosyVoice-300M", + model_type="audio", + ) + model = client.get_model(model_uid) + with open(zero_shot_prompt_file, "rb") as f: + zero_shot_prompt = f.read() + with open(cross_lingual_prompt_file, "rb") as f: + cross_lingual_prompt = f.read() + input_string = ( + "<|en|>And then later on, fully acquiring that company. So keeping management in line, interest in " + "line with the asset that's coming into the family is a reason why sometimes we don't buy the whole thing.", + ) + + # inference_cross_lingual + response = model.speech(input_string, prompt_speech=cross_lingual_prompt) + assert type(response) is bytes, response + assert len(response) > 0 + with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f: + f.write(response) + assert os.stat(f.name).st_size > 0 + + # inference_zero_shot + response = model.speech( + "收到好友从远方寄来的生日礼物,那份意外的惊喜与深深的祝福让我心中充满了甜蜜的快乐,笑容如花儿般绽放。", + prompt_text="希望你以后能够做的比我还好呦。", + prompt_speech=zero_shot_prompt, + ) + assert type(response) is bytes, response + assert len(response) > 0 + with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f: + f.write(response) + assert os.stat(f.name).st_size > 0 + + +def test_cosyvoice_instruct(setup): + endpoint, _ = setup + from ....client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_name="CosyVoice-300M-Instruct", + model_type="audio", + ) + model = client.get_model(model_uid) + + # inference_instruct + response = model.speech( + "在面对挑战时,他展现了非凡的<strong>勇气</strong>与<strong>智慧</strong>。", + voice="中文男", + instruct_text="Theo 'Crimson', is a fiery, passionate rebel leader. " + "Fights with fervor for justice, but struggles with impulsiveness.", + ) + assert type(response) is bytes + assert len(response) > 0 + with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f: + f.write(response) + assert os.stat(f.name).st_size > 0 diff --git a/xinference/model/audio/tests/zero_shot_prompt.wav b/xinference/model/audio/tests/zero_shot_prompt.wav new file mode 100644 index 0000000000000000000000000000000000000000..25fbf592f2a5efa3d966ff64084c75a43be4cc1e GIT binary patch literal 111496 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�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 literal 0 HcmV?d00001 diff --git a/xinference/thirdparty/cosyvoice/__init__.py b/xinference/thirdparty/cosyvoice/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/cosyvoice/bin/__init__.py b/xinference/thirdparty/cosyvoice/bin/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/cosyvoice/bin/inference.py b/xinference/thirdparty/cosyvoice/bin/inference.py new file mode 100644 index 0000000000..6b777fa1cb --- /dev/null +++ b/xinference/thirdparty/cosyvoice/bin/inference.py @@ -0,0 +1,114 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import print_function + +import argparse +import logging +logging.getLogger('matplotlib').setLevel(logging.WARNING) +import os + +import torch +from torch.utils.data import DataLoader +import torchaudio +from hyperpyyaml import load_hyperpyyaml +from tqdm import tqdm +from cosyvoice.cli.model import CosyVoiceModel + +from cosyvoice.dataset.dataset import Dataset + +def get_args(): + parser = argparse.ArgumentParser(description='inference with your model') + parser.add_argument('--config', required=True, help='config file') + parser.add_argument('--prompt_data', required=True, help='prompt data file') + parser.add_argument('--prompt_utt2data', required=True, help='prompt data file') + parser.add_argument('--tts_text', required=True, help='tts input file') + parser.add_argument('--llm_model', required=True, help='llm model file') + parser.add_argument('--flow_model', required=True, help='flow model file') + parser.add_argument('--hifigan_model', required=True, help='hifigan model file') + parser.add_argument('--gpu', + type=int, + default=-1, + help='gpu id for this rank, -1 for cpu') + parser.add_argument('--mode', + default='sft', + choices=['sft', 'zero_shot'], + help='inference mode') + parser.add_argument('--result_dir', required=True, help='asr result file') + args = parser.parse_args() + print(args) + return args + + +def main(): + args = get_args() + logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(levelname)s %(message)s') + os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu) + + # Init cosyvoice models from configs + use_cuda = args.gpu >= 0 and torch.cuda.is_available() + device = torch.device('cuda' if use_cuda else 'cpu') + with open(args.config, 'r') as f: + configs = load_hyperpyyaml(f) + + model = CosyVoiceModel(configs['llm'], configs['flow'], configs['hift']) + model.load(args.llm_model, args.flow_model, args.hifigan_model) + + test_dataset = Dataset(args.prompt_data, data_pipeline=configs['data_pipeline'], mode='inference', shuffle=False, partition=False, tts_file=args.tts_text, prompt_utt2data=args.prompt_utt2data) + test_data_loader = DataLoader(test_dataset, batch_size=None, num_workers=0) + + del configs + os.makedirs(args.result_dir, exist_ok=True) + fn = os.path.join(args.result_dir, 'wav.scp') + f = open(fn, 'w') + with torch.no_grad(): + for batch_idx, batch in tqdm(enumerate(test_data_loader)): + utts = batch["utts"] + assert len(utts) == 1, "inference mode only support batchsize 1" + text = batch["text"] + text_token = batch["text_token"].to(device) + text_token_len = batch["text_token_len"].to(device) + tts_text = batch["tts_text"] + tts_index = batch["tts_index"] + tts_text_token = batch["tts_text_token"].to(device) + tts_text_token_len = batch["tts_text_token_len"].to(device) + speech_token = batch["speech_token"].to(device) + speech_token_len = batch["speech_token_len"].to(device) + speech_feat = batch["speech_feat"].to(device) + speech_feat_len = batch["speech_feat_len"].to(device) + utt_embedding = batch["utt_embedding"].to(device) + spk_embedding = batch["spk_embedding"].to(device) + if args.mode == 'sft': + model_input = {'text': tts_text_token, 'text_len': tts_text_token_len, + 'llm_embedding': spk_embedding, 'flow_embedding': spk_embedding} + else: + model_input = {'text': tts_text_token, 'text_len': tts_text_token_len, + 'prompt_text': text_token, 'prompt_text_len': text_token_len, + 'llm_prompt_speech_token': speech_token, 'llm_prompt_speech_token_len': speech_token_len, + 'flow_prompt_speech_token': speech_token, 'flow_prompt_speech_token_len': speech_token_len, + 'prompt_speech_feat': speech_feat, 'prompt_speech_feat_len': speech_feat_len, + 'llm_embedding': utt_embedding, 'flow_embedding': utt_embedding} + model_output = model.inference(**model_input) + tts_key = '{}_{}'.format(utts[0], tts_index[0]) + tts_fn = os.path.join(args.result_dir, '{}.wav'.format(tts_key)) + torchaudio.save(tts_fn, model_output['tts_speech'], sample_rate=22050) + f.write('{} {}\n'.format(tts_key, tts_fn)) + f.flush() + f.close() + logging.info('Result wav.scp saved in {}'.format(fn)) + + +if __name__ == '__main__': + main() diff --git a/xinference/thirdparty/cosyvoice/bin/train.py b/xinference/thirdparty/cosyvoice/bin/train.py new file mode 100644 index 0000000000..a9d0e0581d --- /dev/null +++ b/xinference/thirdparty/cosyvoice/bin/train.py @@ -0,0 +1,136 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import print_function +import argparse +import datetime +import logging +logging.getLogger('matplotlib').setLevel(logging.WARNING) +from copy import deepcopy +import torch +import torch.distributed as dist +import deepspeed + +from hyperpyyaml import load_hyperpyyaml + +from torch.distributed.elastic.multiprocessing.errors import record + +from cosyvoice.utils.executor import Executor +from cosyvoice.utils.train_utils import ( + init_distributed, + init_dataset_and_dataloader, + init_optimizer_and_scheduler, + init_summarywriter, save_model, + wrap_cuda_model, check_modify_and_save_config) + + +def get_args(): + parser = argparse.ArgumentParser(description='training your network') + parser.add_argument('--train_engine', + default='torch_ddp', + choices=['torch_ddp', 'deepspeed'], + help='Engine for paralleled training') + parser.add_argument('--model', required=True, help='model which will be trained') + parser.add_argument('--config', required=True, help='config file') + parser.add_argument('--train_data', required=True, help='train data file') + parser.add_argument('--cv_data', required=True, help='cv data file') + parser.add_argument('--checkpoint', help='checkpoint model') + parser.add_argument('--model_dir', required=True, help='save model dir') + parser.add_argument('--tensorboard_dir', + default='tensorboard', + help='tensorboard log dir') + parser.add_argument('--ddp.dist_backend', + dest='dist_backend', + default='nccl', + choices=['nccl', 'gloo'], + help='distributed backend') + parser.add_argument('--num_workers', + default=0, + type=int, + help='num of subprocess workers for reading') + parser.add_argument('--prefetch', + default=100, + type=int, + help='prefetch number') + parser.add_argument('--pin_memory', + action='store_true', + default=False, + help='Use pinned memory buffers used for reading') + parser.add_argument('--deepspeed.save_states', + dest='save_states', + default='model_only', + choices=['model_only', 'model+optimizer'], + help='save model/optimizer states') + parser.add_argument('--timeout', + default=30, + type=int, + help='timeout (in seconds) of cosyvoice_join.') + parser = deepspeed.add_config_arguments(parser) + args = parser.parse_args() + return args + + +@record +def main(): + args = get_args() + logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(levelname)s %(message)s') + + override_dict = {k: None for k in ['llm', 'flow', 'hift'] if k != args.model} + with open(args.config, 'r') as f: + configs = load_hyperpyyaml(f, overrides=override_dict) + configs['train_conf'].update(vars(args)) + + # Init env for ddp + init_distributed(args) + + # Get dataset & dataloader + train_dataset, cv_dataset, train_data_loader, cv_data_loader = \ + init_dataset_and_dataloader(args, configs) + + # Do some sanity checks and save config to arsg.model_dir + configs = check_modify_and_save_config(args, configs) + + # Tensorboard summary + writer = init_summarywriter(args) + + # load checkpoint + model = configs[args.model] + if args.checkpoint is not None: + model.load_state_dict(torch.load(args.checkpoint, map_location='cpu')) + + # Dispatch model from cpu to gpu + model = wrap_cuda_model(args, model) + + # Get optimizer & scheduler + model, optimizer, scheduler = init_optimizer_and_scheduler(args, configs, model) + + # Save init checkpoints + info_dict = deepcopy(configs['train_conf']) + save_model(model, 'init', info_dict) + + # Get executor + executor = Executor() + + # Start training loop + for epoch in range(info_dict['max_epoch']): + executor.epoch = epoch + train_dataset.set_epoch(epoch) + dist.barrier() + group_join = dist.new_group(backend="gloo", timeout=datetime.timedelta(seconds=args.timeout)) + executor.train_one_epoc(model, optimizer, scheduler, train_data_loader, cv_data_loader, writer, info_dict, group_join) + dist.destroy_process_group(group_join) + +if __name__ == '__main__': + main() diff --git a/xinference/thirdparty/cosyvoice/cli/__init__.py b/xinference/thirdparty/cosyvoice/cli/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/cosyvoice/cli/cosyvoice.py b/xinference/thirdparty/cosyvoice/cli/cosyvoice.py new file mode 100644 index 0000000000..ea8c448289 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/cli/cosyvoice.py @@ -0,0 +1,83 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import os +import torch +from hyperpyyaml import load_hyperpyyaml +from modelscope import snapshot_download +from cosyvoice.cli.frontend import CosyVoiceFrontEnd +from cosyvoice.cli.model import CosyVoiceModel + +class CosyVoice: + + def __init__(self, model_dir): + instruct = True if '-Instruct' in model_dir else False + self.model_dir = model_dir + if not os.path.exists(model_dir): + model_dir = snapshot_download(model_dir) + with open('{}/cosyvoice.yaml'.format(model_dir), 'r') as f: + configs = load_hyperpyyaml(f) + self.frontend = CosyVoiceFrontEnd(configs['get_tokenizer'], + configs['feat_extractor'], + '{}/campplus.onnx'.format(model_dir), + '{}/speech_tokenizer_v1.onnx'.format(model_dir), + '{}/spk2info.pt'.format(model_dir), + instruct, + configs['allowed_special']) + self.model = CosyVoiceModel(configs['llm'], configs['flow'], configs['hift']) + self.model.load('{}/llm.pt'.format(model_dir), + '{}/flow.pt'.format(model_dir), + '{}/hift.pt'.format(model_dir)) + del configs + + def list_avaliable_spks(self): + spks = list(self.frontend.spk2info.keys()) + return spks + + def inference_sft(self, tts_text, spk_id): + tts_speeches = [] + for i in self.frontend.text_normalize(tts_text, split=True): + model_input = self.frontend.frontend_sft(i, spk_id) + model_output = self.model.inference(**model_input) + tts_speeches.append(model_output['tts_speech']) + return {'tts_speech': torch.concat(tts_speeches, dim=1)} + + def inference_zero_shot(self, tts_text, prompt_text, prompt_speech_16k): + prompt_text = self.frontend.text_normalize(prompt_text, split=False) + tts_speeches = [] + for i in self.frontend.text_normalize(tts_text, split=True): + model_input = self.frontend.frontend_zero_shot(i, prompt_text, prompt_speech_16k) + model_output = self.model.inference(**model_input) + tts_speeches.append(model_output['tts_speech']) + return {'tts_speech': torch.concat(tts_speeches, dim=1)} + + def inference_cross_lingual(self, tts_text, prompt_speech_16k): + if self.frontend.instruct is True: + raise ValueError('{} do not support cross_lingual inference'.format(self.model_dir)) + tts_speeches = [] + for i in self.frontend.text_normalize(tts_text, split=True): + model_input = self.frontend.frontend_cross_lingual(i, prompt_speech_16k) + model_output = self.model.inference(**model_input) + tts_speeches.append(model_output['tts_speech']) + return {'tts_speech': torch.concat(tts_speeches, dim=1)} + + def inference_instruct(self, tts_text, spk_id, instruct_text): + if self.frontend.instruct is False: + raise ValueError('{} do not support instruct inference'.format(self.model_dir)) + instruct_text = self.frontend.text_normalize(instruct_text, split=False) + tts_speeches = [] + for i in self.frontend.text_normalize(tts_text, split=True): + model_input = self.frontend.frontend_instruct(i, spk_id, instruct_text) + model_output = self.model.inference(**model_input) + tts_speeches.append(model_output['tts_speech']) + return {'tts_speech': torch.concat(tts_speeches, dim=1)} diff --git a/xinference/thirdparty/cosyvoice/cli/frontend.py b/xinference/thirdparty/cosyvoice/cli/frontend.py new file mode 100644 index 0000000000..3ed85500cd --- /dev/null +++ b/xinference/thirdparty/cosyvoice/cli/frontend.py @@ -0,0 +1,168 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from functools import partial +import onnxruntime +import torch +import numpy as np +import whisper +from typing import Callable +import torchaudio.compliance.kaldi as kaldi +import torchaudio +import os +import re +import inflect +try: + import ttsfrd + use_ttsfrd = True +except ImportError: + print("failed to import ttsfrd, use WeTextProcessing instead") + from tn.chinese.normalizer import Normalizer as ZhNormalizer + from tn.english.normalizer import Normalizer as EnNormalizer + use_ttsfrd = False +from cosyvoice.utils.frontend_utils import contains_chinese, replace_blank, replace_corner_mark, remove_bracket, spell_out_number, split_paragraph + + +class CosyVoiceFrontEnd: + + def __init__(self, + get_tokenizer: Callable, + feat_extractor: Callable, + campplus_model: str, + speech_tokenizer_model: str, + spk2info: str = '', + instruct: bool = False, + allowed_special: str = 'all'): + self.tokenizer = get_tokenizer() + self.feat_extractor = feat_extractor + self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + option = onnxruntime.SessionOptions() + option.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL + option.intra_op_num_threads = 1 + self.campplus_session = onnxruntime.InferenceSession(campplus_model, sess_options=option, providers=["CPUExecutionProvider"]) + self.speech_tokenizer_session = onnxruntime.InferenceSession(speech_tokenizer_model, sess_options=option, providers=["CUDAExecutionProvider"if torch.cuda.is_available() else "CPUExecutionProvider"]) + if os.path.exists(spk2info): + self.spk2info = torch.load(spk2info, map_location=self.device) + self.instruct = instruct + self.allowed_special = allowed_special + self.inflect_parser = inflect.engine() + self.use_ttsfrd = use_ttsfrd + if self.use_ttsfrd: + self.frd = ttsfrd.TtsFrontendEngine() + ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) + assert self.frd.initialize('{}/../../pretrained_models/CosyVoice-ttsfrd/resource'.format(ROOT_DIR)) is True, 'failed to initialize ttsfrd resource' + self.frd.set_lang_type('pinyin') + self.frd.enable_pinyin_mix(True) + self.frd.set_breakmodel_index(1) + else: + self.zh_tn_model = ZhNormalizer(remove_erhua=False, full_to_half=False) + self.en_tn_model = EnNormalizer() + + def _extract_text_token(self, text): + text_token = self.tokenizer.encode(text, allowed_special=self.allowed_special) + text_token = torch.tensor([text_token], dtype=torch.int32).to(self.device) + text_token_len = torch.tensor([text_token.shape[1]], dtype=torch.int32).to(self.device) + return text_token, text_token_len + + def _extract_speech_token(self, speech): + feat = whisper.log_mel_spectrogram(speech, n_mels=128) + speech_token = self.speech_tokenizer_session.run(None, {self.speech_tokenizer_session.get_inputs()[0].name: feat.detach().cpu().numpy(), + self.speech_tokenizer_session.get_inputs()[1].name: np.array([feat.shape[2]], dtype=np.int32)})[0].flatten().tolist() + speech_token = torch.tensor([speech_token], dtype=torch.int32).to(self.device) + speech_token_len = torch.tensor([speech_token.shape[1]], dtype=torch.int32).to(self.device) + return speech_token, speech_token_len + + def _extract_spk_embedding(self, speech): + feat = kaldi.fbank(speech, + num_mel_bins=80, + dither=0, + sample_frequency=16000) + feat = feat - feat.mean(dim=0, keepdim=True) + embedding = self.campplus_session.run(None, {self.campplus_session.get_inputs()[0].name: feat.unsqueeze(dim=0).cpu().numpy()})[0].flatten().tolist() + embedding = torch.tensor([embedding]).to(self.device) + return embedding + + def _extract_speech_feat(self, speech): + speech_feat = self.feat_extractor(speech).squeeze(dim=0).transpose(0, 1).to(self.device) + speech_feat = speech_feat.unsqueeze(dim=0) + speech_feat_len = torch.tensor([speech_feat.shape[1]], dtype=torch.int32).to(self.device) + return speech_feat, speech_feat_len + + def text_normalize(self, text, split=True): + text = text.strip() + if contains_chinese(text): + if self.use_ttsfrd: + text = self.frd.get_frd_extra_info(text, 'input') + else: + text = self.zh_tn_model.normalize(text) + text = text.replace("\n", "") + text = replace_blank(text) + text = replace_corner_mark(text) + text = text.replace(".", "、") + text = text.replace(" - ", ",") + text = remove_bracket(text) + text = re.sub(r'[,,]+$', '。', text) + texts = [i for i in split_paragraph(text, partial(self.tokenizer.encode, allowed_special=self.allowed_special), "zh", token_max_n=80, + token_min_n=60, merge_len=20, + comma_split=False)] + else: + if self.use_ttsfrd: + text = self.frd.get_frd_extra_info(text, 'input') + else: + text = self.en_tn_model.normalize(text) + text = spell_out_number(text, self.inflect_parser) + texts = [i for i in split_paragraph(text, partial(self.tokenizer.encode, allowed_special=self.allowed_special), "en", token_max_n=80, + token_min_n=60, merge_len=20, + comma_split=False)] + if split is False: + return text + return texts + + def frontend_sft(self, tts_text, spk_id): + tts_text_token, tts_text_token_len = self._extract_text_token(tts_text) + embedding = self.spk2info[spk_id]['embedding'] + model_input = {'text': tts_text_token, 'text_len': tts_text_token_len, 'llm_embedding': embedding, 'flow_embedding': embedding} + return model_input + + def frontend_zero_shot(self, tts_text, prompt_text, prompt_speech_16k): + tts_text_token, tts_text_token_len = self._extract_text_token(tts_text) + prompt_text_token, prompt_text_token_len = self._extract_text_token(prompt_text) + prompt_speech_22050 = torchaudio.transforms.Resample(orig_freq=16000, new_freq=22050)(prompt_speech_16k) + speech_feat, speech_feat_len = self._extract_speech_feat(prompt_speech_22050) + speech_token, speech_token_len = self._extract_speech_token(prompt_speech_16k) + embedding = self._extract_spk_embedding(prompt_speech_16k) + model_input = {'text': tts_text_token, 'text_len': tts_text_token_len, + 'prompt_text': prompt_text_token, 'prompt_text_len': prompt_text_token_len, + 'llm_prompt_speech_token': speech_token, 'llm_prompt_speech_token_len': speech_token_len, + 'flow_prompt_speech_token': speech_token, 'flow_prompt_speech_token_len': speech_token_len, + 'prompt_speech_feat': speech_feat, 'prompt_speech_feat_len': speech_feat_len, + 'llm_embedding': embedding, 'flow_embedding': embedding} + return model_input + + def frontend_cross_lingual(self, tts_text, prompt_speech_16k): + model_input = self.frontend_zero_shot(tts_text, '', prompt_speech_16k) + # in cross lingual mode, we remove prompt in llm + del model_input['prompt_text'] + del model_input['prompt_text_len'] + del model_input['llm_prompt_speech_token'] + del model_input['llm_prompt_speech_token_len'] + return model_input + + def frontend_instruct(self, tts_text, spk_id, instruct_text): + model_input = self.frontend_sft(tts_text, spk_id) + # in instruct mode, we remove spk_embedding in llm due to information leakage + del model_input['llm_embedding'] + instruct_text_token, instruct_text_token_len = self._extract_text_token(instruct_text + '<endofprompt>') + model_input['prompt_text'] = instruct_text_token + model_input['prompt_text_len'] = instruct_text_token_len + return model_input diff --git a/xinference/thirdparty/cosyvoice/cli/model.py b/xinference/thirdparty/cosyvoice/cli/model.py new file mode 100644 index 0000000000..f4625e396c --- /dev/null +++ b/xinference/thirdparty/cosyvoice/cli/model.py @@ -0,0 +1,60 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import torch + +class CosyVoiceModel: + + def __init__(self, + llm: torch.nn.Module, + flow: torch.nn.Module, + hift: torch.nn.Module): + self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + self.llm = llm + self.flow = flow + self.hift = hift + + def load(self, llm_model, flow_model, hift_model): + self.llm.load_state_dict(torch.load(llm_model, map_location=self.device)) + self.llm.to(self.device).eval() + self.flow.load_state_dict(torch.load(flow_model, map_location=self.device)) + self.flow.to(self.device).eval() + self.hift.load_state_dict(torch.load(hift_model, map_location=self.device)) + self.hift.to(self.device).eval() + + def inference(self, text, text_len, flow_embedding, llm_embedding=torch.zeros(0, 192), + prompt_text=torch.zeros(1, 0, dtype=torch.int32), prompt_text_len=torch.zeros(1, dtype=torch.int32), + llm_prompt_speech_token=torch.zeros(1, 0, dtype=torch.int32), llm_prompt_speech_token_len=torch.zeros(1, dtype=torch.int32), + flow_prompt_speech_token=torch.zeros(1, 0, dtype=torch.int32), flow_prompt_speech_token_len=torch.zeros(1, dtype=torch.int32), + prompt_speech_feat=torch.zeros(1, 0, 80), prompt_speech_feat_len=torch.zeros(1, dtype=torch.int32)): + tts_speech_token = self.llm.inference(text=text.to(self.device), + text_len=text_len.to(self.device), + prompt_text=prompt_text.to(self.device), + prompt_text_len=prompt_text_len.to(self.device), + prompt_speech_token=llm_prompt_speech_token.to(self.device), + prompt_speech_token_len=llm_prompt_speech_token_len.to(self.device), + embedding=llm_embedding.to(self.device), + beam_size=1, + sampling=25, + max_token_text_ratio=30, + min_token_text_ratio=3) + tts_mel = self.flow.inference(token=tts_speech_token, + token_len=torch.tensor([tts_speech_token.size(1)], dtype=torch.int32).to(self.device), + prompt_token=flow_prompt_speech_token.to(self.device), + prompt_token_len=flow_prompt_speech_token_len.to(self.device), + prompt_feat=prompt_speech_feat.to(self.device), + prompt_feat_len=prompt_speech_feat_len.to(self.device), + embedding=flow_embedding.to(self.device)) + tts_speech = self.hift.inference(mel=tts_mel).cpu() + torch.cuda.empty_cache() + return {'tts_speech': tts_speech} diff --git a/xinference/thirdparty/cosyvoice/dataset/__init__.py b/xinference/thirdparty/cosyvoice/dataset/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/cosyvoice/dataset/dataset.py b/xinference/thirdparty/cosyvoice/dataset/dataset.py new file mode 100644 index 0000000000..431fae124d --- /dev/null +++ b/xinference/thirdparty/cosyvoice/dataset/dataset.py @@ -0,0 +1,160 @@ +# Copyright (c) 2021 Mobvoi Inc. (authors: Binbin Zhang) +# 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random +import json +import math +from functools import partial + +import torch +import torch.distributed as dist +from torch.utils.data import IterableDataset +from cosyvoice.utils.file_utils import read_lists, read_json_lists + + +class Processor(IterableDataset): + + def __init__(self, source, f, *args, **kw): + assert callable(f) + self.source = source + self.f = f + self.args = args + self.kw = kw + + def set_epoch(self, epoch): + self.source.set_epoch(epoch) + + def __iter__(self): + """ Return an iterator over the source dataset processed by the + given processor. + """ + assert self.source is not None + assert callable(self.f) + return self.f(iter(self.source), *self.args, **self.kw) + + def apply(self, f): + assert callable(f) + return Processor(self, f, *self.args, **self.kw) + + +class DistributedSampler: + + def __init__(self, shuffle=True, partition=True): + self.epoch = -1 + self.update() + self.shuffle = shuffle + self.partition = partition + + def update(self): + assert dist.is_available() + if dist.is_initialized(): + self.rank = dist.get_rank() + self.world_size = dist.get_world_size() + else: + self.rank = 0 + self.world_size = 1 + worker_info = torch.utils.data.get_worker_info() + if worker_info is None: + self.worker_id = 0 + self.num_workers = 1 + else: + self.worker_id = worker_info.id + self.num_workers = worker_info.num_workers + return dict(rank=self.rank, + world_size=self.world_size, + worker_id=self.worker_id, + num_workers=self.num_workers) + + def set_epoch(self, epoch): + self.epoch = epoch + + def sample(self, data): + """ Sample data according to rank/world_size/num_workers + + Args: + data(List): input data list + + Returns: + List: data list after sample + """ + data = list(range(len(data))) + # force datalist even + if self.partition: + if self.shuffle: + random.Random(self.epoch).shuffle(data) + if len(data) < self.world_size: + data = data * math.ceil(self.world_size / len(data)) + data = data[:self.world_size] + data = data[self.rank::self.world_size] + if len(data) < self.num_workers: + data = data * math.ceil(self.num_workers / len(data)) + data = data[:self.num_workers] + data = data[self.worker_id::self.num_workers] + return data + + +class DataList(IterableDataset): + + def __init__(self, lists, shuffle=True, partition=True): + self.lists = lists + self.sampler = DistributedSampler(shuffle, partition) + + def set_epoch(self, epoch): + self.sampler.set_epoch(epoch) + + def __iter__(self): + sampler_info = self.sampler.update() + indexes = self.sampler.sample(self.lists) + for index in indexes: + data = dict(src=self.lists[index]) + data.update(sampler_info) + yield data + + +def Dataset(data_list_file, + data_pipeline, + mode='train', + shuffle=True, + partition=True, + tts_file='', + prompt_utt2data=''): + """ Construct dataset from arguments + + We have two shuffle stage in the Dataset. The first is global + shuffle at shards tar/raw file level. The second is global shuffle + at training samples level. + + Args: + data_type(str): raw/shard + tokenizer (BaseTokenizer): tokenizer to tokenize + partition(bool): whether to do data partition in terms of rank + """ + assert mode in ['train', 'inference'] + lists = read_lists(data_list_file) + if mode == 'inference': + with open(tts_file) as f: + tts_data = json.load(f) + utt2lists = read_json_lists(prompt_utt2data) + # filter unnecessary file in inference mode + lists = list(set([utt2lists[utt] for utt in tts_data.keys() if utt2lists[utt] in lists])) + dataset = DataList(lists, + shuffle=shuffle, + partition=partition) + if mode == 'inference': + # map partial arg tts_data in inference mode + data_pipeline[0] = partial(data_pipeline[0], tts_data=tts_data) + for func in data_pipeline: + dataset = Processor(dataset, func, mode=mode) + return dataset diff --git a/xinference/thirdparty/cosyvoice/dataset/processor.py b/xinference/thirdparty/cosyvoice/dataset/processor.py new file mode 100644 index 0000000000..11f31c4d47 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/dataset/processor.py @@ -0,0 +1,369 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging +import random + +import pyarrow.parquet as pq +from io import BytesIO +import torch +import torchaudio +from torch.nn.utils.rnn import pad_sequence +import torch.nn.functional as F + +torchaudio.set_audio_backend('soundfile') + +AUDIO_FORMAT_SETS = set(['flac', 'mp3', 'm4a', 'ogg', 'opus', 'wav', 'wma']) + + +def parquet_opener(data, mode='train', tts_data={}): + """ Give url or local file, return file descriptor + Inplace operation. + + Args: + data(Iterable[str]): url or local file list + + Returns: + Iterable[{src, stream}] + """ + for sample in data: + assert 'src' in sample + url = sample['src'] + try: + df = pq.read_table(url).to_pandas() + for i in range(len(df)): + if mode == 'inference' and df.loc[i, 'utt'] not in tts_data: + continue + sample.update(dict(df.loc[i])) + if mode == 'train': + # NOTE do not return sample directly, must initialize a new dict + yield {**sample} + else: + for index, text in enumerate(tts_data[df.loc[i, 'utt']]): + yield {**sample, 'tts_index': index, 'tts_text': text} + except Exception as ex: + logging.warning('Failed to open {}, ex info {}'.format(url, ex)) + +def filter(data, + max_length=10240, + min_length=10, + token_max_length=200, + token_min_length=1, + min_output_input_ratio=0.0005, + max_output_input_ratio=1, + mode='train'): + """ Filter sample according to feature and label length + Inplace operation. + + Args:: + data: Iterable[{key, wav, label, sample_rate}] + max_length: drop utterance which is greater than max_length(10ms) + min_length: drop utterance which is less than min_length(10ms) + token_max_length: drop utterance which is greater than + token_max_length, especially when use char unit for + english modeling + token_min_length: drop utterance which is + less than token_max_length + min_output_input_ratio: minimal ration of + token_length / feats_length(10ms) + max_output_input_ratio: maximum ration of + token_length / feats_length(10ms) + + Returns: + Iterable[{key, wav, label, sample_rate}] + """ + for sample in data: + sample['speech'], sample['sample_rate'] = torchaudio.load(BytesIO(sample['audio_data'])) + del sample['audio_data'] + # sample['wav'] is torch.Tensor, we have 100 frames every second + num_frames = sample['speech'].size(1) / sample['sample_rate'] * 100 + if num_frames < min_length: + continue + if num_frames > max_length: + continue + if len(sample['text_token']) < token_min_length: + continue + if len(sample['text_token']) > token_max_length: + continue + if len(sample['speech_token']) == 0: + continue + if num_frames != 0: + if len(sample['text_token']) / num_frames < min_output_input_ratio: + continue + if len(sample['text_token']) / num_frames > max_output_input_ratio: + continue + yield sample + + +def resample(data, resample_rate=22050, min_sample_rate=16000, mode='train'): + """ Resample data. + Inplace operation. + + Args: + data: Iterable[{key, wav, label, sample_rate}] + resample_rate: target resample rate + + Returns: + Iterable[{key, wav, label, sample_rate}] + """ + for sample in data: + assert 'sample_rate' in sample + assert 'speech' in sample + sample_rate = sample['sample_rate'] + waveform = sample['speech'] + if sample_rate != resample_rate: + if sample_rate < min_sample_rate: + continue + sample['sample_rate'] = resample_rate + sample['speech'] = torchaudio.transforms.Resample( + orig_freq=sample_rate, new_freq=resample_rate)(waveform) + max_val = sample['speech'].abs().max() + if max_val > 1: + sample['speech'] /= max_val + yield sample + + +def compute_fbank(data, + feat_extractor, + mode='train'): + """ Extract fbank + + Args: + data: Iterable[{key, wav, label, sample_rate}] + + Returns: + Iterable[{key, feat, label}] + """ + for sample in data: + assert 'sample_rate' in sample + assert 'speech' in sample + assert 'utt' in sample + assert 'text_token' in sample + waveform = sample['speech'] + mat = feat_extractor(waveform).squeeze(dim=0).transpose(0, 1) + sample['speech_feat'] = mat + del sample['speech'] + yield sample + + +def parse_embedding(data, normalize, mode='train'): + """ Parse utt_embedding/spk_embedding + + Args: + data: Iterable[{key, wav, label, sample_rate}] + + Returns: + Iterable[{key, feat, label}] + """ + for sample in data: + sample['utt_embedding'] = torch.tensor(sample['utt_embedding'], dtype=torch.float32) + sample['spk_embedding'] = torch.tensor(sample['spk_embedding'], dtype=torch.float32) + if normalize: + sample['utt_embedding'] = F.normalize(sample['utt_embedding'], dim=0) + sample['spk_embedding'] = F.normalize(sample['spk_embedding'], dim=0) + yield sample + + +def tokenize(data, get_tokenizer, allowed_special, mode='train'): + """ Decode text to chars or BPE + Inplace operation + + Args: + data: Iterable[{key, wav, txt, sample_rate}] + + Returns: + Iterable[{key, wav, txt, tokens, label, sample_rate}] + """ + tokenizer = get_tokenizer() + for sample in data: + assert 'text' in sample + sample['text_token'] = tokenizer.encode(sample['text'], allowed_special=allowed_special) + if mode == 'inference': + sample['tts_text_token'] = tokenizer.encode(sample['tts_text'], allowed_special=allowed_special) + yield sample + + +def shuffle(data, shuffle_size=10000, mode='train'): + """ Local shuffle the data + + Args: + data: Iterable[{key, feat, label}] + shuffle_size: buffer size for shuffle + + Returns: + Iterable[{key, feat, label}] + """ + buf = [] + for sample in data: + buf.append(sample) + if len(buf) >= shuffle_size: + random.shuffle(buf) + for x in buf: + yield x + buf = [] + # The sample left over + random.shuffle(buf) + for x in buf: + yield x + + +def sort(data, sort_size=500, mode='train'): + """ Sort the data by feature length. + Sort is used after shuffle and before batch, so we can group + utts with similar lengths into a batch, and `sort_size` should + be less than `shuffle_size` + + Args: + data: Iterable[{key, feat, label}] + sort_size: buffer size for sort + + Returns: + Iterable[{key, feat, label}] + """ + + buf = [] + for sample in data: + buf.append(sample) + if len(buf) >= sort_size: + buf.sort(key=lambda x: x['speech_feat'].size(0)) + for x in buf: + yield x + buf = [] + # The sample left over + buf.sort(key=lambda x: x['speech_feat'].size(0)) + for x in buf: + yield x + + +def static_batch(data, batch_size=16): + """ Static batch the data by `batch_size` + + Args: + data: Iterable[{key, feat, label}] + batch_size: batch size + + Returns: + Iterable[List[{key, feat, label}]] + """ + buf = [] + for sample in data: + buf.append(sample) + if len(buf) >= batch_size: + yield buf + buf = [] + if len(buf) > 0: + yield buf + + +def dynamic_batch(data, max_frames_in_batch=12000, mode='train'): + """ Dynamic batch the data until the total frames in batch + reach `max_frames_in_batch` + + Args: + data: Iterable[{key, feat, label}] + max_frames_in_batch: max_frames in one batch + + Returns: + Iterable[List[{key, feat, label}]] + """ + buf = [] + longest_frames = 0 + for sample in data: + assert 'speech_feat' in sample + assert isinstance(sample['speech_feat'], torch.Tensor) + new_sample_frames = sample['speech_feat'].size(0) + longest_frames = max(longest_frames, new_sample_frames) + frames_after_padding = longest_frames * (len(buf) + 1) + if frames_after_padding > max_frames_in_batch: + yield buf + buf = [sample] + longest_frames = new_sample_frames + else: + buf.append(sample) + if len(buf) > 0: + yield buf + + +def batch(data, batch_type='static', batch_size=16, max_frames_in_batch=12000, mode='train'): + """ Wrapper for static/dynamic batch + """ + if mode == 'inference': + return static_batch(data, 1) + else: + if batch_type == 'static': + return static_batch(data, batch_size) + elif batch_type == 'dynamic': + return dynamic_batch(data, max_frames_in_batch) + else: + logging.fatal('Unsupported batch type {}'.format(batch_type)) + + +def padding(data, use_spk_embedding, mode='train'): + """ Padding the data into training data + + Args: + data: Iterable[List[{key, feat, label}]] + + Returns: + Iterable[Tuple(keys, feats, labels, feats lengths, label lengths)] + """ + for sample in data: + assert isinstance(sample, list) + speech_feat_len = torch.tensor([x['speech_feat'].size(1) for x in sample], + dtype=torch.int32) + order = torch.argsort(speech_feat_len, descending=True) + + utts = [sample[i]['utt'] for i in order] + speech_token = [torch.tensor(sample[i]['speech_token']) for i in order] + speech_token_len = torch.tensor([i.size(0) for i in speech_token], dtype=torch.int32) + speech_token = pad_sequence(speech_token, + batch_first=True, + padding_value=0) + speech_feat = [sample[i]['speech_feat'] for i in order] + speech_feat_len = torch.tensor([i.size(0) for i in speech_feat], dtype=torch.int32) + speech_feat = pad_sequence(speech_feat, + batch_first=True, + padding_value=0) + text = [sample[i]['text'] for i in order] + text_token = [torch.tensor(sample[i]['text_token']) for i in order] + text_token_len = torch.tensor([i.size(0) for i in text_token], dtype=torch.int32) + text_token = pad_sequence(text_token, batch_first=True, padding_value=0) + utt_embedding = torch.stack([sample[i]['utt_embedding'] for i in order], dim=0) + spk_embedding = torch.stack([sample[i]['spk_embedding'] for i in order], dim=0) + batch = { + "utts": utts, + "speech_token": speech_token, + "speech_token_len": speech_token_len, + "speech_feat": speech_feat, + "speech_feat_len": speech_feat_len, + "text": text, + "text_token": text_token, + "text_token_len": text_token_len, + "utt_embedding": utt_embedding, + "spk_embedding": spk_embedding, + } + if mode == 'inference': + tts_text = [sample[i]['tts_text'] for i in order] + tts_index = [sample[i]['tts_index'] for i in order] + tts_text_token = [torch.tensor(sample[i]['tts_text_token']) for i in order] + tts_text_token_len = torch.tensor([i.size(0) for i in tts_text_token], dtype=torch.int32) + tts_text_token = pad_sequence(tts_text_token, batch_first=True, padding_value=-1) + batch.update({'tts_text': tts_text, + 'tts_index': tts_index, + 'tts_text_token': tts_text_token, + 'tts_text_token_len': tts_text_token_len}) + if use_spk_embedding is True: + batch["embedding"] = batch["spk_embedding"] + else: + batch["embedding"] = batch["utt_embedding"] + yield batch diff --git a/xinference/thirdparty/cosyvoice/flow/__init__.py b/xinference/thirdparty/cosyvoice/flow/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/cosyvoice/flow/decoder.py b/xinference/thirdparty/cosyvoice/flow/decoder.py new file mode 100755 index 0000000000..4349279939 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/flow/decoder.py @@ -0,0 +1,222 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu, Zhihao Du) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import torch +import torch.nn as nn +from einops import pack, rearrange, repeat +from matcha.models.components.decoder import SinusoidalPosEmb, Block1D, ResnetBlock1D, Downsample1D, TimestepEmbedding, Upsample1D +from matcha.models.components.transformer import BasicTransformerBlock + + +class ConditionalDecoder(nn.Module): + def __init__( + self, + in_channels, + out_channels, + channels=(256, 256), + dropout=0.05, + attention_head_dim=64, + n_blocks=1, + num_mid_blocks=2, + num_heads=4, + act_fn="snake", + ): + """ + This decoder requires an input with the same shape of the target. So, if your text content + is shorter or longer than the outputs, please re-sampling it before feeding to the decoder. + """ + super().__init__() + channels = tuple(channels) + self.in_channels = in_channels + self.out_channels = out_channels + + self.time_embeddings = SinusoidalPosEmb(in_channels) + time_embed_dim = channels[0] * 4 + self.time_mlp = TimestepEmbedding( + in_channels=in_channels, + time_embed_dim=time_embed_dim, + act_fn="silu", + ) + self.down_blocks = nn.ModuleList([]) + self.mid_blocks = nn.ModuleList([]) + self.up_blocks = nn.ModuleList([]) + + output_channel = in_channels + for i in range(len(channels)): # pylint: disable=consider-using-enumerate + input_channel = output_channel + output_channel = channels[i] + is_last = i == len(channels) - 1 + resnet = ResnetBlock1D(dim=input_channel, dim_out=output_channel, time_emb_dim=time_embed_dim) + transformer_blocks = nn.ModuleList( + [ + BasicTransformerBlock( + dim=output_channel, + num_attention_heads=num_heads, + attention_head_dim=attention_head_dim, + dropout=dropout, + activation_fn=act_fn, + ) + for _ in range(n_blocks) + ] + ) + downsample = ( + Downsample1D(output_channel) if not is_last else nn.Conv1d(output_channel, output_channel, 3, padding=1) + ) + self.down_blocks.append(nn.ModuleList([resnet, transformer_blocks, downsample])) + + for i in range(num_mid_blocks): + input_channel = channels[-1] + out_channels = channels[-1] + resnet = ResnetBlock1D(dim=input_channel, dim_out=output_channel, time_emb_dim=time_embed_dim) + + transformer_blocks = nn.ModuleList( + [ + BasicTransformerBlock( + dim=output_channel, + num_attention_heads=num_heads, + attention_head_dim=attention_head_dim, + dropout=dropout, + activation_fn=act_fn, + ) + for _ in range(n_blocks) + ] + ) + + self.mid_blocks.append(nn.ModuleList([resnet, transformer_blocks])) + + channels = channels[::-1] + (channels[0],) + for i in range(len(channels) - 1): + input_channel = channels[i] * 2 + output_channel = channels[i + 1] + is_last = i == len(channels) - 2 + resnet = ResnetBlock1D( + dim=input_channel, + dim_out=output_channel, + time_emb_dim=time_embed_dim, + ) + transformer_blocks = nn.ModuleList( + [ + BasicTransformerBlock( + dim=output_channel, + num_attention_heads=num_heads, + attention_head_dim=attention_head_dim, + dropout=dropout, + activation_fn=act_fn, + ) + for _ in range(n_blocks) + ] + ) + upsample = ( + Upsample1D(output_channel, use_conv_transpose=True) + if not is_last + else nn.Conv1d(output_channel, output_channel, 3, padding=1) + ) + self.up_blocks.append(nn.ModuleList([resnet, transformer_blocks, upsample])) + self.final_block = Block1D(channels[-1], channels[-1]) + self.final_proj = nn.Conv1d(channels[-1], self.out_channels, 1) + self.initialize_weights() + + + def initialize_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv1d): + nn.init.kaiming_normal_(m.weight, nonlinearity="relu") + if m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.GroupNorm): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Linear): + nn.init.kaiming_normal_(m.weight, nonlinearity="relu") + if m.bias is not None: + nn.init.constant_(m.bias, 0) + + def forward(self, x, mask, mu, t, spks=None, cond=None): + """Forward pass of the UNet1DConditional model. + + Args: + x (torch.Tensor): shape (batch_size, in_channels, time) + mask (_type_): shape (batch_size, 1, time) + t (_type_): shape (batch_size) + spks (_type_, optional): shape: (batch_size, condition_channels). Defaults to None. + cond (_type_, optional): placeholder for future use. Defaults to None. + + Raises: + ValueError: _description_ + ValueError: _description_ + + Returns: + _type_: _description_ + """ + + t = self.time_embeddings(t) + t = self.time_mlp(t) + + x = pack([x, mu], "b * t")[0] + + if spks is not None: + spks = repeat(spks, "b c -> b c t", t=x.shape[-1]) + x = pack([x, spks], "b * t")[0] + if cond is not None: + x = pack([x, cond], "b * t")[0] + + hiddens = [] + masks = [mask] + for resnet, transformer_blocks, downsample in self.down_blocks: + mask_down = masks[-1] + x = resnet(x, mask_down, t) + x = rearrange(x, "b c t -> b t c").contiguous() + attn_mask = torch.matmul(mask_down.transpose(1, 2).contiguous(), mask_down) + for transformer_block in transformer_blocks: + x = transformer_block( + hidden_states=x, + attention_mask=attn_mask, + timestep=t, + ) + x = rearrange(x, "b t c -> b c t").contiguous() + hiddens.append(x) # Save hidden states for skip connections + x = downsample(x * mask_down) + masks.append(mask_down[:, :, ::2]) + masks = masks[:-1] + mask_mid = masks[-1] + + for resnet, transformer_blocks in self.mid_blocks: + x = resnet(x, mask_mid, t) + x = rearrange(x, "b c t -> b t c").contiguous() + attn_mask = torch.matmul(mask_mid.transpose(1, 2).contiguous(), mask_mid) + for transformer_block in transformer_blocks: + x = transformer_block( + hidden_states=x, + attention_mask=attn_mask, + timestep=t, + ) + x = rearrange(x, "b t c -> b c t").contiguous() + + for resnet, transformer_blocks, upsample in self.up_blocks: + mask_up = masks.pop() + skip = hiddens.pop() + x = pack([x[:, :, :skip.shape[-1]], skip], "b * t")[0] + x = resnet(x, mask_up, t) + x = rearrange(x, "b c t -> b t c").contiguous() + attn_mask = torch.matmul(mask_up.transpose(1, 2).contiguous(), mask_up) + for transformer_block in transformer_blocks: + x = transformer_block( + hidden_states=x, + attention_mask=attn_mask, + timestep=t, + ) + x = rearrange(x, "b t c -> b c t").contiguous() + x = upsample(x * mask_up) + x = self.final_block(x, mask_up) + output = self.final_proj(x * mask_up) + return output * mask diff --git a/xinference/thirdparty/cosyvoice/flow/flow.py b/xinference/thirdparty/cosyvoice/flow/flow.py new file mode 100644 index 0000000000..009160ab07 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/flow/flow.py @@ -0,0 +1,135 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu, Zhihao Du) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging +from typing import Dict, Optional +import torch +import torch.nn as nn +from torch.nn import functional as F +from omegaconf import DictConfig +from cosyvoice.utils.mask import make_pad_mask + + +class MaskedDiffWithXvec(torch.nn.Module): + def __init__(self, + input_size: int = 512, + output_size: int = 80, + spk_embed_dim: int = 192, + output_type: str = "mel", + vocab_size: int = 4096, + input_frame_rate: int = 50, + only_mask_loss: bool = True, + encoder: torch.nn.Module = None, + length_regulator: torch.nn.Module = None, + decoder: torch.nn.Module = None, + decoder_conf: Dict = {'in_channels': 240, 'out_channel': 80, 'spk_emb_dim': 80, 'n_spks': 1, 'cfm_params': DictConfig({'sigma_min': 1e-06, 'solver': 'euler', 't_scheduler': 'cosine', 'training_cfg_rate': 0.2, 'inference_cfg_rate': 0.7, 'reg_loss_type': 'l1'}), 'decoder_params': {'channels': [256, 256], 'dropout': 0.0, 'attention_head_dim': 64, 'n_blocks': 4, 'num_mid_blocks': 12, 'num_heads': 8, 'act_fn': 'gelu'}}, + mel_feat_conf: Dict = {'n_fft': 1024, 'num_mels': 80, 'sampling_rate': 22050, 'hop_size': 256, 'win_size': 1024, 'fmin': 0, 'fmax': 8000}): + super().__init__() + self.input_size = input_size + self.output_size = output_size + self.decoder_conf = decoder_conf + self.mel_feat_conf = mel_feat_conf + self.vocab_size = vocab_size + self.output_type = output_type + self.input_frame_rate = input_frame_rate + logging.info(f"input frame rate={self.input_frame_rate}") + self.input_embedding = nn.Embedding(vocab_size, input_size) + self.spk_embed_affine_layer = torch.nn.Linear(spk_embed_dim, output_size) + self.encoder = encoder + self.encoder_proj = torch.nn.Linear(self.encoder.output_size(), output_size) + self.decoder = decoder + self.length_regulator = length_regulator + self.only_mask_loss = only_mask_loss + + def forward( + self, + batch: dict, + device: torch.device, + ) -> Dict[str, Optional[torch.Tensor]]: + token = batch['speech_token'].to(device) + token_len = batch['speech_token_len'].to(device) + feat = batch['speech_feat'].to(device) + feat_len = batch['speech_feat_len'].to(device) + embedding = batch['embedding'].to(device) + + # xvec projection + embedding = F.normalize(embedding, dim=1) + embedding = self.spk_embed_affine_layer(embedding) + + # concat text and prompt_text + mask = (~make_pad_mask(token_len)).float().unsqueeze(-1).to(device) + token = self.input_embedding(torch.clamp(token, min=0)) * mask + + # text encode + h, h_lengths = self.encoder(token, token_len) + h = self.encoder_proj(h) + h, h_lengths = self.length_regulator(h, feat_len) + + # get conditions + conds = torch.zeros(feat.shape, device=token.device) + conds = conds.transpose(1, 2) + + mask = (~make_pad_mask(feat_len)).to(h) + feat = F.interpolate(feat.unsqueeze(dim=1), size=h.shape[1:], mode="nearest").squeeze(dim=1) + loss, _ = self.decoder.compute_loss( + feat.transpose(1, 2).contiguous(), + mask.unsqueeze(1), + h.transpose(1, 2).contiguous(), + embedding, + cond=conds + ) + return {'loss': loss} + + @torch.inference_mode() + def inference(self, + token, + token_len, + prompt_token, + prompt_token_len, + prompt_feat, + prompt_feat_len, + embedding): + assert token.shape[0] == 1 + # xvec projection + embedding = F.normalize(embedding, dim=1) + embedding = self.spk_embed_affine_layer(embedding) + + # concat text and prompt_text + token, token_len = torch.concat([prompt_token, token], dim=1), prompt_token_len + token_len + mask = (~make_pad_mask(token_len)).float().unsqueeze(-1).to(embedding) + token = self.input_embedding(torch.clamp(token, min=0)) * mask + + # text encode + h, h_lengths = self.encoder(token, token_len) + h = self.encoder_proj(h) + feat_len = (token_len / 50 * 22050 / 256).int() + h, h_lengths = self.length_regulator(h, feat_len) + + # get conditions + conds = torch.zeros([1, feat_len.max().item(), self.output_size], device=token.device) + if prompt_feat.shape[1] != 0: + for i, j in enumerate(prompt_feat_len): + conds[i, :j] = prompt_feat[i] + conds = conds.transpose(1, 2) + + mask = (~make_pad_mask(feat_len)).to(h) + feat = self.decoder( + mu=h.transpose(1, 2).contiguous(), + mask=mask.unsqueeze(1), + spks=embedding, + cond=conds, + n_timesteps=10 + ) + if prompt_feat.shape[1] != 0: + feat = feat[:, :, prompt_feat.shape[1]:] + return feat diff --git a/xinference/thirdparty/cosyvoice/flow/flow_matching.py b/xinference/thirdparty/cosyvoice/flow/flow_matching.py new file mode 100755 index 0000000000..f82eaaeaf9 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/flow/flow_matching.py @@ -0,0 +1,138 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu, Zhihao Du) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import torch +import torch.nn.functional as F +from matcha.models.components.flow_matching import BASECFM + +class ConditionalCFM(BASECFM): + def __init__(self, in_channels, cfm_params, n_spks=1, spk_emb_dim=64, estimator: torch.nn.Module = None): + super().__init__( + n_feats=in_channels, + cfm_params=cfm_params, + n_spks=n_spks, + spk_emb_dim=spk_emb_dim, + ) + self.t_scheduler = cfm_params.t_scheduler + self.training_cfg_rate = cfm_params.training_cfg_rate + self.inference_cfg_rate = cfm_params.inference_cfg_rate + in_channels = in_channels + (spk_emb_dim if n_spks > 0 else 0) + # Just change the architecture of the estimator here + self.estimator = estimator + + @torch.inference_mode() + def forward(self, mu, mask, n_timesteps, temperature=1.0, spks=None, cond=None): + """Forward diffusion + + Args: + mu (torch.Tensor): output of encoder + shape: (batch_size, n_feats, mel_timesteps) + mask (torch.Tensor): output_mask + shape: (batch_size, 1, mel_timesteps) + n_timesteps (int): number of diffusion steps + temperature (float, optional): temperature for scaling noise. Defaults to 1.0. + spks (torch.Tensor, optional): speaker ids. Defaults to None. + shape: (batch_size, spk_emb_dim) + cond: Not used but kept for future purposes + + Returns: + sample: generated mel-spectrogram + shape: (batch_size, n_feats, mel_timesteps) + """ + z = torch.randn_like(mu) * temperature + t_span = torch.linspace(0, 1, n_timesteps + 1, device=mu.device) + if self.t_scheduler == 'cosine': + t_span = 1 - torch.cos(t_span * 0.5 * torch.pi) + return self.solve_euler(z, t_span=t_span, mu=mu, mask=mask, spks=spks, cond=cond) + + def solve_euler(self, x, t_span, mu, mask, spks, cond): + """ + Fixed euler solver for ODEs. + Args: + x (torch.Tensor): random noise + t_span (torch.Tensor): n_timesteps interpolated + shape: (n_timesteps + 1,) + mu (torch.Tensor): output of encoder + shape: (batch_size, n_feats, mel_timesteps) + mask (torch.Tensor): output_mask + shape: (batch_size, 1, mel_timesteps) + spks (torch.Tensor, optional): speaker ids. Defaults to None. + shape: (batch_size, spk_emb_dim) + cond: Not used but kept for future purposes + """ + t, _, dt = t_span[0], t_span[-1], t_span[1] - t_span[0] + + # I am storing this because I can later plot it by putting a debugger here and saving it to a file + # Or in future might add like a return_all_steps flag + sol = [] + + for step in range(1, len(t_span)): + dphi_dt = self.estimator(x, mask, mu, t, spks, cond) + # Classifier-Free Guidance inference introduced in VoiceBox + if self.inference_cfg_rate > 0: + cfg_dphi_dt = self.estimator( + x, mask, + torch.zeros_like(mu), t, + torch.zeros_like(spks) if spks is not None else None, + torch.zeros_like(cond) + ) + dphi_dt = ((1.0 + self.inference_cfg_rate) * dphi_dt - + self.inference_cfg_rate * cfg_dphi_dt) + x = x + dt * dphi_dt + t = t + dt + sol.append(x) + if step < len(t_span) - 1: + dt = t_span[step + 1] - t + + return sol[-1] + + def compute_loss(self, x1, mask, mu, spks=None, cond=None): + """Computes diffusion loss + + Args: + x1 (torch.Tensor): Target + shape: (batch_size, n_feats, mel_timesteps) + mask (torch.Tensor): target mask + shape: (batch_size, 1, mel_timesteps) + mu (torch.Tensor): output of encoder + shape: (batch_size, n_feats, mel_timesteps) + spks (torch.Tensor, optional): speaker embedding. Defaults to None. + shape: (batch_size, spk_emb_dim) + + Returns: + loss: conditional flow matching loss + y: conditional flow + shape: (batch_size, n_feats, mel_timesteps) + """ + b, _, t = mu.shape + + # random timestep + t = torch.rand([b, 1, 1], device=mu.device, dtype=mu.dtype) + if self.t_scheduler == 'cosine': + t = 1 - torch.cos(t * 0.5 * torch.pi) + # sample noise p(x_0) + z = torch.randn_like(x1) + + y = (1 - (1 - self.sigma_min) * t) * z + t * x1 + u = x1 - (1 - self.sigma_min) * z + + # during training, we randomly drop condition to trade off mode coverage and sample fidelity + if self.training_cfg_rate > 0: + cfg_mask = torch.rand(b, device=x1.device) > self.training_cfg_rate + mu = mu * cfg_mask.view(-1, 1, 1) + spks = spks * cfg_mask.view(-1, 1) + cond = cond * cfg_mask.view(-1, 1, 1) + + pred = self.estimator(y, mask, mu, t.squeeze(), spks, cond) + loss = F.mse_loss(pred * mask, u * mask, reduction="sum") / (torch.sum(mask) * u.shape[1]) + return loss, y diff --git a/xinference/thirdparty/cosyvoice/flow/length_regulator.py b/xinference/thirdparty/cosyvoice/flow/length_regulator.py new file mode 100755 index 0000000000..622f29aacc --- /dev/null +++ b/xinference/thirdparty/cosyvoice/flow/length_regulator.py @@ -0,0 +1,49 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu, Zhihao Du) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Tuple +import torch.nn as nn +from torch.nn import functional as F +from cosyvoice.utils.mask import make_pad_mask + + +class InterpolateRegulator(nn.Module): + def __init__( + self, + channels: int, + sampling_ratios: Tuple, + out_channels: int = None, + groups: int = 1, + ): + super().__init__() + self.sampling_ratios = sampling_ratios + out_channels = out_channels or channels + model = nn.ModuleList([]) + if len(sampling_ratios) > 0: + for _ in sampling_ratios: + module = nn.Conv1d(channels, channels, 3, 1, 1) + norm = nn.GroupNorm(groups, channels) + act = nn.Mish() + model.extend([module, norm, act]) + model.append( + nn.Conv1d(channels, out_channels, 1, 1) + ) + self.model = nn.Sequential(*model) + + def forward(self, x, ylens=None): + # x in (B, T, D) + mask = (~make_pad_mask(ylens)).to(x).unsqueeze(-1) + x = F.interpolate(x.transpose(1, 2).contiguous(), size=ylens.max(), mode='nearest') + out = self.model(x).transpose(1, 2).contiguous() + olens = ylens + return out * mask, olens diff --git a/xinference/thirdparty/cosyvoice/hifigan/__init__.py b/xinference/thirdparty/cosyvoice/hifigan/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/cosyvoice/hifigan/f0_predictor.py b/xinference/thirdparty/cosyvoice/hifigan/f0_predictor.py new file mode 100755 index 0000000000..36b85f4ed9 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/hifigan/f0_predictor.py @@ -0,0 +1,55 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu, Kai Hu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import torch +import torch.nn as nn +from torch.nn.utils import weight_norm + + +class ConvRNNF0Predictor(nn.Module): + def __init__(self, + num_class: int = 1, + in_channels: int = 80, + cond_channels: int = 512 + ): + super().__init__() + + self.num_class = num_class + self.condnet = nn.Sequential( + weight_norm( + nn.Conv1d(in_channels, cond_channels, kernel_size=3, padding=1) + ), + nn.ELU(), + weight_norm( + nn.Conv1d(cond_channels, cond_channels, kernel_size=3, padding=1) + ), + nn.ELU(), + weight_norm( + nn.Conv1d(cond_channels, cond_channels, kernel_size=3, padding=1) + ), + nn.ELU(), + weight_norm( + nn.Conv1d(cond_channels, cond_channels, kernel_size=3, padding=1) + ), + nn.ELU(), + weight_norm( + nn.Conv1d(cond_channels, cond_channels, kernel_size=3, padding=1) + ), + nn.ELU(), + ) + self.classifier = nn.Linear(in_features=cond_channels, out_features=self.num_class) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = self.condnet(x) + x = x.transpose(1, 2) + return torch.abs(self.classifier(x).squeeze(-1)) diff --git a/xinference/thirdparty/cosyvoice/hifigan/generator.py b/xinference/thirdparty/cosyvoice/hifigan/generator.py new file mode 100644 index 0000000000..a45419b582 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/hifigan/generator.py @@ -0,0 +1,391 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu, Kai Hu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""HIFI-GAN""" + +import typing as tp +import numpy as np +from scipy.signal import get_window +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import Conv1d +from torch.nn import ConvTranspose1d +from torch.nn.utils import remove_weight_norm +from torch.nn.utils import weight_norm +from torch.distributions.uniform import Uniform + +from cosyvoice.transformer.activation import Snake +from cosyvoice.utils.common import get_padding +from cosyvoice.utils.common import init_weights + + +"""hifigan based generator implementation. + +This code is modified from https://github.com/jik876/hifi-gan + ,https://github.com/kan-bayashi/ParallelWaveGAN and + https://github.com/NVIDIA/BigVGAN + +""" +class ResBlock(torch.nn.Module): + """Residual block module in HiFiGAN/BigVGAN.""" + def __init__( + self, + channels: int = 512, + kernel_size: int = 3, + dilations: tp.List[int] = [1, 3, 5], + ): + super(ResBlock, self).__init__() + self.convs1 = nn.ModuleList() + self.convs2 = nn.ModuleList() + + for dilation in dilations: + self.convs1.append( + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation, + padding=get_padding(kernel_size, dilation) + ) + ) + ) + self.convs2.append( + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1) + ) + ) + ) + self.convs1.apply(init_weights) + self.convs2.apply(init_weights) + self.activations1 = nn.ModuleList([ + Snake(channels, alpha_logscale=False) + for _ in range(len(self.convs1)) + ]) + self.activations2 = nn.ModuleList([ + Snake(channels, alpha_logscale=False) + for _ in range(len(self.convs2)) + ]) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + for idx in range(len(self.convs1)): + xt = self.activations1[idx](x) + xt = self.convs1[idx](xt) + xt = self.activations2[idx](xt) + xt = self.convs2[idx](xt) + x = xt + x + return x + + def remove_weight_norm(self): + for idx in range(len(self.convs1)): + remove_weight_norm(self.convs1[idx]) + remove_weight_norm(self.convs2[idx]) + +class SineGen(torch.nn.Module): + """ Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__(self, samp_rate, harmonic_num=0, + sine_amp=0.1, noise_std=0.003, + voiced_threshold=0): + super(SineGen, self).__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + + def _f02uv(self, f0): + # generate uv signal + uv = (f0 > self.voiced_threshold).type(torch.float32) + return uv + + @torch.no_grad() + def forward(self, f0): + """ + :param f0: [B, 1, sample_len], Hz + :return: [B, 1, sample_len] + """ + + F_mat = torch.zeros((f0.size(0), self.harmonic_num + 1, f0.size(-1))).to(f0.device) + for i in range(self.harmonic_num + 1): + F_mat[:, i: i + 1, :] = f0 * (i + 1) / self.sampling_rate + + theta_mat = 2 * np.pi * (torch.cumsum(F_mat, dim=-1) % 1) + u_dist = Uniform(low=-np.pi, high=np.pi) + phase_vec = u_dist.sample(sample_shape=(f0.size(0), self.harmonic_num + 1, 1)).to(F_mat.device) + phase_vec[:, 0, :] = 0 + + # generate sine waveforms + sine_waves = self.sine_amp * torch.sin(theta_mat + phase_vec) + + # generate uv signal + uv = self._f02uv(f0) + + # noise: for unvoiced should be similar to sine_amp + # std = self.sine_amp/3 -> max value ~ self.sine_amp + # . for voiced regions is self.noise_std + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + + # first: set the unvoiced part to 0 by uv + # then: additive noise + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """ SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threhold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__(self, sampling_rate, upsample_scale, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0): + super(SourceModuleHnNSF, self).__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + + # to produce sine waveforms + self.l_sin_gen = SineGen(sampling_rate, harmonic_num, + sine_amp, add_noise_std, voiced_threshod) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x): + """ + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + """ + # source for harmonic branch + with torch.no_grad(): + sine_wavs, uv, _ = self.l_sin_gen(x.transpose(1, 2)) + sine_wavs = sine_wavs.transpose(1, 2) + uv = uv.transpose(1, 2) + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + + # source for noise branch, in the same shape as uv + noise = torch.randn_like(uv) * self.sine_amp / 3 + return sine_merge, noise, uv + + +class HiFTGenerator(nn.Module): + """ + HiFTNet Generator: Neural Source Filter + ISTFTNet + https://arxiv.org/abs/2309.09493 + """ + def __init__( + self, + in_channels: int = 80, + base_channels: int = 512, + nb_harmonics: int = 8, + sampling_rate: int = 22050, + nsf_alpha: float = 0.1, + nsf_sigma: float = 0.003, + nsf_voiced_threshold: float = 10, + upsample_rates: tp.List[int] = [8, 8], + upsample_kernel_sizes: tp.List[int] = [16, 16], + istft_params: tp.Dict[str, int] = {"n_fft": 16, "hop_len": 4}, + resblock_kernel_sizes: tp.List[int] = [3, 7, 11], + resblock_dilation_sizes: tp.List[tp.List[int]] = [[1, 3, 5], [1, 3, 5], [1, 3, 5]], + source_resblock_kernel_sizes: tp.List[int] = [7, 11], + source_resblock_dilation_sizes: tp.List[tp.List[int]] = [[1, 3, 5], [1, 3, 5]], + lrelu_slope: float = 0.1, + audio_limit: float = 0.99, + f0_predictor: torch.nn.Module = None, + ): + super(HiFTGenerator, self).__init__() + + self.out_channels = 1 + self.nb_harmonics = nb_harmonics + self.sampling_rate = sampling_rate + self.istft_params = istft_params + self.lrelu_slope = lrelu_slope + self.audio_limit = audio_limit + + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + self.m_source = SourceModuleHnNSF( + sampling_rate=sampling_rate, + upsample_scale=np.prod(upsample_rates) * istft_params["hop_len"], + harmonic_num=nb_harmonics, + sine_amp=nsf_alpha, + add_noise_std=nsf_sigma, + voiced_threshod=nsf_voiced_threshold) + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates) * istft_params["hop_len"]) + + self.conv_pre = weight_norm( + Conv1d(in_channels, base_channels, 7, 1, padding=3) + ) + + # Up + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + base_channels // (2**i), + base_channels // (2**(i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + # Down + self.source_downs = nn.ModuleList() + self.source_resblocks = nn.ModuleList() + downsample_rates = [1] + upsample_rates[::-1][:-1] + downsample_cum_rates = np.cumprod(downsample_rates) + for i, (u, k, d) in enumerate(zip(downsample_cum_rates[::-1], source_resblock_kernel_sizes, + source_resblock_dilation_sizes)): + if u == 1: + self.source_downs.append( + Conv1d(istft_params["n_fft"] + 2, base_channels // (2 ** (i + 1)), 1, 1) + ) + else: + self.source_downs.append( + Conv1d(istft_params["n_fft"] + 2, base_channels // (2 ** (i + 1)), u * 2, u, padding=(u // 2)) + ) + + self.source_resblocks.append( + ResBlock(base_channels // (2 ** (i + 1)), k, d) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = base_channels // (2**(i + 1)) + for j, (k, d) in enumerate(zip(resblock_kernel_sizes, resblock_dilation_sizes)): + self.resblocks.append(ResBlock(ch, k, d)) + + self.conv_post = weight_norm(Conv1d(ch, istft_params["n_fft"] + 2, 7, 1, padding=3)) + self.ups.apply(init_weights) + self.conv_post.apply(init_weights) + self.reflection_pad = nn.ReflectionPad1d((1, 0)) + self.stft_window = torch.from_numpy(get_window("hann", istft_params["n_fft"], fftbins=True).astype(np.float32)) + self.f0_predictor = f0_predictor + + def _f02source(self, f0: torch.Tensor) -> torch.Tensor: + f0 = self.f0_upsamp(f0[:, None]).transpose(1, 2) # bs,n,t + + har_source, _, _ = self.m_source(f0) + return har_source.transpose(1, 2) + + def _stft(self, x): + spec = torch.stft( + x, + self.istft_params["n_fft"], self.istft_params["hop_len"], self.istft_params["n_fft"], window=self.stft_window.to(x.device), + return_complex=True) + spec = torch.view_as_real(spec) # [B, F, TT, 2] + return spec[..., 0], spec[..., 1] + + def _istft(self, magnitude, phase): + magnitude = torch.clip(magnitude, max=1e2) + real = magnitude * torch.cos(phase) + img = magnitude * torch.sin(phase) + inverse_transform = torch.istft(torch.complex(real, img), self.istft_params["n_fft"], self.istft_params["hop_len"], self.istft_params["n_fft"], window=self.stft_window.to(magnitude.device)) + return inverse_transform + + def forward(self, x: torch.Tensor) -> torch.Tensor: + f0 = self.f0_predictor(x) + s = self._f02source(f0) + + s_stft_real, s_stft_imag = self._stft(s.squeeze(1)) + s_stft = torch.cat([s_stft_real, s_stft_imag], dim=1) + + x = self.conv_pre(x) + for i in range(self.num_upsamples): + x = F.leaky_relu(x, self.lrelu_slope) + x = self.ups[i](x) + + if i == self.num_upsamples - 1: + x = self.reflection_pad(x) + + # fusion + si = self.source_downs[i](s_stft) + si = self.source_resblocks[i](si) + x = x + si + + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + + x = F.leaky_relu(x) + x = self.conv_post(x) + magnitude = torch.exp(x[:, :self.istft_params["n_fft"] // 2 + 1, :]) + phase = torch.sin(x[:, self.istft_params["n_fft"] // 2 + 1:, :]) # actually, sin is redundancy + + x = self._istft(magnitude, phase) + x = torch.clamp(x, -self.audio_limit, self.audio_limit) + return x + + def remove_weight_norm(self): + print('Removing weight norm...') + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + remove_weight_norm(self.conv_pre) + remove_weight_norm(self.conv_post) + self.source_module.remove_weight_norm() + for l in self.source_downs: + remove_weight_norm(l) + for l in self.source_resblocks: + l.remove_weight_norm() + + @torch.inference_mode() + def inference(self, mel: torch.Tensor) -> torch.Tensor: + return self.forward(x=mel) diff --git a/xinference/thirdparty/cosyvoice/llm/__init__.py b/xinference/thirdparty/cosyvoice/llm/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/cosyvoice/llm/llm.py b/xinference/thirdparty/cosyvoice/llm/llm.py new file mode 100644 index 0000000000..3b418c5d10 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/llm/llm.py @@ -0,0 +1,206 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu, Zhihao Du) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Dict, Optional, Union +import torch +from torch import nn +import torch.nn.functional as F +from torch.nn.utils.rnn import pad_sequence, unpad_sequence +from cosyvoice.utils.common import IGNORE_ID +from cosyvoice.transformer.label_smoothing_loss import LabelSmoothingLoss +from cosyvoice.utils.common import th_accuracy + + +class TransformerLM(torch.nn.Module): + def __init__( + self, + text_encoder_input_size: int, + llm_input_size: int, + llm_output_size: int, + text_token_size: int, + speech_token_size: int, + text_encoder: torch.nn.Module, + llm: torch.nn.Module, + length_normalized_loss: bool = True, + lsm_weight: float = 0.0, + spk_embed_dim: int = 192, + ): + super().__init__() + self.llm_input_size = llm_input_size + self.speech_token_size = speech_token_size + # 1. build text token inputs related modules + self.text_embedding = torch.nn.Embedding(text_token_size, text_encoder_input_size) + self.text_encoder = text_encoder + self.text_encoder_affine_layer = nn.Linear( + self.text_encoder.output_size(), + llm_input_size + ) + + # 2. build speech token language model related modules + self.sos_eos = 0 + self.task_id = 1 + self.llm_embedding = torch.nn.Embedding(2, llm_input_size) + self.llm = llm + self.llm_decoder = nn.Linear(llm_output_size, speech_token_size + 1) + self.criterion_ce = LabelSmoothingLoss( + size=speech_token_size + 1, + padding_idx=IGNORE_ID, + smoothing=lsm_weight, + normalize_length=length_normalized_loss, + ) + + # 3. [Optional] build speech token related modules + self.speech_embedding = torch.nn.Embedding(speech_token_size, llm_input_size) + self.spk_embed_affine_layer = torch.nn.Linear(spk_embed_dim, llm_input_size) + + def encode( + self, + text: torch.Tensor, + text_lengths: torch.Tensor, + ): + encoder_out, encoder_mask = self.text_encoder(text, text_lengths, decoding_chunk_size=1, num_decoding_left_chunks=-1) + encoder_out_lens = encoder_mask.squeeze(1).sum(1) + encoder_out = self.text_encoder_affine_layer(encoder_out) + return encoder_out, encoder_out_lens + + def pad_unpad_sequence(self, sos_eos_emb, embedding, text_token, text_token_len, task_id_emb, speech_token, speech_token_len): + text_token = unpad_sequence(text_token, text_token_len.cpu(), batch_first=True) + speech_token = unpad_sequence(speech_token, speech_token_len.cpu(), batch_first=True) + lm_input = [torch.concat([sos_eos_emb.squeeze(dim=0), embedding[i], text_token[i], task_id_emb.squeeze(dim=0), speech_token[i]], dim=0) for i in range(len(text_token))] + lm_input_len = torch.tensor([i.size(0) for i in lm_input], dtype=torch.int32) + lm_input = pad_sequence(lm_input, batch_first=True, padding_value=IGNORE_ID) + return lm_input, lm_input_len + + def forward( + self, + batch: dict, + device: torch.device, + ) -> Dict[str, Optional[torch.Tensor]]: + """ + Args: + text: (B, L, D) + text_lengths: (B,) + audio: (B, T, N) or (B, T) + audio_lengths: (B,) + """ + text_token = batch['text_token'].to(device) + text_token_len = batch['text_token_len'].to(device) + speech_token = batch['speech_token'].to(device) + speech_token_len = batch['speech_token_len'].to(device) + embedding = batch['embedding'].to(device) + + # 1. prepare llm_target + lm_target = [torch.tensor([IGNORE_ID] * (2 + text_token_len[i]) + speech_token[i, :speech_token_len[i]].tolist() + [self.speech_token_size]) for i in range(text_token.size(0))] + lm_target = pad_sequence(lm_target, batch_first=True, padding_value=IGNORE_ID).to(device) + + # 1. encode text_token + text_token = self.text_embedding(text_token) + text_token, text_token_len = self.encode(text_token, text_token_len) + + # 2. embedding projection + embedding = F.normalize(embedding, dim=1) + embedding = self.spk_embed_affine_layer(embedding) + embedding = embedding.unsqueeze(1) + + # 3. eos and task_id + sos_eos_emb = self.llm_embedding.weight[self.sos_eos].reshape(1, 1, -1) + task_id_emb = self.llm_embedding.weight[self.task_id].reshape(1, 1, -1) + + # 4. encode speech_token + speech_token = self.speech_embedding(speech_token) + + # 5. unpad and pad + lm_input, lm_input_len = self.pad_unpad_sequence(sos_eos_emb, embedding, text_token, text_token_len, task_id_emb, speech_token, speech_token_len) + + # 6. run lm forward + lm_output, lm_output_mask = self.llm(lm_input, lm_input_len.to(device)) + logits = self.llm_decoder(lm_output) + loss = self.criterion_ce(logits, lm_target) + acc = th_accuracy(logits.view(-1, self.speech_token_size + 1), lm_target, ignore_label=IGNORE_ID) + return {'loss': loss, 'acc': acc} + + def sampling_ids( + self, + weighted_scores: torch.Tensor, + sampling: Union[bool, int, float] = True, + beam_size: int = 1, + ignore_eos: bool = True, + ): + while True: + prob, indices = weighted_scores.softmax(dim=-1).topk(sampling) + top_ids = prob.multinomial(beam_size, replacement=True) + top_ids = indices[top_ids] + if (not ignore_eos) or (self.speech_token_size not in top_ids): + break + return top_ids + + @torch.inference_mode() + def inference( + self, + text: torch.Tensor, + text_len: torch.Tensor, + prompt_text: torch.Tensor, + prompt_text_len: torch.Tensor, + prompt_speech_token: torch.Tensor, + prompt_speech_token_len: torch.Tensor, + embedding: torch.Tensor, + beam_size: int = 1, + sampling: int = 25, + max_token_text_ratio: float = 20, + min_token_text_ratio: float = 2, + ) -> torch.Tensor: + device = text.device + text = torch.concat([prompt_text, text], dim=1) + text_len += prompt_text_len + text = self.text_embedding(text) + + # 1. encode text + text, text_len = self.encode(text, text_len) + + # 2. encode embedding + if embedding.shape[0] != 0: + embedding = F.normalize(embedding, dim=1) + embedding = self.spk_embed_affine_layer(embedding) + embedding = embedding.unsqueeze(dim=1) + else: + embedding = torch.zeros(1, 0, self.llm_input_size).to(device) + + # 3. concat llm_input + sos_eos_emb = self.llm_embedding.weight[self.sos_eos].reshape(1, 1, -1) + task_id_emb = self.llm_embedding.weight[self.task_id].reshape(1, 1, -1) + if prompt_speech_token_len != 0: + prompt_speech_token_emb = self.speech_embedding(prompt_speech_token) + else: + prompt_speech_token_emb = torch.zeros(1, 0, self.llm_input_size).to(device) + lm_input = torch.concat([sos_eos_emb, embedding, text, task_id_emb, prompt_speech_token_emb], dim=1) + + # 4. cal min/max_length + min_len = int((text_len - prompt_text_len) * min_token_text_ratio) + max_len = int((text_len - prompt_text_len) * max_token_text_ratio) + + # 5. step by step decode + out_tokens = [] + offset = 0 + att_cache, cnn_cache = torch.zeros((0, 0, 0, 0), device=lm_input.device), torch.zeros((0, 0, 0, 0), device=lm_input.device) + for i in range(max_len): + y_pred, att_cache, cnn_cache = self.llm.forward_chunk(lm_input, offset=0, required_cache_size=-1, att_cache=att_cache, cnn_cache=cnn_cache, + att_mask=torch.tril(torch.ones((1, lm_input.shape[1], lm_input.shape[1]), device=lm_input.device)).to(torch.bool)) + logp = self.llm_decoder(y_pred[:, -1]).log_softmax(dim=-1) + top_ids = self.sampling_ids(logp.squeeze(dim=0), sampling, beam_size, ignore_eos=True if i < min_len else False).item() + if top_ids == self.speech_token_size: + break + out_tokens.append(top_ids) + offset += lm_input.size(1) + lm_input = self.speech_embedding.weight[top_ids].reshape(1, 1, -1) + + return torch.tensor([out_tokens], dtype=torch.int64, device=device) diff --git a/xinference/thirdparty/cosyvoice/transformer/__init__.py b/xinference/thirdparty/cosyvoice/transformer/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/cosyvoice/transformer/activation.py b/xinference/thirdparty/cosyvoice/transformer/activation.py new file mode 100644 index 0000000000..8cea548163 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/activation.py @@ -0,0 +1,84 @@ +# Copyright (c) 2020 Johns Hopkins University (Shinji Watanabe) +# 2020 Northwestern Polytechnical University (Pengcheng Guo) +# 2020 Mobvoi Inc (Binbin Zhang) +# 2024 Alibaba Inc (Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Swish() activation function for Conformer.""" + +import torch +from torch import nn, sin, pow +from torch.nn import Parameter + + +class Swish(torch.nn.Module): + """Construct an Swish object.""" + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """Return Swish activation function.""" + return x * torch.sigmoid(x) + + +# Implementation adapted from https://github.com/EdwardDixon/snake under the MIT license. +# LICENSE is in incl_licenses directory. +class Snake(nn.Module): + ''' + Implementation of a sine-based periodic activation function + Shape: + - Input: (B, C, T) + - Output: (B, C, T), same shape as the input + Parameters: + - alpha - trainable parameter + References: + - This activation function is from this paper by Liu Ziyin, Tilman Hartwig, Masahito Ueda: + https://arxiv.org/abs/2006.08195 + Examples: + >>> a1 = snake(256) + >>> x = torch.randn(256) + >>> x = a1(x) + ''' + def __init__(self, in_features, alpha=1.0, alpha_trainable=True, alpha_logscale=False): + ''' + Initialization. + INPUT: + - in_features: shape of the input + - alpha: trainable parameter + alpha is initialized to 1 by default, higher values = higher-frequency. + alpha will be trained along with the rest of your model. + ''' + super(Snake, self).__init__() + self.in_features = in_features + + # initialize alpha + self.alpha_logscale = alpha_logscale + if self.alpha_logscale: # log scale alphas initialized to zeros + self.alpha = Parameter(torch.zeros(in_features) * alpha) + else: # linear scale alphas initialized to ones + self.alpha = Parameter(torch.ones(in_features) * alpha) + + self.alpha.requires_grad = alpha_trainable + + self.no_div_by_zero = 0.000000001 + + def forward(self, x): + ''' + Forward pass of the function. + Applies the function to the input elementwise. + Snake ∶= x + 1/a * sin^2 (xa) + ''' + alpha = self.alpha.unsqueeze(0).unsqueeze(-1) # line up with x to [B, C, T] + if self.alpha_logscale: + alpha = torch.exp(alpha) + x = x + (1.0 / (alpha + self.no_div_by_zero)) * pow(sin(x * alpha), 2) + + return x diff --git a/xinference/thirdparty/cosyvoice/transformer/attention.py b/xinference/thirdparty/cosyvoice/transformer/attention.py new file mode 100644 index 0000000000..cb6723af96 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/attention.py @@ -0,0 +1,326 @@ +# Copyright (c) 2019 Shigeki Karita +# 2020 Mobvoi Inc (Binbin Zhang) +# 2022 Xingchen Song (sxc19@mails.tsinghua.edu.cn) +# 2024 Alibaba Inc (Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Multi-Head Attention layer definition.""" + +import math +from typing import Tuple + +import torch +from torch import nn + + +class MultiHeadedAttention(nn.Module): + """Multi-Head Attention layer. + + Args: + n_head (int): The number of heads. + n_feat (int): The number of features. + dropout_rate (float): Dropout rate. + + """ + + def __init__(self, + n_head: int, + n_feat: int, + dropout_rate: float, + key_bias: bool = True): + """Construct an MultiHeadedAttention object.""" + super().__init__() + assert n_feat % n_head == 0 + # We assume d_v always equals d_k + self.d_k = n_feat // n_head + self.h = n_head + self.linear_q = nn.Linear(n_feat, n_feat) + self.linear_k = nn.Linear(n_feat, n_feat, bias=key_bias) + self.linear_v = nn.Linear(n_feat, n_feat) + self.linear_out = nn.Linear(n_feat, n_feat) + self.dropout = nn.Dropout(p=dropout_rate) + + def forward_qkv( + self, query: torch.Tensor, key: torch.Tensor, value: torch.Tensor + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Transform query, key and value. + + Args: + query (torch.Tensor): Query tensor (#batch, time1, size). + key (torch.Tensor): Key tensor (#batch, time2, size). + value (torch.Tensor): Value tensor (#batch, time2, size). + + Returns: + torch.Tensor: Transformed query tensor, size + (#batch, n_head, time1, d_k). + torch.Tensor: Transformed key tensor, size + (#batch, n_head, time2, d_k). + torch.Tensor: Transformed value tensor, size + (#batch, n_head, time2, d_k). + + """ + n_batch = query.size(0) + q = self.linear_q(query).view(n_batch, -1, self.h, self.d_k) + k = self.linear_k(key).view(n_batch, -1, self.h, self.d_k) + v = self.linear_v(value).view(n_batch, -1, self.h, self.d_k) + q = q.transpose(1, 2) # (batch, head, time1, d_k) + k = k.transpose(1, 2) # (batch, head, time2, d_k) + v = v.transpose(1, 2) # (batch, head, time2, d_k) + + return q, k, v + + def forward_attention( + self, + value: torch.Tensor, + scores: torch.Tensor, + mask: torch.Tensor = torch.ones((0, 0, 0), dtype=torch.bool) + ) -> torch.Tensor: + """Compute attention context vector. + + Args: + value (torch.Tensor): Transformed value, size + (#batch, n_head, time2, d_k). + scores (torch.Tensor): Attention score, size + (#batch, n_head, time1, time2). + mask (torch.Tensor): Mask, size (#batch, 1, time2) or + (#batch, time1, time2), (0, 0, 0) means fake mask. + + Returns: + torch.Tensor: Transformed value (#batch, time1, d_model) + weighted by the attention score (#batch, time1, time2). + + """ + n_batch = value.size(0) + # NOTE(xcsong): When will `if mask.size(2) > 0` be True? + # 1. onnx(16/4) [WHY? Because we feed real cache & real mask for the + # 1st chunk to ease the onnx export.] + # 2. pytorch training + if mask.size(2) > 0: # time2 > 0 + mask = mask.unsqueeze(1).eq(0) # (batch, 1, *, time2) + # For last chunk, time2 might be larger than scores.size(-1) + mask = mask[:, :, :, :scores.size(-1)] # (batch, 1, *, time2) + scores = scores.masked_fill(mask, -float('inf')) + attn = torch.softmax(scores, dim=-1).masked_fill( + mask, 0.0) # (batch, head, time1, time2) + # NOTE(xcsong): When will `if mask.size(2) > 0` be False? + # 1. onnx(16/-1, -1/-1, 16/0) + # 2. jit (16/-1, -1/-1, 16/0, 16/4) + else: + attn = torch.softmax(scores, dim=-1) # (batch, head, time1, time2) + + p_attn = self.dropout(attn) + x = torch.matmul(p_attn, value) # (batch, head, time1, d_k) + x = (x.transpose(1, 2).contiguous().view(n_batch, -1, + self.h * self.d_k) + ) # (batch, time1, d_model) + + return self.linear_out(x) # (batch, time1, d_model) + + def forward( + self, + query: torch.Tensor, + key: torch.Tensor, + value: torch.Tensor, + mask: torch.Tensor = torch.ones((0, 0, 0), dtype=torch.bool), + pos_emb: torch.Tensor = torch.empty(0), + cache: torch.Tensor = torch.zeros((0, 0, 0, 0)) + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Compute scaled dot product attention. + + Args: + query (torch.Tensor): Query tensor (#batch, time1, size). + key (torch.Tensor): Key tensor (#batch, time2, size). + value (torch.Tensor): Value tensor (#batch, time2, size). + mask (torch.Tensor): Mask tensor (#batch, 1, time2) or + (#batch, time1, time2). + 1.When applying cross attention between decoder and encoder, + the batch padding mask for input is in (#batch, 1, T) shape. + 2.When applying self attention of encoder, + the mask is in (#batch, T, T) shape. + 3.When applying self attention of decoder, + the mask is in (#batch, L, L) shape. + 4.If the different position in decoder see different block + of the encoder, such as Mocha, the passed in mask could be + in (#batch, L, T) shape. But there is no such case in current + CosyVoice. + cache (torch.Tensor): Cache tensor (1, head, cache_t, d_k * 2), + where `cache_t == chunk_size * num_decoding_left_chunks` + and `head * d_k == size` + + + Returns: + torch.Tensor: Output tensor (#batch, time1, d_model). + torch.Tensor: Cache tensor (1, head, cache_t + time1, d_k * 2) + where `cache_t == chunk_size * num_decoding_left_chunks` + and `head * d_k == size` + + """ + q, k, v = self.forward_qkv(query, key, value) + + # NOTE(xcsong): + # when export onnx model, for 1st chunk, we feed + # cache(1, head, 0, d_k * 2) (16/-1, -1/-1, 16/0 mode) + # or cache(1, head, real_cache_t, d_k * 2) (16/4 mode). + # In all modes, `if cache.size(0) > 0` will alwayse be `True` + # and we will always do splitting and + # concatnation(this will simplify onnx export). Note that + # it's OK to concat & split zero-shaped tensors(see code below). + # when export jit model, for 1st chunk, we always feed + # cache(0, 0, 0, 0) since jit supports dynamic if-branch. + # >>> a = torch.ones((1, 2, 0, 4)) + # >>> b = torch.ones((1, 2, 3, 4)) + # >>> c = torch.cat((a, b), dim=2) + # >>> torch.equal(b, c) # True + # >>> d = torch.split(a, 2, dim=-1) + # >>> torch.equal(d[0], d[1]) # True + if cache.size(0) > 0: + key_cache, value_cache = torch.split(cache, + cache.size(-1) // 2, + dim=-1) + k = torch.cat([key_cache, k], dim=2) + v = torch.cat([value_cache, v], dim=2) + # NOTE(xcsong): We do cache slicing in encoder.forward_chunk, since it's + # non-trivial to calculate `next_cache_start` here. + new_cache = torch.cat((k, v), dim=-1) + + scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.d_k) + return self.forward_attention(v, scores, mask), new_cache + + +class RelPositionMultiHeadedAttention(MultiHeadedAttention): + """Multi-Head Attention layer with relative position encoding. + Paper: https://arxiv.org/abs/1901.02860 + Args: + n_head (int): The number of heads. + n_feat (int): The number of features. + dropout_rate (float): Dropout rate. + """ + + def __init__(self, + n_head: int, + n_feat: int, + dropout_rate: float, + key_bias: bool = True): + """Construct an RelPositionMultiHeadedAttention object.""" + super().__init__(n_head, n_feat, dropout_rate, key_bias) + # linear transformation for positional encoding + self.linear_pos = nn.Linear(n_feat, n_feat, bias=False) + # these two learnable bias are used in matrix c and matrix d + # as described in https://arxiv.org/abs/1901.02860 Section 3.3 + self.pos_bias_u = nn.Parameter(torch.Tensor(self.h, self.d_k)) + self.pos_bias_v = nn.Parameter(torch.Tensor(self.h, self.d_k)) + torch.nn.init.xavier_uniform_(self.pos_bias_u) + torch.nn.init.xavier_uniform_(self.pos_bias_v) + + def rel_shift(self, x): + """Compute relative positional encoding. + + Args: + x (torch.Tensor): Input tensor (batch, head, time1, 2*time1-1). + time1 means the length of query vector. + + Returns: + torch.Tensor: Output tensor. + + """ + zero_pad = torch.zeros((*x.size()[:3], 1), device=x.device, dtype=x.dtype) + x_padded = torch.cat([zero_pad, x], dim=-1) + + x_padded = x_padded.view(*x.size()[:2], x.size(3) + 1, x.size(2)) + x = x_padded[:, :, 1:].view_as(x)[ + :, :, :, : x.size(-1) // 2 + 1 + ] # only keep the positions from 0 to time2 + return x + + def forward( + self, + query: torch.Tensor, + key: torch.Tensor, + value: torch.Tensor, + mask: torch.Tensor = torch.ones((0, 0, 0), dtype=torch.bool), + pos_emb: torch.Tensor = torch.empty(0), + cache: torch.Tensor = torch.zeros((0, 0, 0, 0)) + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Compute 'Scaled Dot Product Attention' with rel. positional encoding. + Args: + query (torch.Tensor): Query tensor (#batch, time1, size). + key (torch.Tensor): Key tensor (#batch, time2, size). + value (torch.Tensor): Value tensor (#batch, time2, size). + mask (torch.Tensor): Mask tensor (#batch, 1, time2) or + (#batch, time1, time2), (0, 0, 0) means fake mask. + pos_emb (torch.Tensor): Positional embedding tensor + (#batch, time2, size). + cache (torch.Tensor): Cache tensor (1, head, cache_t, d_k * 2), + where `cache_t == chunk_size * num_decoding_left_chunks` + and `head * d_k == size` + Returns: + torch.Tensor: Output tensor (#batch, time1, d_model). + torch.Tensor: Cache tensor (1, head, cache_t + time1, d_k * 2) + where `cache_t == chunk_size * num_decoding_left_chunks` + and `head * d_k == size` + """ + q, k, v = self.forward_qkv(query, key, value) + q = q.transpose(1, 2) # (batch, time1, head, d_k) + + # NOTE(xcsong): + # when export onnx model, for 1st chunk, we feed + # cache(1, head, 0, d_k * 2) (16/-1, -1/-1, 16/0 mode) + # or cache(1, head, real_cache_t, d_k * 2) (16/4 mode). + # In all modes, `if cache.size(0) > 0` will alwayse be `True` + # and we will always do splitting and + # concatnation(this will simplify onnx export). Note that + # it's OK to concat & split zero-shaped tensors(see code below). + # when export jit model, for 1st chunk, we always feed + # cache(0, 0, 0, 0) since jit supports dynamic if-branch. + # >>> a = torch.ones((1, 2, 0, 4)) + # >>> b = torch.ones((1, 2, 3, 4)) + # >>> c = torch.cat((a, b), dim=2) + # >>> torch.equal(b, c) # True + # >>> d = torch.split(a, 2, dim=-1) + # >>> torch.equal(d[0], d[1]) # True + if cache.size(0) > 0: + key_cache, value_cache = torch.split(cache, + cache.size(-1) // 2, + dim=-1) + k = torch.cat([key_cache, k], dim=2) + v = torch.cat([value_cache, v], dim=2) + # NOTE(xcsong): We do cache slicing in encoder.forward_chunk, since it's + # non-trivial to calculate `next_cache_start` here. + new_cache = torch.cat((k, v), dim=-1) + + n_batch_pos = pos_emb.size(0) + p = self.linear_pos(pos_emb).view(n_batch_pos, -1, self.h, self.d_k) + p = p.transpose(1, 2) # (batch, head, time1, d_k) + + # (batch, head, time1, d_k) + q_with_bias_u = (q + self.pos_bias_u).transpose(1, 2) + # (batch, head, time1, d_k) + q_with_bias_v = (q + self.pos_bias_v).transpose(1, 2) + + # compute attention score + # first compute matrix a and matrix c + # as described in https://arxiv.org/abs/1901.02860 Section 3.3 + # (batch, head, time1, time2) + matrix_ac = torch.matmul(q_with_bias_u, k.transpose(-2, -1)) + + # compute matrix b and matrix d + # (batch, head, time1, time2) + matrix_bd = torch.matmul(q_with_bias_v, p.transpose(-2, -1)) + # NOTE(Xiang Lyu): Keep rel_shift since espnet rel_pos_emb is used + if matrix_ac.shape != matrix_bd.shape: + matrix_bd = self.rel_shift(matrix_bd) + + scores = (matrix_ac + matrix_bd) / math.sqrt( + self.d_k) # (batch, head, time1, time2) + + return self.forward_attention(v, scores, mask), new_cache diff --git a/xinference/thirdparty/cosyvoice/transformer/convolution.py b/xinference/thirdparty/cosyvoice/transformer/convolution.py new file mode 100644 index 0000000000..4d5d961491 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/convolution.py @@ -0,0 +1,145 @@ +# Copyright (c) 2020 Mobvoi Inc. (authors: Binbin Zhang, Di Wu) +# 2024 Alibaba Inc (Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Modified from ESPnet(https://github.com/espnet/espnet) +"""ConvolutionModule definition.""" + +from typing import Tuple + +import torch +from torch import nn + + +class ConvolutionModule(nn.Module): + """ConvolutionModule in Conformer model.""" + + def __init__(self, + channels: int, + kernel_size: int = 15, + activation: nn.Module = nn.ReLU(), + norm: str = "batch_norm", + causal: bool = False, + bias: bool = True): + """Construct an ConvolutionModule object. + Args: + channels (int): The number of channels of conv layers. + kernel_size (int): Kernel size of conv layers. + causal (int): Whether use causal convolution or not + """ + super().__init__() + + self.pointwise_conv1 = nn.Conv1d( + channels, + 2 * channels, + kernel_size=1, + stride=1, + padding=0, + bias=bias, + ) + # self.lorder is used to distinguish if it's a causal convolution, + # if self.lorder > 0: it's a causal convolution, the input will be + # padded with self.lorder frames on the left in forward. + # else: it's a symmetrical convolution + if causal: + padding = 0 + self.lorder = kernel_size - 1 + else: + # kernel_size should be an odd number for none causal convolution + assert (kernel_size - 1) % 2 == 0 + padding = (kernel_size - 1) // 2 + self.lorder = 0 + self.depthwise_conv = nn.Conv1d( + channels, + channels, + kernel_size, + stride=1, + padding=padding, + groups=channels, + bias=bias, + ) + + assert norm in ['batch_norm', 'layer_norm'] + if norm == "batch_norm": + self.use_layer_norm = False + self.norm = nn.BatchNorm1d(channels) + else: + self.use_layer_norm = True + self.norm = nn.LayerNorm(channels) + + self.pointwise_conv2 = nn.Conv1d( + channels, + channels, + kernel_size=1, + stride=1, + padding=0, + bias=bias, + ) + self.activation = activation + + def forward( + self, + x: torch.Tensor, + mask_pad: torch.Tensor = torch.ones((0, 0, 0), dtype=torch.bool), + cache: torch.Tensor = torch.zeros((0, 0, 0)), + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Compute convolution module. + Args: + x (torch.Tensor): Input tensor (#batch, time, channels). + mask_pad (torch.Tensor): used for batch padding (#batch, 1, time), + (0, 0, 0) means fake mask. + cache (torch.Tensor): left context cache, it is only + used in causal convolution (#batch, channels, cache_t), + (0, 0, 0) meas fake cache. + Returns: + torch.Tensor: Output tensor (#batch, time, channels). + """ + # exchange the temporal dimension and the feature dimension + x = x.transpose(1, 2) # (#batch, channels, time) + + # mask batch padding + if mask_pad.size(2) > 0: # time > 0 + x.masked_fill_(~mask_pad, 0.0) + + if self.lorder > 0: + if cache.size(2) == 0: # cache_t == 0 + x = nn.functional.pad(x, (self.lorder, 0), 'constant', 0.0) + else: + assert cache.size(0) == x.size(0) # equal batch + assert cache.size(1) == x.size(1) # equal channel + x = torch.cat((cache, x), dim=2) + assert (x.size(2) > self.lorder) + new_cache = x[:, :, -self.lorder:] + else: + # It's better we just return None if no cache is required, + # However, for JIT export, here we just fake one tensor instead of + # None. + new_cache = torch.zeros((0, 0, 0), dtype=x.dtype, device=x.device) + + # GLU mechanism + x = self.pointwise_conv1(x) # (batch, 2*channel, dim) + x = nn.functional.glu(x, dim=1) # (batch, channel, dim) + + # 1D Depthwise Conv + x = self.depthwise_conv(x) + if self.use_layer_norm: + x = x.transpose(1, 2) + x = self.activation(self.norm(x)) + if self.use_layer_norm: + x = x.transpose(1, 2) + x = self.pointwise_conv2(x) + # mask batch padding + if mask_pad.size(2) > 0: # time > 0 + x.masked_fill_(~mask_pad, 0.0) + + return x.transpose(1, 2), new_cache diff --git a/xinference/thirdparty/cosyvoice/transformer/decoder.py b/xinference/thirdparty/cosyvoice/transformer/decoder.py new file mode 100644 index 0000000000..961c875eab --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/decoder.py @@ -0,0 +1,396 @@ +# Copyright (c) 2021 Mobvoi Inc. (authors: Binbin Zhang, Di Wu) +# 2024 Alibaba Inc (Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Modified from ESPnet(https://github.com/espnet/espnet) +"""Decoder definition.""" +from typing import Tuple, List, Optional + +import torch +import torch.utils.checkpoint as ckpt +import logging + +from cosyvoice.transformer.decoder_layer import DecoderLayer +from cosyvoice.transformer.positionwise_feed_forward import PositionwiseFeedForward +from cosyvoice.utils.class_utils import ( + COSYVOICE_EMB_CLASSES, + COSYVOICE_ATTENTION_CLASSES, + COSYVOICE_ACTIVATION_CLASSES, +) +from cosyvoice.utils.mask import (subsequent_mask, make_pad_mask) + + +class TransformerDecoder(torch.nn.Module): + """Base class of Transfomer decoder module. + Args: + vocab_size: output dim + encoder_output_size: dimension of attention + attention_heads: the number of heads of multi head attention + linear_units: the hidden units number of position-wise feedforward + num_blocks: the number of decoder blocks + dropout_rate: dropout rate + self_attention_dropout_rate: dropout rate for attention + input_layer: input layer type + use_output_layer: whether to use output layer + pos_enc_class: PositionalEncoding or ScaledPositionalEncoding + normalize_before: + True: use layer_norm before each sub-block of a layer. + False: use layer_norm after each sub-block of a layer. + src_attention: if false, encoder-decoder cross attention is not + applied, such as CIF model + key_bias: whether use bias in attention.linear_k, False for whisper models. + gradient_checkpointing: rerunning a forward-pass segment for each + checkpointed segment during backward. + tie_word_embedding: Tie or clone module weights depending of whether we are + using TorchScript or not + """ + + def __init__( + self, + vocab_size: int, + encoder_output_size: int, + attention_heads: int = 4, + linear_units: int = 2048, + num_blocks: int = 6, + dropout_rate: float = 0.1, + positional_dropout_rate: float = 0.1, + self_attention_dropout_rate: float = 0.0, + src_attention_dropout_rate: float = 0.0, + input_layer: str = "embed", + use_output_layer: bool = True, + normalize_before: bool = True, + src_attention: bool = True, + key_bias: bool = True, + activation_type: str = "relu", + gradient_checkpointing: bool = False, + tie_word_embedding: bool = False, + ): + super().__init__() + attention_dim = encoder_output_size + activation = COSYVOICE_ACTIVATION_CLASSES[activation_type]() + + self.embed = torch.nn.Sequential( + torch.nn.Identity() if input_layer == "no_pos" else + torch.nn.Embedding(vocab_size, attention_dim), + COSYVOICE_EMB_CLASSES[input_layer](attention_dim, + positional_dropout_rate), + ) + + self.normalize_before = normalize_before + self.after_norm = torch.nn.LayerNorm(attention_dim, eps=1e-5) + self.use_output_layer = use_output_layer + if use_output_layer: + self.output_layer = torch.nn.Linear(attention_dim, vocab_size) + else: + self.output_layer = torch.nn.Identity() + self.num_blocks = num_blocks + self.decoders = torch.nn.ModuleList([ + DecoderLayer( + attention_dim, + COSYVOICE_ATTENTION_CLASSES["selfattn"]( + attention_heads, attention_dim, + self_attention_dropout_rate, key_bias), + COSYVOICE_ATTENTION_CLASSES["selfattn"]( + attention_heads, attention_dim, src_attention_dropout_rate, + key_bias) if src_attention else None, + PositionwiseFeedForward(attention_dim, linear_units, + dropout_rate, activation), + dropout_rate, + normalize_before, + ) for _ in range(self.num_blocks) + ]) + + self.gradient_checkpointing = gradient_checkpointing + self.tie_word_embedding = tie_word_embedding + + def forward( + self, + memory: torch.Tensor, + memory_mask: torch.Tensor, + ys_in_pad: torch.Tensor, + ys_in_lens: torch.Tensor, + r_ys_in_pad: torch.Tensor = torch.empty(0), + reverse_weight: float = 0.0, + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Forward decoder. + Args: + memory: encoded memory, float32 (batch, maxlen_in, feat) + memory_mask: encoder memory mask, (batch, 1, maxlen_in) + ys_in_pad: padded input token ids, int64 (batch, maxlen_out) + ys_in_lens: input lengths of this batch (batch) + r_ys_in_pad: not used in transformer decoder, in order to unify api + with bidirectional decoder + reverse_weight: not used in transformer decoder, in order to unify + api with bidirectional decode + Returns: + (tuple): tuple containing: + x: decoded token score before softmax (batch, maxlen_out, + vocab_size) if use_output_layer is True, + torch.tensor(0.0), in order to unify api with bidirectional decoder + olens: (batch, ) + NOTE(xcsong): + We pass the `__call__` method of the modules instead of `forward` to the + checkpointing API because `__call__` attaches all the hooks of the module. + https://discuss.pytorch.org/t/any-different-between-model-input-and-model-forward-input/3690/2 + """ + tgt = ys_in_pad + maxlen = tgt.size(1) + # tgt_mask: (B, 1, L) + tgt_mask = ~make_pad_mask(ys_in_lens, maxlen).unsqueeze(1) + tgt_mask = tgt_mask.to(tgt.device) + # m: (1, L, L) + m = subsequent_mask(tgt_mask.size(-1), + device=tgt_mask.device).unsqueeze(0) + # tgt_mask: (B, L, L) + tgt_mask = tgt_mask & m + x, _ = self.embed(tgt) + if self.gradient_checkpointing and self.training: + x = self.forward_layers_checkpointed(x, tgt_mask, memory, + memory_mask) + else: + x = self.forward_layers(x, tgt_mask, memory, memory_mask) + if self.normalize_before: + x = self.after_norm(x) + if self.use_output_layer: + x = self.output_layer(x) + olens = tgt_mask.sum(1) + return x, torch.tensor(0.0), olens + + def forward_layers(self, x: torch.Tensor, tgt_mask: torch.Tensor, + memory: torch.Tensor, + memory_mask: torch.Tensor) -> torch.Tensor: + for layer in self.decoders: + x, tgt_mask, memory, memory_mask = layer(x, tgt_mask, memory, + memory_mask) + return x + + @torch.jit.ignore(drop=True) + def forward_layers_checkpointed(self, x: torch.Tensor, + tgt_mask: torch.Tensor, + memory: torch.Tensor, + memory_mask: torch.Tensor) -> torch.Tensor: + for layer in self.decoders: + x, tgt_mask, memory, memory_mask = ckpt.checkpoint( + layer.__call__, x, tgt_mask, memory, memory_mask) + return x + + def forward_one_step( + self, + memory: torch.Tensor, + memory_mask: torch.Tensor, + tgt: torch.Tensor, + tgt_mask: torch.Tensor, + cache: Optional[List[torch.Tensor]] = None, + ) -> Tuple[torch.Tensor, List[torch.Tensor]]: + """Forward one step. + This is only used for decoding. + Args: + memory: encoded memory, float32 (batch, maxlen_in, feat) + memory_mask: encoded memory mask, (batch, 1, maxlen_in) + tgt: input token ids, int64 (batch, maxlen_out) + tgt_mask: input token mask, (batch, maxlen_out) + dtype=torch.uint8 in PyTorch 1.2- + dtype=torch.bool in PyTorch 1.2+ (include 1.2) + cache: cached output list of (batch, max_time_out-1, size) + Returns: + y, cache: NN output value and cache per `self.decoders`. + y.shape` is (batch, maxlen_out, token) + """ + x, _ = self.embed(tgt) + new_cache = [] + for i, decoder in enumerate(self.decoders): + if cache is None: + c = None + else: + c = cache[i] + x, tgt_mask, memory, memory_mask = decoder(x, + tgt_mask, + memory, + memory_mask, + cache=c) + new_cache.append(x) + if self.normalize_before: + y = self.after_norm(x[:, -1]) + else: + y = x[:, -1] + if self.use_output_layer: + y = torch.log_softmax(self.output_layer(y), dim=-1) + return y, new_cache + + def tie_or_clone_weights(self, jit_mode: bool = True): + """Tie or clone module weights (between word_emb and output_layer) + depending of whether we are using TorchScript or not""" + if not self.use_output_layer: + return + if jit_mode: + logging.info("clone emb.weight to output.weight") + self.output_layer.weight = torch.nn.Parameter( + self.embed[0].weight.clone()) + else: + logging.info("tie emb.weight with output.weight") + self.output_layer.weight = self.embed[0].weight + + if getattr(self.output_layer, "bias", None) is not None: + self.output_layer.bias.data = torch.nn.functional.pad( + self.output_layer.bias.data, + ( + 0, + self.output_layer.weight.shape[0] - + self.output_layer.bias.shape[0], + ), + "constant", + 0, + ) + + +class BiTransformerDecoder(torch.nn.Module): + """Base class of Transfomer decoder module. + Args: + vocab_size: output dim + encoder_output_size: dimension of attention + attention_heads: the number of heads of multi head attention + linear_units: the hidden units number of position-wise feedforward + num_blocks: the number of decoder blocks + r_num_blocks: the number of right to left decoder blocks + dropout_rate: dropout rate + self_attention_dropout_rate: dropout rate for attention + input_layer: input layer type + use_output_layer: whether to use output layer + pos_enc_class: PositionalEncoding or ScaledPositionalEncoding + normalize_before: + True: use layer_norm before each sub-block of a layer. + False: use layer_norm after each sub-block of a layer. + key_bias: whether use bias in attention.linear_k, False for whisper models. + """ + + def __init__( + self, + vocab_size: int, + encoder_output_size: int, + attention_heads: int = 4, + linear_units: int = 2048, + num_blocks: int = 6, + r_num_blocks: int = 0, + dropout_rate: float = 0.1, + positional_dropout_rate: float = 0.1, + self_attention_dropout_rate: float = 0.0, + src_attention_dropout_rate: float = 0.0, + input_layer: str = "embed", + use_output_layer: bool = True, + normalize_before: bool = True, + key_bias: bool = True, + gradient_checkpointing: bool = False, + tie_word_embedding: bool = False, + ): + + super().__init__() + self.tie_word_embedding = tie_word_embedding + self.left_decoder = TransformerDecoder( + vocab_size, + encoder_output_size, + attention_heads, + linear_units, + num_blocks, + dropout_rate, + positional_dropout_rate, + self_attention_dropout_rate, + src_attention_dropout_rate, + input_layer, + use_output_layer, + normalize_before, + key_bias=key_bias, + gradient_checkpointing=gradient_checkpointing, + tie_word_embedding=tie_word_embedding) + + self.right_decoder = TransformerDecoder( + vocab_size, + encoder_output_size, + attention_heads, + linear_units, + r_num_blocks, + dropout_rate, + positional_dropout_rate, + self_attention_dropout_rate, + src_attention_dropout_rate, + input_layer, + use_output_layer, + normalize_before, + key_bias=key_bias, + gradient_checkpointing=gradient_checkpointing, + tie_word_embedding=tie_word_embedding) + + def forward( + self, + memory: torch.Tensor, + memory_mask: torch.Tensor, + ys_in_pad: torch.Tensor, + ys_in_lens: torch.Tensor, + r_ys_in_pad: torch.Tensor, + reverse_weight: float = 0.0, + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Forward decoder. + Args: + memory: encoded memory, float32 (batch, maxlen_in, feat) + memory_mask: encoder memory mask, (batch, 1, maxlen_in) + ys_in_pad: padded input token ids, int64 (batch, maxlen_out) + ys_in_lens: input lengths of this batch (batch) + r_ys_in_pad: padded input token ids, int64 (batch, maxlen_out), + used for right to left decoder + reverse_weight: used for right to left decoder + Returns: + (tuple): tuple containing: + x: decoded token score before softmax (batch, maxlen_out, + vocab_size) if use_output_layer is True, + r_x: x: decoded token score (right to left decoder) + before softmax (batch, maxlen_out, vocab_size) + if use_output_layer is True, + olens: (batch, ) + """ + l_x, _, olens = self.left_decoder(memory, memory_mask, ys_in_pad, + ys_in_lens) + r_x = torch.tensor(0.0) + if reverse_weight > 0.0: + r_x, _, olens = self.right_decoder(memory, memory_mask, + r_ys_in_pad, ys_in_lens) + return l_x, r_x, olens + + def forward_one_step( + self, + memory: torch.Tensor, + memory_mask: torch.Tensor, + tgt: torch.Tensor, + tgt_mask: torch.Tensor, + cache: Optional[List[torch.Tensor]] = None, + ) -> Tuple[torch.Tensor, List[torch.Tensor]]: + """Forward one step. + This is only used for decoding. + Args: + memory: encoded memory, float32 (batch, maxlen_in, feat) + memory_mask: encoded memory mask, (batch, 1, maxlen_in) + tgt: input token ids, int64 (batch, maxlen_out) + tgt_mask: input token mask, (batch, maxlen_out) + dtype=torch.uint8 in PyTorch 1.2- + dtype=torch.bool in PyTorch 1.2+ (include 1.2) + cache: cached output list of (batch, max_time_out-1, size) + Returns: + y, cache: NN output value and cache per `self.decoders`. + y.shape` is (batch, maxlen_out, token) + """ + return self.left_decoder.forward_one_step(memory, memory_mask, tgt, + tgt_mask, cache) + + def tie_or_clone_weights(self, jit_mode: bool = True): + """Tie or clone module weights (between word_emb and output_layer) + depending of whether we are using TorchScript or not""" + self.left_decoder.tie_or_clone_weights(jit_mode) + self.right_decoder.tie_or_clone_weights(jit_mode) diff --git a/xinference/thirdparty/cosyvoice/transformer/decoder_layer.py b/xinference/thirdparty/cosyvoice/transformer/decoder_layer.py new file mode 100644 index 0000000000..91c7c5d7fb --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/decoder_layer.py @@ -0,0 +1,132 @@ +# Copyright (c) 2019 Shigeki Karita +# 2020 Mobvoi Inc (Binbin Zhang) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Decoder self-attention layer definition.""" +from typing import Optional, Tuple + +import torch +from torch import nn + + +class DecoderLayer(nn.Module): + """Single decoder layer module. + + Args: + size (int): Input dimension. + self_attn (torch.nn.Module): Self-attention module instance. + `MultiHeadedAttention` instance can be used as the argument. + src_attn (torch.nn.Module): Inter-attention module instance. + `MultiHeadedAttention` instance can be used as the argument. + If `None` is passed, Inter-attention is not used, such as + CIF, GPT, and other decoder only model. + feed_forward (torch.nn.Module): Feed-forward module instance. + `PositionwiseFeedForward` instance can be used as the argument. + dropout_rate (float): Dropout rate. + normalize_before (bool): + True: use layer_norm before each sub-block. + False: to use layer_norm after each sub-block. + """ + + def __init__( + self, + size: int, + self_attn: nn.Module, + src_attn: Optional[nn.Module], + feed_forward: nn.Module, + dropout_rate: float, + normalize_before: bool = True, + ): + """Construct an DecoderLayer object.""" + super().__init__() + self.size = size + self.self_attn = self_attn + self.src_attn = src_attn + self.feed_forward = feed_forward + self.norm1 = nn.LayerNorm(size, eps=1e-5) + self.norm2 = nn.LayerNorm(size, eps=1e-5) + self.norm3 = nn.LayerNorm(size, eps=1e-5) + self.dropout = nn.Dropout(dropout_rate) + self.normalize_before = normalize_before + + def forward( + self, + tgt: torch.Tensor, + tgt_mask: torch.Tensor, + memory: torch.Tensor, + memory_mask: torch.Tensor, + cache: Optional[torch.Tensor] = None + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: + """Compute decoded features. + + Args: + tgt (torch.Tensor): Input tensor (#batch, maxlen_out, size). + tgt_mask (torch.Tensor): Mask for input tensor + (#batch, maxlen_out). + memory (torch.Tensor): Encoded memory + (#batch, maxlen_in, size). + memory_mask (torch.Tensor): Encoded memory mask + (#batch, maxlen_in). + cache (torch.Tensor): cached tensors. + (#batch, maxlen_out - 1, size). + + Returns: + torch.Tensor: Output tensor (#batch, maxlen_out, size). + torch.Tensor: Mask for output tensor (#batch, maxlen_out). + torch.Tensor: Encoded memory (#batch, maxlen_in, size). + torch.Tensor: Encoded memory mask (#batch, maxlen_in). + + """ + residual = tgt + if self.normalize_before: + tgt = self.norm1(tgt) + + if cache is None: + tgt_q = tgt + tgt_q_mask = tgt_mask + else: + # compute only the last frame query keeping dim: max_time_out -> 1 + assert cache.shape == ( + tgt.shape[0], + tgt.shape[1] - 1, + self.size, + ), "{cache.shape} == {(tgt.shape[0], tgt.shape[1] - 1, self.size)}" + tgt_q = tgt[:, -1:, :] + residual = residual[:, -1:, :] + tgt_q_mask = tgt_mask[:, -1:, :] + + x = residual + self.dropout( + self.self_attn(tgt_q, tgt, tgt, tgt_q_mask)[0]) + if not self.normalize_before: + x = self.norm1(x) + + if self.src_attn is not None: + residual = x + if self.normalize_before: + x = self.norm2(x) + x = residual + self.dropout( + self.src_attn(x, memory, memory, memory_mask)[0]) + if not self.normalize_before: + x = self.norm2(x) + + residual = x + if self.normalize_before: + x = self.norm3(x) + x = residual + self.dropout(self.feed_forward(x)) + if not self.normalize_before: + x = self.norm3(x) + + if cache is not None: + x = torch.cat([cache, x], dim=1) + + return x, tgt_mask, memory, memory_mask diff --git a/xinference/thirdparty/cosyvoice/transformer/embedding.py b/xinference/thirdparty/cosyvoice/transformer/embedding.py new file mode 100644 index 0000000000..46130a503f --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/embedding.py @@ -0,0 +1,293 @@ +# Copyright (c) 2020 Mobvoi Inc. (authors: Binbin Zhang, Di Wu) +# 2024 Alibaba Inc (Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Modified from ESPnet(https://github.com/espnet/espnet) +"""Positonal Encoding Module.""" + +import math +from typing import Tuple, Union + +import torch +import torch.nn.functional as F +import numpy as np + + +class PositionalEncoding(torch.nn.Module): + """Positional encoding. + + :param int d_model: embedding dim + :param float dropout_rate: dropout rate + :param int max_len: maximum input length + + PE(pos, 2i) = sin(pos/(10000^(2i/dmodel))) + PE(pos, 2i+1) = cos(pos/(10000^(2i/dmodel))) + """ + + def __init__(self, + d_model: int, + dropout_rate: float, + max_len: int = 5000, + reverse: bool = False): + """Construct an PositionalEncoding object.""" + super().__init__() + self.d_model = d_model + self.xscale = math.sqrt(self.d_model) + self.dropout = torch.nn.Dropout(p=dropout_rate) + self.max_len = max_len + + self.pe = torch.zeros(self.max_len, self.d_model) + position = torch.arange(0, self.max_len, + dtype=torch.float32).unsqueeze(1) + div_term = torch.exp( + torch.arange(0, self.d_model, 2, dtype=torch.float32) * + -(math.log(10000.0) / self.d_model)) + self.pe[:, 0::2] = torch.sin(position * div_term) + self.pe[:, 1::2] = torch.cos(position * div_term) + self.pe = self.pe.unsqueeze(0) + + def forward(self, + x: torch.Tensor, + offset: Union[int, torch.Tensor] = 0) \ + -> Tuple[torch.Tensor, torch.Tensor]: + """Add positional encoding. + + Args: + x (torch.Tensor): Input. Its shape is (batch, time, ...) + offset (int, torch.tensor): position offset + + Returns: + torch.Tensor: Encoded tensor. Its shape is (batch, time, ...) + torch.Tensor: for compatibility to RelPositionalEncoding + """ + + self.pe = self.pe.to(x.device) + pos_emb = self.position_encoding(offset, x.size(1), False) + x = x * self.xscale + pos_emb + return self.dropout(x), self.dropout(pos_emb) + + def position_encoding(self, + offset: Union[int, torch.Tensor], + size: int, + apply_dropout: bool = True) -> torch.Tensor: + """ For getting encoding in a streaming fashion + + Attention!!!!! + we apply dropout only once at the whole utterance level in a none + streaming way, but will call this function several times with + increasing input size in a streaming scenario, so the dropout will + be applied several times. + + Args: + offset (int or torch.tensor): start offset + size (int): required size of position encoding + + Returns: + torch.Tensor: Corresponding encoding + """ + # How to subscript a Union type: + # https://github.com/pytorch/pytorch/issues/69434 + if isinstance(offset, int): + assert offset + size <= self.max_len + pos_emb = self.pe[:, offset:offset + size] + elif isinstance(offset, torch.Tensor) and offset.dim() == 0: # scalar + assert offset + size <= self.max_len + pos_emb = self.pe[:, offset:offset + size] + else: # for batched streaming decoding on GPU + assert torch.max(offset) + size <= self.max_len + index = offset.unsqueeze(1) + \ + torch.arange(0, size).to(offset.device) # B X T + flag = index > 0 + # remove negative offset + index = index * flag + pos_emb = F.embedding(index, self.pe[0]) # B X T X d_model + + if apply_dropout: + pos_emb = self.dropout(pos_emb) + return pos_emb + + +class RelPositionalEncoding(PositionalEncoding): + """Relative positional encoding module. + See : Appendix B in https://arxiv.org/abs/1901.02860 + Args: + d_model (int): Embedding dimension. + dropout_rate (float): Dropout rate. + max_len (int): Maximum input length. + """ + + def __init__(self, d_model: int, dropout_rate: float, max_len: int = 5000): + """Initialize class.""" + super().__init__(d_model, dropout_rate, max_len, reverse=True) + + def forward(self, + x: torch.Tensor, + offset: Union[int, torch.Tensor] = 0) \ + -> Tuple[torch.Tensor, torch.Tensor]: + """Compute positional encoding. + Args: + x (torch.Tensor): Input tensor (batch, time, `*`). + Returns: + torch.Tensor: Encoded tensor (batch, time, `*`). + torch.Tensor: Positional embedding tensor (1, time, `*`). + """ + self.pe = self.pe.to(x.device) + x = x * self.xscale + pos_emb = self.position_encoding(offset, x.size(1), False) + return self.dropout(x), self.dropout(pos_emb) + + +class WhisperPositionalEncoding(PositionalEncoding): + """ Sinusoids position encoding used in openai-whisper.encoder + """ + + def __init__(self, d_model: int, dropout_rate: float, max_len: int = 1500): + super().__init__(d_model, dropout_rate, max_len) + self.xscale = 1.0 + log_timescale_increment = np.log(10000) / (d_model // 2 - 1) + inv_timescales = torch.exp(-log_timescale_increment * + torch.arange(d_model // 2)) + scaled_time = torch.arange(max_len)[:, np.newaxis] * \ + inv_timescales[np.newaxis, :] + pe = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], dim=1) + delattr(self, "pe") + self.register_buffer("pe", pe.unsqueeze(0)) + + +class LearnablePositionalEncoding(PositionalEncoding): + """ Learnable position encoding used in openai-whisper.decoder + """ + + def __init__(self, d_model: int, dropout_rate: float, max_len: int = 448): + super().__init__(d_model, dropout_rate, max_len) + # NOTE(xcsong): overwrite self.pe & self.xscale + self.pe = torch.nn.Parameter(torch.empty(1, max_len, d_model)) + self.xscale = 1.0 + + +class NoPositionalEncoding(torch.nn.Module): + """ No position encoding + """ + + def __init__(self, d_model: int, dropout_rate: float): + super().__init__() + self.d_model = d_model + self.dropout = torch.nn.Dropout(p=dropout_rate) + + def forward(self, + x: torch.Tensor, + offset: Union[int, torch.Tensor] = 0) \ + -> Tuple[torch.Tensor, torch.Tensor]: + """ Just return zero vector for interface compatibility + """ + pos_emb = torch.zeros(1, x.size(1), self.d_model).to(x.device) + return self.dropout(x), pos_emb + + def position_encoding(self, offset: Union[int, torch.Tensor], + size: int) -> torch.Tensor: + return torch.zeros(1, size, self.d_model) + + +class EspnetRelPositionalEncoding(torch.nn.Module): + """Relative positional encoding module (new implementation). + + Details can be found in https://github.com/espnet/espnet/pull/2816. + + See : Appendix B in https://arxiv.org/abs/1901.02860 + + Args: + d_model (int): Embedding dimension. + dropout_rate (float): Dropout rate. + max_len (int): Maximum input length. + + """ + + def __init__(self, d_model, dropout_rate, max_len=5000): + """Construct an PositionalEncoding object.""" + super(EspnetRelPositionalEncoding, self).__init__() + self.d_model = d_model + self.xscale = math.sqrt(self.d_model) + self.dropout = torch.nn.Dropout(p=dropout_rate) + self.pe = None + self.extend_pe(torch.tensor(0.0).expand(1, max_len)) + + def extend_pe(self, x): + """Reset the positional encodings.""" + if self.pe is not None: + # self.pe contains both positive and negative parts + # the length of self.pe is 2 * input_len - 1 + if self.pe.size(1) >= x.size(1) * 2 - 1: + if self.pe.dtype != x.dtype or self.pe.device != x.device: + self.pe = self.pe.to(dtype=x.dtype, device=x.device) + return + # Suppose `i` means to the position of query vecotr and `j` means the + # position of key vector. We use position relative positions when keys + # are to the left (i>j) and negative relative positions otherwise (i<j). + pe_positive = torch.zeros(x.size(1), self.d_model) + pe_negative = torch.zeros(x.size(1), self.d_model) + position = torch.arange(0, x.size(1), dtype=torch.float32).unsqueeze(1) + div_term = torch.exp( + torch.arange(0, self.d_model, 2, dtype=torch.float32) + * -(math.log(10000.0) / self.d_model) + ) + pe_positive[:, 0::2] = torch.sin(position * div_term) + pe_positive[:, 1::2] = torch.cos(position * div_term) + pe_negative[:, 0::2] = torch.sin(-1 * position * div_term) + pe_negative[:, 1::2] = torch.cos(-1 * position * div_term) + + # Reserve the order of positive indices and concat both positive and + # negative indices. This is used to support the shifting trick + # as in https://arxiv.org/abs/1901.02860 + pe_positive = torch.flip(pe_positive, [0]).unsqueeze(0) + pe_negative = pe_negative[1:].unsqueeze(0) + pe = torch.cat([pe_positive, pe_negative], dim=1) + self.pe = pe.to(device=x.device, dtype=x.dtype) + + def forward(self, x: torch.Tensor, offset: Union[int, torch.Tensor] = 0): + """Add positional encoding. + + Args: + x (torch.Tensor): Input tensor (batch, time, `*`). + + Returns: + torch.Tensor: Encoded tensor (batch, time, `*`). + + """ + self.extend_pe(x) + x = x * self.xscale + pos_emb = self.position_encoding(size=x.size(1), offset=offset) + return self.dropout(x), self.dropout(pos_emb) + + def position_encoding(self, + offset: Union[int, torch.Tensor], + size: int) -> torch.Tensor: + """ For getting encoding in a streaming fashion + + Attention!!!!! + we apply dropout only once at the whole utterance level in a none + streaming way, but will call this function several times with + increasing input size in a streaming scenario, so the dropout will + be applied several times. + + Args: + offset (int or torch.tensor): start offset + size (int): required size of position encoding + + Returns: + torch.Tensor: Corresponding encoding + """ + pos_emb = self.pe[ + :, + self.pe.size(1) // 2 - size + 1 : self.pe.size(1) // 2 + size, + ] + return pos_emb diff --git a/xinference/thirdparty/cosyvoice/transformer/encoder.py b/xinference/thirdparty/cosyvoice/transformer/encoder.py new file mode 100644 index 0000000000..7e8bd230b2 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/encoder.py @@ -0,0 +1,472 @@ +# Copyright (c) 2021 Mobvoi Inc (Binbin Zhang, Di Wu) +# 2022 Xingchen Song (sxc19@mails.tsinghua.edu.cn) +# 2024 Alibaba Inc (Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Modified from ESPnet(https://github.com/espnet/espnet) +"""Encoder definition.""" +from typing import Tuple + +import torch +import torch.utils.checkpoint as ckpt + +from cosyvoice.transformer.convolution import ConvolutionModule +from cosyvoice.transformer.encoder_layer import TransformerEncoderLayer +from cosyvoice.transformer.encoder_layer import ConformerEncoderLayer +from cosyvoice.transformer.positionwise_feed_forward import PositionwiseFeedForward +from cosyvoice.utils.class_utils import ( + COSYVOICE_EMB_CLASSES, + COSYVOICE_SUBSAMPLE_CLASSES, + COSYVOICE_ATTENTION_CLASSES, + COSYVOICE_ACTIVATION_CLASSES, +) +from cosyvoice.utils.mask import make_pad_mask +from cosyvoice.utils.mask import add_optional_chunk_mask + + +class BaseEncoder(torch.nn.Module): + + def __init__( + self, + input_size: int, + output_size: int = 256, + attention_heads: int = 4, + linear_units: int = 2048, + num_blocks: int = 6, + dropout_rate: float = 0.1, + positional_dropout_rate: float = 0.1, + attention_dropout_rate: float = 0.0, + input_layer: str = "conv2d", + pos_enc_layer_type: str = "abs_pos", + normalize_before: bool = True, + static_chunk_size: int = 0, + use_dynamic_chunk: bool = False, + global_cmvn: torch.nn.Module = None, + use_dynamic_left_chunk: bool = False, + gradient_checkpointing: bool = False, + ): + """ + Args: + input_size (int): input dim + output_size (int): dimension of attention + attention_heads (int): the number of heads of multi head attention + linear_units (int): the hidden units number of position-wise feed + forward + num_blocks (int): the number of decoder blocks + dropout_rate (float): dropout rate + attention_dropout_rate (float): dropout rate in attention + positional_dropout_rate (float): dropout rate after adding + positional encoding + input_layer (str): input layer type. + optional [linear, conv2d, conv2d6, conv2d8] + pos_enc_layer_type (str): Encoder positional encoding layer type. + opitonal [abs_pos, scaled_abs_pos, rel_pos, no_pos] + normalize_before (bool): + True: use layer_norm before each sub-block of a layer. + False: use layer_norm after each sub-block of a layer. + static_chunk_size (int): chunk size for static chunk training and + decoding + use_dynamic_chunk (bool): whether use dynamic chunk size for + training or not, You can only use fixed chunk(chunk_size > 0) + or dyanmic chunk size(use_dynamic_chunk = True) + global_cmvn (Optional[torch.nn.Module]): Optional GlobalCMVN module + use_dynamic_left_chunk (bool): whether use dynamic left chunk in + dynamic chunk training + key_bias: whether use bias in attention.linear_k, False for whisper models. + gradient_checkpointing: rerunning a forward-pass segment for each + checkpointed segment during backward. + """ + super().__init__() + self._output_size = output_size + + self.global_cmvn = global_cmvn + self.embed = COSYVOICE_SUBSAMPLE_CLASSES[input_layer]( + input_size, + output_size, + dropout_rate, + COSYVOICE_EMB_CLASSES[pos_enc_layer_type](output_size, + positional_dropout_rate), + ) + + self.normalize_before = normalize_before + self.after_norm = torch.nn.LayerNorm(output_size, eps=1e-5) + self.static_chunk_size = static_chunk_size + self.use_dynamic_chunk = use_dynamic_chunk + self.use_dynamic_left_chunk = use_dynamic_left_chunk + self.gradient_checkpointing = gradient_checkpointing + + def output_size(self) -> int: + return self._output_size + + def forward( + self, + xs: torch.Tensor, + xs_lens: torch.Tensor, + decoding_chunk_size: int = 0, + num_decoding_left_chunks: int = -1, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Embed positions in tensor. + + Args: + xs: padded input tensor (B, T, D) + xs_lens: input length (B) + decoding_chunk_size: decoding chunk size for dynamic chunk + 0: default for training, use random dynamic chunk. + <0: for decoding, use full chunk. + >0: for decoding, use fixed chunk size as set. + num_decoding_left_chunks: number of left chunks, this is for decoding, + the chunk size is decoding_chunk_size. + >=0: use num_decoding_left_chunks + <0: use all left chunks + Returns: + encoder output tensor xs, and subsampled masks + xs: padded output tensor (B, T' ~= T/subsample_rate, D) + masks: torch.Tensor batch padding mask after subsample + (B, 1, T' ~= T/subsample_rate) + NOTE(xcsong): + We pass the `__call__` method of the modules instead of `forward` to the + checkpointing API because `__call__` attaches all the hooks of the module. + https://discuss.pytorch.org/t/any-different-between-model-input-and-model-forward-input/3690/2 + """ + T = xs.size(1) + masks = ~make_pad_mask(xs_lens, T).unsqueeze(1) # (B, 1, T) + if self.global_cmvn is not None: + xs = self.global_cmvn(xs) + xs, pos_emb, masks = self.embed(xs, masks) + mask_pad = masks # (B, 1, T/subsample_rate) + chunk_masks = add_optional_chunk_mask(xs, masks, + self.use_dynamic_chunk, + self.use_dynamic_left_chunk, + decoding_chunk_size, + self.static_chunk_size, + num_decoding_left_chunks) + if self.gradient_checkpointing and self.training: + xs = self.forward_layers_checkpointed(xs, chunk_masks, pos_emb, + mask_pad) + else: + xs = self.forward_layers(xs, chunk_masks, pos_emb, mask_pad) + if self.normalize_before: + xs = self.after_norm(xs) + # Here we assume the mask is not changed in encoder layers, so just + # return the masks before encoder layers, and the masks will be used + # for cross attention with decoder later + return xs, masks + + def forward_layers(self, xs: torch.Tensor, chunk_masks: torch.Tensor, + pos_emb: torch.Tensor, + mask_pad: torch.Tensor) -> torch.Tensor: + for layer in self.encoders: + xs, chunk_masks, _, _ = layer(xs, chunk_masks, pos_emb, mask_pad) + return xs + + @torch.jit.ignore(drop=True) + def forward_layers_checkpointed(self, xs: torch.Tensor, + chunk_masks: torch.Tensor, + pos_emb: torch.Tensor, + mask_pad: torch.Tensor) -> torch.Tensor: + for layer in self.encoders: + xs, chunk_masks, _, _ = ckpt.checkpoint(layer.__call__, xs, + chunk_masks, pos_emb, + mask_pad) + return xs + + def forward_chunk( + self, + xs: torch.Tensor, + offset: int, + required_cache_size: int, + att_cache: torch.Tensor = torch.zeros(0, 0, 0, 0), + cnn_cache: torch.Tensor = torch.zeros(0, 0, 0, 0), + att_mask: torch.Tensor = torch.ones((0, 0, 0), dtype=torch.bool), + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """ Forward just one chunk + + Args: + xs (torch.Tensor): chunk input, with shape (b=1, time, mel-dim), + where `time == (chunk_size - 1) * subsample_rate + \ + subsample.right_context + 1` + offset (int): current offset in encoder output time stamp + required_cache_size (int): cache size required for next chunk + compuation + >=0: actual cache size + <0: means all history cache is required + att_cache (torch.Tensor): cache tensor for KEY & VALUE in + transformer/conformer attention, with shape + (elayers, head, cache_t1, d_k * 2), where + `head * d_k == hidden-dim` and + `cache_t1 == chunk_size * num_decoding_left_chunks`. + cnn_cache (torch.Tensor): cache tensor for cnn_module in conformer, + (elayers, b=1, hidden-dim, cache_t2), where + `cache_t2 == cnn.lorder - 1` + + Returns: + torch.Tensor: output of current input xs, + with shape (b=1, chunk_size, hidden-dim). + torch.Tensor: new attention cache required for next chunk, with + dynamic shape (elayers, head, ?, d_k * 2) + depending on required_cache_size. + torch.Tensor: new conformer cnn cache required for next chunk, with + same shape as the original cnn_cache. + + """ + assert xs.size(0) == 1 + # tmp_masks is just for interface compatibility + tmp_masks = torch.ones(1, + xs.size(1), + device=xs.device, + dtype=torch.bool) + tmp_masks = tmp_masks.unsqueeze(1) + if self.global_cmvn is not None: + xs = self.global_cmvn(xs) + # NOTE(xcsong): Before embed, shape(xs) is (b=1, time, mel-dim) + xs, pos_emb, _ = self.embed(xs, tmp_masks, offset) + # NOTE(xcsong): After embed, shape(xs) is (b=1, chunk_size, hidden-dim) + elayers, cache_t1 = att_cache.size(0), att_cache.size(2) + chunk_size = xs.size(1) + attention_key_size = cache_t1 + chunk_size + pos_emb = self.embed.position_encoding(offset=offset - cache_t1, + size=attention_key_size) + if required_cache_size < 0: + next_cache_start = 0 + elif required_cache_size == 0: + next_cache_start = attention_key_size + else: + next_cache_start = max(attention_key_size - required_cache_size, 0) + r_att_cache = [] + r_cnn_cache = [] + for i, layer in enumerate(self.encoders): + # NOTE(xcsong): Before layer.forward + # shape(att_cache[i:i + 1]) is (1, head, cache_t1, d_k * 2), + # shape(cnn_cache[i]) is (b=1, hidden-dim, cache_t2) + xs, _, new_att_cache, new_cnn_cache = layer( + xs, + att_mask, + pos_emb, + att_cache=att_cache[i:i + 1] if elayers > 0 else att_cache, + cnn_cache=cnn_cache[i] if cnn_cache.size(0) > 0 else cnn_cache) + # NOTE(xcsong): After layer.forward + # shape(new_att_cache) is (1, head, attention_key_size, d_k * 2), + # shape(new_cnn_cache) is (b=1, hidden-dim, cache_t2) + r_att_cache.append(new_att_cache[:, :, next_cache_start:, :]) + r_cnn_cache.append(new_cnn_cache.unsqueeze(0)) + if self.normalize_before: + xs = self.after_norm(xs) + + # NOTE(xcsong): shape(r_att_cache) is (elayers, head, ?, d_k * 2), + # ? may be larger than cache_t1, it depends on required_cache_size + r_att_cache = torch.cat(r_att_cache, dim=0) + # NOTE(xcsong): shape(r_cnn_cache) is (e, b=1, hidden-dim, cache_t2) + r_cnn_cache = torch.cat(r_cnn_cache, dim=0) + + return (xs, r_att_cache, r_cnn_cache) + + def forward_chunk_by_chunk( + self, + xs: torch.Tensor, + decoding_chunk_size: int, + num_decoding_left_chunks: int = -1, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """ Forward input chunk by chunk with chunk_size like a streaming + fashion + + Here we should pay special attention to computation cache in the + streaming style forward chunk by chunk. Three things should be taken + into account for computation in the current network: + 1. transformer/conformer encoder layers output cache + 2. convolution in conformer + 3. convolution in subsampling + + However, we don't implement subsampling cache for: + 1. We can control subsampling module to output the right result by + overlapping input instead of cache left context, even though it + wastes some computation, but subsampling only takes a very + small fraction of computation in the whole model. + 2. Typically, there are several covolution layers with subsampling + in subsampling module, it is tricky and complicated to do cache + with different convolution layers with different subsampling + rate. + 3. Currently, nn.Sequential is used to stack all the convolution + layers in subsampling, we need to rewrite it to make it work + with cache, which is not prefered. + Args: + xs (torch.Tensor): (1, max_len, dim) + chunk_size (int): decoding chunk size + """ + assert decoding_chunk_size > 0 + # The model is trained by static or dynamic chunk + assert self.static_chunk_size > 0 or self.use_dynamic_chunk + subsampling = self.embed.subsampling_rate + context = self.embed.right_context + 1 # Add current frame + stride = subsampling * decoding_chunk_size + decoding_window = (decoding_chunk_size - 1) * subsampling + context + num_frames = xs.size(1) + att_cache: torch.Tensor = torch.zeros((0, 0, 0, 0), device=xs.device) + cnn_cache: torch.Tensor = torch.zeros((0, 0, 0, 0), device=xs.device) + outputs = [] + offset = 0 + required_cache_size = decoding_chunk_size * num_decoding_left_chunks + + # Feed forward overlap input step by step + for cur in range(0, num_frames - context + 1, stride): + end = min(cur + decoding_window, num_frames) + chunk_xs = xs[:, cur:end, :] + (y, att_cache, + cnn_cache) = self.forward_chunk(chunk_xs, offset, + required_cache_size, att_cache, + cnn_cache) + outputs.append(y) + offset += y.size(1) + ys = torch.cat(outputs, 1) + masks = torch.ones((1, 1, ys.size(1)), + device=ys.device, + dtype=torch.bool) + return ys, masks + + +class TransformerEncoder(BaseEncoder): + """Transformer encoder module.""" + + def __init__( + self, + input_size: int, + output_size: int = 256, + attention_heads: int = 4, + linear_units: int = 2048, + num_blocks: int = 6, + dropout_rate: float = 0.1, + positional_dropout_rate: float = 0.1, + attention_dropout_rate: float = 0.0, + input_layer: str = "conv2d", + pos_enc_layer_type: str = "abs_pos", + normalize_before: bool = True, + static_chunk_size: int = 0, + use_dynamic_chunk: bool = False, + global_cmvn: torch.nn.Module = None, + use_dynamic_left_chunk: bool = False, + key_bias: bool = True, + selfattention_layer_type: str = "selfattn", + activation_type: str = "relu", + gradient_checkpointing: bool = False, + ): + """ Construct TransformerEncoder + + See Encoder for the meaning of each parameter. + """ + super().__init__(input_size, output_size, attention_heads, + linear_units, num_blocks, dropout_rate, + positional_dropout_rate, attention_dropout_rate, + input_layer, pos_enc_layer_type, normalize_before, + static_chunk_size, use_dynamic_chunk, global_cmvn, + use_dynamic_left_chunk, gradient_checkpointing) + activation = COSYVOICE_ACTIVATION_CLASSES[activation_type]() + self.encoders = torch.nn.ModuleList([ + TransformerEncoderLayer( + output_size, + COSYVOICE_ATTENTION_CLASSES[selfattention_layer_type](attention_heads, + output_size, + attention_dropout_rate, + key_bias), + PositionwiseFeedForward(output_size, linear_units, + dropout_rate, activation), + dropout_rate, normalize_before) for _ in range(num_blocks) + ]) + + +class ConformerEncoder(BaseEncoder): + """Conformer encoder module.""" + + def __init__( + self, + input_size: int, + output_size: int = 256, + attention_heads: int = 4, + linear_units: int = 2048, + num_blocks: int = 6, + dropout_rate: float = 0.1, + positional_dropout_rate: float = 0.1, + attention_dropout_rate: float = 0.0, + input_layer: str = "conv2d", + pos_enc_layer_type: str = "rel_pos", + normalize_before: bool = True, + static_chunk_size: int = 0, + use_dynamic_chunk: bool = False, + global_cmvn: torch.nn.Module = None, + use_dynamic_left_chunk: bool = False, + positionwise_conv_kernel_size: int = 1, + macaron_style: bool = True, + selfattention_layer_type: str = "rel_selfattn", + activation_type: str = "swish", + use_cnn_module: bool = True, + cnn_module_kernel: int = 15, + causal: bool = False, + cnn_module_norm: str = "batch_norm", + key_bias: bool = True, + gradient_checkpointing: bool = False, + ): + """Construct ConformerEncoder + + Args: + input_size to use_dynamic_chunk, see in BaseEncoder + positionwise_conv_kernel_size (int): Kernel size of positionwise + conv1d layer. + macaron_style (bool): Whether to use macaron style for + positionwise layer. + selfattention_layer_type (str): Encoder attention layer type, + the parameter has no effect now, it's just for configure + compatibility. + activation_type (str): Encoder activation function type. + use_cnn_module (bool): Whether to use convolution module. + cnn_module_kernel (int): Kernel size of convolution module. + causal (bool): whether to use causal convolution or not. + key_bias: whether use bias in attention.linear_k, False for whisper models. + """ + super().__init__(input_size, output_size, attention_heads, + linear_units, num_blocks, dropout_rate, + positional_dropout_rate, attention_dropout_rate, + input_layer, pos_enc_layer_type, normalize_before, + static_chunk_size, use_dynamic_chunk, global_cmvn, + use_dynamic_left_chunk, gradient_checkpointing) + activation = COSYVOICE_ACTIVATION_CLASSES[activation_type]() + + # self-attention module definition + encoder_selfattn_layer_args = ( + attention_heads, + output_size, + attention_dropout_rate, + key_bias, + ) + # feed-forward module definition + positionwise_layer_args = ( + output_size, + linear_units, + dropout_rate, + activation, + ) + # convolution module definition + convolution_layer_args = (output_size, cnn_module_kernel, activation, + cnn_module_norm, causal) + + self.encoders = torch.nn.ModuleList([ + ConformerEncoderLayer( + output_size, + COSYVOICE_ATTENTION_CLASSES[selfattention_layer_type]( + *encoder_selfattn_layer_args), + PositionwiseFeedForward(*positionwise_layer_args), + PositionwiseFeedForward( + *positionwise_layer_args) if macaron_style else None, + ConvolutionModule( + *convolution_layer_args) if use_cnn_module else None, + dropout_rate, + normalize_before, + ) for _ in range(num_blocks) + ]) diff --git a/xinference/thirdparty/cosyvoice/transformer/encoder_layer.py b/xinference/thirdparty/cosyvoice/transformer/encoder_layer.py new file mode 100644 index 0000000000..dfd758bc1c --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/encoder_layer.py @@ -0,0 +1,236 @@ +# Copyright (c) 2021 Mobvoi Inc (Binbin Zhang, Di Wu) +# 2022 Xingchen Song (sxc19@mails.tsinghua.edu.cn) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Modified from ESPnet(https://github.com/espnet/espnet) +"""Encoder self-attention layer definition.""" + +from typing import Optional, Tuple + +import torch +from torch import nn + + +class TransformerEncoderLayer(nn.Module): + """Encoder layer module. + + Args: + size (int): Input dimension. + self_attn (torch.nn.Module): Self-attention module instance. + `MultiHeadedAttention` or `RelPositionMultiHeadedAttention` + instance can be used as the argument. + feed_forward (torch.nn.Module): Feed-forward module instance. + `PositionwiseFeedForward`, instance can be used as the argument. + dropout_rate (float): Dropout rate. + normalize_before (bool): + True: use layer_norm before each sub-block. + False: to use layer_norm after each sub-block. + """ + + def __init__( + self, + size: int, + self_attn: torch.nn.Module, + feed_forward: torch.nn.Module, + dropout_rate: float, + normalize_before: bool = True, + ): + """Construct an EncoderLayer object.""" + super().__init__() + self.self_attn = self_attn + self.feed_forward = feed_forward + self.norm1 = nn.LayerNorm(size, eps=1e-5) + self.norm2 = nn.LayerNorm(size, eps=1e-5) + self.dropout = nn.Dropout(dropout_rate) + self.size = size + self.normalize_before = normalize_before + + def forward( + self, + x: torch.Tensor, + mask: torch.Tensor, + pos_emb: torch.Tensor, + mask_pad: torch.Tensor = torch.ones((0, 0, 0), dtype=torch.bool), + att_cache: torch.Tensor = torch.zeros((0, 0, 0, 0)), + cnn_cache: torch.Tensor = torch.zeros((0, 0, 0, 0)), + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: + """Compute encoded features. + + Args: + x (torch.Tensor): (#batch, time, size) + mask (torch.Tensor): Mask tensor for the input (#batch, time,time), + (0, 0, 0) means fake mask. + pos_emb (torch.Tensor): just for interface compatibility + to ConformerEncoderLayer + mask_pad (torch.Tensor): does not used in transformer layer, + just for unified api with conformer. + att_cache (torch.Tensor): Cache tensor of the KEY & VALUE + (#batch=1, head, cache_t1, d_k * 2), head * d_k == size. + cnn_cache (torch.Tensor): Convolution cache in conformer layer + (#batch=1, size, cache_t2), not used here, it's for interface + compatibility to ConformerEncoderLayer. + Returns: + torch.Tensor: Output tensor (#batch, time, size). + torch.Tensor: Mask tensor (#batch, time, time). + torch.Tensor: att_cache tensor, + (#batch=1, head, cache_t1 + time, d_k * 2). + torch.Tensor: cnn_cahce tensor (#batch=1, size, cache_t2). + + """ + residual = x + if self.normalize_before: + x = self.norm1(x) + x_att, new_att_cache = self.self_attn(x, x, x, mask, pos_emb=pos_emb, cache=att_cache) + x = residual + self.dropout(x_att) + if not self.normalize_before: + x = self.norm1(x) + + residual = x + if self.normalize_before: + x = self.norm2(x) + x = residual + self.dropout(self.feed_forward(x)) + if not self.normalize_before: + x = self.norm2(x) + + fake_cnn_cache = torch.zeros((0, 0, 0), dtype=x.dtype, device=x.device) + return x, mask, new_att_cache, fake_cnn_cache + + +class ConformerEncoderLayer(nn.Module): + """Encoder layer module. + Args: + size (int): Input dimension. + self_attn (torch.nn.Module): Self-attention module instance. + `MultiHeadedAttention` or `RelPositionMultiHeadedAttention` + instance can be used as the argument. + feed_forward (torch.nn.Module): Feed-forward module instance. + `PositionwiseFeedForward` instance can be used as the argument. + feed_forward_macaron (torch.nn.Module): Additional feed-forward module + instance. + `PositionwiseFeedForward` instance can be used as the argument. + conv_module (torch.nn.Module): Convolution module instance. + `ConvlutionModule` instance can be used as the argument. + dropout_rate (float): Dropout rate. + normalize_before (bool): + True: use layer_norm before each sub-block. + False: use layer_norm after each sub-block. + """ + + def __init__( + self, + size: int, + self_attn: torch.nn.Module, + feed_forward: Optional[nn.Module] = None, + feed_forward_macaron: Optional[nn.Module] = None, + conv_module: Optional[nn.Module] = None, + dropout_rate: float = 0.1, + normalize_before: bool = True, + ): + """Construct an EncoderLayer object.""" + super().__init__() + self.self_attn = self_attn + self.feed_forward = feed_forward + self.feed_forward_macaron = feed_forward_macaron + self.conv_module = conv_module + self.norm_ff = nn.LayerNorm(size, eps=1e-5) # for the FNN module + self.norm_mha = nn.LayerNorm(size, eps=1e-5) # for the MHA module + if feed_forward_macaron is not None: + self.norm_ff_macaron = nn.LayerNorm(size, eps=1e-5) + self.ff_scale = 0.5 + else: + self.ff_scale = 1.0 + if self.conv_module is not None: + self.norm_conv = nn.LayerNorm(size, eps=1e-5) # for the CNN module + self.norm_final = nn.LayerNorm( + size, eps=1e-5) # for the final output of the block + self.dropout = nn.Dropout(dropout_rate) + self.size = size + self.normalize_before = normalize_before + + def forward( + self, + x: torch.Tensor, + mask: torch.Tensor, + pos_emb: torch.Tensor, + mask_pad: torch.Tensor = torch.ones((0, 0, 0), dtype=torch.bool), + att_cache: torch.Tensor = torch.zeros((0, 0, 0, 0)), + cnn_cache: torch.Tensor = torch.zeros((0, 0, 0, 0)), + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: + """Compute encoded features. + + Args: + x (torch.Tensor): (#batch, time, size) + mask (torch.Tensor): Mask tensor for the input (#batch, time,time), + (0, 0, 0) means fake mask. + pos_emb (torch.Tensor): positional encoding, must not be None + for ConformerEncoderLayer. + mask_pad (torch.Tensor): batch padding mask used for conv module. + (#batch, 1,time), (0, 0, 0) means fake mask. + att_cache (torch.Tensor): Cache tensor of the KEY & VALUE + (#batch=1, head, cache_t1, d_k * 2), head * d_k == size. + cnn_cache (torch.Tensor): Convolution cache in conformer layer + (#batch=1, size, cache_t2) + Returns: + torch.Tensor: Output tensor (#batch, time, size). + torch.Tensor: Mask tensor (#batch, time, time). + torch.Tensor: att_cache tensor, + (#batch=1, head, cache_t1 + time, d_k * 2). + torch.Tensor: cnn_cahce tensor (#batch, size, cache_t2). + """ + + # whether to use macaron style + if self.feed_forward_macaron is not None: + residual = x + if self.normalize_before: + x = self.norm_ff_macaron(x) + x = residual + self.ff_scale * self.dropout( + self.feed_forward_macaron(x)) + if not self.normalize_before: + x = self.norm_ff_macaron(x) + + # multi-headed self-attention module + residual = x + if self.normalize_before: + x = self.norm_mha(x) + x_att, new_att_cache = self.self_attn(x, x, x, mask, pos_emb, + att_cache) + x = residual + self.dropout(x_att) + if not self.normalize_before: + x = self.norm_mha(x) + + # convolution module + # Fake new cnn cache here, and then change it in conv_module + new_cnn_cache = torch.zeros((0, 0, 0), dtype=x.dtype, device=x.device) + if self.conv_module is not None: + residual = x + if self.normalize_before: + x = self.norm_conv(x) + x, new_cnn_cache = self.conv_module(x, mask_pad, cnn_cache) + x = residual + self.dropout(x) + + if not self.normalize_before: + x = self.norm_conv(x) + + # feed forward module + residual = x + if self.normalize_before: + x = self.norm_ff(x) + + x = residual + self.ff_scale * self.dropout(self.feed_forward(x)) + if not self.normalize_before: + x = self.norm_ff(x) + + if self.conv_module is not None: + x = self.norm_final(x) + + return x, mask, new_att_cache, new_cnn_cache diff --git a/xinference/thirdparty/cosyvoice/transformer/label_smoothing_loss.py b/xinference/thirdparty/cosyvoice/transformer/label_smoothing_loss.py new file mode 100644 index 0000000000..feacabf096 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/label_smoothing_loss.py @@ -0,0 +1,96 @@ +# Copyright (c) 2019 Shigeki Karita +# 2020 Mobvoi Inc (Binbin Zhang) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Label smoothing module.""" + +import torch +from torch import nn + + +class LabelSmoothingLoss(nn.Module): + """Label-smoothing loss. + + In a standard CE loss, the label's data distribution is: + [0,1,2] -> + [ + [1.0, 0.0, 0.0], + [0.0, 1.0, 0.0], + [0.0, 0.0, 1.0], + ] + + In the smoothing version CE Loss,some probabilities + are taken from the true label prob (1.0) and are divided + among other labels. + + e.g. + smoothing=0.1 + [0,1,2] -> + [ + [0.9, 0.05, 0.05], + [0.05, 0.9, 0.05], + [0.05, 0.05, 0.9], + ] + + Args: + size (int): the number of class + padding_idx (int): padding class id which will be ignored for loss + smoothing (float): smoothing rate (0.0 means the conventional CE) + normalize_length (bool): + normalize loss by sequence length if True + normalize loss by batch size if False + """ + + def __init__(self, + size: int, + padding_idx: int, + smoothing: float, + normalize_length: bool = False): + """Construct an LabelSmoothingLoss object.""" + super(LabelSmoothingLoss, self).__init__() + self.criterion = nn.KLDivLoss(reduction="none") + self.padding_idx = padding_idx + self.confidence = 1.0 - smoothing + self.smoothing = smoothing + self.size = size + self.normalize_length = normalize_length + + def forward(self, x: torch.Tensor, target: torch.Tensor) -> torch.Tensor: + """Compute loss between x and target. + + The model outputs and data labels tensors are flatten to + (batch*seqlen, class) shape and a mask is applied to the + padding part which should not be calculated for loss. + + Args: + x (torch.Tensor): prediction (batch, seqlen, class) + target (torch.Tensor): + target signal masked with self.padding_id (batch, seqlen) + Returns: + loss (torch.Tensor) : The KL loss, scalar float value + """ + assert x.size(2) == self.size + batch_size = x.size(0) + x = x.view(-1, self.size) + target = target.view(-1) + # use zeros_like instead of torch.no_grad() for true_dist, + # since no_grad() can not be exported by JIT + true_dist = torch.zeros_like(x) + true_dist.fill_(self.smoothing / (self.size - 1)) + ignore = target == self.padding_idx # (B,) + total = len(target) - ignore.sum().item() + target = target.masked_fill(ignore, 0) # avoid -1 index + true_dist.scatter_(1, target.unsqueeze(1), self.confidence) + kl = self.criterion(torch.log_softmax(x, dim=1), true_dist) + denom = total if self.normalize_length else batch_size + return kl.masked_fill(ignore.unsqueeze(1), 0).sum() / denom diff --git a/xinference/thirdparty/cosyvoice/transformer/positionwise_feed_forward.py b/xinference/thirdparty/cosyvoice/transformer/positionwise_feed_forward.py new file mode 100644 index 0000000000..b7a2cf6e73 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/positionwise_feed_forward.py @@ -0,0 +1,115 @@ +# Copyright (c) 2019 Shigeki Karita +# 2020 Mobvoi Inc (Binbin Zhang) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Positionwise feed forward layer definition.""" + +import torch + + +class PositionwiseFeedForward(torch.nn.Module): + """Positionwise feed forward layer. + + FeedForward are appied on each position of the sequence. + The output dim is same with the input dim. + + Args: + idim (int): Input dimenstion. + hidden_units (int): The number of hidden units. + dropout_rate (float): Dropout rate. + activation (torch.nn.Module): Activation function + """ + + def __init__( + self, + idim: int, + hidden_units: int, + dropout_rate: float, + activation: torch.nn.Module = torch.nn.ReLU(), + ): + """Construct a PositionwiseFeedForward object.""" + super(PositionwiseFeedForward, self).__init__() + self.w_1 = torch.nn.Linear(idim, hidden_units) + self.activation = activation + self.dropout = torch.nn.Dropout(dropout_rate) + self.w_2 = torch.nn.Linear(hidden_units, idim) + + def forward(self, xs: torch.Tensor) -> torch.Tensor: + """Forward function. + + Args: + xs: input tensor (B, L, D) + Returns: + output tensor, (B, L, D) + """ + return self.w_2(self.dropout(self.activation(self.w_1(xs)))) + + +class MoEFFNLayer(torch.nn.Module): + """ + Mixture of expert with Positionwise feed forward layer + See also figure 1 in https://arxiv.org/pdf/2305.15663.pdf + The output dim is same with the input dim. + + Modified from https://github.com/Lightning-AI/lit-gpt/pull/823 + https://github.com/mistralai/mistral-src/blob/b46d6/moe_one_file_ref.py#L203-L219 + Args: + n_expert: number of expert. + n_expert_per_token: The actual number of experts used for each frame + idim (int): Input dimenstion. + hidden_units (int): The number of hidden units. + dropout_rate (float): Dropout rate. + activation (torch.nn.Module): Activation function + """ + + def __init__( + self, + n_expert: int, + n_expert_per_token: int, + idim: int, + hidden_units: int, + dropout_rate: float, + activation: torch.nn.Module = torch.nn.ReLU(), + ): + super(MoEFFNLayer, self).__init__() + self.gate = torch.nn.Linear(idim, n_expert, bias=False) + self.experts = torch.nn.ModuleList( + PositionwiseFeedForward(idim, hidden_units, dropout_rate, + activation) for _ in range(n_expert)) + self.n_expert_per_token = n_expert_per_token + + def forward(self, xs: torch.Tensor) -> torch.Tensor: + """Foward function. + Args: + xs: input tensor (B, L, D) + Returns: + output tensor, (B, L, D) + + """ + B, L, D = xs.size( + ) # batch size, sequence length, embedding dimension (idim) + xs = xs.view(-1, D) # (B*L, D) + router = self.gate(xs) # (B*L, n_expert) + logits, indices = torch.topk( + router, self.n_expert_per_token + ) # probs:(B*L, n_expert), indices: (B*L, n_expert) + weights = torch.nn.functional.softmax( + logits, dim=1, + dtype=torch.float).to(dtype=xs.dtype) # (B*L, n_expert_per_token) + output = torch.zeros_like(xs) # (B*L, D) + for i, expert in enumerate(self.experts): + mask = indices == i + batch_idx, ith_expert = torch.where(mask) + output[batch_idx] += weights[batch_idx, ith_expert, None] * expert( + xs[batch_idx]) + return output.view(B, L, D) diff --git a/xinference/thirdparty/cosyvoice/transformer/subsampling.py b/xinference/thirdparty/cosyvoice/transformer/subsampling.py new file mode 100644 index 0000000000..e17c2e324e --- /dev/null +++ b/xinference/thirdparty/cosyvoice/transformer/subsampling.py @@ -0,0 +1,383 @@ +# Copyright (c) 2021 Mobvoi Inc (Binbin Zhang, Di Wu) +# 2024 Alibaba Inc (Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Modified from ESPnet(https://github.com/espnet/espnet) +"""Subsampling layer definition.""" + +from typing import Tuple, Union + +import torch + + +class BaseSubsampling(torch.nn.Module): + + def __init__(self): + super().__init__() + self.right_context = 0 + self.subsampling_rate = 1 + + def position_encoding(self, offset: Union[int, torch.Tensor], + size: int) -> torch.Tensor: + return self.pos_enc.position_encoding(offset, size) + + +class EmbedinigNoSubsampling(BaseSubsampling): + """Embedding input without subsampling + """ + + def __init__(self, idim: int, odim: int, dropout_rate: float, + pos_enc_class: torch.nn.Module): + super().__init__() + self.embed = torch.nn.Embedding(idim, odim) + self.pos_enc = pos_enc_class + + def forward( + self, + x: torch.Tensor, + x_mask: torch.Tensor, + offset: Union[int, torch.Tensor] = 0 + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Input x. + + Args: + x (torch.Tensor): Input tensor (#batch, time, idim). + x_mask (torch.Tensor): Input mask (#batch, 1, time). + + Returns: + torch.Tensor: linear input tensor (#batch, time', odim), + where time' = time . + torch.Tensor: linear input mask (#batch, 1, time'), + where time' = time . + + """ + x = self.embed(x) + x, pos_emb = self.pos_enc(x, offset) + return x, pos_emb, x_mask + + +class LinearNoSubsampling(BaseSubsampling): + """Linear transform the input without subsampling + + Args: + idim (int): Input dimension. + odim (int): Output dimension. + dropout_rate (float): Dropout rate. + + """ + + def __init__(self, idim: int, odim: int, dropout_rate: float, + pos_enc_class: torch.nn.Module): + """Construct an linear object.""" + super().__init__() + self.out = torch.nn.Sequential( + torch.nn.Linear(idim, odim), + torch.nn.LayerNorm(odim, eps=1e-5), + torch.nn.Dropout(dropout_rate), + ) + self.pos_enc = pos_enc_class + self.right_context = 0 + self.subsampling_rate = 1 + + def forward( + self, + x: torch.Tensor, + x_mask: torch.Tensor, + offset: Union[int, torch.Tensor] = 0 + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Input x. + + Args: + x (torch.Tensor): Input tensor (#batch, time, idim). + x_mask (torch.Tensor): Input mask (#batch, 1, time). + + Returns: + torch.Tensor: linear input tensor (#batch, time', odim), + where time' = time . + torch.Tensor: linear input mask (#batch, 1, time'), + where time' = time . + + """ + x = self.out(x) + x, pos_emb = self.pos_enc(x, offset) + return x, pos_emb, x_mask + + +class Conv1dSubsampling2(BaseSubsampling): + """Convolutional 1D subsampling (to 1/2 length). + It is designed for Whisper, ref: + https://github.com/openai/whisper/blob/main/whisper/model.py + + Args: + idim (int): Input dimension. + odim (int): Output dimension. + dropout_rate (float): Dropout rate. + + """ + + def __init__(self, idim: int, odim: int, dropout_rate: float, + pos_enc_class: torch.nn.Module): + """Construct an Conv1dSubsampling2 object.""" + super().__init__() + self.conv = torch.nn.Sequential( + torch.nn.Conv1d(idim, odim, kernel_size=3, padding=1), + torch.nn.GELU(), + torch.nn.Conv1d(odim, odim, kernel_size=3, stride=2, padding=1), + torch.nn.GELU(), + ) + self.pos_enc = pos_enc_class + # The right context for every conv layer is computed by: + # (kernel_size - 1) * frame_rate_of_this_layer + self.subsampling_rate = 2 + # 4 = (3 - 1) * 1 + (3 - 1) * 1 + self.right_context = 4 + + def forward( + self, + x: torch.Tensor, + x_mask: torch.Tensor, + offset: Union[int, torch.Tensor] = 0 + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Subsample x. + + Args: + x (torch.Tensor): Input tensor (#batch, time, idim). + x_mask (torch.Tensor): Input mask (#batch, 1, time). + + Returns: + torch.Tensor: Subsampled tensor (#batch, time', odim), + where time' = time // 2. + torch.Tensor: Subsampled mask (#batch, 1, time'), + where time' = time // 2. + torch.Tensor: positional encoding + + """ + time = x.size(1) + x = x.transpose(1, 2) # (b, f, t) + x = self.conv(x) + x = x.transpose(1, 2) # (b, t, f) + x, pos_emb = self.pos_enc(x, offset) + return x, pos_emb, x_mask[:, :, (time + 1) % 2::2] + + +class Conv2dSubsampling4(BaseSubsampling): + """Convolutional 2D subsampling (to 1/4 length). + + Args: + idim (int): Input dimension. + odim (int): Output dimension. + dropout_rate (float): Dropout rate. + + """ + + def __init__(self, idim: int, odim: int, dropout_rate: float, + pos_enc_class: torch.nn.Module): + """Construct an Conv2dSubsampling4 object.""" + super().__init__() + self.conv = torch.nn.Sequential( + torch.nn.Conv2d(1, odim, 3, 2), + torch.nn.ReLU(), + torch.nn.Conv2d(odim, odim, 3, 2), + torch.nn.ReLU(), + ) + self.out = torch.nn.Sequential( + torch.nn.Linear(odim * (((idim - 1) // 2 - 1) // 2), odim)) + self.pos_enc = pos_enc_class + # The right context for every conv layer is computed by: + # (kernel_size - 1) * frame_rate_of_this_layer + self.subsampling_rate = 4 + # 6 = (3 - 1) * 1 + (3 - 1) * 2 + self.right_context = 6 + + def forward( + self, + x: torch.Tensor, + x_mask: torch.Tensor, + offset: Union[int, torch.Tensor] = 0 + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Subsample x. + + Args: + x (torch.Tensor): Input tensor (#batch, time, idim). + x_mask (torch.Tensor): Input mask (#batch, 1, time). + + Returns: + torch.Tensor: Subsampled tensor (#batch, time', odim), + where time' = time // 4. + torch.Tensor: Subsampled mask (#batch, 1, time'), + where time' = time // 4. + torch.Tensor: positional encoding + + """ + x = x.unsqueeze(1) # (b, c=1, t, f) + x = self.conv(x) + b, c, t, f = x.size() + x = self.out(x.transpose(1, 2).contiguous().view(b, t, c * f)) + x, pos_emb = self.pos_enc(x, offset) + return x, pos_emb, x_mask[:, :, 2::2][:, :, 2::2] + + +class Conv2dSubsampling6(BaseSubsampling): + """Convolutional 2D subsampling (to 1/6 length). + Args: + idim (int): Input dimension. + odim (int): Output dimension. + dropout_rate (float): Dropout rate. + pos_enc (torch.nn.Module): Custom position encoding layer. + """ + + def __init__(self, idim: int, odim: int, dropout_rate: float, + pos_enc_class: torch.nn.Module): + """Construct an Conv2dSubsampling6 object.""" + super().__init__() + self.conv = torch.nn.Sequential( + torch.nn.Conv2d(1, odim, 3, 2), + torch.nn.ReLU(), + torch.nn.Conv2d(odim, odim, 5, 3), + torch.nn.ReLU(), + ) + self.linear = torch.nn.Linear(odim * (((idim - 1) // 2 - 2) // 3), + odim) + self.pos_enc = pos_enc_class + # 10 = (3 - 1) * 1 + (5 - 1) * 2 + self.subsampling_rate = 6 + self.right_context = 10 + + def forward( + self, + x: torch.Tensor, + x_mask: torch.Tensor, + offset: Union[int, torch.Tensor] = 0 + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Subsample x. + Args: + x (torch.Tensor): Input tensor (#batch, time, idim). + x_mask (torch.Tensor): Input mask (#batch, 1, time). + + Returns: + torch.Tensor: Subsampled tensor (#batch, time', odim), + where time' = time // 6. + torch.Tensor: Subsampled mask (#batch, 1, time'), + where time' = time // 6. + torch.Tensor: positional encoding + """ + x = x.unsqueeze(1) # (b, c, t, f) + x = self.conv(x) + b, c, t, f = x.size() + x = self.linear(x.transpose(1, 2).contiguous().view(b, t, c * f)) + x, pos_emb = self.pos_enc(x, offset) + return x, pos_emb, x_mask[:, :, 2::2][:, :, 4::3] + + +class Conv2dSubsampling8(BaseSubsampling): + """Convolutional 2D subsampling (to 1/8 length). + + Args: + idim (int): Input dimension. + odim (int): Output dimension. + dropout_rate (float): Dropout rate. + + """ + + def __init__(self, idim: int, odim: int, dropout_rate: float, + pos_enc_class: torch.nn.Module): + """Construct an Conv2dSubsampling8 object.""" + super().__init__() + self.conv = torch.nn.Sequential( + torch.nn.Conv2d(1, odim, 3, 2), + torch.nn.ReLU(), + torch.nn.Conv2d(odim, odim, 3, 2), + torch.nn.ReLU(), + torch.nn.Conv2d(odim, odim, 3, 2), + torch.nn.ReLU(), + ) + self.linear = torch.nn.Linear( + odim * ((((idim - 1) // 2 - 1) // 2 - 1) // 2), odim) + self.pos_enc = pos_enc_class + self.subsampling_rate = 8 + # 14 = (3 - 1) * 1 + (3 - 1) * 2 + (3 - 1) * 4 + self.right_context = 14 + + def forward( + self, + x: torch.Tensor, + x_mask: torch.Tensor, + offset: Union[int, torch.Tensor] = 0 + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Subsample x. + + Args: + x (torch.Tensor): Input tensor (#batch, time, idim). + x_mask (torch.Tensor): Input mask (#batch, 1, time). + + Returns: + torch.Tensor: Subsampled tensor (#batch, time', odim), + where time' = time // 8. + torch.Tensor: Subsampled mask (#batch, 1, time'), + where time' = time // 8. + torch.Tensor: positional encoding + """ + x = x.unsqueeze(1) # (b, c, t, f) + x = self.conv(x) + b, c, t, f = x.size() + x = self.linear(x.transpose(1, 2).contiguous().view(b, t, c * f)) + x, pos_emb = self.pos_enc(x, offset) + return x, pos_emb, x_mask[:, :, 2::2][:, :, 2::2][:, :, 2::2] + + +class LegacyLinearNoSubsampling(BaseSubsampling): + """Linear transform the input without subsampling + + Args: + idim (int): Input dimension. + odim (int): Output dimension. + dropout_rate (float): Dropout rate. + + """ + + def __init__(self, idim: int, odim: int, dropout_rate: float, + pos_enc_class: torch.nn.Module): + """Construct an linear object.""" + super().__init__() + self.out = torch.nn.Sequential( + torch.nn.Linear(idim, odim), + torch.nn.LayerNorm(odim, eps=1e-5), + torch.nn.Dropout(dropout_rate), + torch.nn.ReLU(), + ) + self.pos_enc = pos_enc_class + self.right_context = 0 + self.subsampling_rate = 1 + + def forward( + self, + x: torch.Tensor, + x_mask: torch.Tensor, + offset: Union[int, torch.Tensor] = 0 + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """Input x. + + Args: + x (torch.Tensor): Input tensor (#batch, time, idim). + x_mask (torch.Tensor): Input mask (#batch, 1, time). + + Returns: + torch.Tensor: linear input tensor (#batch, time', odim), + where time' = time . + torch.Tensor: linear input mask (#batch, 1, time'), + where time' = time . + + """ + x = self.out(x) + x, pos_emb = self.pos_enc(x, offset) + return x, pos_emb, x_mask diff --git a/xinference/thirdparty/cosyvoice/utils/__init__.py b/xinference/thirdparty/cosyvoice/utils/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/cosyvoice/utils/class_utils.py b/xinference/thirdparty/cosyvoice/utils/class_utils.py new file mode 100644 index 0000000000..b8cc471458 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/utils/class_utils.py @@ -0,0 +1,70 @@ +# Copyright [2023-11-28] <sxc19@mails.tsinghua.edu.cn, Xingchen Song> +# 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import torch + +from cosyvoice.transformer.activation import Swish +from cosyvoice.transformer.subsampling import ( + LinearNoSubsampling, + EmbedinigNoSubsampling, + Conv1dSubsampling2, + Conv2dSubsampling4, + Conv2dSubsampling6, + Conv2dSubsampling8, +) +from cosyvoice.transformer.embedding import (PositionalEncoding, + RelPositionalEncoding, + WhisperPositionalEncoding, + LearnablePositionalEncoding, + NoPositionalEncoding) +from cosyvoice.transformer.attention import (MultiHeadedAttention, + RelPositionMultiHeadedAttention) +from cosyvoice.transformer.embedding import EspnetRelPositionalEncoding +from cosyvoice.transformer.subsampling import LegacyLinearNoSubsampling + + +COSYVOICE_ACTIVATION_CLASSES = { + "hardtanh": torch.nn.Hardtanh, + "tanh": torch.nn.Tanh, + "relu": torch.nn.ReLU, + "selu": torch.nn.SELU, + "swish": getattr(torch.nn, "SiLU", Swish), + "gelu": torch.nn.GELU, +} + +COSYVOICE_SUBSAMPLE_CLASSES = { + "linear": LinearNoSubsampling, + "linear_legacy": LegacyLinearNoSubsampling, + "embed": EmbedinigNoSubsampling, + "conv1d2": Conv1dSubsampling2, + "conv2d": Conv2dSubsampling4, + "conv2d6": Conv2dSubsampling6, + "conv2d8": Conv2dSubsampling8, + 'paraformer_dummy': torch.nn.Identity +} + +COSYVOICE_EMB_CLASSES = { + "embed": PositionalEncoding, + "abs_pos": PositionalEncoding, + "rel_pos": RelPositionalEncoding, + "rel_pos_espnet": EspnetRelPositionalEncoding, + "no_pos": NoPositionalEncoding, + "abs_pos_whisper": WhisperPositionalEncoding, + "embed_learnable_pe": LearnablePositionalEncoding, +} + +COSYVOICE_ATTENTION_CLASSES = { + "selfattn": MultiHeadedAttention, + "rel_selfattn": RelPositionMultiHeadedAttention, +} diff --git a/xinference/thirdparty/cosyvoice/utils/common.py b/xinference/thirdparty/cosyvoice/utils/common.py new file mode 100644 index 0000000000..6ec5e17835 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/utils/common.py @@ -0,0 +1,103 @@ +# Copyright (c) 2020 Mobvoi Inc (Binbin Zhang) +# 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Modified from ESPnet(https://github.com/espnet/espnet) +"""Unility functions for Transformer.""" + +from typing import List + +import torch + +IGNORE_ID = -1 + + +def pad_list(xs: List[torch.Tensor], pad_value: int): + """Perform padding for the list of tensors. + + Args: + xs (List): List of Tensors [(T_1, `*`), (T_2, `*`), ..., (T_B, `*`)]. + pad_value (float): Value for padding. + + Returns: + Tensor: Padded tensor (B, Tmax, `*`). + + Examples: + >>> x = [torch.ones(4), torch.ones(2), torch.ones(1)] + >>> x + [tensor([1., 1., 1., 1.]), tensor([1., 1.]), tensor([1.])] + >>> pad_list(x, 0) + tensor([[1., 1., 1., 1.], + [1., 1., 0., 0.], + [1., 0., 0., 0.]]) + + """ + max_len = max([len(item) for item in xs]) + batchs = len(xs) + ndim = xs[0].ndim + if ndim == 1: + pad_res = torch.zeros(batchs, + max_len, + dtype=xs[0].dtype, + device=xs[0].device) + elif ndim == 2: + pad_res = torch.zeros(batchs, + max_len, + xs[0].shape[1], + dtype=xs[0].dtype, + device=xs[0].device) + elif ndim == 3: + pad_res = torch.zeros(batchs, + max_len, + xs[0].shape[1], + xs[0].shape[2], + dtype=xs[0].dtype, + device=xs[0].device) + else: + raise ValueError(f"Unsupported ndim: {ndim}") + pad_res.fill_(pad_value) + for i in range(batchs): + pad_res[i, :len(xs[i])] = xs[i] + return pad_res + + +def th_accuracy(pad_outputs: torch.Tensor, pad_targets: torch.Tensor, + ignore_label: int) -> torch.Tensor: + """Calculate accuracy. + + Args: + pad_outputs (Tensor): Prediction tensors (B * Lmax, D). + pad_targets (LongTensor): Target label tensors (B, Lmax). + ignore_label (int): Ignore label id. + + Returns: + torch.Tensor: Accuracy value (0.0 - 1.0). + + """ + pad_pred = pad_outputs.view(pad_targets.size(0), pad_targets.size(1), + pad_outputs.size(1)).argmax(2) + mask = pad_targets != ignore_label + numerator = torch.sum( + pad_pred.masked_select(mask) == pad_targets.masked_select(mask)) + denominator = torch.sum(mask) + return (numerator / denominator).detach() + + +def get_padding(kernel_size, dilation=1): + return int((kernel_size * dilation - dilation) / 2) + + +def init_weights(m, mean=0.0, std=0.01): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) diff --git a/xinference/thirdparty/cosyvoice/utils/executor.py b/xinference/thirdparty/cosyvoice/utils/executor.py new file mode 100644 index 0000000000..c12e52df9f --- /dev/null +++ b/xinference/thirdparty/cosyvoice/utils/executor.py @@ -0,0 +1,110 @@ +# Copyright (c) 2020 Mobvoi Inc (Binbin Zhang) +# 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from contextlib import nullcontext +import os + +import torch +import torch.distributed as dist + +from cosyvoice.utils.train_utils import update_parameter_and_lr, log_per_step, log_per_save, batch_forward, batch_backward, save_model, cosyvoice_join + + +class Executor: + + def __init__(self): + self.step = 0 + self.epoch = 0 + self.rank = int(os.environ.get('RANK', 0)) + self.device = torch.device('cuda:{}'.format(self.rank)) + + def train_one_epoc(self, model, optimizer, scheduler, train_data_loader, cv_data_loader, writer, info_dict, group_join): + ''' Train one epoch + ''' + + lr = optimizer.param_groups[0]['lr'] + logging.info('Epoch {} TRAIN info lr {} rank {}'.format(self.epoch, lr, self.rank)) + logging.info('using accumulate grad, new batch size is {} times' + ' larger than before'.format(info_dict['accum_grad'])) + # A context manager to be used in conjunction with an instance of + # torch.nn.parallel.DistributedDataParallel to be able to train + # with uneven inputs across participating processes. + model.train() + model_context = model.join if info_dict['train_engine'] == 'torch_ddp' else nullcontext + with model_context(): + for batch_idx, batch_dict in enumerate(train_data_loader): + info_dict["tag"] = "TRAIN" + info_dict["step"] = self.step + info_dict["epoch"] = self.epoch + info_dict["batch_idx"] = batch_idx + if cosyvoice_join(group_join, info_dict): + break + + # Disable gradient synchronizations across DDP processes. + # Within this context, gradients will be accumulated on module + # variables, which will later be synchronized. + if info_dict['train_engine'] == 'torch_ddp' and (batch_idx + 1) % info_dict["accum_grad"] != 0: + context = model.no_sync + # Used for single gpu training and DDP gradient synchronization + # processes. + else: + context = nullcontext + + with context(): + info_dict = batch_forward(model, batch_dict, info_dict) + info_dict = batch_backward(model, info_dict) + + info_dict = update_parameter_and_lr(model, optimizer, scheduler, info_dict) + log_per_step(writer, info_dict) + # NOTE specify save_per_step in cosyvoice.yaml if you want to enable step save + if info_dict['save_per_step'] > 0 and (self.step + 1) % info_dict['save_per_step'] == 0 and (batch_idx + 1) % info_dict["accum_grad"] == 0: + dist.barrier() + self.cv(model, cv_data_loader, writer, info_dict, on_batch_end=False) + model.train() + if (batch_idx + 1) % info_dict["accum_grad"] == 0: + self.step += 1 + dist.barrier() + self.cv(model, cv_data_loader, writer, info_dict, on_batch_end=True) + + @torch.inference_mode() + def cv(self, model, cv_data_loader, writer, info_dict, on_batch_end=True): + ''' Cross validation on + ''' + logging.info('Epoch {} Step {} on_batch_end {} CV rank {}'.format(self.epoch, self.step + 1, on_batch_end, self.rank)) + model.eval() + total_num_utts, total_loss_dict = 0, {} # avoid division by 0 + for batch_idx, batch_dict in enumerate(cv_data_loader): + info_dict["tag"] = "CV" + info_dict["step"] = self.step + info_dict["epoch"] = self.epoch + info_dict["batch_idx"] = batch_idx + + num_utts = len(batch_dict["utts"]) + total_num_utts += num_utts + + info_dict = batch_forward(model, batch_dict, info_dict) + + for k, v in info_dict['loss_dict'].items(): + if k not in total_loss_dict: + total_loss_dict[k] = [] + total_loss_dict[k].append(v.item() * num_utts) + log_per_step(None, info_dict) + for k, v in total_loss_dict.items(): + total_loss_dict[k] = sum(v) / total_num_utts + info_dict['loss_dict'] = total_loss_dict + log_per_save(writer, info_dict) + model_name = 'epoch_{}_whole'.format(self.epoch) if on_batch_end else 'epoch_{}_step_{}'.format(self.epoch, self.step + 1) + save_model(model, model_name, info_dict) diff --git a/xinference/thirdparty/cosyvoice/utils/file_utils.py b/xinference/thirdparty/cosyvoice/utils/file_utils.py new file mode 100644 index 0000000000..92c448b9cc --- /dev/null +++ b/xinference/thirdparty/cosyvoice/utils/file_utils.py @@ -0,0 +1,41 @@ +# Copyright (c) 2021 Mobvoi Inc. (authors: Binbin Zhang) +# 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import torchaudio + + +def read_lists(list_file): + lists = [] + with open(list_file, 'r', encoding='utf8') as fin: + for line in fin: + lists.append(line.strip()) + return lists + +def read_json_lists(list_file): + lists = read_lists(list_file) + results = {} + for fn in lists: + with open(fn, 'r', encoding='utf8') as fin: + results.update(json.load(fin)) + return results + +def load_wav(wav, target_sr): + speech, sample_rate = torchaudio.load(wav) + speech = speech.mean(dim=0, keepdim=True) + if sample_rate != target_sr: + assert sample_rate > target_sr, 'wav sample rate {} must be greater than {}'.format(sample_rate, target_sr) + speech = torchaudio.transforms.Resample(orig_freq=sample_rate, new_freq=target_sr)(speech) + return speech diff --git a/xinference/thirdparty/cosyvoice/utils/frontend_utils.py b/xinference/thirdparty/cosyvoice/utils/frontend_utils.py new file mode 100644 index 0000000000..59489a7a6f --- /dev/null +++ b/xinference/thirdparty/cosyvoice/utils/frontend_utils.py @@ -0,0 +1,125 @@ +# Copyright (c) 2024 Alibaba Inc (authors: Xiang Lyu, Zhihao Du) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import re +chinese_char_pattern = re.compile(r'[\u4e00-\u9fff]+') + +# whether contain chinese character +def contains_chinese(text): + return bool(chinese_char_pattern.search(text)) + + +# replace special symbol +def replace_corner_mark(text): + text = text.replace('²', '平方') + text = text.replace('³', '立方') + return text + + +# remove meaningless symbol +def remove_bracket(text): + text = text.replace('(', '').replace(')', '') + text = text.replace('【', '').replace('】', '') + text = text.replace('`', '').replace('`', '') + text = text.replace("——", " ") + return text + + +# spell Arabic numerals +def spell_out_number(text: str, inflect_parser): + new_text = [] + st = None + for i, c in enumerate(text): + if not c.isdigit(): + if st is not None: + num_str = inflect_parser.number_to_words(text[st: i]) + new_text.append(num_str) + st = None + new_text.append(c) + else: + if st is None: + st = i + if st is not None and st < len(text): + num_str = inflect_parser.number_to_words(text[st:]) + new_text.append(num_str) + return ''.join(new_text) + + +# split paragrah logic: +# 1. per sentence max len token_max_n, min len token_min_n, merge if last sentence len less than merge_len +# 2. cal sentence len according to lang +# 3. split sentence according to puncatation +def split_paragraph(text: str, tokenize, lang="zh", token_max_n=80, token_min_n=60, merge_len=20, comma_split=False): + def calc_utt_length(_text: str): + if lang == "zh": + return len(_text) + else: + return len(tokenize(_text)) + + def should_merge(_text: str): + if lang == "zh": + return len(_text) < merge_len + else: + return len(tokenize(_text)) < merge_len + + if lang == "zh": + pounc = ['。', '?', '!', ';', ':', '、', '.', '?', '!', ';'] + else: + pounc = ['.', '?', '!', ';', ':'] + if comma_split: + pounc.extend([',', ',']) + st = 0 + utts = [] + for i, c in enumerate(text): + if c in pounc: + if len(text[st: i]) > 0: + utts.append(text[st: i] + c) + if i + 1 < len(text) and text[i + 1] in ['"', '”']: + tmp = utts.pop(-1) + utts.append(tmp + text[i + 1]) + st = i + 2 + else: + st = i + 1 + if len(utts) == 0: + if lang == "zh": + utts.append(text + '。') + else: + utts.append(text + '.') + final_utts = [] + cur_utt = "" + for utt in utts: + if calc_utt_length(cur_utt + utt) > token_max_n and calc_utt_length(cur_utt) > token_min_n: + final_utts.append(cur_utt) + cur_utt = "" + cur_utt = cur_utt + utt + if len(cur_utt) > 0: + if should_merge(cur_utt) and len(final_utts) != 0: + final_utts[-1] = final_utts[-1] + cur_utt + else: + final_utts.append(cur_utt) + + return final_utts + + +# remove blank between chinese character +def replace_blank(text: str): + out_str = [] + for i, c in enumerate(text): + if c == " ": + if ((text[i + 1].isascii() and text[i + 1] != " ") and + (text[i - 1].isascii() and text[i - 1] != " ")): + out_str.append(c) + else: + out_str.append(c) + return "".join(out_str) diff --git a/xinference/thirdparty/cosyvoice/utils/mask.py b/xinference/thirdparty/cosyvoice/utils/mask.py new file mode 100644 index 0000000000..2b460bbd5a --- /dev/null +++ b/xinference/thirdparty/cosyvoice/utils/mask.py @@ -0,0 +1,227 @@ +# Copyright (c) 2019 Shigeki Karita +# 2020 Mobvoi Inc (Binbin Zhang) +# 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import torch +''' +def subsequent_mask( + size: int, + device: torch.device = torch.device("cpu"), +) -> torch.Tensor: + """Create mask for subsequent steps (size, size). + + This mask is used only in decoder which works in an auto-regressive mode. + This means the current step could only do attention with its left steps. + + In encoder, fully attention is used when streaming is not necessary and + the sequence is not long. In this case, no attention mask is needed. + + When streaming is need, chunk-based attention is used in encoder. See + subsequent_chunk_mask for the chunk-based attention mask. + + Args: + size (int): size of mask + str device (str): "cpu" or "cuda" or torch.Tensor.device + dtype (torch.device): result dtype + + Returns: + torch.Tensor: mask + + Examples: + >>> subsequent_mask(3) + [[1, 0, 0], + [1, 1, 0], + [1, 1, 1]] + """ + ret = torch.ones(size, size, device=device, dtype=torch.bool) + return torch.tril(ret) +''' + + +def subsequent_mask( + size: int, + device: torch.device = torch.device("cpu"), +) -> torch.Tensor: + """Create mask for subsequent steps (size, size). + + This mask is used only in decoder which works in an auto-regressive mode. + This means the current step could only do attention with its left steps. + + In encoder, fully attention is used when streaming is not necessary and + the sequence is not long. In this case, no attention mask is needed. + + When streaming is need, chunk-based attention is used in encoder. See + subsequent_chunk_mask for the chunk-based attention mask. + + Args: + size (int): size of mask + str device (str): "cpu" or "cuda" or torch.Tensor.device + dtype (torch.device): result dtype + + Returns: + torch.Tensor: mask + + Examples: + >>> subsequent_mask(3) + [[1, 0, 0], + [1, 1, 0], + [1, 1, 1]] + """ + arange = torch.arange(size, device=device) + mask = arange.expand(size, size) + arange = arange.unsqueeze(-1) + mask = mask <= arange + return mask + + +def subsequent_chunk_mask( + size: int, + chunk_size: int, + num_left_chunks: int = -1, + device: torch.device = torch.device("cpu"), +) -> torch.Tensor: + """Create mask for subsequent steps (size, size) with chunk size, + this is for streaming encoder + + Args: + size (int): size of mask + chunk_size (int): size of chunk + num_left_chunks (int): number of left chunks + <0: use full chunk + >=0: use num_left_chunks + device (torch.device): "cpu" or "cuda" or torch.Tensor.device + + Returns: + torch.Tensor: mask + + Examples: + >>> subsequent_chunk_mask(4, 2) + [[1, 1, 0, 0], + [1, 1, 0, 0], + [1, 1, 1, 1], + [1, 1, 1, 1]] + """ + ret = torch.zeros(size, size, device=device, dtype=torch.bool) + for i in range(size): + if num_left_chunks < 0: + start = 0 + else: + start = max((i // chunk_size - num_left_chunks) * chunk_size, 0) + ending = min((i // chunk_size + 1) * chunk_size, size) + ret[i, start:ending] = True + return ret + + +def add_optional_chunk_mask(xs: torch.Tensor, + masks: torch.Tensor, + use_dynamic_chunk: bool, + use_dynamic_left_chunk: bool, + decoding_chunk_size: int, + static_chunk_size: int, + num_decoding_left_chunks: int, + enable_full_context: bool = True): + """ Apply optional mask for encoder. + + Args: + xs (torch.Tensor): padded input, (B, L, D), L for max length + mask (torch.Tensor): mask for xs, (B, 1, L) + use_dynamic_chunk (bool): whether to use dynamic chunk or not + use_dynamic_left_chunk (bool): whether to use dynamic left chunk for + training. + decoding_chunk_size (int): decoding chunk size for dynamic chunk, it's + 0: default for training, use random dynamic chunk. + <0: for decoding, use full chunk. + >0: for decoding, use fixed chunk size as set. + static_chunk_size (int): chunk size for static chunk training/decoding + if it's greater than 0, if use_dynamic_chunk is true, + this parameter will be ignored + num_decoding_left_chunks: number of left chunks, this is for decoding, + the chunk size is decoding_chunk_size. + >=0: use num_decoding_left_chunks + <0: use all left chunks + enable_full_context (bool): + True: chunk size is either [1, 25] or full context(max_len) + False: chunk size ~ U[1, 25] + + Returns: + torch.Tensor: chunk mask of the input xs. + """ + # Whether to use chunk mask or not + if use_dynamic_chunk: + max_len = xs.size(1) + if decoding_chunk_size < 0: + chunk_size = max_len + num_left_chunks = -1 + elif decoding_chunk_size > 0: + chunk_size = decoding_chunk_size + num_left_chunks = num_decoding_left_chunks + else: + # chunk size is either [1, 25] or full context(max_len). + # Since we use 4 times subsampling and allow up to 1s(100 frames) + # delay, the maximum frame is 100 / 4 = 25. + chunk_size = torch.randint(1, max_len, (1, )).item() + num_left_chunks = -1 + if chunk_size > max_len // 2 and enable_full_context: + chunk_size = max_len + else: + chunk_size = chunk_size % 25 + 1 + if use_dynamic_left_chunk: + max_left_chunks = (max_len - 1) // chunk_size + num_left_chunks = torch.randint(0, max_left_chunks, + (1, )).item() + chunk_masks = subsequent_chunk_mask(xs.size(1), chunk_size, + num_left_chunks, + xs.device) # (L, L) + chunk_masks = chunk_masks.unsqueeze(0) # (1, L, L) + chunk_masks = masks & chunk_masks # (B, L, L) + elif static_chunk_size > 0: + num_left_chunks = num_decoding_left_chunks + chunk_masks = subsequent_chunk_mask(xs.size(1), static_chunk_size, + num_left_chunks, + xs.device) # (L, L) + chunk_masks = chunk_masks.unsqueeze(0) # (1, L, L) + chunk_masks = masks & chunk_masks # (B, L, L) + else: + chunk_masks = masks + return chunk_masks + + +def make_pad_mask(lengths: torch.Tensor, max_len: int = 0) -> torch.Tensor: + """Make mask tensor containing indices of padded part. + + See description of make_non_pad_mask. + + Args: + lengths (torch.Tensor): Batch of lengths (B,). + Returns: + torch.Tensor: Mask tensor containing indices of padded part. + + Examples: + >>> lengths = [5, 3, 2] + >>> make_pad_mask(lengths) + masks = [[0, 0, 0, 0 ,0], + [0, 0, 0, 1, 1], + [0, 0, 1, 1, 1]] + """ + batch_size = lengths.size(0) + max_len = max_len if max_len > 0 else lengths.max().item() + seq_range = torch.arange(0, + max_len, + dtype=torch.int64, + device=lengths.device) + seq_range_expand = seq_range.unsqueeze(0).expand(batch_size, max_len) + seq_length_expand = lengths.unsqueeze(-1) + mask = seq_range_expand >= seq_length_expand + return mask diff --git a/xinference/thirdparty/cosyvoice/utils/scheduler.py b/xinference/thirdparty/cosyvoice/utils/scheduler.py new file mode 100644 index 0000000000..fbf4803f81 --- /dev/null +++ b/xinference/thirdparty/cosyvoice/utils/scheduler.py @@ -0,0 +1,739 @@ +# Copyright (c) 2020 Mobvoi Inc (Binbin Zhang) +# 2022 Ximalaya Inc (Yuguang Yang) +# 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# Modified from ESPnet(https://github.com/espnet/espnet) +# NeMo(https://github.com/NVIDIA/NeMo) + +from typing import Union + +import math +import warnings +import torch +from torch.optim.lr_scheduler import _LRScheduler + + +class WarmupLR(_LRScheduler): + """The WarmupLR scheduler + + This scheduler is almost same as NoamLR Scheduler except for following + difference: + + NoamLR: + lr = optimizer.lr * model_size ** -0.5 + * min(step ** -0.5, step * warmup_step ** -1.5) + WarmupLR: + lr = optimizer.lr * warmup_step ** 0.5 + * min(step ** -0.5, step * warmup_step ** -1.5) + + Note that the maximum lr equals to optimizer.lr in this scheduler. + + """ + + def __init__( + self, + optimizer: torch.optim.Optimizer, + warmup_steps: Union[int, float] = 25000, + last_epoch: int = -1, + ): + self.warmup_steps = warmup_steps + + # __init__() must be invoked before setting field + # because step() is also invoked in __init__() + super().__init__(optimizer, last_epoch) + + def __repr__(self): + return f"{self.__class__.__name__}(warmup_steps={self.warmup_steps})" + + def get_lr(self): + step_num = self.last_epoch + 1 + if self.warmup_steps == 0: + return [lr * step_num**-0.5 for lr in self.base_lrs] + else: + return [ + lr * self.warmup_steps**0.5 * + min(step_num**-0.5, step_num * self.warmup_steps**-1.5) + for lr in self.base_lrs + ] + + def set_step(self, step: int): + self.last_epoch = step + + +class WarmupPolicy(_LRScheduler): + """Adds warmup kwargs and warmup logic to lr policy. + All arguments should be passed as kwargs for clarity, + Args: + warmup_steps: Number of training steps in warmup stage + warmup_ratio: Ratio of warmup steps to total steps + max_steps: Total number of steps while training or `None` for + infinite training + """ + + def __init__(self, + optimizer, + *, + warmup_steps=None, + warmup_ratio=None, + max_steps=None, + min_lr=0.0, + last_epoch=-1): + assert not (warmup_steps is not None and warmup_ratio is not None),\ + "Either use particular number of step or ratio" + assert warmup_ratio is None or max_steps is not None, \ + "If there is a ratio, there should be a total steps" + + # It is necessary to assign all attributes *before* __init__, + # as class is wrapped by an inner class. + self.max_steps = max_steps + if warmup_steps is not None: + self.warmup_steps = warmup_steps + elif warmup_ratio is not None: + self.warmup_steps = int(warmup_ratio * max_steps) + else: + self.warmup_steps = 0 + + self.min_lr = min_lr + super().__init__(optimizer, last_epoch) + + def get_lr(self): + if not self._get_lr_called_within_step: + warnings.warn( + "To get the last learning rate computed " + "by the scheduler, please use `get_last_lr()`.", + UserWarning, + stacklevel=2) + + step = self.last_epoch + + if step <= self.warmup_steps and self.warmup_steps > 0: + return self._get_warmup_lr(step) + + if step > self.max_steps: + return [self.min_lr for _ in self.base_lrs] + + return self._get_lr(step) + + def _get_warmup_lr(self, step): + lr_val = (step + 1) / (self.warmup_steps + 1) + return [initial_lr * lr_val for initial_lr in self.base_lrs] + + def _get_lr(self, step): + """Simple const lr policy""" + return self.base_lrs + + +class SquareRootConstantPolicy(_LRScheduler): + """Adds warmup kwargs and warmup logic to lr policy. + All arguments should be passed as kwargs for clarity, + Args: + warmup_steps: Number of training steps in warmup stage + warmup_ratio: Ratio of warmup steps to total steps + max_steps: Total number of steps while training or `None` for + infinite training + """ + + def __init__(self, + optimizer, + *, + constant_steps=None, + constant_ratio=None, + max_steps=None, + min_lr=0.0, + last_epoch=-1): + assert not (constant_steps is not None + and constant_ratio is not None), \ + "Either use particular number of step or ratio" + assert constant_ratio is None or max_steps is not None, \ + "If there is a ratio, there should be a total steps" + + # It is necessary to assign all attributes *before* __init__, + # as class is wrapped by an inner class. + self.max_steps = max_steps + if constant_steps is not None: + self.constant_steps = constant_steps + elif constant_ratio is not None: + self.constant_steps = int(constant_ratio * max_steps) + else: + self.constant_steps = 0 + + self.constant_lr = 1 / (constant_steps**0.5) + self.min_lr = min_lr + super().__init__(optimizer, last_epoch) + + def get_lr(self): + if not self._get_lr_called_within_step: + warnings.warn( + "To get the last learning rate computed " + "by the scheduler, please use `get_last_lr()`.", + UserWarning, + stacklevel=2) + + step = self.last_epoch + + if step <= self.constant_steps: + return [self.constant_lr for _ in self.base_lrs] + + if step > self.max_steps: + return [self.min_lr for _ in self.base_lrs] + + return self._get_lr(step) + + def _get_lr(self, step): + """Simple const lr policy""" + return self.base_lrs + + +class WarmupHoldPolicy(WarmupPolicy): + """Variant of WarmupPolicy which maintains high + learning rate for a defined number of steps. + All arguments should be passed as kwargs for clarity, + Args: + warmup_steps: Number of training steps in warmup stage + warmup_ratio: Ratio of warmup steps to total steps + hold_steps: Number of training steps to + hold the learning rate after warm up + hold_ratio: Ratio of hold steps to total steps + max_steps: Total number of steps while training or `None` for + infinite training + """ + + def __init__( + self, + optimizer, + *, + warmup_steps=None, + warmup_ratio=None, + hold_steps=None, + hold_ratio=None, + max_steps=None, + min_lr=0.0, + last_epoch=-1, + ): + assert not (hold_steps is not None and hold_ratio is not None), \ + "Either use particular number of step or ratio" + assert hold_ratio is None or max_steps is not None, \ + "If there is a ratio, there should be a total steps" + + self.min_lr = min_lr + self._last_warmup_lr = 0.0 + + # Necessary to duplicate as class attributes are hidden in inner class + self.max_steps = max_steps + if warmup_steps is not None: + self.warmup_steps = warmup_steps + elif warmup_ratio is not None: + self.warmup_steps = int(warmup_ratio * max_steps) + else: + self.warmup_steps = 0 + + if hold_steps is not None: + self.hold_steps = hold_steps + self.warmup_steps + elif hold_ratio is not None: + self.hold_steps = int(hold_ratio * max_steps) + self.warmup_steps + else: + self.hold_steps = 0 + + super().__init__( + optimizer, + warmup_steps=warmup_steps, + warmup_ratio=warmup_ratio, + max_steps=max_steps, + last_epoch=last_epoch, + min_lr=min_lr, + ) + + def get_lr(self): + if not self._get_lr_called_within_step: + warnings.warn( + "To get the last learning rate computed by the scheduler," + " " + "please use `get_last_lr()`.", + UserWarning, + stacklevel=2) + + step = self.last_epoch + + # Warmup phase + if step <= self.warmup_steps and self.warmup_steps > 0: + return self._get_warmup_lr(step) + + # Hold phase + if (step >= self.warmup_steps) and (step < self.hold_steps): + return self.base_lrs + + if step > self.max_steps: + return [self.min_lr for _ in self.base_lrs] + + return self._get_lr(step) + + +class WarmupAnnealHoldPolicy(_LRScheduler): + """Adds warmup kwargs and warmup logic to lr policy. + All arguments should be passed as kwargs for clarity, + Args: + warmup_steps: Number of training steps in warmup stage + warmup_ratio: Ratio of warmup steps to total steps + max_steps: Total number of steps while training or `None` for + infinite training + min_lr: Minimum lr to hold the learning rate after decay at. + constant_steps: Number of steps to keep lr constant at. + constant_ratio: Ratio of steps to keep lr constant. + """ + + def __init__( + self, + optimizer, + *, + warmup_steps=None, + warmup_ratio=None, + constant_steps=None, + constant_ratio=None, + max_steps=None, + min_lr=0.0, + last_epoch=-1, + ): + assert not (warmup_steps is not None + and warmup_ratio is not None), \ + "Either use particular number of step or ratio" + assert not (constant_steps is not None + and constant_ratio is not None), \ + "Either use constant_steps or constant_ratio" + assert warmup_ratio is None or max_steps is not None, \ + "If there is a ratio, there should be a total steps" + + # It is necessary to assign all attributes *before* __init__, + # as class is wrapped by an inner class. + self.max_steps = max_steps + + if warmup_steps is not None: + self.warmup_steps = warmup_steps + elif warmup_ratio is not None: + self.warmup_steps = int(warmup_ratio * max_steps) + else: + self.warmup_steps = 0 + + if constant_steps is not None: + self.constant_steps = constant_steps + elif constant_ratio is not None: + self.constant_steps = int(constant_ratio * max_steps) + else: + self.constant_steps = 0 + + self.decay_steps = max_steps - (self.constant_steps + + self.warmup_steps) + + self.min_lr = min_lr + super().__init__(optimizer, last_epoch) + + def get_lr(self): + if not self._get_lr_called_within_step: + warnings.warn( + "To get the last learning rate computed " + "by the scheduler, please use `get_last_lr()`.", + UserWarning, + stacklevel=2) + + step = self.last_epoch + + # Warmup steps + if self.warmup_steps > 0 and step <= self.warmup_steps: + return self._get_warmup_lr(step) + + # Constant steps after warmup and decay + if self.constant_steps > 0 and ( + self.warmup_steps + self.decay_steps) < step <= self.max_steps: + return self._get_constant_lr(step) + + # Min lr after max steps of updates + if step > self.max_steps: + return [self.min_lr for _ in self.base_lrs] + + return self._get_lr(step) + + def _get_warmup_lr(self, step): + lr_val = (step + 1) / (self.warmup_steps + 1) + return [initial_lr * lr_val for initial_lr in self.base_lrs] + + def _get_constant_lr(self, step): + return [self.min_lr for _ in self.base_lrs] + + def _get_lr(self, step): + """Simple const lr policy""" + return self.base_lrs + + +def _squareroot_annealing(initial_lr, step, max_steps, min_lr): + mult = ((max_steps - step) / max_steps)**0.5 + out_lr = initial_lr * mult + out_lr = max(out_lr, min_lr) + return out_lr + + +def _square_annealing(initial_lr, step, max_steps, min_lr): + mult = ((max_steps - step) / max_steps)**2 + out_lr = initial_lr * mult + out_lr = max(out_lr, min_lr) + return out_lr + + +def _cosine_annealing(initial_lr, step, max_steps, min_lr): + mult = 0.5 * (1 + math.cos(math.pi * step / max_steps)) + out_lr = (initial_lr - min_lr) * mult + min_lr + return out_lr + + +def _linear_warmup_with_cosine_annealing(max_lr, warmup_steps, step, + decay_steps, min_lr): + assert max_lr > min_lr + # Use linear warmup for the initial part. + if warmup_steps > 0 and step <= warmup_steps: + return max_lr * float(step) / float(warmup_steps) + + # For any steps larger than `decay_steps`, use `min_lr`. + if step > warmup_steps + decay_steps: + return min_lr + + # If we are done with the warmup period, use the decay style. + num_steps_ = step - warmup_steps + decay_steps_ = decay_steps + decay_ratio = float(num_steps_) / float(decay_steps_) + assert decay_ratio >= 0.0 + assert decay_ratio <= 1.0 + delta_lr = max_lr - min_lr + + coeff = 0.5 * (math.cos(math.pi * decay_ratio) + 1.0) + + return min_lr + coeff * delta_lr + + +def _poly_decay(initial_lr, step, decay_steps, power, min_lr, cycle): + if cycle: + multiplier = 1.0 if step == 0 else math.ceil(step / decay_steps) + decay_steps *= multiplier + else: + step = min(step, decay_steps) + p = step / decay_steps + lr = (initial_lr - min_lr) * math.pow(1.0 - p, power) + lr += min_lr + return lr + + +def _noam_hold_annealing(initial_lr, step, warmup_steps, hold_steps, + decay_rate, min_lr): + # hold_steps = total number of steps + # to hold the LR, not the warmup + hold steps. + T_warmup_decay = max(1, warmup_steps**decay_rate) + T_hold_decay = max(1, (step - hold_steps)**decay_rate) + lr = (initial_lr * T_warmup_decay) / T_hold_decay + lr = max(lr, min_lr) + return lr + + +class SquareAnnealing(WarmupPolicy): + + def __init__(self, + optimizer, + *, + max_steps, + min_lr=1e-5, + last_epoch=-1, + **kwargs): + super().__init__(optimizer=optimizer, + max_steps=max_steps, + last_epoch=last_epoch, + min_lr=min_lr, + **kwargs) + + def _get_lr(self, step): + new_lrs = [ + _square_annealing( + initial_lr=initial_lr, + step=step - self.warmup_steps, + max_steps=self.max_steps - self.warmup_steps, + min_lr=self.min_lr, + ) for initial_lr in self.base_lrs + ] + return new_lrs + + +class SquareRootAnnealing(WarmupPolicy): + + def __init__(self, + optimizer, + *, + max_steps, + min_lr=0, + last_epoch=-1, + **kwargs): + super().__init__(optimizer=optimizer, + max_steps=max_steps, + last_epoch=last_epoch, + min_lr=min_lr, + **kwargs) + + def _get_lr(self, step): + new_lrs = [ + _squareroot_annealing(initial_lr=initial_lr, + step=step, + max_steps=self.max_steps, + min_lr=self.min_lr) + for initial_lr in self.base_lrs + ] + return new_lrs + + +class CosineAnnealing(WarmupAnnealHoldPolicy): + + def __init__(self, + optimizer, + *, + max_steps, + min_lr=0, + last_epoch=-1, + **kwargs): + super().__init__(optimizer=optimizer, + max_steps=max_steps, + last_epoch=last_epoch, + min_lr=min_lr, + **kwargs) + + def _get_lr(self, step): + for initial_lr in self.base_lrs: + if initial_lr < self.min_lr: + raise ValueError( + f"{self} received an initial learning rate " + f"that was lower than the minimum learning rate.") + + if self.constant_steps is None or self.constant_steps == 0: + new_lrs = [ + _cosine_annealing( + initial_lr=initial_lr, + step=step - self.warmup_steps, + max_steps=self.max_steps - self.warmup_steps, + min_lr=self.min_lr, + ) for initial_lr in self.base_lrs + ] + else: + new_lrs = self._get_linear_warmup_with_cosine_annealing_lr(step) + return new_lrs + + def _get_warmup_lr(self, step): + if self.constant_steps is None or self.constant_steps == 0: + return super()._get_warmup_lr(step) + else: + # Use linear warmup for the initial part. + return self._get_linear_warmup_with_cosine_annealing_lr(step) + + def _get_constant_lr(self, step): + # Only called when `constant_steps` > 0. + return self._get_linear_warmup_with_cosine_annealing_lr(step) + + def _get_linear_warmup_with_cosine_annealing_lr(self, step): + # Cosine Schedule for Megatron LM, + # slightly different warmup schedule + constant LR at the end. + new_lrs = [ + _linear_warmup_with_cosine_annealing( + max_lr=self.base_lrs[0], + warmup_steps=self.warmup_steps, + step=step, + decay_steps=self.decay_steps, + min_lr=self.min_lr, + ) for _ in self.base_lrs + ] + return new_lrs + + +class NoamAnnealing(_LRScheduler): + + def __init__(self, + optimizer, + *, + d_model, + warmup_steps=None, + warmup_ratio=None, + max_steps=None, + min_lr=0.0, + last_epoch=-1): + self._normalize = d_model**(-0.5) + assert not (warmup_steps is not None + and warmup_ratio is not None), \ + "Either use particular number of step or ratio" + assert warmup_ratio is None or max_steps is not None, \ + "If there is a ratio, there should be a total steps" + + # It is necessary to assign all attributes *before* __init__, + # as class is wrapped by an inner class. + self.max_steps = max_steps + if warmup_steps is not None: + self.warmup_steps = warmup_steps + elif warmup_ratio is not None: + self.warmup_steps = int(warmup_ratio * max_steps) + else: + self.warmup_steps = 0 + + self.min_lr = min_lr + super().__init__(optimizer, last_epoch) + + def get_lr(self): + if not self._get_lr_called_within_step: + warnings.warn( + "To get the last learning rate computed " + "by the scheduler, please use `get_last_lr()`.", + UserWarning, + stacklevel=2) + + step = max(1, self.last_epoch) + + for initial_lr in self.base_lrs: + if initial_lr < self.min_lr: + raise ValueError( + f"{self} received an initial learning rate " + f"that was lower than the minimum learning rate.") + + new_lrs = [ + self._noam_annealing(initial_lr=initial_lr, step=step) + for initial_lr in self.base_lrs + ] + return new_lrs + + def _noam_annealing(self, initial_lr, step): + if self.warmup_steps > 0: + mult = self._normalize * min(step**(-0.5), + step * (self.warmup_steps**(-1.5))) + else: + mult = self._normalize * step**(-0.5) + + out_lr = initial_lr * mult + if step > self.warmup_steps: + out_lr = max(out_lr, self.min_lr) + return out_lr + + +class NoamHoldAnnealing(WarmupHoldPolicy): + + def __init__(self, + optimizer, + *, + max_steps, + decay_rate=0.5, + min_lr=0.0, + last_epoch=-1, + **kwargs): + """ + From Nemo: + Implementation of the Noam Hold Annealing policy + from the SqueezeFormer paper. + + Unlike NoamAnnealing, the peak learning rate + can be explicitly set for this scheduler. + The schedule first performs linear warmup, + then holds the peak LR, then decays with some schedule for + the remainder of the steps. + Therefore the min-lr is still dependent + on the hyper parameters selected. + + It's schedule is determined by three factors- + + Warmup Steps: Initial stage, where linear warmup + occurs uptil the peak LR is reached. Unlike NoamAnnealing, + the peak LR is explicitly stated here instead of a scaling factor. + + Hold Steps: Intermediate stage, where the peak LR + is maintained for some number of steps. In this region, + the high peak LR allows the model to converge faster + if training is stable. However the high LR + may also cause instability during training. + Should usually be a significant fraction of training + steps (around 30-40% of the entire training steps). + + Decay Steps: Final stage, where the LR rapidly decays + with some scaling rate (set by decay rate). + To attain Noam decay, use 0.5, + for Squeezeformer recommended decay, use 1.0. + The fast decay after prolonged high LR during + hold phase allows for rapid convergence. + + References: + - [Squeezeformer: + An Efficient Transformer for Automatic Speech Recognition] + (https://arxiv.org/abs/2206.00888) + + Args: + optimizer: Pytorch compatible Optimizer object. + warmup_steps: Number of training steps in warmup stage + warmup_ratio: Ratio of warmup steps to total steps + hold_steps: Number of training steps to + hold the learning rate after warm up + hold_ratio: Ratio of hold steps to total steps + max_steps: Total number of steps while training or `None` for + infinite training + decay_rate: Float value describing the polynomial decay + after the hold period. Default value + of 0.5 corresponds to Noam decay. + min_lr: Minimum learning rate. + """ + self.decay_rate = decay_rate + super().__init__(optimizer=optimizer, + max_steps=max_steps, + last_epoch=last_epoch, + min_lr=min_lr, + **kwargs) + + def _get_lr(self, step): + if self.warmup_steps is None or self.warmup_steps == 0: + raise ValueError( + "Noam scheduler cannot be used without warmup steps") + + if self.hold_steps > 0: + hold_steps = self.hold_steps - self.warmup_steps + else: + hold_steps = 0 + + new_lrs = [ + _noam_hold_annealing( + initial_lr, + step=step, + warmup_steps=self.warmup_steps, + hold_steps=hold_steps, + decay_rate=self.decay_rate, + min_lr=self.min_lr, + ) for initial_lr in self.base_lrs + ] + return new_lrs + + def set_step(self, step: int): + self.last_epoch = step + + +class ConstantLR(_LRScheduler): + """The ConstantLR scheduler + + This scheduler keeps a constant lr + + """ + + def __init__( + self, + optimizer: torch.optim.Optimizer, + ): + # __init__() must be invoked before setting field + # because step() is also invoked in __init__() + super().__init__(optimizer) + + def get_lr(self): + return self.base_lrs + + def set_step(self, step: int): + self.last_epoch = step diff --git a/xinference/thirdparty/cosyvoice/utils/train_utils.py b/xinference/thirdparty/cosyvoice/utils/train_utils.py new file mode 100644 index 0000000000..f8d7b4586c --- /dev/null +++ b/xinference/thirdparty/cosyvoice/utils/train_utils.py @@ -0,0 +1,289 @@ +# Copyright (c) 2021 Mobvoi Inc. (authors: Binbin Zhang) +# 2023 Horizon Inc. (authors: Xingchen Song) +# 2024 Alibaba Inc (authors: Xiang Lyu) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from contextlib import nullcontext +import logging +import os +import torch +import json +import re +import datetime +import yaml + +import deepspeed +import torch.optim as optim +import torch.distributed as dist + +from torch.utils.tensorboard import SummaryWriter +from torch.utils.data import DataLoader +from torch.nn.utils import clip_grad_norm_ + +from deepspeed.runtime.zero.stage_1_and_2 import estimate_zero2_model_states_mem_needs_all_live + +from cosyvoice.dataset.dataset import Dataset +from cosyvoice.utils.scheduler import WarmupLR, NoamHoldAnnealing, ConstantLR + + +def init_distributed(args): + world_size = int(os.environ.get('WORLD_SIZE', 1)) + local_rank = int(os.environ.get('LOCAL_RANK', 0)) + rank = int(os.environ.get('RANK', 0)) + logging.info('training on multiple gpus, this gpu {}'.format(local_rank) + + ', rank {}, world_size {}'.format(rank, world_size)) + if args.train_engine == 'torch_ddp': + torch.cuda.set_device(local_rank) + dist.init_process_group(args.dist_backend) + else: + deepspeed.init_distributed(dist_backend=args.dist_backend) + return world_size, local_rank, rank + + +def init_dataset_and_dataloader(args, configs): + train_dataset = Dataset(args.train_data, data_pipeline=configs['data_pipeline'], mode='train', shuffle=True, partition=True) + cv_dataset = Dataset(args.cv_data, data_pipeline=configs['data_pipeline'], mode='train', shuffle=False, partition=False) + + # do not use persistent_workers=True, as whisper tokenizer opens tiktoken file each time when the for loop starts + train_data_loader = DataLoader(train_dataset, + batch_size=None, + pin_memory=args.pin_memory, + num_workers=args.num_workers, + prefetch_factor=args.prefetch) + cv_data_loader = DataLoader(cv_dataset, + batch_size=None, + pin_memory=args.pin_memory, + num_workers=args.num_workers, + prefetch_factor=args.prefetch) + return train_dataset, cv_dataset, train_data_loader, cv_data_loader + + + +def check_modify_and_save_config(args, configs): + if args.train_engine == "torch_ddp": + configs['train_conf']["dtype"] = 'fp32' + else: + with open(args.deepspeed_config, 'r') as fin: + ds_configs = json.load(fin) + if "fp16" in ds_configs and ds_configs["fp16"]["enabled"]: + configs['train_conf']["dtype"] = "fp16" + elif "bf16" in ds_configs and ds_configs["bf16"]["enabled"]: + configs['train_conf']["dtype"] = "bf16" + else: + configs['train_conf']["dtype"] = "fp32" + assert ds_configs["train_micro_batch_size_per_gpu"] == 1 + # if use deepspeed, override ddp config + configs['train_conf']['save_per_step'] = int(configs['train_conf']['save_per_step'] * configs['train_conf']['accum_grad'] / ds_configs["gradient_accumulation_steps"]) + configs['train_conf']['accum_grad'] = ds_configs["gradient_accumulation_steps"] + configs['train_conf']['grad_clip'] = ds_configs["gradient_clipping"] + configs['train_conf']['log_interval'] = ds_configs["steps_per_print"] + return configs + + +def wrap_cuda_model(args, model): + local_world_size = int(os.environ.get('LOCAL_WORLD_SIZE', 1)) + world_size = int(os.environ.get('WORLD_SIZE', 1)) + if args.train_engine == "torch_ddp": # native pytorch ddp + assert (torch.cuda.is_available()) + model.cuda() + model = torch.nn.parallel.DistributedDataParallel(model, find_unused_parameters=True) + else: + if int(os.environ.get('RANK', 0)) == 0: + logging.info("Estimating model states memory needs (zero2)...") + estimate_zero2_model_states_mem_needs_all_live( + model, + num_gpus_per_node=local_world_size, + num_nodes=world_size // local_world_size) + return model + + +def init_optimizer_and_scheduler(args, configs, model): + if configs['train_conf']['optim'] == 'adam': + optimizer = optim.Adam(model.parameters(), **configs['train_conf']['optim_conf']) + elif configs['train_conf']['optim'] == 'adamw': + optimizer = optim.AdamW(model.parameters(), **configs['train_conf']['optim_conf']) + else: + raise ValueError("unknown optimizer: " + configs['train_conf']) + + if configs['train_conf']['scheduler'] == 'warmuplr': + scheduler_type = WarmupLR + scheduler = WarmupLR(optimizer, **configs['train_conf']['scheduler_conf']) + elif configs['train_conf']['scheduler'] == 'NoamHoldAnnealing': + scheduler_type = NoamHoldAnnealing + scheduler = NoamHoldAnnealing(optimizer, **configs['train_conf']['scheduler_conf']) + elif configs['train_conf']['scheduler'] == 'constantlr': + scheduler_type = ConstantLR + scheduler = ConstantLR(optimizer) + else: + raise ValueError("unknown scheduler: " + configs['train_conf']) + + # use deepspeed optimizer for speedup + if args.train_engine == "deepspeed": + def scheduler(opt): + return scheduler_type(opt, **configs['train_conf']['scheduler_conf']) + model, optimizer, _, scheduler = deepspeed.initialize( + args=args, + model=model, + optimizer=None, + lr_scheduler=scheduler, + model_parameters=model.parameters()) + + return model, optimizer, scheduler + + +def init_summarywriter(args): + writer = None + if int(os.environ.get('RANK', 0)) == 0: + os.makedirs(args.model_dir, exist_ok=True) + writer = SummaryWriter(args.tensorboard_dir) + return writer + + +def save_model(model, model_name, info_dict): + rank = int(os.environ.get('RANK', 0)) + model_dir = info_dict["model_dir"] + save_model_path = os.path.join(model_dir, '{}.pt'.format(model_name)) + + if info_dict["train_engine"] == "torch_ddp": + if rank == 0: + torch.save(model.module.state_dict(), save_model_path) + else: + with torch.no_grad(): + model.save_checkpoint(save_dir=model_dir, + tag=model_name, + client_state=info_dict) + if rank == 0: + info_path = re.sub('.pt$', '.yaml', save_model_path) + info_dict['save_time'] = datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S') + with open(info_path, 'w') as fout: + data = yaml.dump(info_dict) + fout.write(data) + logging.info('[Rank {}] Checkpoint: save to checkpoint {}'.format(rank, save_model_path)) + + +def cosyvoice_join(group_join, info_dict): + world_size = int(os.environ.get('WORLD_SIZE', 1)) + local_rank = int(os.environ.get('LOCAL_RANK', 0)) + rank = int(os.environ.get('RANK', 0)) + + if info_dict["batch_idx"] != 0: + # we try to join all rank in both ddp and deepspeed mode, in case different rank has different lr + try: + dist.monitored_barrier(group=group_join, + timeout=group_join.options._timeout) + return False + except RuntimeError as e: + logging.info("Detected uneven workload distribution: {}\n".format(e) + + "Break current worker to manually join all workers, " + + "world_size {}, current rank {}, current local_rank {}\n". + format(world_size, rank, local_rank)) + return True + else: + return False + + +def batch_forward(model, batch, info_dict): + device = int(os.environ.get('LOCAL_RANK', 0)) + + dtype = info_dict["dtype"] + if dtype == "fp16": + dtype = torch.float16 + elif dtype == "bf16": + dtype = torch.bfloat16 + else: # fp32 + dtype = torch.float32 + + if info_dict['train_engine'] == 'torch_ddp': + autocast = nullcontext() + else: + autocast = torch.cuda.amp.autocast(enabled=True, dtype=dtype, cache_enabled=False) + + with autocast: + info_dict['loss_dict'] = model(batch, device) + return info_dict + + +def batch_backward(model, info_dict): + if info_dict["train_engine"] == "deepspeed": + scaled_loss = model.backward(info_dict['loss_dict']['loss']) + else: + scaled_loss = info_dict['loss_dict']['loss'] / info_dict['accum_grad'] + scaled_loss.backward() + + info_dict['loss_dict']['loss'] = scaled_loss + return info_dict + + +def update_parameter_and_lr(model, optimizer, scheduler, info_dict): + grad_norm = 0.0 + if info_dict['train_engine'] == "deepspeed": + info_dict["is_gradient_accumulation_boundary"] = model.is_gradient_accumulation_boundary() + model.step() + grad_norm = model.get_global_grad_norm() + elif (info_dict['batch_idx'] + 1) % info_dict["accum_grad"] == 0: + grad_norm = clip_grad_norm_(model.parameters(), info_dict['grad_clip']) + if torch.isfinite(grad_norm): + optimizer.step() + optimizer.zero_grad() + scheduler.step() + info_dict["lr"] = optimizer.param_groups[0]['lr'] + info_dict["grad_norm"] = grad_norm + return info_dict + + +def log_per_step(writer, info_dict): + tag = info_dict["tag"] + epoch = info_dict.get('epoch', 0) + step = info_dict["step"] + batch_idx = info_dict["batch_idx"] + loss_dict = info_dict['loss_dict'] + rank = int(os.environ.get('RANK', 0)) + + # only rank 0 write to tensorboard to avoid multi-process write + if writer is not None: + if (info_dict['train_engine'] == 'deepspeed' and info_dict['is_gradient_accumulation_boundary'] is True) or \ + (info_dict['train_engine'] == 'torch_ddp' and (info_dict['batch_idx'] + 1) % info_dict['accum_grad'] == 0): + for k in ['epoch', 'lr', 'grad_norm']: + writer.add_scalar('{}/{}'.format(tag, k), info_dict[k], step + 1) + for k, v in loss_dict.items(): + writer.add_scalar('{}/{}'.format(tag, k), v, step + 1) + + # TRAIN & CV, Shell log (stdout) + if (info_dict['batch_idx'] + 1) % info_dict['log_interval'] == 0: + log_str = '{} Batch {}/{} '.format(tag, epoch, batch_idx + 1) + for name, value in loss_dict.items(): + log_str += '{} {:.6f} '.format(name, value) + if tag == "TRAIN": + log_str += 'lr {:.8f} grad_norm {:.6f}'.format( + info_dict["lr"], info_dict['grad_norm']) + log_str += ' rank {}'.format(rank) + logging.debug(log_str) + + +def log_per_save(writer, info_dict): + tag = info_dict["tag"] + epoch = info_dict["epoch"] + step = info_dict["step"] + loss_dict = info_dict["loss_dict"] + lr = info_dict['lr'] + rank = int(os.environ.get('RANK', 0)) + logging.info( + 'Epoch {} Step {} CV info lr {} {} rank {}'.format( + epoch, step + 1, lr, rank, ' '.join(['{}_{}'.format(k, v) for k, v in loss_dict.items()]))) + + if writer is not None: + for k in ['epoch', 'lr']: + writer.add_scalar('{}/{}'.format(tag, k), info_dict[k], step + 1) + for k, v in loss_dict.items(): + writer.add_scalar('{}/{}'.format(tag, k), v, step + 1) From 2a67d8b19c1ff4789e22075db74e974b86e9c01d Mon Sep 17 00:00:00 2001 From: Weaxs <459312872@qq.com> Date: Fri, 26 Jul 2024 16:28:26 +0800 Subject: [PATCH 214/298] FEAT: add llama-3.1, llama-3.1-instruct (#1932) Co-authored-by: qinxuye <qinxuye@gmail.com> --- doc/source/models/builtin/llm/index.rst | 14 + .../models/builtin/llm/llama-3.1-instruct.rst | 271 ++++++++++++++++++ doc/source/models/builtin/llm/llama-3.1.rst | 63 ++++ xinference/model/llm/llm_family.json | 259 +++++++++++++++++ .../model/llm/llm_family_modelscope.json | 152 ++++++++++ 5 files changed, 759 insertions(+) create mode 100644 doc/source/models/builtin/llm/llama-3.1-instruct.rst create mode 100644 doc/source/models/builtin/llm/llama-3.1.rst diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index f3673f7172..b915d0e1f1 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -281,6 +281,16 @@ The following is a list of built-in LLM in Xinference: - 8192 - The Llama 3 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks.. + * - :ref:`llama-3.1 <models_llm_llama-3.1>` + - generate + - 131072 + - Llama 3.1 is an auto-regressive language model that uses an optimized transformer architecture + + * - :ref:`llama-3.1-instruct <models_llm_llama-3.1-instruct>` + - chat + - 131072 + - The Llama 3.1 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks.. + * - :ref:`minicpm-2b-dpo-bf16 <models_llm_minicpm-2b-dpo-bf16>` - chat - 4096 @@ -682,6 +692,10 @@ The following is a list of built-in LLM in Xinference: llama-3-instruct + llama-3.1 + + llama-3.1-instruct + minicpm-2b-dpo-bf16 minicpm-2b-dpo-fp16 diff --git a/doc/source/models/builtin/llm/llama-3.1-instruct.rst b/doc/source/models/builtin/llm/llama-3.1-instruct.rst new file mode 100644 index 0000000000..9f7d7fe524 --- /dev/null +++ b/doc/source/models/builtin/llm/llama-3.1-instruct.rst @@ -0,0 +1,271 @@ +.. _models_llm_llama-3.1-instruct: + +======================================== +llama-3.1-instruct +======================================== + +- **Context Length:** 131072 +- **Model Name:** llama-3.1-instruct +- **Languages:** en, de, fr, it, pt, hi, es, th +- **Abilities:** chat +- **Description:** The Llama 3.1 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks.. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (ggufv2, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 8 +- **Quantizations:** Q3_K_L, IQ4_XS, Q4_K_M, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp +- **Model ID:** lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 8 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 2 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** none +- **Engines**: Transformers +- **Model ID:** meta-llama/Meta-Llama-3.1-8B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 8 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** 4-bit +- **Engines**: Transformers +- **Model ID:** unsloth/Meta-Llama-3.1-8B-Instruct-bnb-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/unsloth/Meta-Llama-3.1-8B-Instruct-bnb-4bit>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 8 --model-format pytorch --quantization ${quantization} + + +Model Spec 4 (gptq, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 8 +- **Quantizations:** Int4 +- **Engines**: Transformers +- **Model ID:** hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4 +- **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 8 --model-format gptq --quantization ${quantization} + + +Model Spec 5 (awq, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 8 +- **Quantizations:** Int4 +- **Engines**: Transformers +- **Model ID:** hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4 +- **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 8 --model-format awq --quantization ${quantization} + + +Model Spec 6 (ggufv2, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 70 +- **Quantizations:** IQ2_M, IQ4_XS, Q2_K, Q3_K_S, Q4_K_M, Q5_K_M, Q6_K, Q8_0 +- **Engines**: llama.cpp +- **Model ID:** lmstudio-community/Meta-Llama-3.1-70B-Instruct-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/lmstudio-community/Meta-Llama-3.1-70B-Instruct-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 7 (pytorch, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 70 +- **Quantizations:** none +- **Engines**: Transformers +- **Model ID:** meta-llama/Meta-Llama-3.1-70B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 70 --model-format pytorch --quantization ${quantization} + + +Model Spec 8 (pytorch, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 70 +- **Quantizations:** 4-bit +- **Engines**: Transformers +- **Model ID:** unsloth/Meta-Llama-3.1-70B-Instruct-bnb-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/unsloth/Meta-Llama-3.1-70B-Instruct-bnb-4bit>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 70 --model-format pytorch --quantization ${quantization} + + +Model Spec 9 (gptq, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 70 +- **Quantizations:** Int4 +- **Engines**: Transformers +- **Model ID:** hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4 +- **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 70 --model-format gptq --quantization ${quantization} + + +Model Spec 10 (awq, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 70 +- **Quantizations:** Int4 +- **Engines**: Transformers +- **Model ID:** hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4 +- **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 70 --model-format awq --quantization ${quantization} + + +Model Spec 11 (mlx, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 8 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3.1-8B-Instruct-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3.1-8B-Instruct-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 8 --model-format mlx --quantization ${quantization} + + +Model Spec 12 (mlx, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 8 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3.1-8B-Instruct-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3.1-8B-Instruct-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 8 --model-format mlx --quantization ${quantization} + + +Model Spec 13 (mlx, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 8 +- **Quantizations:** none +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3.1-8B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3.1-8B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 8 --model-format mlx --quantization ${quantization} + + +Model Spec 14 (mlx, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 70 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3.1-70B-Instruct-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3.1-70B-Instruct-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 70 --model-format mlx --quantization ${quantization} + + +Model Spec 15 (mlx, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 70 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3.1-70B-Instruct-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3.1-70B-Instruct-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 70 --model-format mlx --quantization ${quantization} + + +Model Spec 16 (mlx, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 70 +- **Quantizations:** none +- **Engines**: MLX +- **Model ID:** mlx-community/Meta-Llama-3.1-70B-Instruct-bf16 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Meta-Llama-3.1-70B-Instruct-bf16>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 70 --model-format mlx --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/llama-3.1.rst b/doc/source/models/builtin/llm/llama-3.1.rst new file mode 100644 index 0000000000..8afb580545 --- /dev/null +++ b/doc/source/models/builtin/llm/llama-3.1.rst @@ -0,0 +1,63 @@ +.. _models_llm_llama-3.1: + +======================================== +llama-3.1 +======================================== + +- **Context Length:** 131072 +- **Model Name:** llama-3.1 +- **Languages:** en, de, fr, it, pt, hi, es, th +- **Abilities:** generate +- **Description:** Llama 3.1 is an auto-regressive language model that uses an optimized transformer architecture + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers +- **Model ID:** meta-llama/Meta-Llama-3.1-8B +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-8B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1 --size-in-billions 8 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (ggufv2, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 8 +- **Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_1, Q4_K_M, Q4_K_S, Q5_0, Q5_1, Q5_K_M, Q5_K_S, Q6_K, Q8_0 +- **Engines**: llama.cpp +- **Model ID:** QuantFactory/Meta-Llama-3.1-8B-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/QuantFactory/Meta-Llama-3.1-8B-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1 --size-in-billions 8 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 3 (pytorch, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 70 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers +- **Model ID:** meta-llama/Meta-Llama-3.1-70B +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-70B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1 --size-in-billions 70 --model-format pytorch --quantization ${quantization} + diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 59d9d38a7b..c26a4192e9 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1737,6 +1737,265 @@ ] } }, + { + "version": 1, + "context_length": 131072, + "model_name": "llama-3.1", + "model_lang": [ + "en", + "de", + "fr", + "it", + "pt", + "hi", + "es", + "th" + ], + "model_ability": [ + "generate" + ], + "model_description": "Llama 3.1 is an auto-regressive language model that uses an optimized transformer architecture", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "meta-llama/Meta-Llama-3.1-8B" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 8, + "quantizations": [ + "Q2_K", + "Q3_K_L", + "Q3_K_M", + "Q3_K_S", + "Q4_0", + "Q4_1", + "Q4_K_M", + "Q4_K_S", + "Q5_0", + "Q5_1", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q8_0" + ], + "model_id": "QuantFactory/Meta-Llama-3.1-8B-GGUF", + "model_file_name_template": "Meta-Llama-3.1-8B.{quantization}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "meta-llama/Meta-Llama-3.1-70B" + } + ] + }, + { + "version": 1, + "context_length": 131072, + "model_name": "llama-3.1-instruct", + "model_lang": [ + "en", + "de", + "fr", + "it", + "pt", + "hi", + "es", + "th" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Llama 3.1 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks..", + "model_specs": [ + { + "model_format": "ggufv2", + "model_size_in_billions": 8, + "quantizations": [ + "Q3_K_L", + "IQ4_XS", + "Q4_K_M", + "Q5_K_M", + "Q6_K", + "Q8_0" + ], + "model_id": "lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF", + "model_file_name_template": "Meta-Llama-3.1-8B-Instruct-{quantization}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "none" + ], + "model_id": "meta-llama/Meta-Llama-3.1-8B-Instruct" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit" + ], + "model_id": "unsloth/Meta-Llama-3.1-8B-Instruct-bnb-4bit" + }, + { + "model_format": "gptq", + "model_size_in_billions": 8, + "quantizations": [ + "Int4" + ], + "model_id": "hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4" + }, + { + "model_format": "awq", + "model_size_in_billions": 8, + "quantizations": [ + "Int4" + ], + "model_id": "hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 70, + "quantizations": [ + "IQ2_M", + "IQ4_XS", + "Q2_K", + "Q3_K_S", + "Q4_K_M", + "Q5_K_M", + "Q6_K", + "Q8_0" + ], + "quantization_parts": { + "Q5_K_M": [ + "00001-of-00002", + "00002-of-00002" + ], + "Q6_K": [ + "00001-of-00002", + "00002-of-00002" + ], + "Q8_0": [ + "00001-of-00002", + "00002-of-00002" + ] + }, + "model_id": "lmstudio-community/Meta-Llama-3.1-70B-Instruct-GGUF", + "model_file_name_template": "Meta-Llama-3.1-70B-Instruct-{quantization}.gguf", + "model_file_name_split_template": "Meta-Llama-3.1-70B-Instruct-{quantization}-{part}.gguf" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 70, + "quantizations": [ + "none" + ], + "model_id": "meta-llama/Meta-Llama-3.1-70B-Instruct" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit" + ], + "model_id": "unsloth/Meta-Llama-3.1-70B-Instruct-bnb-4bit" + }, + { + "model_format": "gptq", + "model_size_in_billions": 70, + "quantizations": [ + "Int4" + ], + "model_id": "hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4" + }, + { + "model_format": "awq", + "model_size_in_billions": 70, + "quantizations": [ + "Int4" + ], + "model_id": "hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4" + }, + { + "model_format": "mlx", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Meta-Llama-3.1-8B-Instruct-4bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 8, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Meta-Llama-3.1-8B-Instruct-8bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 8, + "quantizations": [ + "none" + ], + "model_id": "mlx-community/Meta-Llama-3.1-8B-Instruct" + }, + { + "model_format": "mlx", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Meta-Llama-3.1-70B-Instruct-4bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 70, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Meta-Llama-3.1-70B-Instruct-8bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 70, + "quantizations": [ + "none" + ], + "model_id": "mlx-community/Meta-Llama-3.1-70B-Instruct-bf16" + } + ], + "prompt_style": { + "style_name": "LLAMA3", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n\n", + "inter_message_sep": "<|eot_id|>", + "stop_token_ids": [ + 128001, + 128009 + ], + "stop": [ + "<|end_of_text|>", + "<|eot_id|>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index aea0d0c795..f7862feea3 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -194,6 +194,158 @@ ] } }, + { + "version": 1, + "context_length": 131072, + "model_name": "llama-3.1", + "model_lang": [ + "en", + "de", + "fr", + "it", + "pt", + "hi", + "es", + "th" + ], + "model_ability": [ + "generate" + ], + "model_description": "Llama 3.1 is an auto-regressive language model that uses an optimized transformer architecture", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-8B", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-70B", + "model_hub": "modelscope" + } + ] + }, + { + "version": 1, + "context_length": 131072, + "model_name": "llama-3.1-instruct", + "model_lang": [ + "en", + "de", + "fr", + "it", + "pt", + "hi", + "es", + "th" + ], + "model_ability": [ + "chat" + ], + "model_description": "The Llama 3.1 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks..", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-8B-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": 8, + "quantizations": [ + "Int4" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4", + "model_hub": "modelscope" + }, + { + "model_format": "awq", + "model_size_in_billions": 8, + "quantizations": [ + "Int4" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4", + "model_hub": "modelscope" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 8, + "quantizations": [ + "Q3_K_L", + "Q4_K_M", + "Q5_K_M", + "Q6_K", + "Q8_0" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-8B-Instruct-GGUF", + "model_file_name_template": "Meta-Llama-3.1-8B-Instruct-{quantization}.gguf", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 70, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-70B-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": 70, + "quantizations": [ + "Int4" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4", + "model_hub": "modelscope" + }, + { + "model_format": "awq", + "model_size_in_billions": 70, + "quantizations": [ + "Int4" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "LLAMA3", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n\n", + "inter_message_sep": "<|eot_id|>", + "stop_token_ids": [ + 128001, + 128009 + ], + "stop": [ + "<|end_of_text|>", + "<|eot_id|>" + ] + } + }, { "version": 1, "context_length": 2048, From c521cdd2680144e755e707e98b0f8bc7aa7e2d77 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 26 Jul 2024 18:34:57 +0800 Subject: [PATCH 215/298] FEAT: support mistral-large-instruct (#1944) --- doc/source/getting_started/installation.rst | 2 +- doc/source/models/builtin/llm/index.rst | 7 + .../builtin/llm/mistral-large-instruct.rst | 143 ++++++++++++++++ doc/source/user_guide/backends.rst | 2 +- xinference/model/llm/llm_family.json | 157 ++++++++++++++++++ .../model/llm/llm_family_modelscope.json | 57 +++++++ xinference/model/llm/vllm/core.py | 1 + 7 files changed, 367 insertions(+), 2 deletions(-) create mode 100644 doc/source/models/builtin/llm/mistral-large-instruct.rst diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index c6562746c3..5f366107b4 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -42,7 +42,7 @@ Currently, supported models include: - ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` -- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct`` +- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-instruct`` - ``codestral-v0.1`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index b915d0e1f1..aabec0054d 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -336,6 +336,11 @@ The following is a list of built-in LLM in Xinference: - 32768 - The Mistral-7B-Instruct-v0.2 Large Language Model (LLM) is an improved instruct fine-tuned version of Mistral-7B-Instruct-v0.1. + * - :ref:`mistral-large-instruct <models_llm_mistral-large-instruct>` + - chat + - 131072 + - Mistral-Large-Instruct-2407 is an advanced dense Large Language Model (LLM) of 123B parameters with state-of-the-art reasoning, knowledge and coding capabilities. + * - :ref:`mistral-nemo-instruct <models_llm_mistral-nemo-instruct>` - chat - 1024000 @@ -714,6 +719,8 @@ The following is a list of built-in LLM in Xinference: mistral-instruct-v0.3 + mistral-large-instruct + mistral-nemo-instruct mistral-v0.1 diff --git a/doc/source/models/builtin/llm/mistral-large-instruct.rst b/doc/source/models/builtin/llm/mistral-large-instruct.rst new file mode 100644 index 0000000000..1b23a41ed2 --- /dev/null +++ b/doc/source/models/builtin/llm/mistral-large-instruct.rst @@ -0,0 +1,143 @@ +.. _models_llm_mistral-large-instruct: + +======================================== +mistral-large-instruct +======================================== + +- **Context Length:** 131072 +- **Model Name:** mistral-large-instruct +- **Languages:** en, fr, de, es, it, pt, zh, ru, ja, ko +- **Abilities:** chat +- **Description:** Mistral-Large-Instruct-2407 is an advanced dense Large Language Model (LLM) of 123B parameters with state-of-the-art reasoning, knowledge and coding capabilities. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 123 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 123 +- **Quantizations:** none +- **Engines**: vLLM, Transformers +- **Model ID:** mistralai/Mistral-Large-Instruct-2407 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-Large-Instruct-2407>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Mistral-Large-Instruct-2407-bnb-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-large-instruct --size-in-billions 123 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 123 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 123 +- **Quantizations:** 4-bit +- **Engines**: Transformers +- **Model ID:** unsloth/Mistral-Large-Instruct-2407-bnb-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/unsloth/Mistral-Large-Instruct-2407-bnb-4bit>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Mistral-Large-Instruct-2407-bnb-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-large-instruct --size-in-billions 123 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (gptq, 123 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 123 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** ModelCloud/Mistral-Large-Instruct-2407-gptq-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/ModelCloud/Mistral-Large-Instruct-2407-gptq-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-large-instruct --size-in-billions 123 --model-format gptq --quantization ${quantization} + + +Model Spec 4 (awq, 123 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 123 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers +- **Model ID:** TechxGenus/Mistral-Large-Instruct-2407-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TechxGenus/Mistral-Large-Instruct-2407-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-large-instruct --size-in-billions 123 --model-format awq --quantization ${quantization} + + +Model Spec 5 (ggufv2, 123 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 123 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_K_S, Q4_K_M +- **Engines**: llama.cpp +- **Model ID:** MaziyarPanahi/Mistral-Large-Instruct-2407-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/MaziyarPanahi/Mistral-Large-Instruct-2407-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-large-instruct --size-in-billions 123 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 6 (mlx, 123 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 123 +- **Quantizations:** none +- **Engines**: MLX +- **Model ID:** mlx-community/Mistral-Large-Instruct-2407-bf16 +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Mistral-Large-Instruct-2407-bf16>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-large-instruct --size-in-billions 123 --model-format mlx --quantization ${quantization} + + +Model Spec 7 (mlx, 123 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 123 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Mistral-Large-Instruct-2407-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Mistral-Large-Instruct-2407-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-large-instruct --size-in-billions 123 --model-format mlx --quantization ${quantization} + + +Model Spec 8 (mlx, 123 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 123 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/Mistral-Large-Instruct-2407-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/Mistral-Large-Instruct-2407-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name mistral-large-instruct --size-in-billions 123 --model-format mlx --quantization ${quantization} + diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 7d00b22e18..3ff456d612 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -49,7 +49,7 @@ Currently, supported model includes: - ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` -- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct`` +- ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-instruct`` - ``codestral-v0.1`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index c26a4192e9..a01f63569b 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -4335,6 +4335,163 @@ ] } }, + { + "version": 1, + "context_length": 131072, + "model_name": "mistral-large-instruct", + "model_lang": [ + "en", + "fr", + "de", + "es", + "it", + "pt", + "zh", + "ru", + "ja", + "ko" + ], + "model_ability": [ + "chat" + ], + "model_description": "Mistral-Large-Instruct-2407 is an advanced dense Large Language Model (LLM) of 123B parameters with state-of-the-art reasoning, knowledge and coding capabilities.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 123, + "quantizations": [ + "none" + ], + "model_id": "mistralai/Mistral-Large-Instruct-2407" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 123, + "quantizations": [ + "4-bit" + ], + "model_id": "unsloth/Mistral-Large-Instruct-2407-bnb-4bit" + }, + { + "model_format": "gptq", + "model_size_in_billions": 123, + "quantizations": [ + "Int4" + ], + "model_id": "ModelCloud/Mistral-Large-Instruct-2407-gptq-4bit" + }, + { + "model_format": "awq", + "model_size_in_billions": 123, + "quantizations": [ + "Int4" + ], + "model_id": "TechxGenus/Mistral-Large-Instruct-2407-AWQ" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 123, + "quantizations": [ + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_K_S", + "Q4_K_M" + ], + "model_id": "MaziyarPanahi/Mistral-Large-Instruct-2407-GGUF", + "model_file_name_template": "Mistral-Large-Instruct-2407.{quantization}.gguf", + "model_file_name_split_template": "Mixtral-8x22B-Instruct-v0.1.{quantization}-{part}.gguf", + "quantization_parts": { + "Q3_K_L": [ + "00001-of-00007", + "00002-of-00007", + "00003-of-00007", + "00004-of-00007", + "00005-of-00007", + "00006-of-00007", + "00007-of-00007" + ], + "Q3_K_M": [ + "00001-of-00007", + "00002-of-00007", + "00003-of-00007", + "00004-of-00007", + "00005-of-00007", + "00006-of-00007", + "00007-of-00007" + ], + "Q3_K_S": [ + "00001-of-00007", + "00002-of-00007", + "00003-of-00007", + "00004-of-00007", + "00005-of-00007", + "00006-of-00007", + "00007-of-00007" + ], + "Q4_K_M": [ + "00001-of-00007", + "00002-of-00007", + "00003-of-00007", + "00004-of-00007", + "00005-of-00007", + "00006-of-00007", + "00007-of-00007" + ], + "Q4_K_S": [ + "00001-of-00007", + "00002-of-00007", + "00003-of-00007", + "00004-of-00007", + "00005-of-00007", + "00006-of-00007", + "00007-of-00007" + ] + } + }, + { + "model_format": "mlx", + "model_size_in_billions": 123, + "quantizations": [ + "none" + ], + "model_id": "mlx-community/Mistral-Large-Instruct-2407-bf16" + }, + { + "model_format": "mlx", + "model_size_in_billions": 123, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/Mistral-Large-Instruct-2407-4bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 123, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/Mistral-Large-Instruct-2407-8bit" + } + ], + "prompt_style": { + "style_name": "mistral-nemo", + "system_prompt": "", + "roles": [ + "[INST]", + "[/INST]" + ], + "intra_message_sep": "", + "inter_message_sep": "</s>", + "stop_token_ids": [ + 2 + ], + "stop": [ + "</s>" + ] + } + }, { "version": 1, "context_length": 32768, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index f7862feea3..37f415a1f1 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -2306,6 +2306,63 @@ ] } }, + { + "version": 1, + "context_length": 131072, + "model_name": "mistral-large-instruct", + "model_lang": [ + "en", + "fr", + "de", + "es", + "it", + "pt", + "zh", + "ru", + "ja", + "ko" + ], + "model_ability": [ + "chat" + ], + "model_description": "Mistral-Large-Instruct-2407 is an advanced dense Large Language Model (LLM) of 123B parameters with state-of-the-art reasoning, knowledge and coding capabilities.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 123, + "quantizations": [ + "none" + ], + "model_id": "LLM-Research/Mistral-Large-Instruct-2407", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 123, + "quantizations": [ + "4-bit" + ], + "model_id": "LLM-Research/Mistral-Large-Instruct-2407-bnb-4bit", + "model_hub": "modelscope" + } + ], + "prompt_style": { + "style_name": "mistral-nemo", + "system_prompt": "", + "roles": [ + "[INST]", + "[/INST]" + ], + "intra_message_sep": "", + "inter_message_sep": "</s>", + "stop_token_ids": [ + 2 + ], + "stop": [ + "</s>" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index bffdf22ecc..26173d51b3 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -153,6 +153,7 @@ class VLLMGenerateConfig(TypedDict, total=False): if VLLM_INSTALLED and vllm.__version__ >= "0.5.3": VLLM_SUPPORTED_CHAT_MODELS.append("mistral-nemo-instruct") + VLLM_SUPPORTED_CHAT_MODELS.append("mistral-large-instruct") class VLLMModel(LLM): From 681246f64cd32c5f5a3515f62a8daaf44a37893e Mon Sep 17 00:00:00 2001 From: Phoenix <Phoenix500526@163.com> Date: Fri, 26 Jul 2024 18:36:11 +0800 Subject: [PATCH 216/298] Feat: support for llama 3.1 for vllm (#1935) Co-authored-by: qinxuye <qinxuye@gmail.com> --- doc/source/getting_started/installation.rst | 2 +- doc/source/models/builtin/llm/llama-3.1-instruct.rst | 12 ++++++------ doc/source/user_guide/backends.rst | 2 +- setup.cfg | 4 ++-- xinference/model/llm/vllm/core.py | 4 ++++ 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 5f366107b4..0710f2df17 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -39,7 +39,7 @@ Currently, supported models include: .. vllm_start -- ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` +- ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``, ``llama-3.1``, ``llama-3.1-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-instruct`` diff --git a/doc/source/models/builtin/llm/llama-3.1-instruct.rst b/doc/source/models/builtin/llm/llama-3.1-instruct.rst index 9f7d7fe524..9460eb7874 100644 --- a/doc/source/models/builtin/llm/llama-3.1-instruct.rst +++ b/doc/source/models/builtin/llm/llama-3.1-instruct.rst @@ -36,7 +36,7 @@ Model Spec 2 (pytorch, 8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 8 - **Quantizations:** none -- **Engines**: Transformers +- **Engines**: vLLM, Transformers - **Model ID:** meta-llama/Meta-Llama-3.1-8B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct>`__ @@ -68,7 +68,7 @@ Model Spec 4 (gptq, 8 Billion) - **Model Format:** gptq - **Model Size (in billions):** 8 - **Quantizations:** Int4 -- **Engines**: Transformers +- **Engines**: vLLM, Transformers - **Model ID:** hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4 - **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4>`__ @@ -84,7 +84,7 @@ Model Spec 5 (awq, 8 Billion) - **Model Format:** awq - **Model Size (in billions):** 8 - **Quantizations:** Int4 -- **Engines**: Transformers +- **Engines**: vLLM, Transformers - **Model ID:** hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4 - **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4>`__ @@ -116,7 +116,7 @@ Model Spec 7 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** none -- **Engines**: Transformers +- **Engines**: vLLM, Transformers - **Model ID:** meta-llama/Meta-Llama-3.1-70B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct>`__ @@ -148,7 +148,7 @@ Model Spec 9 (gptq, 70 Billion) - **Model Format:** gptq - **Model Size (in billions):** 70 - **Quantizations:** Int4 -- **Engines**: Transformers +- **Engines**: vLLM, Transformers - **Model ID:** hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4 - **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4>`__ @@ -164,7 +164,7 @@ Model Spec 10 (awq, 70 Billion) - **Model Format:** awq - **Model Size (in billions):** 70 - **Quantizations:** Int4 -- **Engines**: Transformers +- **Engines**: vLLM, Transformers - **Model ID:** hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4 - **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4>`__ diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 3ff456d612..76f4a2c1e6 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -46,7 +46,7 @@ Currently, supported model includes: .. vllm_start -- ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct`` +- ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``, ``llama-3.1``, ``llama-3.1-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-instruct`` diff --git a/setup.cfg b/setup.cfg index 599be2c821..dba0947956 100644 --- a/setup.cfg +++ b/setup.cfg @@ -83,7 +83,7 @@ dev = sphinx-design all = llama-cpp-python>=0.2.25,!=0.2.58 - transformers>=4.34.1 + transformers>=4.34.2 torch accelerate>=0.27.2 sentencepiece @@ -126,7 +126,7 @@ intel = ggml = llama-cpp-python>=0.2.25,!=0.2.58 transformers = - transformers>=4.34.1 + transformers>=4.34.2 torch accelerate>=0.27.2 sentencepiece diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 26173d51b3..71f259d656 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -155,6 +155,10 @@ class VLLMGenerateConfig(TypedDict, total=False): VLLM_SUPPORTED_CHAT_MODELS.append("mistral-nemo-instruct") VLLM_SUPPORTED_CHAT_MODELS.append("mistral-large-instruct") +if VLLM_INSTALLED and vllm.__version__ > "0.5.3": + VLLM_SUPPORTED_MODELS.append("llama-3.1") + VLLM_SUPPORTED_CHAT_MODELS.append("llama-3.1-instruct") + class VLLMModel(LLM): def __init__( From d5562f8f94a553988a7f41dffa8b7a7ff89c3034 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 26 Jul 2024 18:41:06 +0800 Subject: [PATCH 217/298] DOC: update new models to readme (#1946) --- README.md | 10 +++++----- README_zh_CN.md | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4d75133fca..933e9d5d29 100644 --- a/README.md +++ b/README.md @@ -34,14 +34,14 @@ potential of cutting-edge AI models. - Support speech recognition model: [#929](https://github.com/xorbitsai/inference/pull/929) - Metrics support: [#906](https://github.com/xorbitsai/inference/pull/906) ### New Models +- Built-in support for [Mistral Large 2](https://mistral.ai/news/mistral-large-2407/): [#1944](https://github.com/xorbitsai/inference/pull/1944) +- Built-in support for [llama3.1](https://ai.meta.com/blog/meta-llama-3-1/): [#1932](https://github.com/xorbitsai/inference/pull/1932) +- Built-in support for [Mistral Nemo](https://mistral.ai/news/mistral-nemo/): [#1936](https://github.com/xorbitsai/inference/pull/1936) +- Built-in support for [CosyVoice](https://github.com/FunAudioLLM/CosyVoice): [#1881](https://github.com/xorbitsai/inference/pull/1881) +- Built-in support for [codegeex4](https://github.com/THUDM/CodeGeeX4): [#1888](https://github.com/xorbitsai/inference/pull/1888) - Built-in support for [Gemma-2-it](https://huggingface.co/blog/gemma2): [#1774](https://github.com/xorbitsai/inference/pull/1774) - Built-in support for [jina-reranker-v2](https://huggingface.co/jinaai/jina-reranker-v2-base-multilingual): [#1733](https://github.com/xorbitsai/inference/pull/1733) - Built-in support for [Qwen2](https://github.com/QwenLM/Qwen2): [#1509](https://github.com/xorbitsai/inference/pull/1597) -- Built-in support for [ChatTTS](https://github.com/2noise/ChatTTS): [#1578](https://github.com/xorbitsai/inference/pull/1578) -- Built-in support for [GLM-4 & GLM-4V](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) -- Built-in support for [Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3): [#1576](https://github.com/xorbitsai/inference/pull/1576) -- Built-in support for [Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1): [#1575](https://github.com/xorbitsai/inference/pull/1575) -- Built-in support for [MiniCPM-Llama3-V 2.5](https://github.com/OpenBMB/MiniCPM-V): [#1577](https://github.com/xorbitsai/inference/pull/1577) ### Integrations - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. diff --git a/README_zh_CN.md b/README_zh_CN.md index 5a46a10dd9..7d7fd08250 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -31,14 +31,14 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - 支持语音识别模型: [#929](https://github.com/xorbitsai/inference/pull/929) - 增加 Metrics 统计信息: [#906](https://github.com/xorbitsai/inference/pull/906) ### 新模型 +- 内置 [Mistral Large 2](https://mistral.ai/news/mistral-large-2407/): [#1944](https://github.com/xorbitsai/inference/pull/1944) +- 内置 [llama3.1](https://ai.meta.com/blog/meta-llama-3-1/): [#1932](https://github.com/xorbitsai/inference/pull/1932) +- 内置 [Mistral Nemo](https://mistral.ai/news/mistral-nemo/): [#1936](https://github.com/xorbitsai/inference/pull/1936) +- 内置 [CosyVoice](https://github.com/FunAudioLLM/CosyVoice): [#1881](https://github.com/xorbitsai/inference/pull/1881) +- 内置 [codegeex4](https://github.com/THUDM/CodeGeeX4): [#1888](https://github.com/xorbitsai/inference/pull/1888) - 内置 [Gemma-2-it](https://huggingface.co/blog/gemma2): [#1774](https://github.com/xorbitsai/inference/pull/1774) - 内置 [jina-reranker-v2](https://huggingface.co/jinaai/jina-reranker-v2-base-multilingual): [#1733](https://github.com/xorbitsai/inference/pull/1733) - 内置 [Qwen2](https://github.com/QwenLM/Qwen2): [#1509](https://github.com/xorbitsai/inference/pull/1597) -- 内置 [ChatTTS](https://github.com/2noise/ChatTTS): [#1578](https://github.com/xorbitsai/inference/pull/1578) -- 内置 [GLM-4 & GLM-4V](https://github.com/THUDM/GLM-4): [#1584](https://github.com/xorbitsai/inference/pull/1584) -- 内置 [Mistral-7B-Instruct-v0.3](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3): [#1576](https://github.com/xorbitsai/inference/pull/1576) -- 内置 [Codestral-22B-v0.1](https://huggingface.co/mistralai/Codestral-22B-v0.1): [#1575](https://github.com/xorbitsai/inference/pull/1575) -- 内置 [MiniCPM-Llama3-V 2.5](https://github.com/OpenBMB/MiniCPM-V): [#1577](https://github.com/xorbitsai/inference/pull/1577) ### 集成 - [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 From aa51ff22dbfb5644554436270deaf57a7ebaf066 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 26 Jul 2024 18:42:50 +0800 Subject: [PATCH 218/298] FEAT: add rembg flexible model to remove background of image (#1917) --- doc/source/models/builtin/image/index.rst | 2 + xinference/core/scheduler.py | 8 +-- .../model/flexible/launchers/__init__.py | 1 + .../launchers/image_process_launcher.py | 70 +++++++++++++++++++ xinference/model/llm/pytorch/cogvlm2.py | 2 +- 5 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 xinference/model/flexible/launchers/image_process_launcher.py diff --git a/doc/source/models/builtin/image/index.rst b/doc/source/models/builtin/image/index.rst index e0c43fd708..4656c35407 100644 --- a/doc/source/models/builtin/image/index.rst +++ b/doc/source/models/builtin/image/index.rst @@ -26,4 +26,6 @@ The following is a list of built-in image models in Xinference: stable-diffusion-xl-base-1.0 stable-diffusion-xl-inpainting + + stable-diffusion-xl-inpainting \ No newline at end of file diff --git a/xinference/core/scheduler.py b/xinference/core/scheduler.py index da9d4bbe28..c8a0747e56 100644 --- a/xinference/core/scheduler.py +++ b/xinference/core/scheduler.py @@ -81,7 +81,7 @@ def __init__(self, prompt, future_or_queue, is_prefill, *args, **kwargs): self.future_or_queue = future_or_queue # Record error message when this request has error. # Must set stopped=True when this field is set. - self.error_msg: Optional[str] = None + self.error_msg: Optional[str] = None # type: ignore # For compatibility. Record some extra parameters for some special cases. self.extra_kwargs = {} @@ -295,11 +295,11 @@ def gen_uid(cls, model_uid: str, replica_id: str): def __init__(self): super().__init__() - self._waiting_queue: deque[InferenceRequest] = deque() - self._running_queue: deque[InferenceRequest] = deque() + self._waiting_queue: deque[InferenceRequest] = deque() # type: ignore + self._running_queue: deque[InferenceRequest] = deque() # type: ignore self._model = None self._id_to_req = {} - self._abort_req_ids: Set[str] = set() + self._abort_req_ids: Set[str] = set() # type: ignore self._isolation = None async def __post_create__(self): diff --git a/xinference/model/flexible/launchers/__init__.py b/xinference/model/flexible/launchers/__init__.py index 29559082d2..1dc7941c39 100644 --- a/xinference/model/flexible/launchers/__init__.py +++ b/xinference/model/flexible/launchers/__init__.py @@ -12,4 +12,5 @@ # See the License for the specific language governing permissions and # limitations under the License. +from .image_process_launcher import launcher as image_process from .transformers_launcher import launcher as transformers diff --git a/xinference/model/flexible/launchers/image_process_launcher.py b/xinference/model/flexible/launchers/image_process_launcher.py new file mode 100644 index 0000000000..e1e3bece90 --- /dev/null +++ b/xinference/model/flexible/launchers/image_process_launcher.py @@ -0,0 +1,70 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import base64 +from io import BytesIO + +import PIL.Image +import PIL.ImageOps + +from ....types import Image +from ..core import FlexibleModel, FlexibleModelSpec + + +class ImageRemoveBackgroundModel(FlexibleModel): + def infer(self, **kwargs): + invert = kwargs.get("invert", False) + b64_image: str = kwargs.get("image") # type: ignore + only_mask = kwargs.pop("only_mask", True) + image_format = kwargs.pop("image_format", "PNG") + if not b64_image: + raise ValueError("No image found to remove background") + image = base64.b64decode(b64_image) + + try: + from rembg import remove + except ImportError: + error_message = "Failed to import module 'rembg'" + installation_guide = [ + "Please make sure 'rembg' is installed. ", + "You can install it by visiting the installation section of the git repo:\n", + "https://github.com/danielgatis/rembg?tab=readme-ov-file#installation", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + im = PIL.Image.open(BytesIO(image)) + om = remove(im, only_mask=only_mask, **kwargs) + if invert: + om = PIL.ImageOps.invert(om) + + buffered = BytesIO() + om.save(buffered, format=image_format) + img_str = base64.b64encode(buffered.getvalue()).decode() + return Image(url=None, b64_json=img_str) + + +def launcher(model_uid: str, model_spec: FlexibleModelSpec, **kwargs) -> FlexibleModel: + task = kwargs.get("task") + device = kwargs.get("device") + + if task == "remove_background": + return ImageRemoveBackgroundModel( + model_uid=model_uid, + model_path=model_spec.model_uri, # type: ignore + device=device, + config=kwargs, + ) + else: + raise ValueError(f"Unknown Task for image processing: {task}") diff --git a/xinference/model/llm/pytorch/cogvlm2.py b/xinference/model/llm/pytorch/cogvlm2.py index 07f44ad47f..791ecedc98 100644 --- a/xinference/model/llm/pytorch/cogvlm2.py +++ b/xinference/model/llm/pytorch/cogvlm2.py @@ -387,7 +387,7 @@ def _get_full_prompt(self, prompt, system_prompt, chat_history, tools): prompt, system_prompt=system_prompt, chat_history=chat_history ) - input_by_model: dict = self._model.build_conversation_input_ids( + input_by_model: dict = self._model.build_conversation_input_ids( # type: ignore self._tokenizer, query=query, history=history, From 202e6cbcca053c75e2429d54b15d81e0861fd26b Mon Sep 17 00:00:00 2001 From: Weizheng Lu <luweizheng36@hotmail.com> Date: Sat, 27 Jul 2024 12:54:18 +0800 Subject: [PATCH 219/298] ENH: Add support of sglang for llama 3 qwen 2 (#1947) --- xinference/model/llm/sglang/core.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/xinference/model/llm/sglang/core.py b/xinference/model/llm/sglang/core.py index 8a9895097b..9eebfbde7c 100644 --- a/xinference/model/llm/sglang/core.py +++ b/xinference/model/llm/sglang/core.py @@ -63,11 +63,21 @@ class SGLANGGenerateConfig(TypedDict, total=False): except ImportError: SGLANG_INSTALLED = False -SGLANG_SUPPORTED_MODELS = ["llama-2", "mistral-v0.1", "mixtral-v0.1"] +SGLANG_SUPPORTED_MODELS = [ + "llama-2", + "llama-3", + "llama-3.1", + "mistral-v0.1", + "mixtral-v0.1", +] SGLANG_SUPPORTED_CHAT_MODELS = [ "llama-2-chat", + "llama-3-instruct", + "llama-3.1-instruct", "qwen-chat", "qwen1.5-chat", + "qwen2-instruct", + "qwen2-moe-instruct", "mistral-instruct-v0.1", "mistral-instruct-v0.2", "mixtral-instruct-v0.1", From 94580f616328bd7a8ec4d6ad103fb09eb188bd7d Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Mon, 29 Jul 2024 11:06:12 +0200 Subject: [PATCH 220/298] BUG: Fix GLM chat (#1966) --- xinference/model/llm/pytorch/chatglm.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index 9a8b497bee..da970c99a9 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -430,7 +430,10 @@ def non_stream_chat( outputs = self._model.generate(**kwargs) outputs = outputs[:, kwargs["input_ids"].shape[1] :] response = tokenizer.decode(outputs[0], skip_special_tokens=True) - return self._process_response(response, history, tools, end=True) + if tools: + return self._process_response(response, history, tools, end=True) + else: + return self._process_response(response, history, tools) def chat( self, From 76e3ae5329563ac8210e71184dfc18f81c43b35f Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 30 Jul 2024 10:21:11 +0800 Subject: [PATCH 221/298] REF: enable sglang by default (#1953) --- doc/source/getting_started/environments.rst | 10 --------- .../getting_started/environments.po | 22 +++++-------------- xinference/constants.py | 4 ---- xinference/model/llm/sglang/core.py | 5 ----- xinference/model/llm/vllm/core.py | 5 ----- 5 files changed, 5 insertions(+), 41 deletions(-) diff --git a/doc/source/getting_started/environments.rst b/doc/source/getting_started/environments.rst index de7e426296..575abbf2a1 100644 --- a/doc/source/getting_started/environments.rst +++ b/doc/source/getting_started/environments.rst @@ -36,18 +36,8 @@ XINFERENCE_DISABLE_HEALTH_CHECK Xinference will automatically report health check at Xinference startup. Setting this environment to 1 can disable health check. -XINFERENCE_DISABLE_VLLM -~~~~~~~~~~~~~~~~~~~~~~~~ -Xinference will automatically use vLLM as backend if conditions are met. -Setting this environment to 1 can disable the use of vLLM. - XINFERENCE_DISABLE_METRICS ~~~~~~~~~~~~~~~~~~~~~~~~~~ Xinference will by default enable the metrics exporter on the supervisor and worker. Setting this environment to 1 will disable the /metrics endpoint on the supervisor and the HTTP service (only provide the /metrics endpoint) on the worker. - -XINFERENCE_AUDIO_SPEECH_DEFAULT_STREAM -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Xinference audio Speech API will use non-stream by default. Setting this environment -to 1 will use stream by default. diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/environments.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/environments.po index aa258e8781..e8a2a368b6 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/environments.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/environments.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-31 11:46+0800\n" +"POT-Creation-Date: 2024-07-28 22:01+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -100,29 +100,17 @@ msgstr "" "禁用健康检查。" #: ../../source/getting_started/environments.rst:40 -msgid "XINFERENCE_DISABLE_VLLM" -msgstr "XINFERENCE_DISABLE_VLLM" - -#: ../../source/getting_started/environments.rst:41 -msgid "" -"Xinference will automatically use vLLM as backend if conditions are met. " -"Setting this environment to 1 can disable the use of vLLM." -msgstr "" -"在满足条件时,Xinference 会自动使用 vLLM 作为推理引擎提供推理效率,设置改" -"环境变量为 1可以禁用 vLLM。" - -#: ../../source/getting_started/environments.rst:45 #, fuzzy msgid "XINFERENCE_DISABLE_METRICS" msgstr "XINFERENCE_DISABLE_VLLM" -#: ../../source/getting_started/environments.rst:46 +#: ../../source/getting_started/environments.rst:41 msgid "" "Xinference will by default enable the metrics exporter on the supervisor " "and worker. Setting this environment to 1 will disable the /metrics " "endpoint on the supervisor and the HTTP service (only provide the " "/metrics endpoint) on the worker." msgstr "" -"Xinference 会默认在 supervisor 和 worker 上启用 metrics exporter。" -"设置环境变量为 1可以在 supervisor 上禁用 /metrics 端点," -"并在 worker 上禁用 HTTP 服务(仅提供 /metrics 端点)" +"Xinference 会默认在 supervisor 和 worker 上启用 metrics exporter。设置" +"环境变量为 1可以在 supervisor 上禁用 /metrics 端点,并在 worker 上禁用 " +"HTTP 服务(仅提供 /metrics 端点)" diff --git a/xinference/constants.py b/xinference/constants.py index 9fa5939603..3efad56ed3 100644 --- a/xinference/constants.py +++ b/xinference/constants.py @@ -26,8 +26,6 @@ XINFERENCE_ENV_HEALTH_CHECK_INTERVAL = "XINFERENCE_HEALTH_CHECK_INTERVAL" XINFERENCE_ENV_HEALTH_CHECK_TIMEOUT = "XINFERENCE_HEALTH_CHECK_TIMEOUT" XINFERENCE_ENV_DISABLE_HEALTH_CHECK = "XINFERENCE_DISABLE_HEALTH_CHECK" -XINFERENCE_ENV_DISABLE_VLLM = "XINFERENCE_DISABLE_VLLM" -XINFERENCE_ENV_ENABLE_SGLANG = "XINFERENCE_ENABLE_SGLANG" XINFERENCE_ENV_DISABLE_METRICS = "XINFERENCE_DISABLE_METRICS" XINFERENCE_ENV_TRANSFORMERS_ENABLE_BATCHING = "XINFERENCE_TRANSFORMERS_ENABLE_BATCHING" @@ -72,8 +70,6 @@ def get_xinference_home() -> str: XINFERENCE_DISABLE_HEALTH_CHECK = bool( int(os.environ.get(XINFERENCE_ENV_DISABLE_HEALTH_CHECK, 0)) ) -XINFERENCE_DISABLE_VLLM = bool(int(os.environ.get(XINFERENCE_ENV_DISABLE_VLLM, 0))) -XINFERENCE_ENABLE_SGLANG = bool(int(os.environ.get(XINFERENCE_ENV_ENABLE_SGLANG, 0))) XINFERENCE_DISABLE_METRICS = bool( int(os.environ.get(XINFERENCE_ENV_DISABLE_METRICS, 0)) ) diff --git a/xinference/model/llm/sglang/core.py b/xinference/model/llm/sglang/core.py index 9eebfbde7c..52def97a1a 100644 --- a/xinference/model/llm/sglang/core.py +++ b/xinference/model/llm/sglang/core.py @@ -17,7 +17,6 @@ import uuid from typing import AsyncGenerator, Dict, List, Optional, TypedDict, Union -from ....constants import XINFERENCE_ENABLE_SGLANG from ....types import ( ChatCompletion, ChatCompletionChunk, @@ -178,8 +177,6 @@ def _sanitize_generate_config( def match( cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str ) -> bool: - if not XINFERENCE_ENABLE_SGLANG: - return False if not cls._has_cuda_device(): return False if not cls._is_linux(): @@ -342,8 +339,6 @@ class SGLANGChatModel(SGLANGModel, ChatModelMixin): def match( cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str ) -> bool: - if not XINFERENCE_ENABLE_SGLANG: - return False if llm_spec.model_format not in ["pytorch", "gptq", "awq"]: return False if llm_spec.model_format == "pytorch": diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 71f259d656..5d29eceb02 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -28,7 +28,6 @@ Union, ) -from ....constants import XINFERENCE_DISABLE_VLLM from ....types import ( ChatCompletion, ChatCompletionChunk, @@ -296,8 +295,6 @@ def _sanitize_generate_config( def match( cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str ) -> bool: - if XINFERENCE_DISABLE_VLLM: - return False if not cls._has_cuda_device(): return False if not cls._is_linux(): @@ -522,8 +519,6 @@ class VLLMChatModel(VLLMModel, ChatModelMixin): def match( cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str ) -> bool: - if XINFERENCE_DISABLE_VLLM: - return False if llm_spec.model_format not in ["pytorch", "gptq", "awq"]: return False if llm_spec.model_format == "pytorch": From 67bebc3f194c97ab6bdf853c372c939acdbea91b Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 30 Jul 2024 10:21:30 +0800 Subject: [PATCH 222/298] ENH: add cache_limit_gb option for MLX (#1954) --- xinference/model/llm/mlx/core.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/xinference/model/llm/mlx/core.py b/xinference/model/llm/mlx/core.py index c344c2f594..e41db2b693 100644 --- a/xinference/model/llm/mlx/core.py +++ b/xinference/model/llm/mlx/core.py @@ -101,6 +101,7 @@ def _sanitize_generate_config( def _load_model(self, **kwargs): try: + import mlx.core as mx from mlx_lm import load except ImportError: error_message = "Failed to import module 'mlx_lm'" @@ -122,6 +123,11 @@ def _load_model(self, **kwargs): self._model_config, ) + cache_limit_gb = kwargs.get("cache_limit_gb", None) + if cache_limit_gb: + logger.debug(f"Setting cache limit to {cache_limit_gb} GB") + mx.metal.set_cache_limit(cache_limit_gb * 1024 * 1024 * 1024) + return load( self.model_path, tokenizer_config=tokenizer_config, @@ -134,6 +140,7 @@ def load(self): "revision", self.model_spec.model_revision ) kwargs["trust_remote_code"] = self._model_config.get("trust_remote_code") + kwargs["cache_limit_gb"] = self._model_config.pop("cache_limit_gb", None) self._model, self._tokenizer = self._load_model(**kwargs) From 09a18acf89adfddefd0f5c9b2471c09a1b464fa8 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 30 Jul 2024 10:21:59 +0800 Subject: [PATCH 223/298] BUG: fix match for transformers from model registered (#1955) --- xinference/model/llm/pytorch/deepseek_vl.py | 3 ++- xinference/model/llm/pytorch/falcon.py | 3 ++- xinference/model/llm/pytorch/llama_2.py | 6 ++++-- xinference/model/llm/pytorch/omnilmm.py | 3 ++- xinference/model/llm/pytorch/qwen_vl.py | 3 ++- xinference/model/llm/pytorch/vicuna.py | 3 ++- xinference/model/llm/pytorch/yi_vl.py | 3 ++- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/xinference/model/llm/pytorch/deepseek_vl.py b/xinference/model/llm/pytorch/deepseek_vl.py index 74a9abce93..d24158f5d4 100644 --- a/xinference/model/llm/pytorch/deepseek_vl.py +++ b/xinference/model/llm/pytorch/deepseek_vl.py @@ -52,7 +52,8 @@ def __init__(self, *args, **kwargs): def match( cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str ) -> bool: - if "deepseek" in model_family.model_name: + llm_family = model_family.model_family or model_family.model_name + if "deepseek-vl" in llm_family: return True return False diff --git a/xinference/model/llm/pytorch/falcon.py b/xinference/model/llm/pytorch/falcon.py index 7f66bdd01f..d4f032333c 100644 --- a/xinference/model/llm/pytorch/falcon.py +++ b/xinference/model/llm/pytorch/falcon.py @@ -71,7 +71,8 @@ def match( ) -> bool: if llm_spec.model_format != "pytorch": return False - if "falcon" not in llm_family.model_name: + model_family = llm_family.model_family or llm_family.model_name + if "falcon" not in model_family: return False if "generate" not in llm_family.model_ability: return False diff --git a/xinference/model/llm/pytorch/llama_2.py b/xinference/model/llm/pytorch/llama_2.py index a7c3e7bba6..4e5e01d263 100644 --- a/xinference/model/llm/pytorch/llama_2.py +++ b/xinference/model/llm/pytorch/llama_2.py @@ -55,7 +55,8 @@ def match( ) -> bool: if llm_spec.model_format != "pytorch": return False - if "llama-2" not in llm_family.model_name: + model_family = llm_family.model_family or llm_family.model_name + if "llama-2" not in model_family: return False if "generate" not in llm_family.model_ability: return False @@ -99,7 +100,8 @@ def match( ) -> bool: if llm_spec.model_format != "pytorch": return False - if "llama-2" not in llm_family.model_name: + model_family = llm_family.model_family or llm_family.model_name + if "llama-2" not in model_family: return False if "chat" not in llm_family.model_ability: return False diff --git a/xinference/model/llm/pytorch/omnilmm.py b/xinference/model/llm/pytorch/omnilmm.py index a8e569b5dc..583f3cc56e 100644 --- a/xinference/model/llm/pytorch/omnilmm.py +++ b/xinference/model/llm/pytorch/omnilmm.py @@ -44,7 +44,8 @@ def __init__(self, *args, **kwargs): def match( cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str ) -> bool: - if "OmniLMM" in model_family.model_name: + llm_family = model_family.model_family or model_family.model_name + if "OmniLMM" in llm_family: return True return False diff --git a/xinference/model/llm/pytorch/qwen_vl.py b/xinference/model/llm/pytorch/qwen_vl.py index 100344441a..8a2be562e3 100644 --- a/xinference/model/llm/pytorch/qwen_vl.py +++ b/xinference/model/llm/pytorch/qwen_vl.py @@ -52,7 +52,8 @@ def __init__(self, *args, **kwargs): def match( cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str ) -> bool: - if "qwen" in model_family.model_name and "vision" in model_family.model_ability: + llm_family = model_family.model_family or model_family.model_name + if "qwen" in llm_family and "vision" in model_family.model_ability: return True return False diff --git a/xinference/model/llm/pytorch/vicuna.py b/xinference/model/llm/pytorch/vicuna.py index 8e9eb16233..f9e8dcfc8a 100644 --- a/xinference/model/llm/pytorch/vicuna.py +++ b/xinference/model/llm/pytorch/vicuna.py @@ -61,7 +61,8 @@ def match( ) -> bool: if llm_spec.model_format != "pytorch": return False - if "vicuna" not in llm_family.model_name: + model_family = llm_family.model_family or llm_family.model_name + if "vicuna" not in model_family: return False if "chat" not in llm_family.model_ability: return False diff --git a/xinference/model/llm/pytorch/yi_vl.py b/xinference/model/llm/pytorch/yi_vl.py index 712d0654df..9714ecec69 100644 --- a/xinference/model/llm/pytorch/yi_vl.py +++ b/xinference/model/llm/pytorch/yi_vl.py @@ -51,7 +51,8 @@ def __init__(self, *args, **kwargs): def match( cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str ) -> bool: - if "yi" in model_family.model_name: + llm_family = model_family.model_family or model_family.model_name + if "yi-vl" in llm_family: return True return False From 38eeae4c72996eadbc9fa46383aff6d3c0e7dc4a Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Tue, 30 Jul 2024 12:19:32 +0800 Subject: [PATCH 224/298] BUG: Load llama.so failed in docker image (#1974) --- xinference/deploy/docker/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index fb652ec19f..7c5f583af0 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -8,6 +8,10 @@ ENV NODE_VERSION 14.21.1 RUN apt-get -y update \ && apt install -y curl procps git libgl1 ffmpeg \ + # upgrade libstdc++ and libc for llama-cpp-python + && printf "\ndeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse" >> /etc/apt/sources.list \ + && apt-get -y update \ + && apt-get install -y --only-upgrade libstdc++6 && apt install -y libc6 \ && mkdir -p $NVM_DIR \ && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash \ && . $NVM_DIR/nvm.sh \ From aafd36e3d3c0717ab9d34a4d04c3bda4936142e0 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Tue, 30 Jul 2024 13:24:55 +0800 Subject: [PATCH 225/298] ENH: [benchmark] Add api-key support (#1961) --- benchmark/benchmark_latency.py | 7 ++++++- benchmark/benchmark_long.py | 9 ++++++++- benchmark/benchmark_rerank.py | 13 +++++++++++-- benchmark/benchmark_serving.py | 9 ++++++++- benchmark/utils.py | 5 ++++- 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/benchmark/benchmark_latency.py b/benchmark/benchmark_latency.py index 7b607cef51..20c96ae04e 100644 --- a/benchmark/benchmark_latency.py +++ b/benchmark/benchmark_latency.py @@ -17,7 +17,7 @@ import logging import random import time -from typing import List, Tuple +from typing import List, Tuple, Optional import numpy as np from utils import get_tokenizer, sample_requests, send_request @@ -32,6 +32,7 @@ async def benchmark( api_url: str, model_uid: str, input_requests: List[Tuple[str, int, int]], + api_key: Optional[str] = None, ) -> None: for request in input_requests: prompt, prompt_len, output_len = request @@ -60,6 +61,7 @@ def main(args: argparse.Namespace): api_url, model_uid, input_requests, + api_key=args.api_key, ) ) @@ -106,6 +108,9 @@ def main(args: argparse.Namespace): help="Trust remote code from huggingface.", ) parser.add_argument("--model-uid", type=str, help="Xinference model UID.") + parser.add_argument( + "--api-key", type=str, default=None, help="Authorization api key", + ) args = parser.parse_args() main(args) diff --git a/benchmark/benchmark_long.py b/benchmark/benchmark_long.py index 13a899dea2..531a8c6858 100644 --- a/benchmark/benchmark_long.py +++ b/benchmark/benchmark_long.py @@ -17,7 +17,7 @@ import logging import random import time -from typing import List, Tuple +from typing import List, Tuple, Optional import numpy as np @@ -38,6 +38,7 @@ def __init__( model_uid: str, input_requests: List[Tuple[str, int, int]], concurrency: int, + api_key: Optional[str]=None, ): self.api_url = api_url @@ -46,6 +47,7 @@ def __init__( self.concurrency = concurrency self.sent = 0 self.left = len(input_requests) + self.api_key = api_key async def run(self): tasks = [] @@ -68,6 +70,7 @@ async def worker(self, i: int): prompt_len, output_len, REQUEST_LATENCY, + api_key=self.api_key, ) self.left -= 1 # pring longer space to overwrite the previous when left decrease @@ -101,6 +104,7 @@ def main(args: argparse.Namespace): model_uid, input_requests, concurrency=args.concurrency, + api_key=args.api_key, ) asyncio.run(benchmark.run()) benchmark_end_time = time.time() @@ -160,5 +164,8 @@ def main(args: argparse.Namespace): help="Trust remote code from huggingface.", ) parser.add_argument("--model-uid", type=str, help="Xinference model UID.") + parser.add_argument( + "--api-key", type=str, default=None, help="Authorization api key", + ) args = parser.parse_args() main(args) diff --git a/benchmark/benchmark_rerank.py b/benchmark/benchmark_rerank.py index 0b7a2438e6..8e6e416fac 100644 --- a/benchmark/benchmark_rerank.py +++ b/benchmark/benchmark_rerank.py @@ -18,7 +18,7 @@ import random import time import aiohttp -from typing import List, Dict +from typing import List, Dict, Optional from datasets import load_dataset @@ -36,6 +36,7 @@ def __init__( input_requests: List[Dict], top_n: int, concurrency: int, + api_key: Optional[str]=None, ): self.api_url = api_url self.model_uid = model_uid @@ -44,6 +45,7 @@ def __init__( self.concurrency = concurrency self.sent = 0 self.left = len(input_requests) + self.api_key = api_key async def run(self): tasks = [] @@ -73,7 +75,8 @@ async def worker(self, i: int): print("") async def send_request( - self, api_url: str, model_uid: str, prompt: str, documents: List[str] + self, api_url: str, model_uid: str, prompt: str, documents: List[str], + api_key: Optional[str]=None, ): request_start_time = time.time() @@ -85,6 +88,8 @@ async def send_request( } headers = {"User-Agent": "Benchmark Client"} + if api_key: + headers["Authorization"] = f"Bearer {api_key}" timeout = aiohttp.ClientTimeout(total=3 * 3600) async with aiohttp.ClientSession(timeout=timeout) as session: @@ -121,6 +126,7 @@ def main(args: argparse.Namespace): input_requests, top_n=args.top_n, concurrency=args.concurrency, + api_key=args.api_key, ) asyncio.run(benchmark.run()) benchmark_end_time = time.time() @@ -161,5 +167,8 @@ def main(args: argparse.Namespace): help="Trust remote code from huggingface.", ) parser.add_argument("--model-uid", type=str, help="Xinference model UID.") + parser.add_argument( + "--api-key", type=str, default=None, help="Authorization api key", + ) args = parser.parse_args() main(args) diff --git a/benchmark/benchmark_serving.py b/benchmark/benchmark_serving.py index 0440e0a722..d60b6da7bb 100644 --- a/benchmark/benchmark_serving.py +++ b/benchmark/benchmark_serving.py @@ -17,7 +17,7 @@ import logging import random import time -from typing import List, Tuple +from typing import List, Tuple, Optional import numpy as np @@ -39,6 +39,7 @@ def __init__( input_requests: List[Tuple[str, int, int]], request_rate: float, concurrency: int, + api_key: Optional[str] = None, ): self.api_url = api_url @@ -48,6 +49,7 @@ def __init__( self.request_rate = request_rate self.queue = asyncio.Queue(concurrency or 100) self.left = len(input_requests) + self.api_key = api_key async def run(self): tasks = [] @@ -78,6 +80,7 @@ async def worker(self): prompt_len, output_len, REQUEST_LATENCY, + api_key=self.api_key, ) self.left -= 1 # pring longer space to overwrite the previous when left decrease @@ -111,6 +114,7 @@ def main(args: argparse.Namespace): input_requests, request_rate=args.request_rate, concurrency=args.concurrency, + api_key=args.api_key, ) asyncio.run(benchmark.run()) benchmark_end_time = time.time() @@ -156,6 +160,9 @@ def main(args: argparse.Namespace): parser.add_argument( "--prompt-len-limit", type=int, default=1024, help="Prompt length limitation." ) + parser.add_argument( + "--api-key", type=str, default=None, help="Authorization api key", + ) parser.add_argument( "--concurrency", "-c", diff --git a/benchmark/utils.py b/benchmark/utils.py index 3a393adc62..345dcaa437 100644 --- a/benchmark/utils.py +++ b/benchmark/utils.py @@ -17,7 +17,7 @@ import logging import random import time -from typing import TYPE_CHECKING, List, Tuple +from typing import TYPE_CHECKING, List, Tuple, Optional import openai from transformers import AutoTokenizer, PreTrainedTokenizerFast @@ -173,6 +173,7 @@ async def send_request( prompt_len: int, output_len: int, stats: List[Tuple[int, int, float]], # output. + api_key: Optional[str]=None, ) -> None: request_start_time = time.time() @@ -187,6 +188,8 @@ async def send_request( } headers = {"User-Agent": "Benchmark Client"} + if api_key: + headers["Authorization"] = f"Bearer {api_key}" timeout = aiohttp.ClientTimeout(total=3 * 3600) async with aiohttp.ClientSession(timeout=timeout) as session: From 31523d688bb7978527df10109b4bd0f57d61f771 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 30 Jul 2024 19:00:03 +0800 Subject: [PATCH 226/298] DOC: ascend support (#1978) --- doc/source/getting_started/installation.rst | 14 +++ .../getting_started/installation_npu.rst | 47 ++++++++ .../getting_started/installation.po | 101 +++++++++++++----- .../getting_started/installation_npu.po | 79 ++++++++++++++ .../zh_CN/LC_MESSAGES/user_guide/backends.po | 80 +++++++++++--- doc/source/user_guide/backends.rst | 6 ++ 6 files changed, 284 insertions(+), 43 deletions(-) create mode 100644 doc/source/getting_started/installation_npu.rst create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation_npu.po diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 0710f2df17..1e13576194 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -99,3 +99,17 @@ SGLang has a high-performance inference runtime with RadixAttention. It signific Initial setup:: pip install 'xinference[sglang]' + + +MLX Backend +~~~~~~~~~~~ +MLX-lm is designed for Apple silicon users to run LLM efficiently. + +Initial setup:: + + pip install 'xinference[mlx]' + +Other Platforms +~~~~~~~~~~~~~~~ + +* :ref:`Ascend NPU <installation_npu>` diff --git a/doc/source/getting_started/installation_npu.rst b/doc/source/getting_started/installation_npu.rst new file mode 100644 index 0000000000..8202661487 --- /dev/null +++ b/doc/source/getting_started/installation_npu.rst @@ -0,0 +1,47 @@ +.. _installation_npu: + + +================================= +Installation Guide for Ascend NPU +================================= +Xinference can run on Ascend NPU, follow below instructions to install. + + +Installing PyTorch and Ascend extension for PyTorch +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Install PyTorch CPU version and corresponding Ascend extension. + +Take PyTorch v2.1.0 as example. + + .. code-block:: bash + + pip3 install torch==2.1.0 torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cpu + +Then install `Ascend extension for PyTorch <https://github.com/Ascend/pytorch>`_. + + .. code-block:: bash + + pip3 install 'numpy<2.0' + pip3 install decorator + pip3 install torch-npu==2.1.0.post3 + +Running below command to see if it correctly prints the Ascend NPU count. + +.. code-block:: bash + + python -c "import torch; import torch_npu; print(torch.npu.device_count())" + +Installing Xinference +~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + pip3 install xinference + +Now you can use xinference according to :ref:`doc <using_xinference>`. +``Transformers`` backend is the only available engine supported for Ascend NPU for open source version. + +Enterprise Support +~~~~~~~~~~~~~~~~~~ +If you encounter any performance or other issues for Ascend NPU, please reach out to us +via `link <https://xorbits.io/community>`_. diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po index b655be777d..4496b34859 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-31 11:46+0800\n" +"POT-Creation-Date: 2024-07-30 17:00+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -116,7 +116,9 @@ msgid "Currently, supported models include:" msgstr "目前,支持的模型包括:" #: ../../source/getting_started/installation.rst:42 -msgid "``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``" +msgid "" +"``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``, " +"``llama-3.1``, ``llama-3.1-instruct``" msgstr "" #: ../../source/getting_started/installation.rst:43 @@ -130,72 +132,95 @@ msgid "" msgstr "" #: ../../source/getting_started/installation.rst:45 -msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" +msgid "" +"``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, " +"``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-" +"instruct``" msgstr "" #: ../../source/getting_started/installation.rst:46 -msgid "``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k``" +msgid "``codestral-v0.1``" msgstr "" #: ../../source/getting_started/installation.rst:47 -msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" +msgid "``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k``" msgstr "" #: ../../source/getting_started/installation.rst:48 +msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" +msgstr "" + +#: ../../source/getting_started/installation.rst:49 msgid "" "``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-" "instruct``" msgstr "" -#: ../../source/getting_started/installation.rst:49 +#: ../../source/getting_started/installation.rst:50 msgid "``codeqwen1.5``, ``codeqwen1.5-chat``" msgstr "" -#: ../../source/getting_started/installation.rst:50 +#: ../../source/getting_started/installation.rst:51 msgid "``vicuna-v1.3``, ``vicuna-v1.5``" msgstr "" -#: ../../source/getting_started/installation.rst:51 +#: ../../source/getting_started/installation.rst:52 msgid "``internlm2-chat``" msgstr "" -#: ../../source/getting_started/installation.rst:52 +#: ../../source/getting_started/installation.rst:53 +msgid "``internlm2.5-chat``, ``internlm2.5-chat-1m``" +msgstr "" + +#: ../../source/getting_started/installation.rst:54 msgid "``qwen-chat``" msgstr "" -#: ../../source/getting_started/installation.rst:53 +#: ../../source/getting_started/installation.rst:55 msgid "``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1``" msgstr "" -#: ../../source/getting_started/installation.rst:54 +#: ../../source/getting_started/installation.rst:56 msgid "``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k``" msgstr "" -#: ../../source/getting_started/installation.rst:55 +#: ../../source/getting_started/installation.rst:57 +msgid "``glm4-chat``, ``glm4-chat-1m``" +msgstr "" + +#: ../../source/getting_started/installation.rst:58 +msgid "``codegeex4``" +msgstr "" + +#: ../../source/getting_started/installation.rst:59 msgid "``qwen1.5-chat``, ``qwen1.5-moe-chat``" msgstr "" -#: ../../source/getting_started/installation.rst:56 +#: ../../source/getting_started/installation.rst:60 +msgid "``qwen2-instruct``, ``qwen2-moe-instruct``" +msgstr "" + +#: ../../source/getting_started/installation.rst:61 msgid "``gemma-it``" msgstr "" -#: ../../source/getting_started/installation.rst:57 +#: ../../source/getting_started/installation.rst:62 msgid "``orion-chat``, ``orion-chat-rag``" msgstr "" -#: ../../source/getting_started/installation.rst:58 +#: ../../source/getting_started/installation.rst:63 msgid "``c4ai-command-r-v01``" msgstr "" -#: ../../source/getting_started/installation.rst:61 +#: ../../source/getting_started/installation.rst:66 msgid "To install Xinference and vLLM::" msgstr "安装 xinference 和 vLLM:" -#: ../../source/getting_started/installation.rst:68 +#: ../../source/getting_started/installation.rst:73 msgid "Llama.cpp Backend" msgstr "Llama.cpp 引擎" -#: ../../source/getting_started/installation.rst:69 +#: ../../source/getting_started/installation.rst:74 msgid "" "Xinference supports models in ``gguf`` and ``ggml`` format via ``llama-" "cpp-python``. It's advised to install the llama.cpp-related dependencies " @@ -204,32 +229,33 @@ msgstr "" "Xinference 通过 ``llama-cpp-python`` 支持 ``gguf`` 和 ``ggml`` 格式的模型" "。建议根据当前使用的硬件手动安装依赖,从而获得最佳的加速效果。" -#: ../../source/getting_started/installation.rst:71 -#: ../../source/getting_started/installation.rst:94 +#: ../../source/getting_started/installation.rst:76 +#: ../../source/getting_started/installation.rst:99 +#: ../../source/getting_started/installation.rst:108 msgid "Initial setup::" msgstr "初始步骤:" -#: ../../source/getting_started/installation.rst:75 +#: ../../source/getting_started/installation.rst:80 msgid "Hardware-Specific installations:" msgstr "不同硬件的安装方式:" -#: ../../source/getting_started/installation.rst:77 +#: ../../source/getting_started/installation.rst:82 msgid "Apple Silicon::" msgstr "Apple M系列" -#: ../../source/getting_started/installation.rst:81 +#: ../../source/getting_started/installation.rst:86 msgid "Nvidia cards::" msgstr "英伟达显卡:" -#: ../../source/getting_started/installation.rst:85 +#: ../../source/getting_started/installation.rst:90 msgid "AMD cards::" msgstr "AMD 显卡:" -#: ../../source/getting_started/installation.rst:91 +#: ../../source/getting_started/installation.rst:96 msgid "SGLang Backend" msgstr "SGLang 引擎" -#: ../../source/getting_started/installation.rst:92 +#: ../../source/getting_started/installation.rst:97 msgid "" "SGLang has a high-performance inference runtime with RadixAttention. It " "significantly accelerates the execution of complex LLM programs by " @@ -240,6 +266,23 @@ msgstr "" "自动重用KV缓存,显著加速了复杂 LLM 程序的执行。它还支持其他常见推理技术," "如连续批处理和张量并行处理。" +#: ../../source/getting_started/installation.rst:105 +#, fuzzy +msgid "MLX Backend" +msgstr "vLLM 引擎" + +#: ../../source/getting_started/installation.rst:106 +msgid "MLX-lm is designed for Apple silicon users to run LLM efficiently." +msgstr "MLX-lm 用来在苹果 silicon 芯片上提供高效的 LLM 推理。" + +#: ../../source/getting_started/installation.rst:113 +msgid "Other Platforms" +msgstr "其他平台" + +#: ../../source/getting_started/installation.rst:115 +msgid ":ref:`Ascend NPU <installation_npu>`" +msgstr "" + #~ msgid "``Yi``, ``Yi-chat``" #~ msgstr "" @@ -252,3 +295,9 @@ msgstr "" #~ msgid "``codeqwen1.5-chat``" #~ msgstr "" +#~ msgid "``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``" +#~ msgstr "" + +#~ msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" +#~ msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation_npu.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation_npu.po new file mode 100644 index 0000000000..85657a774b --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation_npu.po @@ -0,0 +1,79 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-07-30 17:00+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/getting_started/installation_npu.rst:6 +msgid "Installation Guide for Ascend NPU" +msgstr "在昇腾 NPU 上安装" + +#: ../../source/getting_started/installation_npu.rst:7 +msgid "Xinference can run on Ascend NPU, follow below instructions to install." +msgstr "Xinference 能在昇腾 NPU 上运行,使用如下命令安装。" + +#: ../../source/getting_started/installation_npu.rst:11 +msgid "Installing PyTorch and Ascend extension for PyTorch" +msgstr "安装 PyTorch 和昇腾扩展" + +#: ../../source/getting_started/installation_npu.rst:12 +msgid "Install PyTorch CPU version and corresponding Ascend extension." +msgstr "安装 PyTorch CPU 版本和相应的昇腾扩展。" + +#: ../../source/getting_started/installation_npu.rst:14 +msgid "Take PyTorch v2.1.0 as example." +msgstr "以 PyTorch v2.1.0 为例。" + +#: ../../source/getting_started/installation_npu.rst:20 +msgid "" +"Then install `Ascend extension for PyTorch " +"<https://github.com/Ascend/pytorch>`_." +msgstr "" +"接着安装 `昇腾 PyTorch 扩展 " +"<https://gitee.com/ascend/pytorch>`_." + +#: ../../source/getting_started/installation_npu.rst:28 +msgid "Running below command to see if it correctly prints the Ascend NPU count." +msgstr "运行如下命令查看,如果正常运行,会打印昇腾 NPU 的个数。" + +#: ../../source/getting_started/installation_npu.rst:35 +msgid "Installing Xinference" +msgstr "安装 Xinference" + +#: ../../source/getting_started/installation_npu.rst:41 +msgid "" +"Now you can use xinference according to :ref:`doc <using_xinference>`. " +"``Transformers`` backend is the only available engine supported for " +"Ascend NPU for open source version." +msgstr "" +"现在你可以参考 :ref:`文档 <using_xinference>` 来使用 Xinference。" +"``Transformers`` 是开源唯一支持的昇腾 NPU 的引擎。" + +#: ../../source/getting_started/installation_npu.rst:45 +msgid "Enterprise Support" +msgstr "企业支持" + +#: ../../source/getting_started/installation_npu.rst:46 +msgid "" +"If you encounter any performance or other issues for Ascend NPU, please " +"reach out to us via `link <https://xorbits.io/community>`_." +msgstr "" +"如果你在昇腾 NPU 遇到任何性能和其他问题,欢迎垂询 Xinference 企业版," +"在 `这里 <https://xorbits.cn/community>`_ 可以找到我们,亦可以 " +"`填写表单 <https://w8v6grm432.feishu.cn/share/base/form/shrcn9u1EBXQxmGMqILEjguuGoh>`_ 申请企业版试用。" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po index 481deefd57..686eca5f64 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-31 11:46+0800\n" +"POT-Creation-Date: 2024-07-30 17:04+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -139,7 +139,9 @@ msgid "Currently, supported model includes:" msgstr "目前,支持的模型包括:" #: ../../source/user_guide/backends.rst:49 -msgid "``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``" +msgid "" +"``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``, " +"``llama-3.1``, ``llama-3.1-instruct``" msgstr "" #: ../../source/user_guide/backends.rst:50 @@ -153,68 +155,91 @@ msgid "" msgstr "" #: ../../source/user_guide/backends.rst:52 -msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" +msgid "" +"``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, " +"``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-" +"instruct``" msgstr "" #: ../../source/user_guide/backends.rst:53 -msgid "``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k``" +msgid "``codestral-v0.1``" msgstr "" #: ../../source/user_guide/backends.rst:54 -msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" +msgid "``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k``" msgstr "" #: ../../source/user_guide/backends.rst:55 +msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" +msgstr "" + +#: ../../source/user_guide/backends.rst:56 msgid "" "``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-" "instruct``" msgstr "" -#: ../../source/user_guide/backends.rst:56 +#: ../../source/user_guide/backends.rst:57 msgid "``codeqwen1.5``, ``codeqwen1.5-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:57 +#: ../../source/user_guide/backends.rst:58 msgid "``vicuna-v1.3``, ``vicuna-v1.5``" msgstr "" -#: ../../source/user_guide/backends.rst:58 +#: ../../source/user_guide/backends.rst:59 msgid "``internlm2-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:59 +#: ../../source/user_guide/backends.rst:60 +msgid "``internlm2.5-chat``, ``internlm2.5-chat-1m``" +msgstr "" + +#: ../../source/user_guide/backends.rst:61 msgid "``qwen-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:60 +#: ../../source/user_guide/backends.rst:62 msgid "``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1``" msgstr "" -#: ../../source/user_guide/backends.rst:61 +#: ../../source/user_guide/backends.rst:63 msgid "``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k``" msgstr "" -#: ../../source/user_guide/backends.rst:62 +#: ../../source/user_guide/backends.rst:64 +msgid "``glm4-chat``, ``glm4-chat-1m``" +msgstr "" + +#: ../../source/user_guide/backends.rst:65 +msgid "``codegeex4``" +msgstr "" + +#: ../../source/user_guide/backends.rst:66 msgid "``qwen1.5-chat``, ``qwen1.5-moe-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:63 +#: ../../source/user_guide/backends.rst:67 +msgid "``qwen2-instruct``, ``qwen2-moe-instruct``" +msgstr "" + +#: ../../source/user_guide/backends.rst:68 msgid "``gemma-it``" msgstr "" -#: ../../source/user_guide/backends.rst:64 +#: ../../source/user_guide/backends.rst:69 msgid "``orion-chat``, ``orion-chat-rag``" msgstr "" -#: ../../source/user_guide/backends.rst:65 +#: ../../source/user_guide/backends.rst:70 msgid "``c4ai-command-r-v01``" msgstr "" -#: ../../source/user_guide/backends.rst:69 +#: ../../source/user_guide/backends.rst:74 msgid "SGLang" msgstr "" -#: ../../source/user_guide/backends.rst:70 +#: ../../source/user_guide/backends.rst:75 msgid "" "`SGLang <https://github.com/sgl-project/sglang>`_ has a high-performance " "inference runtime with RadixAttention. It significantly accelerates the " @@ -226,3 +251,24 @@ msgstr "" " 的高性能推理运行时。它通过在多个调用之间自动重用KV缓存,显著加速了复杂 " "LLM 程序的执行。它还支持其他常见推理技术,如连续批处理和张量并行处理。" +#: ../../source/user_guide/backends.rst:80 +msgid "MLX" +msgstr "" + +#: ../../source/user_guide/backends.rst:81 +msgid "" +"`MLX <https://github.com/ml-explore/mlx-examples/tree/main/llms>`_ " +"provides efficient runtime to run LLM on Apple silicon. It's recommended " +"to use for Mac users when running on Apple silicon if the model has MLX " +"format support." +msgstr "" +"`MLX <https://github.com/ml-explore/mlx-examples/tree/main/llms>`_ " +"提供在苹果 silicon 芯片上高效运行 LLM 的方式。在模型包含 MLX 格式的时候," +"推荐使用苹果 silicon 芯片的 Mac 用户使用 MLX 引擎。" + +#~ msgid "``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``" +#~ msgstr "" + +#~ msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" +#~ msgstr "" + diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 76f4a2c1e6..ef569084da 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -76,4 +76,10 @@ SGLang It significantly accelerates the execution of complex LLM programs by automatic KV cache reuse across multiple calls. And it also supports other common techniques like continuous batching and tensor parallelism. +MLX +~~~ +`MLX <https://github.com/ml-explore/mlx-examples/tree/main/llms>`_ provides efficient runtime +to run LLM on Apple silicon. It's recommended to use for Mac users when running on Apple silicon +if the model has MLX format support. + From e056e6569f549ab289ac87ee458910dc47822647 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 31 Jul 2024 20:24:18 +0800 Subject: [PATCH 227/298] DOC: add CosyVoice doc (#1980) --- .../models/model_abilities/audio.po | 100 ++++++++++---- doc/source/models/model_abilities/audio.rst | 122 ++++++++++++++++++ 2 files changed, 199 insertions(+), 23 deletions(-) diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po index eb82e44a65..b9478b448e 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-07 11:33+0800\n" +"POT-Creation-Date: 2024-07-30 21:20+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -87,59 +87,71 @@ msgstr "支持的模型列表" msgid "The audio API is supported with the following models in Xinference:" msgstr "在Xinference中,以下模型支持音频API:" -#: ../../source/models/model_abilities/audio.rst:44 +#: ../../source/models/model_abilities/audio.rst:45 +msgid "Audio to text" +msgstr "语音转文本" + +#: ../../source/models/model_abilities/audio.rst:47 msgid "whisper-tiny" msgstr "" -#: ../../source/models/model_abilities/audio.rst:45 +#: ../../source/models/model_abilities/audio.rst:48 msgid "whisper-tiny.en" msgstr "" -#: ../../source/models/model_abilities/audio.rst:46 +#: ../../source/models/model_abilities/audio.rst:49 msgid "whisper-base" msgstr "" -#: ../../source/models/model_abilities/audio.rst:47 +#: ../../source/models/model_abilities/audio.rst:50 msgid "whisper-base.en" msgstr "" -#: ../../source/models/model_abilities/audio.rst:48 +#: ../../source/models/model_abilities/audio.rst:51 msgid "whisper-medium" msgstr "" -#: ../../source/models/model_abilities/audio.rst:49 +#: ../../source/models/model_abilities/audio.rst:52 msgid "whisper-medium.en" msgstr "" -#: ../../source/models/model_abilities/audio.rst:50 +#: ../../source/models/model_abilities/audio.rst:53 msgid "whisper-large-v3" msgstr "" -#: ../../source/models/model_abilities/audio.rst:51 +#: ../../source/models/model_abilities/audio.rst:54 msgid "Belle-distilwhisper-large-v2-zh" msgstr "" -#: ../../source/models/model_abilities/audio.rst:52 +#: ../../source/models/model_abilities/audio.rst:55 msgid "Belle-whisper-large-v2-zh" msgstr "" -#: ../../source/models/model_abilities/audio.rst:53 +#: ../../source/models/model_abilities/audio.rst:56 msgid "Belle-whisper-large-v3-zh" msgstr "" -#: ../../source/models/model_abilities/audio.rst:54 +#: ../../source/models/model_abilities/audio.rst:60 +msgid "Text to audio" +msgstr "文本转语音" + +#: ../../source/models/model_abilities/audio.rst:62 msgid "ChatTTS" msgstr "" -#: ../../source/models/model_abilities/audio.rst:57 +#: ../../source/models/model_abilities/audio.rst:63 +msgid "CosyVoice" +msgstr "" + +#: ../../source/models/model_abilities/audio.rst:66 msgid "Quickstart" msgstr "快速入门" -#: ../../source/models/model_abilities/audio.rst:60 +#: ../../source/models/model_abilities/audio.rst:69 msgid "Transcription" msgstr "转录" -#: ../../source/models/model_abilities/audio.rst:62 +#: ../../source/models/model_abilities/audio.rst:71 msgid "" "The Transcription API mimics OpenAI's `create transcriptions API " "<https://platform.openai.com/docs/api-" @@ -151,11 +163,11 @@ msgstr "" "可以通过 cURL、OpenAI Client 或者 Xinference 的 Python 客户端来尝试 " "Transcription API:" -#: ../../source/models/model_abilities/audio.rst:113 +#: ../../source/models/model_abilities/audio.rst:122 msgid "Translation" msgstr "翻译" -#: ../../source/models/model_abilities/audio.rst:115 +#: ../../source/models/model_abilities/audio.rst:124 msgid "" "The Translation API mimics OpenAI's `create translations API " "<https://platform.openai.com/docs/api-" @@ -167,19 +179,61 @@ msgstr "" "通过 cURL、OpenAI Client 或 Xinference 的 Python 客户端来尝试使用 " "Translation API:" -#: ../../source/models/model_abilities/audio.rst:165 +#: ../../source/models/model_abilities/audio.rst:174 msgid "Speech" msgstr "语音" -#: ../../source/models/model_abilities/audio.rst:167 +#: ../../source/models/model_abilities/audio.rst:176 msgid "" "The Speech API mimics OpenAI's `create speech API " "<https://platform.openai.com/docs/api-reference/audio/createSpeech>`_. We" " can try Speech API out either via cURL, OpenAI Client, or Xinference's " "python client:" msgstr "" -"Transcription API 模仿了 OpenAI 的 `create speech API <https://" -"platform.openai.com/docs/api-reference/audio/createSpeech>`_。你" -"可以通过 cURL、OpenAI Client 或者 Xinference 的 Python 客户端来尝试 " -"Speech API:" +"Transcription API 模仿了 OpenAI 的 `create speech API <https://platform." +"openai.com/docs/api-reference/audio/createSpeech>`_。你可以通过 cURL、" +"OpenAI Client 或者 Xinference 的 Python 客户端来尝试 Speech API:" + +#: ../../source/models/model_abilities/audio.rst:179 +msgid "Speech API use non-stream by default as" +msgstr "Speech API 默认使用非流式" + +#: ../../source/models/model_abilities/audio.rst:181 +msgid "" +"The stream output of ChatTTS is not as good as the non-stream output, " +"please refer to: https://github.com/2noise/ChatTTS/pull/564" +msgstr "" +"ChatTTS 的流式输出不如非流式的效果好,参考:https://github.com/2noise/ChatTTS/pull/564" + +#: ../../source/models/model_abilities/audio.rst:182 +msgid "" +"The stream requires ffmpeg<7: " +"https://pytorch.org/audio/stable/installation.html#optional-dependencies" +msgstr "流式要求 ffmpeg<7:https://pytorch.org/audio/stable/installation.html#optional-dependencies" + +#: ../../source/models/model_abilities/audio.rst:234 +msgid "CosyVoice Usage" +msgstr "CosyVoice 模型使用" + +#: ../../source/models/model_abilities/audio.rst:236 +msgid "Basic usage, launch model ``CosyVoice-300M-SFT``." +msgstr "基本使用,加载模型 ``CosyVoice-300M-SFT``。" + +#: ../../source/models/model_abilities/audio.rst:285 +msgid "Clone voice, launch model ``CosyVoice-300M``." +msgstr "克隆声音,加载模型 ``CosyVoice-300M``。" + +#: ../../source/models/model_abilities/audio.rst:308 +msgid "Cross lingual usage, launch model ``CosyVoice-300M``." +msgstr "跨语言使用,加载模型 ``CosyVoice-300M``。" + +#: ../../source/models/model_abilities/audio.rst:327 +msgid "Instruction based, launch model ``CosyVoice-300M-Instruct``." +msgstr "基于指令的声音合成,加载模型 ``CosyVoice-300M-Instruct``。" + +#: ../../source/models/model_abilities/audio.rst:344 +msgid "" +"More instructions and examples, could be found at https://fun-audio-" +"llm.github.io/ ." +msgstr "更多指令和例子,可以参考 https://fun-audio-llm.github.io/ 。" diff --git a/doc/source/models/model_abilities/audio.rst b/doc/source/models/model_abilities/audio.rst index 98cdfaf428..2abb70831e 100644 --- a/doc/source/models/model_abilities/audio.rst +++ b/doc/source/models/model_abilities/audio.rst @@ -41,6 +41,9 @@ Supported models The audio API is supported with the following models in Xinference: +Audio to text +~~~~~~~~~~~~~ + * whisper-tiny * whisper-tiny.en * whisper-base @@ -51,6 +54,11 @@ The audio API is supported with the following models in Xinference: * Belle-distilwhisper-large-v2-zh * Belle-whisper-large-v2-zh * Belle-whisper-large-v3-zh + + +Text to audio +~~~~~~~~~~~~~ + * ChatTTS * CosyVoice @@ -220,3 +228,117 @@ Speech API use non-stream by default as .. code-tab:: output The output will be an audio binary. + + +CosyVoice Usage +~~~~~~~~~~~~~~~ + +Basic usage, launch model ``CosyVoice-300M-SFT``. + +.. tabs:: + + .. code-tab:: bash cURL + + curl -X 'POST' \ + 'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/audio/speech' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "model": "<MODEL_UID>", + "text": "<The text to generate audio for>", + # ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女'] + "voice": "中文女" + }' + + .. code-tab:: python OpenAI Python Client + + import openai + + client = openai.Client( + api_key="cannot be empty", + base_url="http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1" + ) + response = client.audio.speech.create( + model=<MODEL_UID>, + input=<The text to generate audio for>, + # ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女'] + voice="中文女", + ) + response.stream_to_file('1.mp3') + + .. code-tab:: python Xinference Python Client + + from xinference.client import Client + + client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") + + model = client.get_model("<MODEL_UID>") + speech_bytes = model.speech( + input=<The text to generate audio for>, + # ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女'] + voice="中文女" + ) + with open('1.mp3', 'wb') as f: + f.write(speech_bytes) + + +Clone voice, launch model ``CosyVoice-300M``. + +.. code-block:: + + from xinference.client import Client + + client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") + + model = client.get_model("<MODEL_UID>") + + zero_shot_prompt_text = "" + # The zero shot prompt file is the voice file + # the words said in the file shoule be identical to zero_shot_prompt_text + with open(zero_shot_prompt_file, "rb") as f: + zero_shot_prompt = f.read() + + speech_bytes = model.speech( + "<The text to generate audio for>", + prompt_text=zero_shot_prompt_text, + prompt_speech=zero_shot_prompt, + ) + + +Cross lingual usage, launch model ``CosyVoice-300M``. + +.. code-block:: + + from xinference.client import Client + + client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") + + model = client.get_model("<MODEL_UID>") + + # the file that reads in some language + with open(cross_lingual_prompt_file, "rb") as f: + cross_lingual_prompt = f.read() + + speech_bytes = model.speech( + "<The text to generate audio for>", # text could be another language + prompt_speech=cross_lingual_prompt, + ) + +Instruction based, launch model ``CosyVoice-300M-Instruct``. + +.. code-block:: + + from xinference.client import Client + + client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") + + model = client.get_model("<MODEL_UID>") + + response = model.speech( + "在面对挑战时,他展现了非凡的<strong>勇气</strong>与<strong>智慧</strong>。", + voice="中文男", + instruct_text="Theo 'Crimson', is a fiery, passionate rebel leader. " + "Fights with fervor for justice, but struggles with impulsiveness.", + ) + +More instructions and examples, could be found at https://fun-audio-llm.github.io/ . From fdab8e516e62d530a2dc2d9fcc0c2cabc1fd22b5 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Thu, 1 Aug 2024 11:07:07 +0800 Subject: [PATCH 228/298] BUG: [UI]Modifying 'model format' again resulted in an error message. (#1990) --- xinference/web/ui/src/scenes/launch_model/modelCard.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 9b125dfd68..760f39f43e 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -1195,9 +1195,11 @@ const ModelCard = ({ const spec = specs.find((s) => { return s.quantizations.includes(quant) }) - const cached = Array.isArray(spec.cache_status) - ? spec.cache_status[spec.quantizations.indexOf(quant)] - : spec.cache_status + const cached = Array.isArray(spec?.cache_status) + ? spec?.cache_status[ + spec?.quantizations.indexOf(quant) + ] + : spec?.cache_status const displayedQuant = cached ? quant + ' (cached)' From c45f26437963501b6b9d245eda98fe4700cd70e7 Mon Sep 17 00:00:00 2001 From: vikrantrathore <admin@vyomtech.com> Date: Thu, 1 Aug 2024 16:03:44 +0800 Subject: [PATCH 229/298] ENH: Support for Gemma 2 and Llama 3.1 Models for vllm & sglang (#1929) Co-authored-by: Xuye (Chris) Qin <qinxuye@gmail.com> --- doc/source/getting_started/installation.rst | 11 +++++++++++ setup.cfg | 10 ++++++---- xinference/model/llm/sglang/core.py | 1 + xinference/model/llm/vllm/core.py | 1 + 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 1e13576194..f066c3e68e 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -66,6 +66,12 @@ Currently, supported models include: To install Xinference and vLLM:: pip install "xinference[vllm]" + + # FlashInfer is optional but required for specific functionalities such as sliding window attention with Gemma 2. + # For CUDA 12.4 & torch 2.4 to support sliding window attention for gemma 2 and llama 3.1 style rope + pip install flashinfer -i https://flashinfer.ai/whl/cu124/torch2.4 + # For other CUDA & torch versions, please check https://docs.flashinfer.ai/installation.html + .. _installation_ggml: @@ -100,6 +106,10 @@ Initial setup:: pip install 'xinference[sglang]' + # For CUDA 12.4 & torch 2.4 to support sliding window attention for gemma 2 and llama 3.1 style rope + pip install flashinfer -i https://flashinfer.ai/whl/cu124/torch2.4 + # For other CUDA & torch versions, please check https://docs.flashinfer.ai/installation.html + MLX Backend ~~~~~~~~~~~ @@ -113,3 +123,4 @@ Other Platforms ~~~~~~~~~~~~~~~ * :ref:`Ascend NPU <installation_npu>` + diff --git a/setup.cfg b/setup.cfg index dba0947956..e5107c56b9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -100,8 +100,8 @@ all = auto-gptq ; sys_platform!='darwin' autoawq ; sys_platform!='darwin' optimum - outlines==0.0.34 # sglang errored for outlines > 0.0.34 - sglang[all] ; sys_platform=='linux' + outlines>=0.0.34 + sglang>=0.2.7 ; sys_platform=='linux' mlx-lm ; sys_platform=='darwin' and platform_machine=='arm64' attrdict # For deepseek VL timm>=0.9.16 # For deepseek VL @@ -144,8 +144,10 @@ transformers = peft vllm = vllm>=0.2.6 -sglang = - sglang[all] +sglang = + sglang>=0.2.7 ; sys_platform=='linux' + vllm>=0.5.2 ; sys_platform=='linux' + outlines>=0.0.34 mlx = mlx-lm embedding = diff --git a/xinference/model/llm/sglang/core.py b/xinference/model/llm/sglang/core.py index 52def97a1a..acde859066 100644 --- a/xinference/model/llm/sglang/core.py +++ b/xinference/model/llm/sglang/core.py @@ -81,6 +81,7 @@ class SGLANGGenerateConfig(TypedDict, total=False): "mistral-instruct-v0.2", "mixtral-instruct-v0.1", "gemma-it", + "gemma-2-it", ] diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 5d29eceb02..eb633db0b7 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -151,6 +151,7 @@ class VLLMGenerateConfig(TypedDict, total=False): VLLM_SUPPORTED_CHAT_MODELS.append("c4ai-command-r-v01") if VLLM_INSTALLED and vllm.__version__ >= "0.5.3": + VLLM_SUPPORTED_CHAT_MODELS.append("gemma-2-it") VLLM_SUPPORTED_CHAT_MODELS.append("mistral-nemo-instruct") VLLM_SUPPORTED_CHAT_MODELS.append("mistral-large-instruct") From 2c810c64e10e52a38a4490e226874f7d7d4dcf1e Mon Sep 17 00:00:00 2001 From: Valdanito <valdanito@foxmail.com> Date: Thu, 1 Aug 2024 17:53:09 +0800 Subject: [PATCH 230/298] FEAT: Supports model_path input when launching models (#1918) --- xinference/api/restful_api.py | 3 ++ xinference/core/supervisor.py | 2 ++ xinference/core/worker.py | 7 +++++ xinference/model/audio/core.py | 6 ++-- xinference/model/core.py | 29 ++++++++++++++++--- xinference/model/embedding/core.py | 12 ++++++-- xinference/model/flexible/core.py | 10 +++++-- xinference/model/image/core.py | 7 +++-- .../model/image/stable_diffusion/core.py | 2 +- xinference/model/llm/core.py | 10 ++++--- xinference/model/rerank/core.py | 7 +++-- .../ui/src/scenes/launch_model/modelCard.js | 26 +++++++++++++++++ 12 files changed, 101 insertions(+), 20 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 4fb82312d0..01c9871bd7 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -797,6 +797,7 @@ async def launch_model( worker_ip = payload.get("worker_ip", None) gpu_idx = payload.get("gpu_idx", None) download_hub = payload.get("download_hub", None) + model_path = payload.get("model_path", None) exclude_keys = { "model_uid", @@ -813,6 +814,7 @@ async def launch_model( "worker_ip", "gpu_idx", "download_hub", + "model_path", } kwargs = { @@ -861,6 +863,7 @@ async def launch_model( worker_ip=worker_ip, gpu_idx=gpu_idx, download_hub=download_hub, + model_path=model_path, **kwargs, ) except ValueError as ve: diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 873a0b6ab8..54e4b65849 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -859,6 +859,7 @@ async def launch_builtin_model( worker_ip: Optional[str] = None, gpu_idx: Optional[Union[int, List[int]]] = None, download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + model_path: Optional[str] = None, **kwargs, ) -> str: # search in worker first @@ -942,6 +943,7 @@ async def _launch_one_model(_replica_model_uid): peft_model_config=peft_model_config, gpu_idx=replica_gpu_idx, download_hub=download_hub, + model_path=model_path, **kwargs, ) self._replica_model_uid_to_worker[_replica_model_uid] = worker_ref diff --git a/xinference/core/worker.py b/xinference/core/worker.py index e36d32e99e..1d436d4d7b 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -743,6 +743,7 @@ async def launch_builtin_model( request_limits: Optional[int] = None, gpu_idx: Optional[Union[int, List[int]]] = None, download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + model_path: Optional[str] = None, **kwargs, ): # !!! Note that The following code must be placed at the very beginning of this function, @@ -799,6 +800,11 @@ async def launch_builtin_model( raise ValueError( f"PEFT adaptors can only be applied to pytorch-like models" ) + if model_path is not None: + if not os.path.exists(model_path): + raise ValueError( + f"Invalid input. `model_path`: {model_path} File or directory does not exist." + ) assert model_uid not in self._model_uid_to_model self._check_model_is_valid(model_name, model_format) @@ -826,6 +832,7 @@ async def launch_builtin_model( quantization, peft_model_config, download_hub, + model_path, **kwargs, ) await self.update_cache_status(model_name, model_description) diff --git a/xinference/model/audio/core.py b/xinference/model/audio/core.py index f16f09d431..78a606cf01 100644 --- a/xinference/model/audio/core.py +++ b/xinference/model/audio/core.py @@ -150,10 +150,12 @@ def create_audio_model_instance( model_uid: str, model_name: str, download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + model_path: Optional[str] = None, **kwargs, ) -> Tuple[Union[WhisperModel, ChatTTSModel, CosyVoiceModel], AudioModelDescription]: model_spec = match_audio(model_name, download_hub) - model_path = cache(model_spec) + if model_path is None: + model_path = cache(model_spec) model: Union[WhisperModel, ChatTTSModel, CosyVoiceModel] if model_spec.model_family == "whisper": model = WhisperModel(model_uid, model_path, model_spec, **kwargs) @@ -164,6 +166,6 @@ def create_audio_model_instance( else: raise Exception(f"Unsupported audio model family: {model_spec.model_family}") model_description = AudioModelDescription( - subpool_addr, devices, model_spec, model_path=model_path + subpool_addr, devices, model_spec, model_path ) return model, model_description diff --git a/xinference/model/core.py b/xinference/model/core.py index d4dda89c23..09cb4104a4 100644 --- a/xinference/model/core.py +++ b/xinference/model/core.py @@ -56,6 +56,7 @@ def create_model_instance( quantization: Optional[str] = None, peft_model_config: Optional[PeftModelConfig] = None, download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + model_path: Optional[str] = None, **kwargs, ) -> Tuple[Any, ModelDescription]: from .audio.core import create_audio_model_instance @@ -77,13 +78,20 @@ def create_model_instance( quantization, peft_model_config, download_hub, + model_path, **kwargs, ) elif model_type == "embedding": # embedding model doesn't accept trust_remote_code kwargs.pop("trust_remote_code", None) return create_embedding_model_instance( - subpool_addr, devices, model_uid, model_name, download_hub, **kwargs + subpool_addr, + devices, + model_uid, + model_name, + download_hub, + model_path, + **kwargs, ) elif model_type == "image": kwargs.pop("trust_remote_code", None) @@ -94,22 +102,35 @@ def create_model_instance( model_name, peft_model_config, download_hub, + model_path, **kwargs, ) elif model_type == "rerank": kwargs.pop("trust_remote_code", None) return create_rerank_model_instance( - subpool_addr, devices, model_uid, model_name, download_hub, **kwargs + subpool_addr, + devices, + model_uid, + model_name, + download_hub, + model_path, + **kwargs, ) elif model_type == "audio": kwargs.pop("trust_remote_code", None) return create_audio_model_instance( - subpool_addr, devices, model_uid, model_name, download_hub, **kwargs + subpool_addr, + devices, + model_uid, + model_name, + download_hub, + model_path, + **kwargs, ) elif model_type == "flexible": kwargs.pop("trust_remote_code", None) return create_flexible_model_instance( - subpool_addr, devices, model_uid, model_name, **kwargs + subpool_addr, devices, model_uid, model_name, model_path, **kwargs ) else: raise ValueError(f"Unsupported model type: {model_type}.") diff --git a/xinference/model/embedding/core.py b/xinference/model/embedding/core.py index 3b0b4bf3ad..44163ec6b9 100644 --- a/xinference/model/embedding/core.py +++ b/xinference/model/embedding/core.py @@ -118,7 +118,12 @@ def get_cache_status( class EmbeddingModel: - def __init__(self, model_uid: str, model_path: str, device: Optional[str] = None): + def __init__( + self, + model_uid: str, + model_path: str, + device: Optional[str] = None, + ): self._model_uid = model_uid self._model_path = model_path self._device = device @@ -344,10 +349,13 @@ def create_embedding_model_instance( model_uid: str, model_name: str, download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + model_path: Optional[str] = None, **kwargs, ) -> Tuple[EmbeddingModel, EmbeddingModelDescription]: model_spec = match_embedding(model_name, download_hub) - model_path = cache(model_spec) + if model_path is None: + model_path = cache(model_spec) + model = EmbeddingModel(model_uid, model_path, **kwargs) model_description = EmbeddingModelDescription( subpool_addr, devices, model_spec, model_path=model_path diff --git a/xinference/model/flexible/core.py b/xinference/model/flexible/core.py index 75eb3b33c7..44dd848b4d 100644 --- a/xinference/model/flexible/core.py +++ b/xinference/model/flexible/core.py @@ -210,10 +210,16 @@ def match_flexible_model(model_name): def create_flexible_model_instance( - subpool_addr: str, devices: List[str], model_uid: str, model_name: str, **kwargs + subpool_addr: str, + devices: List[str], + model_uid: str, + model_name: str, + model_path: Optional[str] = None, + **kwargs, ) -> Tuple[FlexibleModel, FlexibleModelDescription]: model_spec = match_flexible_model(model_name) - model_path = model_spec.model_uri + if not model_path: + model_path = model_spec.model_uri launcher_name = model_spec.launcher launcher_args = model_spec.parser_args() kwargs.update(launcher_args) diff --git a/xinference/model/image/core.py b/xinference/model/image/core.py index b2fef3baaa..a2196db0ed 100644 --- a/xinference/model/image/core.py +++ b/xinference/model/image/core.py @@ -189,6 +189,7 @@ def create_image_model_instance( model_name: str, peft_model_config: Optional[PeftModelConfig] = None, download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + model_path: Optional[str] = None, **kwargs, ) -> Tuple[DiffusionModel, ImageModelDescription]: model_spec = match_diffusion(model_name, download_hub) @@ -209,7 +210,8 @@ def create_image_model_instance( for name in controlnet: for cn_model_spec in model_spec.controlnet: if cn_model_spec.model_name == name: - model_path = cache(cn_model_spec) + if not model_path: + model_path = cache(cn_model_spec) controlnet_model_paths.append(model_path) break else: @@ -220,7 +222,8 @@ def create_image_model_instance( kwargs["controlnet"] = controlnet_model_paths[0] else: kwargs["controlnet"] = controlnet_model_paths - model_path = cache(model_spec) + if not model_path: + model_path = cache(model_spec) if peft_model_config is not None: lora_model = peft_model_config.peft_model lora_load_kwargs = peft_model_config.image_lora_load_kwargs diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index ec1b765622..b43903d4f2 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -35,7 +35,7 @@ class DiffusionModel: def __init__( self, model_uid: str, - model_path: str, + model_path: Optional[str] = None, device: Optional[str] = None, lora_model: Optional[List[LoRA]] = None, lora_load_kwargs: Optional[Dict] = None, diff --git a/xinference/model/llm/core.py b/xinference/model/llm/core.py index 9aa0599820..d4f1ed32c1 100644 --- a/xinference/model/llm/core.py +++ b/xinference/model/llm/core.py @@ -194,6 +194,7 @@ def create_llm_model_instance( quantization: Optional[str] = None, peft_model_config: Optional[PeftModelConfig] = None, download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + model_path: Optional[str] = None, **kwargs, ) -> Tuple[LLM, LLMDescription]: from .llm_family import cache, check_engine_by_spec_parameters, match_llm @@ -221,7 +222,8 @@ def create_llm_model_instance( ) logger.debug(f"Launching {model_uid} with {llm_cls.__name__}") - save_path = cache(llm_family, llm_spec, quantization) + if not model_path: + model_path = cache(llm_family, llm_spec, quantization) peft_model = peft_model_config.peft_model if peft_model_config else None if peft_model is not None: @@ -231,7 +233,7 @@ def create_llm_model_instance( llm_family, llm_spec, quantization, - save_path, + model_path, kwargs, peft_model, ) @@ -241,11 +243,11 @@ def create_llm_model_instance( f"Load this without lora." ) model = llm_cls( - model_uid, llm_family, llm_spec, quantization, save_path, kwargs + model_uid, llm_family, llm_spec, quantization, model_path, kwargs ) else: model = llm_cls( - model_uid, llm_family, llm_spec, quantization, save_path, kwargs + model_uid, llm_family, llm_spec, quantization, model_path, kwargs ) return model, LLMDescription( subpool_addr, devices, llm_family, llm_spec, quantization diff --git a/xinference/model/rerank/core.py b/xinference/model/rerank/core.py index 3fa53e31b6..2d73e2f399 100644 --- a/xinference/model/rerank/core.py +++ b/xinference/model/rerank/core.py @@ -107,7 +107,7 @@ def __init__( self, model_spec: RerankModelSpec, model_uid: str, - model_path: str, + model_path: Optional[str] = None, device: Optional[str] = None, use_fp16: bool = False, model_config: Optional[Dict] = None, @@ -290,6 +290,7 @@ def create_rerank_model_instance( model_uid: str, model_name: str, download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + model_path: Optional[str] = None, **kwargs, ) -> Tuple[RerankModel, RerankModelDescription]: from ..utils import download_from_modelscope @@ -321,8 +322,8 @@ def create_rerank_model_instance( f"Huggingface: {BUILTIN_RERANK_MODELS.keys()}" f"ModelScope: {MODELSCOPE_RERANK_MODELS.keys()}" ) - - model_path = cache(model_spec) + if not model_path: + model_path = cache(model_spec) use_fp16 = kwargs.pop("use_fp16", False) model = RerankModel( model_spec, model_uid, model_path, use_fp16=use_fp16, model_config=kwargs diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 760f39f43e..91f7bd6a52 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -111,6 +111,7 @@ const ModelCard = ({ const [workerIp, setWorkerIp] = useState('') const [GPUIdx, setGPUIdx] = useState('') const [downloadHub, setDownloadHub] = useState('') + const [modelPath, setModelPath] = useState('') const [enginesObj, setEnginesObj] = useState({}) const [engineOptions, setEngineOptions] = useState([]) @@ -303,6 +304,7 @@ const ModelCard = ({ worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), download_hub: downloadHub === '' ? null : downloadHub, + model_path: modelPath.trim() === '' ? null : modelPath.trim(), } let modelDataWithID_other = { @@ -314,6 +316,7 @@ const ModelCard = ({ worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), download_hub: downloadHub === '' ? null : downloadHub, + model_path: modelPath.trim() === '' ? null : modelPath.trim(), } if (nGPULayers >= 0) { @@ -553,6 +556,7 @@ const ModelCard = ({ worker_ip, gpu_idx, download_hub, + model_path, peft_model_config, } = arr[0] @@ -576,6 +580,7 @@ const ModelCard = ({ setWorkerIp(worker_ip || '') setGPUIdx(gpu_idx?.join(',') || '') setDownloadHub(download_hub || '') + setModelPath(model_path || '') let loraData = [] peft_model_config?.lora_list?.forEach((item) => { @@ -640,6 +645,7 @@ const ModelCard = ({ setGPUIdx(arr[0].gpu_idx || '') setWorkerIp(arr[0].worker_ip || '') setDownloadHub(arr[0].download_hub) + setModelPath(arr[0].model_path) } } @@ -700,6 +706,7 @@ const ModelCard = ({ setWorkerIp('') setGPUIdx('') setDownloadHub('') + setModelPath('') setLoraArr([]) setImageLoraLoadArr([]) setImageLoraFuseArr([]) @@ -713,6 +720,7 @@ const ModelCard = ({ setGPUIdx('') setWorkerIp('') setDownloadHub('') + setModelPath('') } } @@ -1382,6 +1390,16 @@ const ModelCard = ({ </Select> </FormControl> </Grid> + <Grid item xs={12}> + <FormControl variant="outlined" margin="normal" fullWidth> + <TextField + variant="outlined" + value={modelPath} + label="(Optional) Model Path, For PyTorch, provide the model directory. For GGML/GGUF, provide the model file path." + onChange={(e) => setModelPath(e.target.value)} + /> + </FormControl> + </Grid> <ListItemButton onClick={() => setIsPeftModelConfig(!isPeftModelConfig)} > @@ -1546,6 +1564,14 @@ const ModelCard = ({ })} </Select> </FormControl> + <FormControl variant="outlined" margin="normal" fullWidth> + <TextField + variant="outlined" + value={modelPath} + label="(Optional) Model Path, For PyTorch, provide the model directory. For GGML/GGUF, provide the model file path." + onChange={(e) => setModelPath(e.target.value)} + /> + </FormControl> </FormControl> )} <Box className="buttonsContainer"> From 71944050e1e77b716ce259a04b7f20dfa0a645f8 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 1 Aug 2024 18:41:14 +0800 Subject: [PATCH 231/298] ENH: [K8s] worker log dir name (#1997) --- xinference/deploy/utils.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xinference/deploy/utils.py b/xinference/deploy/utils.py index 8cd62214a3..3058c2b1f1 100644 --- a/xinference/deploy/utils.py +++ b/xinference/deploy/utils.py @@ -27,6 +27,9 @@ logger = logging.getLogger(__name__) +# mainly for k8s +XINFERENCE_POD_NAME_ENV_KEY = "XINFERENCE_POD_NAME" + class LoggerNameFilter(logging.Filter): def filter(self, record): @@ -40,6 +43,9 @@ def get_log_file(sub_dir: str): """ sub_dir should contain a timestamp. """ + pod_name = os.environ.get(XINFERENCE_POD_NAME_ENV_KEY, None) + if pod_name is not None: + sub_dir = sub_dir + "_" + pod_name log_dir = os.path.join(XINFERENCE_LOG_DIR, sub_dir) # Here should be creating a new directory each time, so `exist_ok=False` os.makedirs(log_dir, exist_ok=False) From 32ee89be28cf0aad39fc3c2802a7ebbd4f9f7249 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 2 Aug 2024 12:10:09 +0800 Subject: [PATCH 232/298] BUG: fix loading multiple gguf parts (#1987) --- xinference/model/llm/ggml/llamacpp.py | 12 +++++++----- xinference/model/llm/llm_family.py | 12 ++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/xinference/model/llm/ggml/llamacpp.py b/xinference/model/llm/ggml/llamacpp.py index 9e7edf93b9..9e8f09c02f 100644 --- a/xinference/model/llm/ggml/llamacpp.py +++ b/xinference/model/llm/ggml/llamacpp.py @@ -155,11 +155,13 @@ def load(self): raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") # handle legacy cache. - model_path = os.path.join( - self.model_path, - self.model_spec.model_file_name_template.format( - quantization=self.quantization - ), + model_path = os.path.realpath( + os.path.join( + self.model_path, + self.model_spec.model_file_name_template.format( + quantization=self.quantization + ), + ) ) legacy_model_file_path = os.path.join(self.model_path, "model.bin") if os.path.exists(legacy_model_file_path): diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 07402cda7e..406a5e3b58 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -699,12 +699,12 @@ def _generate_model_file_names( def _merge_cached_files( cache_dir: str, input_file_names: List[str], output_file_name: str ): - with open(os.path.join(cache_dir, output_file_name), "wb") as output_file: - for file_name in input_file_names: - logger.info(f"Merging file {file_name} into {output_file_name} ...") - - with open(os.path.join(cache_dir, file_name), "rb") as input_file: - shutil.copyfileobj(input_file, output_file) + # now llama.cpp can find the gguf parts automatically + # we only need to provide the first part + # thus we create the symlink to the first part + symlink_local_file( + os.path.join(cache_dir, input_file_names[0]), cache_dir, output_file_name + ) logger.info(f"Merge complete.") From a7dd8d9f1e571a785709741f8b1c92bcfc7ffc9a Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 2 Aug 2024 12:38:00 +0800 Subject: [PATCH 233/298] ENH: support image_to_image (#1986) --- xinference/api/restful_api.py | 2 +- xinference/client/restful/restful_client.py | 4 +- xinference/core/image_interface.py | 9 ++- xinference/core/model.py | 2 +- xinference/model/image/core.py | 6 +- xinference/model/image/model_spec.json | 36 ++++++++++-- .../model/image/model_spec_modelscope.json | 24 +++++++- .../model/image/stable_diffusion/core.py | 55 ++++++++++--------- .../image/tests/test_stable_diffusion.py | 36 ++++++++++++ 9 files changed, 129 insertions(+), 45 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 01c9871bd7..d3501f11a3 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1410,7 +1410,7 @@ async def create_variations( negative_prompt: Optional[Union[str, List[str]]] = Form(None), n: Optional[int] = Form(1), response_format: Optional[str] = Form("url"), - size: Optional[str] = Form("1024*1024"), + size: Optional[str] = Form(None), kwargs: Optional[str] = Form(None), ) -> Response: model_uid = model diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 6fc0297e9b..59e7153856 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -234,9 +234,9 @@ def image_to_image( self, image: Union[str, bytes], prompt: str, - negative_prompt: str, + negative_prompt: Optional[str] = None, n: int = 1, - size: str = "1024*1024", + size: Optional[str] = None, response_format: str = "url", **kwargs, ) -> "ImageList": diff --git a/xinference/core/image_interface.py b/xinference/core/image_interface.py index 208b1a62de..cf87245820 100644 --- a/xinference/core/image_interface.py +++ b/xinference/core/image_interface.py @@ -153,7 +153,10 @@ def image_generate_image( model = client.get_model(self.model_uid) assert isinstance(model, RESTfulImageModelHandle) - size = f"{int(size_width)}*{int(size_height)}" + if size_width > 0 and size_height > 0: + size = f"{int(size_width)}*{int(size_height)}" + else: + size = None bio = io.BytesIO() image.save(bio, format="png") @@ -195,8 +198,8 @@ def image_generate_image( with gr.Row(): n = gr.Number(label="Number of image", value=1) - size_width = gr.Number(label="Width", value=512) - size_height = gr.Number(label="Height", value=512) + size_width = gr.Number(label="Width", value=-1) + size_height = gr.Number(label="Height", value=-1) with gr.Row(): with gr.Column(scale=1): diff --git a/xinference/core/model.py b/xinference/core/model.py index f5bf4c14f8..6017625469 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -706,7 +706,7 @@ async def image_to_image( prompt: str, negative_prompt: str, n: int = 1, - size: str = "1024*1024", + size: Optional[str] = None, response_format: str = "url", *args, **kwargs, diff --git a/xinference/model/image/core.py b/xinference/model/image/core.py index a2196db0ed..c0b9993668 100644 --- a/xinference/model/image/core.py +++ b/xinference/model/image/core.py @@ -45,7 +45,7 @@ class ImageModelFamilyV1(CacheableModelSpec): model_id: str model_revision: str model_hub: str = "huggingface" - ability: Optional[str] + abilities: Optional[List[str]] controlnet: Optional[List["ImageModelFamilyV1"]] @@ -72,7 +72,7 @@ def to_dict(self): "model_name": self._model_spec.model_name, "model_family": self._model_spec.model_family, "model_revision": self._model_spec.model_revision, - "ability": self._model_spec.ability, + "abilities": self._model_spec.abilities, "controlnet": controlnet, } @@ -239,7 +239,7 @@ def create_image_model_instance( lora_model_paths=lora_model, lora_load_kwargs=lora_load_kwargs, lora_fuse_kwargs=lora_fuse_kwargs, - ability=model_spec.ability, + abilities=model_spec.abilities, **kwargs, ) model_description = ImageModelDescription( diff --git a/xinference/model/image/model_spec.json b/xinference/model/image/model_spec.json index f9a6c7ce8d..8ffe855587 100644 --- a/xinference/model/image/model_spec.json +++ b/xinference/model/image/model_spec.json @@ -3,25 +3,39 @@ "model_name": "sd3-medium", "model_family": "stable_diffusion", "model_id": "stabilityai/stable-diffusion-3-medium-diffusers", - "model_revision": "ea42f8cef0f178587cf766dc8129abd379c90671" + "model_revision": "ea42f8cef0f178587cf766dc8129abd379c90671", + "abilities": [ + "text2iamge", + "image2image" + ] }, { "model_name": "sd-turbo", "model_family": "stable_diffusion", "model_id": "stabilityai/sd-turbo", - "model_revision": "1681ed09e0cff58eeb41e878a49893228b78b94c" + "model_revision": "1681ed09e0cff58eeb41e878a49893228b78b94c", + "abilities": [ + "text2iamge" + ] }, { "model_name": "sdxl-turbo", "model_family": "stable_diffusion", "model_id": "stabilityai/sdxl-turbo", - "model_revision": "f4b0486b498f84668e828044de1d0c8ba486e05b" + "model_revision": "f4b0486b498f84668e828044de1d0c8ba486e05b", + "abilities": [ + "text2iamge" + ] }, { "model_name": "stable-diffusion-v1.5", "model_family": "stable_diffusion", "model_id": "runwayml/stable-diffusion-v1-5", "model_revision": "1d0c4ebf6ff58a5caecab40fa1406526bca4b5b9", + "abilities": [ + "text2iamge", + "image2image" + ], "controlnet": [ { "model_name":"canny", @@ -72,6 +86,10 @@ "model_family": "stable_diffusion", "model_id": "stabilityai/stable-diffusion-xl-base-1.0", "model_revision": "f898a3e026e802f68796b95e9702464bac78d76f", + "abilities": [ + "text2iamge", + "image2image" + ], "controlnet": [ { "model_name":"canny", @@ -98,20 +116,26 @@ "model_family": "stable_diffusion", "model_id": "runwayml/stable-diffusion-inpainting", "model_revision": "51388a731f57604945fddd703ecb5c50e8e7b49d", - "ability": "inpainting" + "abilities": [ + "inpainting" + ] }, { "model_name": "stable-diffusion-2-inpainting", "model_family": "stable_diffusion", "model_id": "stabilityai/stable-diffusion-2-inpainting", "model_revision": "81a84f49b15956b60b4272a405ad3daef3da4590", - "ability": "inpainting" + "abilities": [ + "inpainting" + ] }, { "model_name": "stable-diffusion-xl-inpainting", "model_family": "stable_diffusion", "model_id": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1", "model_revision": "115134f363124c53c7d878647567d04daf26e41e", - "ability": "inpainting" + "abilities": [ + "inpainting" + ] } ] diff --git a/xinference/model/image/model_spec_modelscope.json b/xinference/model/image/model_spec_modelscope.json index 6f00e2ba82..6b4aa340c2 100644 --- a/xinference/model/image/model_spec_modelscope.json +++ b/xinference/model/image/model_spec_modelscope.json @@ -4,21 +4,31 @@ "model_family": "stable_diffusion", "model_hub": "modelscope", "model_id": "AI-ModelScope/stable-diffusion-3-medium-diffusers", - "model_revision": "master" + "model_revision": "master", + "abilities": [ + "text2iamge", + "image2image" + ] }, { "model_name": "sd-turbo", "model_family": "stable_diffusion", "model_hub": "modelscope", "model_id": "AI-ModelScope/sd-turbo", - "model_revision": "master" + "model_revision": "master", + "abilities": [ + "text2iamge" + ] }, { "model_name": "sdxl-turbo", "model_family": "stable_diffusion", "model_hub": "modelscope", "model_id": "AI-ModelScope/sdxl-turbo", - "model_revision": "master" + "model_revision": "master", + "abilities": [ + "text2iamge" + ] }, { "model_name": "stable-diffusion-v1.5", @@ -26,6 +36,10 @@ "model_hub": "modelscope", "model_id": "AI-ModelScope/stable-diffusion-v1-5", "model_revision": "master", + "abilities": [ + "text2iamge", + "image2image" + ], "controlnet": [ { "model_name":"canny", @@ -77,6 +91,10 @@ "model_hub": "modelscope", "model_id": "AI-ModelScope/stable-diffusion-xl-base-1.0", "model_revision": "master", + "abilities": [ + "text2iamge", + "image2image" + ], "controlnet": [ { "model_name":"canny", diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index b43903d4f2..2c510d42f5 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -40,17 +40,18 @@ def __init__( lora_model: Optional[List[LoRA]] = None, lora_load_kwargs: Optional[Dict] = None, lora_fuse_kwargs: Optional[Dict] = None, - ability: Optional[str] = None, + abilities: Optional[List[str]] = None, **kwargs, ): self._model_uid = model_uid self._model_path = model_path self._device = device self._model = None + self._i2i_model = None # image to image model self._lora_model = lora_model self._lora_load_kwargs = lora_load_kwargs or {} self._lora_fuse_kwargs = lora_fuse_kwargs or {} - self._ability = ability + self._abilities = abilities self._kwargs = kwargs def _apply_lora(self): @@ -69,12 +70,12 @@ def _apply_lora(self): def load(self): import torch - if self._ability in [None, "text2image", "image2image"]: + if "text2image" in self._abilities or "image2image" in self._abilities: from diffusers import AutoPipelineForText2Image as AutoPipelineModel - elif self._ability == "inpainting": + elif "inpainting" in self._abilities: from diffusers import AutoPipelineForInpainting as AutoPipelineModel else: - raise ValueError(f"Unknown ability: {self._ability}") + raise ValueError(f"Unknown ability: {self._abilities}") controlnet = self._kwargs.get("controlnet") if controlnet is not None: @@ -106,28 +107,17 @@ def load(self): def _call_model( self, - height: int, - width: int, - num_images_per_prompt: int, response_format: str, + model=None, **kwargs, ): logger.debug( "stable diffusion args: %s", - dict( - kwargs, - height=height, - width=width, - num_images_per_prompt=num_images_per_prompt, - ), + kwargs, ) - assert callable(self._model) - images = self._model( - height=height, - width=width, - num_images_per_prompt=num_images_per_prompt, - **kwargs, - ).images + model = model if model is not None else self._model + assert callable(model) + images = model(**kwargs).images if response_format == "url": os.makedirs(XINFERENCE_IMAGE_DIR, exist_ok=True) image_list = [] @@ -145,7 +135,7 @@ def _gen_base64_image(_img): return base64.b64encode(buffered.getvalue()).decode() with ThreadPoolExecutor() as executor: - results = list(map(partial(executor.submit, _gen_base64_image), images)) + results = list(map(partial(executor.submit, _gen_base64_image), images)) # type: ignore image_list = [Image(url=None, b64_json=s.result()) for s in results] return ImageList(created=int(time.time()), data=image_list) else: @@ -177,19 +167,32 @@ def image_to_image( prompt: Optional[Union[str, List[str]]] = None, negative_prompt: Optional[Union[str, List[str]]] = None, n: int = 1, - size: str = "1024*1024", + size: Optional[str] = None, response_format: str = "url", **kwargs, ): - width, height = map(int, re.split(r"[^\d]+", size)) + if "controlnet" in self._kwargs: + model = self._model + else: + if self._i2i_model is not None: + model = self._i2i_model + else: + from diffusers import AutoPipelineForImage2Image + + self._i2i_model = model = AutoPipelineForImage2Image.from_pipe( + self._model + ) + if size: + width, height = map(int, re.split(r"[^\d]+", size)) + kwargs["width"] = width + kwargs["height"] = height return self._call_model( image=image, prompt=prompt, negative_prompt=negative_prompt, - height=height, - width=width, num_images_per_prompt=n, response_format=response_format, + model=model, **kwargs, ) diff --git a/xinference/model/image/tests/test_stable_diffusion.py b/xinference/model/image/tests/test_stable_diffusion.py index c5b4c516b3..ba54ca806d 100644 --- a/xinference/model/image/tests/test_stable_diffusion.py +++ b/xinference/model/image/tests/test_stable_diffusion.py @@ -188,6 +188,42 @@ def test_restful_api_for_sd_turbo(setup, model_name): assert img.size == (512, 512) +@pytest.mark.skip(reason="Stable diffusion image2image requires too many GRAM.") +def test_restful_api_for_sd_image2image(setup): + endpoint, _ = setup + from ....client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_uid="my_image2image", + model_name="stable-diffusion-xl-base-1.0", + model_type="image", + ) + model = client.get_model(model_uid) + + from diffusers.utils import load_image + + # Replace the image path for your test. + image_path = os.path.expanduser("~/raw.jpg") + logger.info("Image path: %s", image_path) + image = load_image(image_path) + bio = io.BytesIO() + image.save(bio, format="png") + + r = model.image_to_image( + prompt="desert, clear sky, white clouds", + image=bio.getvalue(), + num_inference_steps=10, + ) + logger.info("test result %s", r) + from PIL import Image + + with open(r["data"][0]["url"], "rb") as f: + img = Image.open(f) + assert img.size == image.size + + @pytest.mark.skip(reason="Stable diffusion inpainting requires too many GRAM.") def test_restful_api_for_sd_inpainting(setup): endpoint, _ = setup From be149a8faadda7445380645245e2c85e36baf5e6 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:03:23 +0800 Subject: [PATCH 234/298] DOC: Documents for K8s (#2004) --- README.md | 18 +++ README_zh_CN.md | 18 +++ doc/source/getting_started/index.rst | 1 + .../getting_started/using_kubernetes.rst | 81 ++++++++++ .../getting_started/using_xinference.rst | 37 ----- .../getting_started/using_kubernetes.po | 140 ++++++++++++++++++ .../getting_started/using_xinference.po | 91 +++--------- 7 files changed, 276 insertions(+), 110 deletions(-) create mode 100644 doc/source/getting_started/using_kubernetes.rst create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_kubernetes.po diff --git a/README.md b/README.md index 933e9d5d29..ccbb45d8ab 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,24 @@ Nvidia GPU users can start Xinference server using [Xinference Docker Image](htt docker run --name xinference -d -p 9997:9997 -e XINFERENCE_HOME=/data -v </on/your/host>:/data --gpus all xprobe/xinference:latest xinference-local -H 0.0.0.0 ``` +### K8s via helm + +Ensure that you have GPU support in your Kubernetes cluster, then install as follows. + +``` +# add repo +helm repo add xinference https://xorbitsai.github.io/xinference-helm-charts + +# update indexes and query xinference versions +helm repo update xinference +helm search repo xinference/xinference --devel --versions + +# install xinference +helm install xinference xinference/xinference -n xinference --version 0.0.1-v<xinference_release_version> +``` + +For more customized installation methods on K8s, please refer to the [documentation](https://inference.readthedocs.io/en/latest/getting_started/using_kubernetes.html). + ### Quick Start Install Xinference by using pip as follows. (For more options, see [Installation page](https://inference.readthedocs.io/en/latest/getting_started/installation.html).) diff --git a/README_zh_CN.md b/README_zh_CN.md index 7d7fd08250..261638bc7b 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -91,6 +91,24 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 Nvidia GPU 用户可以使用[Xinference Docker 镜像](https://inference.readthedocs.io/zh-cn/latest/getting_started/using_docker_image.html) 启动 Xinference 服务器。在执行安装命令之前,确保你的系统中已经安装了 [Docker](https://docs.docker.com/get-docker/) 和 [CUDA](https://developer.nvidia.com/cuda-downloads)。 +### Kubernetes + +确保你的 Kubernetes 集群开启了 GPU 支持,然后通过 `helm` 进行如下方式的安装。 + +``` +# 新增xinference仓库 +helm repo add xinference https://xorbitsai.github.io/xinference-helm-charts + +# 更新仓库,查询可安装的版本 +helm repo update xinference +helm search repo xinference/xinference --devel --versions + +# 在K8s中安装xinference +helm install xinference xinference/xinference -n xinference --version 0.0.1-v<xinference_release_version> +``` + +更多定制化安装方式,请参考[文档](https://inference.readthedocs.io/en/latest/getting_started/using_kubernetes.html)。 + ### 快速开始 使用 pip 安装 Xinference,操作如下。(更多选项,请参阅[安装页面](https://inference.readthedocs.io/zh-cn/latest/getting_started/installation.html)。) diff --git a/doc/source/getting_started/index.rst b/doc/source/getting_started/index.rst index ee9d2cd6dd..521fc22be7 100644 --- a/doc/source/getting_started/index.rst +++ b/doc/source/getting_started/index.rst @@ -12,5 +12,6 @@ Getting Started using_xinference logging using_docker_image + using_kubernetes troubleshooting environments diff --git a/doc/source/getting_started/using_kubernetes.rst b/doc/source/getting_started/using_kubernetes.rst new file mode 100644 index 0000000000..e0b96af685 --- /dev/null +++ b/doc/source/getting_started/using_kubernetes.rst @@ -0,0 +1,81 @@ +.. _using_kubernetes: + +######################## +Xinference on Kubernetes +######################## + +************ +Helm Support +************ +Xinference provides a method for installation in a Kubernetes cluster via ``Helm`` . + + +Prerequisites +============= +* You have a fully functional Kubernetes cluster. +* Enable GPU support in Kubernetes, refer to `here <https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/>`_. +* ``Helm`` is correctly installed. + + +Steps +===== +#. Add xinference helm repo. + + .. code-block:: bash + + helm repo add xinference https://xorbitsai.github.io/xinference-helm-charts + +#. Update xinference helm repo indexes and query versions. + + .. code-block:: bash + + helm repo update xinference + helm search repo xinference/xinference --devel --versions + +#. Install + + .. code-block:: bash + + helm install xinference xinference/xinference -n xinference --version <helm_charts_version> + + +Customized Installation +======================= +The installation method mentioned above sets up a Xinference cluster similar to a single-machine setup, +with only one worker and all startup parameters at their default values. +However, this is usually not the desired setup. + +Below are some common custom installation configurations. + +#. I need to download models from ``ModelScope``. + + .. code-block:: bash + + helm install xinference xinference/xinference -n xinference --version <helm_charts_version> --set config.model_src="modelscope" + +#. I want to use cpu image of xinference (or use any other version of xinference images). + + .. code-block:: bash + + helm install xinference xinference/xinference -n xinference --version <helm_charts_version> --set config.xinference_image="<xinference_docker_image>" + +#. I want to have 4 Xinference workers, with each worker managing 4 GPUs. + + .. code-block:: bash + + helm install xinference xinference/xinference -n xinference --version <helm_charts_version> --set config.worker_num=4 --set config.gpu_per_worker="4" + +The above installation method is based on Helm ``--set`` option. +For more complex custom installations, such as multiple workers with shared storage, +it is highly recommended to use your own ``values.yaml`` file with Helm ``-f`` option for installation. + +The default ``values.yaml`` file is located `here <https://github.com/xorbitsai/xinference-helm-charts/blob/main/charts/xinference/values.yaml>`_. +Some examples can be found `here <https://github.com/xorbitsai/xinference-helm-charts/tree/main/examples>`_. + + +****************** +KubeBlocks Support +****************** +You can also install Xinference in Kubernetes using the third-party ``KubeBlocks``. +This method is not maintained by Xinference and does not guarantee timely updates or availability. +Please refer to the documentation at `here <https://kubeblocks.io/docs/preview/user_docs/kubeblocks-for-xinference/manage-xinference>`_. diff --git a/doc/source/getting_started/using_xinference.rst b/doc/source/getting_started/using_xinference.rst index 7b5112d635..b8cc47458a 100644 --- a/doc/source/getting_started/using_xinference.rst +++ b/doc/source/getting_started/using_xinference.rst @@ -424,43 +424,6 @@ Replace ``<your_version>`` with Xinference versions, e.g. ``v0.10.3``, ``latest` For more docker usage, refer to :ref:`Using Docker Image <using_docker_image>`. -Using Xinference On Kubernetes -============================== - -To use Xinference on Kubernetes, `KubeBlocks <https://kubeblocks.io/>`_ is required to help the installation. - -The following steps assume Kubernetes is already installed. - -1. Download cli tool kbcli for KubeBlocks, see `install kbcli <https://kubeblocks.io/docs/preview/user_docs/installation/install-with-kbcli/install-kbcli/>`_. - -Make sure kbcli version is at least v0.7.1. - -2. Install KubeBlocks using kbcli command, see `install KubeBlocks with kbcli <https://kubeblocks.io/docs/preview/user_docs/installation/install-with-kbcli/install-kubeblocks-with-kbcli/>`_. - -3. Enable Xinference addon, run the following command: - -.. code-block:: bash - - kbcli addon enable xinference - -4. Use kbcli to start Xinference cluster, run the following command: - -.. code-block:: bash - - kbcli cluster create xinference - -If the Kubernetes node doesn't have GPU on it, run the command with extra flag: - -.. code-block:: bash - - kbcli cluster create xinference --cpu-mode - -Use -h to read the help documentation for more options: - -.. code-block:: bash - - kbcli cluster create xinference -h - What's Next? ============ diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_kubernetes.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_kubernetes.po new file mode 100644 index 0000000000..ccf8255707 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_kubernetes.po @@ -0,0 +1,140 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-02 15:15+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.11.0\n" + +#: ../../source/getting_started/using_kubernetes.rst:5 +msgid "Xinference on Kubernetes" +msgstr "在 Kubernetes 集群中安装 Xinference" + +#: ../../source/getting_started/using_kubernetes.rst:9 +msgid "Helm Support" +msgstr "基于原生 Helm 的方式" + +#: ../../source/getting_started/using_kubernetes.rst:10 +msgid "" +"Xinference provides a method for installation in a Kubernetes cluster via" +" ``Helm`` ." +msgstr "" +"Xinference 提供基于原生 Helm 在 Kubernetes 集群中安装的方式。" + +#: ../../source/getting_started/using_kubernetes.rst:14 +msgid "Prerequisites" +msgstr "" +"准备条件" + +#: ../../source/getting_started/using_kubernetes.rst:15 +msgid "You have a fully functional Kubernetes cluster." +msgstr "" +"一个可用的 Kubernetes 集群。" + +#: ../../source/getting_started/using_kubernetes.rst:16 +msgid "" +"Enable GPU support in Kubernetes, refer to `here " +"<https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/>`_." +msgstr "" +"在 Kubernetes 中开启 GPU 支持,参考 `这里 <https://kubernetes.io/zh-cn/docs/tasks/manage-gpus/scheduling-gpus/>`_ 。" + +#: ../../source/getting_started/using_kubernetes.rst:17 +msgid "``Helm`` is correctly installed." +msgstr "" +"正确安装 ``Helm`` 。" + +#: ../../source/getting_started/using_kubernetes.rst:21 +msgid "Steps" +msgstr "" +"具体步骤" + +#: ../../source/getting_started/using_kubernetes.rst:22 +msgid "Add xinference helm repo." +msgstr "新增 Xinference Helm 仓库" + +#: ../../source/getting_started/using_kubernetes.rst:28 +msgid "Update xinference helm repo indexes and query versions." +msgstr "更新仓库索引,查询可安装版本" + +#: ../../source/getting_started/using_kubernetes.rst:35 +msgid "Install" +msgstr "安装" + +#: ../../source/getting_started/using_kubernetes.rst:43 +msgid "Customized Installation" +msgstr "自定义安装" + +#: ../../source/getting_started/using_kubernetes.rst:44 +msgid "" +"The installation method mentioned above sets up a Xinference cluster " +"similar to a single-machine setup, with only one worker and all startup " +"parameters at their default values. However, this is usually not the " +"desired setup." +msgstr "" +"上述安装方式安装了一个类似单机的 Xinference ,也就是只有一个节点,同时其他启动参数均保持默认。" + +#: ../../source/getting_started/using_kubernetes.rst:48 +msgid "Below are some common custom installation configurations." +msgstr "下面展示了一些常见的自定义安装配置。" + +#: ../../source/getting_started/using_kubernetes.rst:50 +msgid "I need to download models from ``ModelScope``." +msgstr "我需要从 ``ModelScope`` 下载模型。" + +#: ../../source/getting_started/using_kubernetes.rst:56 +msgid "" +"I want to use cpu image of xinference (or use any other version of " +"xinference images)." +msgstr "我想使用 cpu 版本的 Xinference 镜像(或者其他版本的镜像)。" + +#: ../../source/getting_started/using_kubernetes.rst:62 +msgid "I want to have 4 Xinference workers, with each worker managing 4 GPUs." +msgstr "我需要启动 4 个 Xinference worker 节点,每个 worker 管理 4 个 GPU。" + +#: ../../source/getting_started/using_kubernetes.rst:68 +msgid "" +"The above installation method is based on Helm ``--set`` option. For more" +" complex custom installations, such as multiple workers with shared " +"storage, it is highly recommended to use your own ``values.yaml`` file " +"with Helm ``-f`` option for installation." +msgstr "" +"上面的安装方式基于 Helm ``--set`` 选项。对于更加复杂的自定义安装场景,例如多个 worker 共享存储," +"非常推荐使用你自己的 ``values.yaml`` 文件,然后通过 Helm ``-f`` 选项进行安装。" + +#: ../../source/getting_started/using_kubernetes.rst:72 +msgid "" +"The default ``values.yaml`` file is located `here " +"<https://github.com/xorbitsai/xinference-helm-" +"charts/blob/main/charts/xinference/values.yaml>`_. Some examples can be " +"found `here <https://github.com/xorbitsai/xinference-helm-" +"charts/tree/main/examples>`_." +msgstr "" +"默认安装方式对应的 ``values.yaml`` 文件位于 `这里 <https://github.com/xorbitsai/xinference-helm-charts/blob/main/charts/xinference/values.yaml>`_ 。" +"而 `这里 <https://github.com/xorbitsai/xinference-helm-charts/tree/main/examples>`_ 有一些示例供参考。" + +#: ../../source/getting_started/using_kubernetes.rst:78 +msgid "KubeBlocks Support" +msgstr "基于第三方 KubeBlocks 的方式" + +#: ../../source/getting_started/using_kubernetes.rst:79 +msgid "" +"You can also install Xinference in Kubernetes using the third-party " +"``KubeBlocks``. This method is not maintained by Xinference and does not " +"guarantee timely updates or availability. Please refer to the " +"documentation at `here <https://kubeblocks.io/docs/preview/user_docs" +"/kubeblocks-for-xinference/manage-xinference>`_." +msgstr "" +"你也可以通过第三方的 ``KubeBlocks`` 来在 K8s 集群中安装 Xinference 。这种方式不是 Xinference 官方维护的," +"因此无法严格保证实时更新和可用性。请参考 `文档 <https://kubeblocks.io/docs/preview/user_docs/kubeblocks-for-xinference/manage-xinference>`_ 。" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po index 86c891efac..af00e9da42 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/using_xinference.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-11 10:26+0800\n" +"POT-Creation-Date: 2024-08-02 15:15+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -132,7 +132,8 @@ msgid "" "the inference engine you want to run. Currently, xinference supports the " "following inference engines:" msgstr "" -"自 ``v0.11.0`` 版本开始,在加载 LLM 模型之前,你需要指定具体的推理引擎。当前,Xinference 支持以下推理引擎:" +"自 ``v0.11.0`` 版本开始,在加载 LLM 模型之前,你需要指定具体的推理引擎。" +"当前,Xinference 支持以下推理引擎:" #: ../../source/getting_started/using_xinference.rst:109 msgid "``vllm``" @@ -154,8 +155,7 @@ msgstr "" msgid "" "About the details of these inference engine, please refer to :ref:`here " "<inference_backend>`." -msgstr "" -"关于这些推理引擎的详细信息,请参考 :ref:`这里 <inference_backend>` 。" +msgstr "关于这些推理引擎的详细信息,请参考 :ref:`这里 <inference_backend>` 。" #: ../../source/getting_started/using_xinference.rst:116 msgid "" @@ -163,15 +163,15 @@ msgid "" "``quantization`` of the model you want to launch is closely related to " "the inference engine." msgstr "" -"注意,当加载 LLM 模型时,所能运行的引擎与 ``model_format`` 和 ``quantization`` 参数息息相关。" +"注意,当加载 LLM 模型时,所能运行的引擎与 ``model_format`` 和 ``" +"quantization`` 参数息息相关。" #: ../../source/getting_started/using_xinference.rst:119 msgid "" "You can use ``xinference engine`` command to query the combination of " "parameters of the model you want to launch. This will demonstrate under " "what conditions a model can run on which inference engines." -msgstr "" -"Xinference 提供了 ``xinference engine`` 命令帮助你查询相关的参数组合。" +msgstr "Xinference 提供了 ``xinference engine`` 命令帮助你查询相关的参数组合。" #: ../../source/getting_started/using_xinference.rst:122 msgid "For example:" @@ -182,21 +182,22 @@ msgid "" "I would like to query about which inference engines the ``qwen-chat`` " "model can run on, and what are their respective parameters." msgstr "" -"我想查询与 ``qwen-chat`` 模型相关的参数组合,以决定它能够怎样跑在各种推理引擎上。" +"我想查询与 ``qwen-chat`` 模型相关的参数组合,以决定它能够怎样跑在各种推理" +"引擎上。" #: ../../source/getting_started/using_xinference.rst:130 msgid "" "I want to run ``qwen-chat`` with ``VLLM`` as the inference engine, but I " "don't know how to configure the other parameters." msgstr "" -"我想将 ``qwen-chat`` 跑在 ``VLLM`` 推理引擎上,但是我不知道什么样的其他参数符合这个要求。" +"我想将 ``qwen-chat`` 跑在 ``VLLM`` 推理引擎上,但是我不知道什么样的其他" +"参数符合这个要求。" #: ../../source/getting_started/using_xinference.rst:136 msgid "" "I want to launch the ``qwen-chat`` model in the ``GGUF`` format, and I " "need to know how to configure the remaining parameters." -msgstr "" -"我想加载 ``GGUF`` 格式的 ``qwen-chat`` 模型,我需要知道其余的参数组合。" +msgstr "我想加载 ``GGUF`` 格式的 ``qwen-chat`` 模型,我需要知道其余的参数组合。" #: ../../source/getting_started/using_xinference.rst:143 msgid "" @@ -205,8 +206,9 @@ msgid "" "retrieve information about the supported inference engines and their " "related parameter combinations through the ``xinference engine`` command." msgstr "" -"总之,相比于之前的版本,当加载 LLM 模型时,需要额外传入 ``model_engine`` 参数。" -"你可以通过 ``xinference engine`` 命令查询你想运行的推理引擎与其他参数组合的关系。" +"总之,相比于之前的版本,当加载 LLM 模型时,需要额外传入 ``model_engine`` " +"参数。你可以通过 ``xinference engine`` 命令查询你想运行的推理引擎与其他" +"参数组合的关系。" #: ../../source/getting_started/using_xinference.rst:150 msgid "Run Llama-2" @@ -440,67 +442,10 @@ msgid "" msgstr "更多 docker 使用,请参考 :ref:`使用 docker 镜像 <using_docker_image>`。" #: ../../source/getting_started/using_xinference.rst:428 -msgid "Using Xinference On Kubernetes" -msgstr "在 Kubernetes 环境中运行 Xinference" - -#: ../../source/getting_started/using_xinference.rst:430 -msgid "" -"To use Xinference on Kubernetes, `KubeBlocks <https://kubeblocks.io/>`_ " -"is required to help the installation." -msgstr "" -"如果想在 Kubernetes 中运行 Xinference,需要通过 `KubeBlocks <https://" -"kubeblocks.io/>`_ 来帮助安装。" - -#: ../../source/getting_started/using_xinference.rst:432 -msgid "The following steps assume Kubernetes is already installed." -msgstr "假设已经有一个可以使用的 Kubernetes 环境。" - -#: ../../source/getting_started/using_xinference.rst:434 -msgid "" -"Download cli tool kbcli for KubeBlocks, see `install kbcli " -"<https://kubeblocks.io/docs/preview/user_docs/installation/install-with-" -"kbcli/install-kbcli/>`_." -msgstr "" -"下载 KubeBlocks 的命令行工具,可以参考 `文档 <https://kubeblocks.io/docs/" -"preview/user_docs/installation/install-with-kbcli/install-kbcli/>`_. " - -#: ../../source/getting_started/using_xinference.rst:436 -msgid "Make sure kbcli version is at least v0.7.1." -msgstr "确保 kbcli 的版本至少为 v0.7.1。" - -#: ../../source/getting_started/using_xinference.rst:438 -msgid "" -"Install KubeBlocks using kbcli command, see `install KubeBlocks with " -"kbcli <https://kubeblocks.io/docs/preview/user_docs/installation/install-" -"with-kbcli/install-kubeblocks-with-kbcli/>`_." -msgstr "" -"通过 kbcli 安装 KubeBlocks,参考 `文档 kbcli <https://kubeblocks.io/docs/" -"preview/user_docs/installation/install-with-kbcli/install-kubeblocks-with" -"-kbcli/>`_." - -#: ../../source/getting_started/using_xinference.rst:440 -msgid "Enable Xinference addon, run the following command:" -msgstr "用以下命令打开 Xinference 插件:" - -#: ../../source/getting_started/using_xinference.rst:446 -msgid "Use kbcli to start Xinference cluster, run the following command:" -msgstr "使用 kbcli 来拉起 Xinference 集群:" - -#: ../../source/getting_started/using_xinference.rst:452 -msgid "" -"If the Kubernetes node doesn't have GPU on it, run the command with extra" -" flag:" -msgstr "如果 Kubernetes 节点没有 GPU 设备,需要加上额外的参数:" - -#: ../../source/getting_started/using_xinference.rst:458 -msgid "Use -h to read the help documentation for more options:" -msgstr "使用 -h 获取帮助文档" - -#: ../../source/getting_started/using_xinference.rst:465 msgid "What's Next?" msgstr "更多" -#: ../../source/getting_started/using_xinference.rst:467 +#: ../../source/getting_started/using_xinference.rst:430 msgid "" "Congratulations on getting started with Xinference! To help you navigate " "and make the most out of this powerful tool, here are some resources and " @@ -509,12 +454,12 @@ msgstr "" "恭喜你,已经初步掌握了 Xinference 的用法!为了帮助你更好地使用工具,下面" "是其他的一些文档和指导资源:" -#: ../../source/getting_started/using_xinference.rst:470 +#: ../../source/getting_started/using_xinference.rst:433 msgid "" ":ref:`How to Use Client APIs for Different Types of Models " "<user_guide_client_api>`" msgstr ":ref:`如何使用 Python 创建不同类型的模型 <user_guide_client_api>`" -#: ../../source/getting_started/using_xinference.rst:472 +#: ../../source/getting_started/using_xinference.rst:435 msgid ":ref:`Choosing the Right Backends for Your Needs <user_guide_backends>`" msgstr ":ref:`选择正确的推理引擎 <user_guide_backends>` " From dd85cfe015c9cd2d8110c79213640aa0e21f3a6a Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:08:07 +0800 Subject: [PATCH 235/298] FEAT: Support gte-Qwen2-7B-instruct and multi gpu deploy (#1994) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/model/embedding/core.py | 89 ++++++++++++++++--- xinference/model/embedding/model_spec.json | 8 ++ .../embedding/model_spec_modelscope.json | 8 ++ .../embedding/tests/test_embedding_models.py | 6 +- 4 files changed, 97 insertions(+), 14 deletions(-) diff --git a/xinference/model/embedding/core.py b/xinference/model/embedding/core.py index 44163ec6b9..9fcc8847b1 100644 --- a/xinference/model/embedding/core.py +++ b/xinference/model/embedding/core.py @@ -122,6 +122,7 @@ def __init__( self, model_uid: str, model_path: str, + model_spec: EmbeddingModelSpec, device: Optional[str] = None, ): self._model_uid = model_uid @@ -129,6 +130,7 @@ def __init__( self._device = device self._model = None self._counter = 0 + self._model_spec = model_spec def load(self): try: @@ -139,12 +141,26 @@ def load(self): "Please make sure 'sentence-transformers' is installed. ", "You can install it by `pip install sentence-transformers`\n", ] - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + class XSentenceTransformer(SentenceTransformer): + def to(self, *args, **kwargs): + pass + from ..utils import patch_trust_remote_code patch_trust_remote_code() - self._model = SentenceTransformer(self._model_path, device=self._device) + if ( + "gte-Qwen2" in self._model_spec.model_id + or "gte-Qwen2" in self._model_spec.model_name + ): + self._model = XSentenceTransformer( + self._model_path, + device=self._device, + model_kwargs={"device_map": "auto"}, + ) + else: + self._model = SentenceTransformer(self._model_path, device=self._device) def create_embedding(self, sentences: Union[str, List[str]], **kwargs): self._counter += 1 @@ -161,6 +177,8 @@ def create_embedding(self, sentences: Union[str, List[str]], **kwargs): def encode( model: SentenceTransformer, sentences: Union[str, List[str]], + prompt_name: Optional[str] = None, + prompt: Optional[str] = None, batch_size: int = 32, show_progress_bar: bool = None, output_value: str = "sentence_embedding", @@ -209,10 +227,43 @@ def encode( sentences = [sentences] input_was_string = True + if prompt is None: + if prompt_name is not None: + try: + prompt = model.prompts[prompt_name] + except KeyError: + raise ValueError( + f"Prompt name '{prompt_name}' not found in the configured prompts dictionary with keys {list(model.prompts.keys())!r}." + ) + elif model.default_prompt_name is not None: + prompt = model.prompts.get(model.default_prompt_name, None) + else: + if prompt_name is not None: + logger.warning( + "Encode with either a `prompt`, a `prompt_name`, or neither, but not both. " + "Ignoring the `prompt_name` in favor of `prompt`." + ) + + extra_features = {} + if prompt is not None: + sentences = [prompt + sentence for sentence in sentences] + + # Some models (e.g. INSTRUCTOR, GRIT) require removing the prompt before pooling + # Tracking the prompt length allow us to remove the prompt during pooling + tokenized_prompt = model.tokenize([prompt]) + if "input_ids" in tokenized_prompt: + extra_features["prompt_length"] = ( + tokenized_prompt["input_ids"].shape[-1] - 1 + ) + if device is None: device = model._target_device - model.to(device) + if ( + "gte-Qwen2" not in self._model_spec.model_id + and "gte-Qwen2" not in self._model_spec.model_name + ): + model.to(device) all_embeddings = [] all_token_nums = 0 @@ -233,6 +284,7 @@ def encode( ] features = model.tokenize(sentences_batch) features = batch_to_device(features, device) + features.update(extra_features) all_token_nums += sum([len(f) for f in features]) with torch.no_grad(): @@ -277,7 +329,10 @@ def encode( ] if convert_to_tensor: - all_embeddings = torch.stack(all_embeddings) + if len(all_embeddings): + all_embeddings = torch.stack(all_embeddings) + else: + all_embeddings = torch.Tensor() elif convert_to_numpy: all_embeddings = np.asarray([emb.numpy() for emb in all_embeddings]) @@ -286,12 +341,24 @@ def encode( return all_embeddings, all_token_nums - all_embeddings, all_token_nums = encode( - self._model, - sentences, - convert_to_numpy=False, - **kwargs, - ) + if ( + "gte-Qwen2" in self._model_spec.model_id + or "gte-Qwen2" in self._model_spec.model_name + ): + all_embeddings, all_token_nums = encode( + self._model, + sentences, + prompt_name="query", + convert_to_numpy=False, + **kwargs, + ) + else: + all_embeddings, all_token_nums = encode( + self._model, + sentences, + convert_to_numpy=False, + **kwargs, + ) if isinstance(sentences, str): all_embeddings = [all_embeddings] embedding_list = [] @@ -356,7 +423,7 @@ def create_embedding_model_instance( if model_path is None: model_path = cache(model_spec) - model = EmbeddingModel(model_uid, model_path, **kwargs) + model = EmbeddingModel(model_uid, model_path, model_spec, **kwargs) model_description = EmbeddingModelDescription( subpool_addr, devices, model_spec, model_path=model_path ) diff --git a/xinference/model/embedding/model_spec.json b/xinference/model/embedding/model_spec.json index 42d89929dc..b90dcc8e58 100644 --- a/xinference/model/embedding/model_spec.json +++ b/xinference/model/embedding/model_spec.json @@ -230,5 +230,13 @@ "language": ["zh", "en"], "model_id": "moka-ai/m3e-large", "model_revision": "12900375086c37ba5d83d1e417b21dc7d1d1f388" + }, + { + "model_name": "gte-Qwen2", + "dimensions": 3584, + "max_tokens": 32000, + "language": ["zh", "en"], + "model_id": "Alibaba-NLP/gte-Qwen2-7B-instruct", + "model_revision": "e26182b2122f4435e8b3ebecbf363990f409b45b" } ] diff --git a/xinference/model/embedding/model_spec_modelscope.json b/xinference/model/embedding/model_spec_modelscope.json index dfd16f19cd..b90a913b2b 100644 --- a/xinference/model/embedding/model_spec_modelscope.json +++ b/xinference/model/embedding/model_spec_modelscope.json @@ -232,5 +232,13 @@ "language": ["zh", "en"], "model_id": "AI-ModelScope/m3e-large", "model_hub": "modelscope" + }, + { + "model_name": "gte-Qwen2", + "dimensions": 4096, + "max_tokens": 32000, + "language": ["zh", "en"], + "model_id": "iic/gte_Qwen2-7B-instruct", + "model_hub": "modelscope" } ] diff --git a/xinference/model/embedding/tests/test_embedding_models.py b/xinference/model/embedding/tests/test_embedding_models.py index da49a07604..02e0cdde7c 100644 --- a/xinference/model/embedding/tests/test_embedding_models.py +++ b/xinference/model/embedding/tests/test_embedding_models.py @@ -54,7 +54,7 @@ def test_model(): model_path = None try: model_path = cache(TEST_MODEL_SPEC) - model = EmbeddingModel("mock", model_path) + model = EmbeddingModel("mock", model_path, TEST_MODEL_SPEC) # input is a string input_text = "what is the capital of China?" model.load() @@ -83,7 +83,7 @@ def test_model(): def test_model_from_modelscope(): model_path = cache(TEST_MODEL_SPEC_FROM_MODELSCOPE) - model = EmbeddingModel("mock", model_path) + model = EmbeddingModel("mock", model_path, TEST_MODEL_SPEC_FROM_MODELSCOPE) # input is a string input_text = "乱条犹未变初黄,倚得东风势便狂。解把飞花蒙日月,不知天地有清霜。" model.load() @@ -108,7 +108,7 @@ def test_meta_file(): assert valid_model_revision(meta_path, TEST_MODEL_SPEC2.model_revision) # test functionality of the new version model - model = EmbeddingModel("mock", cache_dir) + model = EmbeddingModel("mock", cache_dir, TEST_MODEL_SPEC2) input_text = "I can do this all day." model.load() r = model.create_embedding(input_text) From 8e292b9416986f15169239e4464ef696fe554f79 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Sun, 4 Aug 2024 14:32:56 +0800 Subject: [PATCH 236/298] BUG: fix flexible model register in worker (#2011) --- xinference/core/worker.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 1d436d4d7b..3b18aa095d 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -226,6 +226,7 @@ async def __post_create__(self): ) from ..model.flexible import ( FlexibleModelSpec, + generate_flexible_model_description, get_flexible_model_descriptions, register_flexible_model, unregister_flexible_model, @@ -287,6 +288,7 @@ async def __post_create__(self): FlexibleModelSpec, register_flexible_model, unregister_flexible_model, + generate_flexible_model_description, ), } From a5e827ddaae7e4614783dd4c3a0690677667fbf1 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Sun, 4 Aug 2024 11:50:54 +0200 Subject: [PATCH 237/298] ENH: Improve internal server error (#2009) --- doc/source/models/model_abilities/audio.rst | 4 ++-- xinference/api/restful_api.py | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/doc/source/models/model_abilities/audio.rst b/doc/source/models/model_abilities/audio.rst index 2abb70831e..7c843cff4d 100644 --- a/doc/source/models/model_abilities/audio.rst +++ b/doc/source/models/model_abilities/audio.rst @@ -191,7 +191,7 @@ Speech API use non-stream by default as -H 'Content-Type: application/json' \ -d '{ "model": "<MODEL_UID>", - "text": "<The text to generate audio for>", + "input": "<The text to generate audio for>", "voice": "echo", "stream": True, }' @@ -245,7 +245,7 @@ Basic usage, launch model ``CosyVoice-300M-SFT``. -H 'Content-Type: application/json' \ -d '{ "model": "<MODEL_UID>", - "text": "<The text to generate audio for>", + "input": "<The text to generate audio for>", # ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女'] "voice": "中文女" }' diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index d3501f11a3..42bb1f3d0e 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -46,7 +46,7 @@ from PIL import Image from sse_starlette.sse import EventSourceResponse from starlette.responses import JSONResponse as StarletteJSONResponse -from starlette.responses import RedirectResponse +from starlette.responses import PlainTextResponse, RedirectResponse from uvicorn import Config, Server from xoscar.utils import get_next_port @@ -235,6 +235,13 @@ def serve(self, logging_conf: Optional[dict] = None): allow_headers=["*"], ) + @self._app.exception_handler(500) + async def internal_exception_handler(request: Request, exc: Exception): + logger.exception("Handling request %s failed: %s", request.url, exc) + return PlainTextResponse( + status_code=500, content=f"Internal Server Error: {exc}" + ) + # internal interface self._router.add_api_route("/status", self.get_status, methods=["GET"]) # conflict with /v1/models/{model_uid} below, so register this first From ec421ed02ad50c0b3b8e4ae09dafa21c4a02db36 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Mon, 5 Aug 2024 11:57:51 +0800 Subject: [PATCH 238/298] BUG: [UI] Fix the 'model_path' bug. (#2015) --- .../ui/src/scenes/launch_model/modelCard.js | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 91f7bd6a52..4bc3eb8130 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -70,6 +70,7 @@ const llmAllDataKey = [ 'worker_ip', 'gpu_idx', 'download_hub', + 'model_path', 'peft_model_config', ] @@ -283,7 +284,7 @@ const ModelCard = ({ const modelDataWithID_LLM = { // If user does not fill model_uid, pass null (None) to server and server generates it. - model_uid: modelUID.trim() === '' ? null : modelUID.trim(), + model_uid: modelUID?.trim() === '' ? null : modelUID?.trim(), model_name: modelData.model_name, model_type: modelType, model_engine: modelEngine, @@ -298,25 +299,25 @@ const ModelCard = ({ : parseInt(nGPU, 10), replica: replica, request_limits: - String(requestLimits).trim() === '' + String(requestLimits)?.trim() === '' ? null - : Number(String(requestLimits).trim()), - worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), - gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), + : Number(String(requestLimits)?.trim()), + worker_ip: workerIp?.trim() === '' ? null : workerIp?.trim(), + gpu_idx: GPUIdx?.trim() === '' ? null : handleGPUIdx(GPUIdx?.trim()), download_hub: downloadHub === '' ? null : downloadHub, - model_path: modelPath.trim() === '' ? null : modelPath.trim(), + model_path: modelPath?.trim() === '' ? null : modelPath?.trim(), } let modelDataWithID_other = { - model_uid: modelUID.trim() === '' ? null : modelUID.trim(), + model_uid: modelUID?.trim() === '' ? null : modelUID?.trim(), model_name: modelData.model_name, model_type: modelType, replica: replica, n_gpu: nGpu === 'GPU' ? 'auto' : null, - worker_ip: workerIp.trim() === '' ? null : workerIp.trim(), - gpu_idx: GPUIdx.trim() === '' ? null : handleGPUIdx(GPUIdx.trim()), + worker_ip: workerIp?.trim() === '' ? null : workerIp.trim(), + gpu_idx: GPUIdx?.trim() === '' ? null : handleGPUIdx(GPUIdx?.trim()), download_hub: downloadHub === '' ? null : downloadHub, - model_path: modelPath.trim() === '' ? null : modelPath.trim(), + model_path: modelPath?.trim() === '' ? null : modelPath?.trim(), } if (nGPULayers >= 0) { @@ -621,7 +622,8 @@ const ModelCard = ({ request_limits || worker_ip || gpu_idx?.join(',') || - download_hub + download_hub || + model_path ) setIsOther(true) @@ -645,7 +647,7 @@ const ModelCard = ({ setGPUIdx(arr[0].gpu_idx || '') setWorkerIp(arr[0].worker_ip || '') setDownloadHub(arr[0].download_hub) - setModelPath(arr[0].model_path) + setModelPath(arr[0].model_path || '') } } From 111299317120411f407b015b2b7dbf8402aa35c8 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Mon, 5 Aug 2024 11:58:50 +0800 Subject: [PATCH 239/298] BUG: fix custom embedding launch error (#2016) --- xinference/model/embedding/core.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/xinference/model/embedding/core.py b/xinference/model/embedding/core.py index 9fcc8847b1..ed8b6c6eb0 100644 --- a/xinference/model/embedding/core.py +++ b/xinference/model/embedding/core.py @@ -151,8 +151,8 @@ def to(self, *args, **kwargs): patch_trust_remote_code() if ( - "gte-Qwen2" in self._model_spec.model_id - or "gte-Qwen2" in self._model_spec.model_name + "gte" in self._model_spec.model_name.lower() + and "qwen2" in self._model_spec.model_name.lower() ): self._model = XSentenceTransformer( self._model_path, @@ -260,8 +260,8 @@ def encode( device = model._target_device if ( - "gte-Qwen2" not in self._model_spec.model_id - and "gte-Qwen2" not in self._model_spec.model_name + "gte" in self._model_spec.model_name.lower() + and "qwen2" in self._model_spec.model_name.lower() ): model.to(device) @@ -342,8 +342,8 @@ def encode( return all_embeddings, all_token_nums if ( - "gte-Qwen2" in self._model_spec.model_id - or "gte-Qwen2" in self._model_spec.model_name + "gte" in self._model_spec.model_name.lower() + and "qwen2" in self._model_spec.model_name.lower() ): all_embeddings, all_token_nums = encode( self._model, From 0057edeba7b85eb4fc2b3db327a666aa873a118f Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Mon, 5 Aug 2024 17:04:07 +0800 Subject: [PATCH 240/298] FEAT: support SenseVoice audio-to-text model (#2008) --- .github/workflows/python.yaml | 6 +- doc/source/models/builtin/audio/index.rst | 2 + .../models/builtin/audio/sensevoicesmall.rst | 19 +++ doc/source/models/model_abilities/audio.rst | 1 + setup.cfg | 2 + xinference/deploy/docker/requirements.txt | 1 + xinference/deploy/docker/requirements_cpu.txt | 1 + xinference/model/audio/core.py | 14 ++- xinference/model/audio/funasr.py | 114 ++++++++++++++++++ xinference/model/audio/model_spec.json | 20 +++ .../model/audio/model_spec_modelscope.json | 21 ++++ xinference/model/audio/tests/test_funasr.py | 52 ++++++++ xinference/model/audio/whisper.py | 2 +- 13 files changed, 250 insertions(+), 5 deletions(-) create mode 100644 doc/source/models/builtin/audio/sensevoicesmall.rst create mode 100644 xinference/model/audio/funasr.py create mode 100644 xinference/model/audio/tests/test_funasr.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 87b4511a53..36990e9118 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -152,6 +152,7 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pip install -U "transformers" ${{ env.SELF_HOST_CONDA }} install -c conda-forge pynini=2.1.5 ${{ env.SELF_HOST_CONDA }} install -c conda-forge "ffmpeg<7" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U funasr ${{ env.SELF_HOST_PYTHON }} -m pip install -U nemo_text_processing ${{ env.SELF_HOST_PYTHON }} -m pip install -U omegaconf~=2.3.0 ${{ env.SELF_HOST_PYTHON }} -m pip install -U WeTextProcessing @@ -169,6 +170,9 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_whisper.py + ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ + -W ignore::PendingDeprecationWarning \ + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_funasr.py ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_chattts.py @@ -185,6 +189,6 @@ jobs: --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/client/tests/test_client.py pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ - --cov-config=setup.cfg --cov-report=xml --cov=xinference --ignore xinference/client/tests/test_client.py --ignore xinference/model/image/tests/test_stable_diffusion.py --ignore xinference/model/audio/tests/test_whisper.py --ignore xinference/model/audio/tests/test_chattts.py --ignore xinference/model/audio/tests/test_cosyvoice.py xinference + --cov-config=setup.cfg --cov-report=xml --cov=xinference --ignore xinference/client/tests/test_client.py --ignore xinference/model/image/tests/test_stable_diffusion.py --ignore xinference/model/audio/tests xinference fi working-directory: . diff --git a/doc/source/models/builtin/audio/index.rst b/doc/source/models/builtin/audio/index.rst index a380343b04..af7521b469 100644 --- a/doc/source/models/builtin/audio/index.rst +++ b/doc/source/models/builtin/audio/index.rst @@ -25,6 +25,8 @@ The following is a list of built-in audio models in Xinference: cosyvoice-300m-sft + sensevoicesmall + whisper-base whisper-base.en diff --git a/doc/source/models/builtin/audio/sensevoicesmall.rst b/doc/source/models/builtin/audio/sensevoicesmall.rst new file mode 100644 index 0000000000..2873a1351b --- /dev/null +++ b/doc/source/models/builtin/audio/sensevoicesmall.rst @@ -0,0 +1,19 @@ +.. _models_builtin_sensevoicesmall: + +=============== +SenseVoiceSmall +=============== + +- **Model Name:** SenseVoiceSmall +- **Model Family:** funasr +- **Abilities:** audio-to-text +- **Multilingual:** True + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** FunAudioLLM/SenseVoiceSmall + +Execute the following command to launch the model:: + + xinference launch --model-name SenseVoiceSmall --model-type audio \ No newline at end of file diff --git a/doc/source/models/model_abilities/audio.rst b/doc/source/models/model_abilities/audio.rst index 7c843cff4d..53996b9bb6 100644 --- a/doc/source/models/model_abilities/audio.rst +++ b/doc/source/models/model_abilities/audio.rst @@ -54,6 +54,7 @@ Audio to text * Belle-distilwhisper-large-v2-zh * Belle-whisper-large-v2-zh * Belle-whisper-large-v3-zh +* SenseVoiceSmall Text to audio diff --git a/setup.cfg b/setup.cfg index e5107c56b9..ae5855fce9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -107,6 +107,7 @@ all = timm>=0.9.16 # For deepseek VL torchvision # For deepseek VL FlagEmbedding # For rerank + funasr omegaconf~=2.3.0 # For ChatTTS nemo_text_processing # For ChatTTS WeTextProcessing # For ChatTTS @@ -158,6 +159,7 @@ image = diffusers controlnet_aux audio = + funasr omegaconf~=2.3.0 nemo_text_processing WeTextProcessing diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 49a3653601..ef6262fdd1 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -45,6 +45,7 @@ attrdict # For deepseek VL timm>=0.9.16 # For deepseek VL torchvision # For deepseek VL FlagEmbedding # For rerank +funasr omegaconf~=2.3.0 # For ChatTTS nemo_text_processing # For ChatTTS WeTextProcessing # For ChatTTS diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 7260824863..27426b6a99 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -42,6 +42,7 @@ optimum peft timm opencv-contrib-python-headless +funasr omegaconf~=2.3.0 # For ChatTTS nemo_text_processing # For ChatTTS WeTextProcessing # For ChatTTS diff --git a/xinference/model/audio/core.py b/xinference/model/audio/core.py index 78a606cf01..2989496004 100644 --- a/xinference/model/audio/core.py +++ b/xinference/model/audio/core.py @@ -14,13 +14,14 @@ import logging import os from collections import defaultdict -from typing import Dict, List, Literal, Optional, Tuple, Union +from typing import Any, Dict, List, Literal, Optional, Tuple, Union from ...constants import XINFERENCE_CACHE_DIR from ..core import CacheableModelSpec, ModelDescription from ..utils import valid_model_revision from .chattts import ChatTTSModel from .cosyvoice import CosyVoiceModel +from .funasr import FunASRModel from .whisper import WhisperModel MAX_ATTEMPTS = 3 @@ -45,6 +46,8 @@ class AudioModelFamilyV1(CacheableModelSpec): model_id: str model_revision: str multilingual: bool + default_model_config: Optional[Dict[str, Any]] + default_transcription_config: Optional[Dict[str, Any]] class AudioModelDescription(ModelDescription): @@ -152,13 +155,18 @@ def create_audio_model_instance( download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, model_path: Optional[str] = None, **kwargs, -) -> Tuple[Union[WhisperModel, ChatTTSModel, CosyVoiceModel], AudioModelDescription]: +) -> Tuple[ + Union[WhisperModel, FunASRModel, ChatTTSModel, CosyVoiceModel], + AudioModelDescription, +]: model_spec = match_audio(model_name, download_hub) if model_path is None: model_path = cache(model_spec) - model: Union[WhisperModel, ChatTTSModel, CosyVoiceModel] + model: Union[WhisperModel, FunASRModel, ChatTTSModel, CosyVoiceModel] if model_spec.model_family == "whisper": model = WhisperModel(model_uid, model_path, model_spec, **kwargs) + elif model_spec.model_family == "funasr": + model = FunASRModel(model_uid, model_path, model_spec, **kwargs) elif model_spec.model_family == "ChatTTS": model = ChatTTSModel(model_uid, model_path, model_spec, **kwargs) elif model_spec.model_family == "CosyVoice": diff --git a/xinference/model/audio/funasr.py b/xinference/model/audio/funasr.py new file mode 100644 index 0000000000..98eb4ae878 --- /dev/null +++ b/xinference/model/audio/funasr.py @@ -0,0 +1,114 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import tempfile +from typing import TYPE_CHECKING, List, Optional + +from ...device_utils import get_available_device, is_device_available + +if TYPE_CHECKING: + from .core import AudioModelFamilyV1 + +logger = logging.getLogger(__name__) + + +class FunASRModel: + def __init__( + self, + model_uid: str, + model_path: str, + model_spec: "AudioModelFamilyV1", + device: Optional[str] = None, + **kwargs, + ): + self._model_uid = model_uid + self._model_path = model_path + self._model_spec = model_spec + self._device = device + self._model = None + self._kwargs = kwargs + + def load(self): + try: + from funasr import AutoModel + except ImportError: + error_message = "Failed to import module 'funasr'" + installation_guide = [ + "Please make sure 'funasr' is installed. ", + "You can install it by `pip install funasr`\n", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + if self._device is None: + self._device = get_available_device() + else: + if not is_device_available(self._device): + raise ValueError(f"Device {self._device} is not available!") + + kwargs = self._model_spec.default_model_config.copy() + kwargs.update(self._kwargs) + logger.debug("Loading FunASR model with kwargs: %s", kwargs) + self._model = AutoModel(model=self._model_path, device=self._device, **kwargs) + + def transcriptions( + self, + audio: bytes, + language: Optional[str] = None, + prompt: Optional[str] = None, + response_format: str = "json", + temperature: float = 0, + timestamp_granularities: Optional[List[str]] = None, + **kwargs, + ): + from funasr.utils.postprocess_utils import rich_transcription_postprocess + + if temperature != 0: + raise RuntimeError("`temperature`is not supported for FunASR") + if timestamp_granularities is not None: + raise RuntimeError("`timestamp_granularities`is not supported for FunASR") + if prompt is not None: + logger.warning( + "Prompt for funasr transcriptions will be ignored: %s", prompt + ) + + language = "auto" if language is None else language + + with tempfile.NamedTemporaryFile(buffering=0) as f: + f.write(audio) + + kw = self._model_spec.default_transcription_config.copy() # type: ignore + kw.update(kwargs) + logger.debug("Calling FunASR model with kwargs: %s", kw) + result = self._model.generate( # type: ignore + input=f.name, cache={}, language=language, **kw + ) + text = rich_transcription_postprocess(result[0]["text"]) + + if response_format == "json": + return {"text": text} + else: + raise ValueError(f"Unsupported response format: {response_format}") + + def translations( + self, + audio: bytes, + language: Optional[str] = None, + prompt: Optional[str] = None, + response_format: str = "json", + temperature: float = 0, + timestamp_granularities: Optional[List[str]] = None, + ): + raise RuntimeError("FunASR does not support translations API") diff --git a/xinference/model/audio/model_spec.json b/xinference/model/audio/model_spec.json index fa6e5db689..b4330d6119 100644 --- a/xinference/model/audio/model_spec.json +++ b/xinference/model/audio/model_spec.json @@ -95,6 +95,26 @@ "ability": "audio-to-text", "multilingual": false }, + { + "model_name": "SenseVoiceSmall", + "model_family": "funasr", + "model_id": "FunAudioLLM/SenseVoiceSmall", + "model_revision": "3eb3b4eeffc2f2dde6051b853983753db33e35c3", + "ability": "audio-to-text", + "multilingual": true, + "default_model_config": { + "vad_model": "fsmn-vad", + "vad_kwargs": { + "max_single_segment_time": 30000 + } + }, + "default_transcription_config": { + "use_itn": true, + "batch_size_s": 60, + "merge_vad": true, + "merge_length_s": 15 + } + }, { "model_name": "ChatTTS", "model_family": "ChatTTS", diff --git a/xinference/model/audio/model_spec_modelscope.json b/xinference/model/audio/model_spec_modelscope.json index 29a59c87e8..54ab82e823 100644 --- a/xinference/model/audio/model_spec_modelscope.json +++ b/xinference/model/audio/model_spec_modelscope.json @@ -8,6 +8,27 @@ "ability": "audio-to-text", "multilingual": true }, + { + "model_name": "SenseVoiceSmall", + "model_family": "funasr", + "model_hub": "modelscope", + "model_id": "iic/SenseVoiceSmall", + "model_revision": "master", + "ability": "audio-to-text", + "multilingual": true, + "default_model_config": { + "vad_model": "fsmn-vad", + "vad_kwargs": { + "max_single_segment_time": 30000 + } + }, + "default_transcription_config": { + "use_itn": true, + "batch_size_s": 60, + "merge_vad": true, + "merge_length_s": 15 + } + }, { "model_name": "ChatTTS", "model_family": "ChatTTS", diff --git a/xinference/model/audio/tests/test_funasr.py b/xinference/model/audio/tests/test_funasr.py new file mode 100644 index 0000000000..4a13860568 --- /dev/null +++ b/xinference/model/audio/tests/test_funasr.py @@ -0,0 +1,52 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os.path + +import requests + + +def test_restful_api_for_funasr(setup): + endpoint, _ = setup + from ....client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_uid="SenseVoiceSmall", + model_name="SenseVoiceSmall", + model_type="audio", + ) + model = client.get_model(model_uid) + response = requests.get("https://github.com/openai/whisper/raw/main/tests/jfk.flac") + audio = response.content + + response = model.transcriptions(audio) + transcription = response["text"].lower() + assert "my fellow americans" in transcription + assert "your country" in transcription + assert "do for you" in transcription + + # Test openai API + import openai + + zh_cn_audio_path = os.path.join( + os.path.dirname(__file__), "common_voice_zh-CN_38026095.mp3" + ) + client = openai.Client(api_key="not empty", base_url=f"{endpoint}/v1") + with open(zh_cn_audio_path, "rb") as f: + completion = client.audio.transcriptions.create(model=model_uid, file=f) + assert "列表" in completion.text + assert "香港" in completion.text + assert "航空" in completion.text diff --git a/xinference/model/audio/whisper.py b/xinference/model/audio/whisper.py index 34d2dead7a..80335a9f47 100644 --- a/xinference/model/audio/whisper.py +++ b/xinference/model/audio/whisper.py @@ -14,7 +14,7 @@ import logging from typing import TYPE_CHECKING, Dict, List, Optional, Union -from xinference.device_utils import ( +from ...device_utils import ( get_available_device, get_device_preferred_dtype, is_device_available, From 3f7dc2ddccfd023dc3aabee7200891de6a60eee0 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 6 Aug 2024 08:41:34 +0800 Subject: [PATCH 241/298] FEAT: support flux.1-schnell & flux.1-dev (#2007) --- doc/source/gen_docs.py | 2 +- .../models/builtin/embedding/gte-qwen2.rst | 21 ++++++++ .../models/builtin/image/flux.1-dev.rst | 19 +++++++ .../models/builtin/image/flux.1-schnell.rst | 19 +++++++ doc/source/models/builtin/image/index.rst | 6 ++- doc/source/models/builtin/image/sd-turbo.rst | 2 +- .../models/builtin/image/sd3-medium.rst | 2 +- .../models/builtin/image/sdxl-turbo.rst | 2 +- .../builtin/image/stable-diffusion-v1.5.rst | 2 +- .../image/stable-diffusion-xl-base-1.0.rst | 2 +- setup.cfg | 4 +- xinference/api/restful_api.py | 2 + xinference/core/image_interface.py | 29 ++++++++-- xinference/deploy/docker/requirements.txt | 2 +- xinference/deploy/docker/requirements_cpu.txt | 2 +- xinference/model/image/core.py | 7 ++- xinference/model/image/model_spec.json | 44 ++++++++++----- .../model/image/model_spec_modelscope.json | 40 ++++++++++---- .../model/image/stable_diffusion/core.py | 54 ++++++++++++++++++- .../web/ui/src/scenes/running_models/index.js | 1 + 20 files changed, 216 insertions(+), 46 deletions(-) create mode 100644 doc/source/models/builtin/embedding/gte-qwen2.rst create mode 100644 doc/source/models/builtin/image/flux.1-dev.rst create mode 100644 doc/source/models/builtin/image/flux.1-schnell.rst diff --git a/doc/source/gen_docs.py b/doc/source/gen_docs.py index 48de3f83ec..c344432917 100644 --- a/doc/source/gen_docs.py +++ b/doc/source/gen_docs.py @@ -193,7 +193,7 @@ def get_unique_id(spec): if not available_controlnet: available_controlnet = None model["available_controlnet"] = available_controlnet - model["model_ability"] = model.get("ability", "text-to-image") + model["model_ability"] = ', '.join(model.get("model_ability")) rendered = env.get_template('image.rst.jinja').render(model) output_file_path = os.path.join(output_dir, f"{model['model_name'].lower()}.rst") with open(output_file_path, 'w') as output_file: diff --git a/doc/source/models/builtin/embedding/gte-qwen2.rst b/doc/source/models/builtin/embedding/gte-qwen2.rst new file mode 100644 index 0000000000..a88fdece9d --- /dev/null +++ b/doc/source/models/builtin/embedding/gte-qwen2.rst @@ -0,0 +1,21 @@ +.. _models_builtin_gte-qwen2: + +========= +gte-Qwen2 +========= + +- **Model Name:** gte-Qwen2 +- **Languages:** zh, en +- **Abilities:** embed + +Specifications +^^^^^^^^^^^^^^ + +- **Dimensions:** 3584 +- **Max Tokens:** 32000 +- **Model ID:** Alibaba-NLP/gte-Qwen2-7B-instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/Alibaba-NLP/gte-Qwen2-7B-instruct>`__, `ModelScope <https://modelscope.cn/models/iic/gte_Qwen2-7B-instruct>`__ + +Execute the following command to launch the model:: + + xinference launch --model-name gte-Qwen2 --model-type embedding \ No newline at end of file diff --git a/doc/source/models/builtin/image/flux.1-dev.rst b/doc/source/models/builtin/image/flux.1-dev.rst new file mode 100644 index 0000000000..829bcbfd75 --- /dev/null +++ b/doc/source/models/builtin/image/flux.1-dev.rst @@ -0,0 +1,19 @@ +.. _models_builtin_flux.1-dev: + +========== +FLUX.1-dev +========== + +- **Model Name:** FLUX.1-dev +- **Model Family:** stable_diffusion +- **Abilities:** text2image +- **Available ControlNet:** None + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** black-forest-labs/FLUX.1-dev + +Execute the following command to launch the model:: + + xinference launch --model-name FLUX.1-dev --model-type image \ No newline at end of file diff --git a/doc/source/models/builtin/image/flux.1-schnell.rst b/doc/source/models/builtin/image/flux.1-schnell.rst new file mode 100644 index 0000000000..268f5a1720 --- /dev/null +++ b/doc/source/models/builtin/image/flux.1-schnell.rst @@ -0,0 +1,19 @@ +.. _models_builtin_flux.1-schnell: + +============== +FLUX.1-schnell +============== + +- **Model Name:** FLUX.1-schnell +- **Model Family:** stable_diffusion +- **Abilities:** text2image +- **Available ControlNet:** None + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** black-forest-labs/FLUX.1-schnell + +Execute the following command to launch the model:: + + xinference launch --model-name FLUX.1-schnell --model-type image \ No newline at end of file diff --git a/doc/source/models/builtin/image/index.rst b/doc/source/models/builtin/image/index.rst index 4656c35407..c1b00f57fb 100644 --- a/doc/source/models/builtin/image/index.rst +++ b/doc/source/models/builtin/image/index.rst @@ -11,6 +11,10 @@ The following is a list of built-in image models in Xinference: :maxdepth: 1 + flux.1-dev + + flux.1-schnell + sd-turbo sd3-medium @@ -26,6 +30,4 @@ The following is a list of built-in image models in Xinference: stable-diffusion-xl-base-1.0 stable-diffusion-xl-inpainting - - stable-diffusion-xl-inpainting \ No newline at end of file diff --git a/doc/source/models/builtin/image/sd-turbo.rst b/doc/source/models/builtin/image/sd-turbo.rst index 75a12e228e..e799b423a3 100644 --- a/doc/source/models/builtin/image/sd-turbo.rst +++ b/doc/source/models/builtin/image/sd-turbo.rst @@ -6,7 +6,7 @@ sd-turbo - **Model Name:** sd-turbo - **Model Family:** stable_diffusion -- **Abilities:** text-to-image +- **Abilities:** text2image - **Available ControlNet:** None Specifications diff --git a/doc/source/models/builtin/image/sd3-medium.rst b/doc/source/models/builtin/image/sd3-medium.rst index a0e9b02863..c69b4a708b 100644 --- a/doc/source/models/builtin/image/sd3-medium.rst +++ b/doc/source/models/builtin/image/sd3-medium.rst @@ -6,7 +6,7 @@ sd3-medium - **Model Name:** sd3-medium - **Model Family:** stable_diffusion -- **Abilities:** text-to-image +- **Abilities:** text2image, image2image - **Available ControlNet:** None Specifications diff --git a/doc/source/models/builtin/image/sdxl-turbo.rst b/doc/source/models/builtin/image/sdxl-turbo.rst index a1d7780d80..878b10079f 100644 --- a/doc/source/models/builtin/image/sdxl-turbo.rst +++ b/doc/source/models/builtin/image/sdxl-turbo.rst @@ -6,7 +6,7 @@ sdxl-turbo - **Model Name:** sdxl-turbo - **Model Family:** stable_diffusion -- **Abilities:** text-to-image +- **Abilities:** text2image - **Available ControlNet:** None Specifications diff --git a/doc/source/models/builtin/image/stable-diffusion-v1.5.rst b/doc/source/models/builtin/image/stable-diffusion-v1.5.rst index 23a7afe89b..5a0c73adcd 100644 --- a/doc/source/models/builtin/image/stable-diffusion-v1.5.rst +++ b/doc/source/models/builtin/image/stable-diffusion-v1.5.rst @@ -6,7 +6,7 @@ stable-diffusion-v1.5 - **Model Name:** stable-diffusion-v1.5 - **Model Family:** stable_diffusion -- **Abilities:** text-to-image +- **Abilities:** text2image, image2image - **Available ControlNet:** ['canny', 'mlsd', 'hed', 'scribble', 'openpose', 'normal', 'seg'] Specifications diff --git a/doc/source/models/builtin/image/stable-diffusion-xl-base-1.0.rst b/doc/source/models/builtin/image/stable-diffusion-xl-base-1.0.rst index d98bdd1865..a4f7518dbf 100644 --- a/doc/source/models/builtin/image/stable-diffusion-xl-base-1.0.rst +++ b/doc/source/models/builtin/image/stable-diffusion-xl-base-1.0.rst @@ -6,7 +6,7 @@ stable-diffusion-xl-base-1.0 - **Model Name:** stable-diffusion-xl-base-1.0 - **Model Family:** stable_diffusion -- **Abilities:** text-to-image +- **Abilities:** text2image, image2image - **Available ControlNet:** ['canny', 'depth', 'zoe-depth'] Specifications diff --git a/setup.cfg b/setup.cfg index ae5855fce9..278fe9f8fc 100644 --- a/setup.cfg +++ b/setup.cfg @@ -94,7 +94,7 @@ all = tiktoken sentence-transformers>=2.7.0 vllm>=0.2.6 ; sys_platform=='linux' - diffusers + diffusers>=0.29.0 controlnet_aux orjson auto-gptq ; sys_platform!='darwin' @@ -156,7 +156,7 @@ embedding = rerank = FlagEmbedding image = - diffusers + diffusers>=0.29.0 controlnet_aux audio = funasr diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 42bb1f3d0e..87e19d98cf 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -158,6 +158,7 @@ class BuildGradioImageInterfaceRequest(BaseModel): model_id: str controlnet: Union[None, List[Dict[str, Union[str, None]]]] model_revision: str + model_ability: List[str] class RESTfulAPI: @@ -1031,6 +1032,7 @@ async def build_gradio_images_interface( model_revision=body.model_revision, controlnet=body.controlnet, access_token=access_token, + model_ability=body.model_ability, ).build() gr.mount_gradio_app(self._app, interface, f"/{model_uid}") diff --git a/xinference/core/image_interface.py b/xinference/core/image_interface.py index cf87245820..791a0c5515 100644 --- a/xinference/core/image_interface.py +++ b/xinference/core/image_interface.py @@ -36,6 +36,7 @@ def __init__( model_name: str, model_id: str, model_revision: str, + model_ability: List[str], controlnet: Union[None, List[Dict[str, Union[str, None]]]], access_token: Optional[str], ): @@ -45,6 +46,7 @@ def __init__( self.model_name = model_name self.model_id = model_id self.model_revision = model_revision + self.model_ability = model_ability self.controlnet = controlnet self.access_token = ( access_token.replace("Bearer ", "") if access_token is not None else None @@ -76,6 +78,7 @@ def text_generate_image( n: int, size_width: int, size_height: int, + num_inference_steps: int, negative_prompt: Optional[str] = None, ) -> PIL.Image.Image: from ..client import RESTfulClient @@ -86,11 +89,15 @@ def text_generate_image( assert isinstance(model, RESTfulImageModelHandle) size = f"{int(size_width)}*{int(size_height)}" + num_inference_steps = ( + None if num_inference_steps == -1 else num_inference_steps # type: ignore + ) response = model.text_to_image( prompt=prompt, n=n, size=size, + num_inference_steps=num_inference_steps, negative_prompt=negative_prompt, response_format="b64_json", ) @@ -125,13 +132,23 @@ def text_generate_image( n = gr.Number(label="Number of Images", value=1) size_width = gr.Number(label="Width", value=1024) size_height = gr.Number(label="Height", value=1024) + num_inference_steps = gr.Number( + label="Inference Step Number", value=-1 + ) with gr.Column(): image_output = gr.Gallery() generate_button.click( text_generate_image, - inputs=[prompt, n, size_width, size_height, negative_prompt], + inputs=[ + prompt, + n, + size_width, + size_height, + num_inference_steps, + negative_prompt, + ], outputs=image_output, ) @@ -247,9 +264,11 @@ def build_main_interface(self) -> "gr.Blocks": </div> """ ) - with gr.Tab("Text to Image"): - self.text2image_interface() - with gr.Tab("Image to Image"): - self.image2image_interface() + if "text2image" in self.model_ability: + with gr.Tab("Text to Image"): + self.text2image_interface() + if "image2image" in self.model_ability: + with gr.Tab("Image to Image"): + self.image2image_interface() return app diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index ef6262fdd1..848513c78f 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -35,7 +35,7 @@ protobuf einops tiktoken sentence-transformers>=2.7.0 -diffusers +diffusers>=0.29.0 controlnet_aux orjson auto-gptq diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 27426b6a99..13039b452d 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -33,7 +33,7 @@ einops tiktoken sentence-transformers>=2.3.1 FlagEmbedding -diffusers +diffusers>=0.29.0 controlnet_aux orjson auto-gptq diff --git a/xinference/model/image/core.py b/xinference/model/image/core.py index c0b9993668..54aa27fe0b 100644 --- a/xinference/model/image/core.py +++ b/xinference/model/image/core.py @@ -45,7 +45,7 @@ class ImageModelFamilyV1(CacheableModelSpec): model_id: str model_revision: str model_hub: str = "huggingface" - abilities: Optional[List[str]] + model_ability: Optional[List[str]] controlnet: Optional[List["ImageModelFamilyV1"]] @@ -72,7 +72,7 @@ def to_dict(self): "model_name": self._model_spec.model_name, "model_family": self._model_spec.model_family, "model_revision": self._model_spec.model_revision, - "abilities": self._model_spec.abilities, + "model_ability": self._model_spec.model_ability, "controlnet": controlnet, } @@ -178,7 +178,6 @@ def get_cache_status( ] ) else: # Usually for UT - logger.warning(f"Cannot find builtin image model spec: {model_name}") return valid_model_revision(meta_path, model_spec.model_revision) @@ -239,7 +238,7 @@ def create_image_model_instance( lora_model_paths=lora_model, lora_load_kwargs=lora_load_kwargs, lora_fuse_kwargs=lora_fuse_kwargs, - abilities=model_spec.abilities, + abilities=model_spec.model_ability, **kwargs, ) model_description = ImageModelDescription( diff --git a/xinference/model/image/model_spec.json b/xinference/model/image/model_spec.json index 8ffe855587..847bffbaaf 100644 --- a/xinference/model/image/model_spec.json +++ b/xinference/model/image/model_spec.json @@ -1,11 +1,29 @@ [ + { + "model_name": "FLUX.1-schnell", + "model_family": "stable_diffusion", + "model_id": "black-forest-labs/FLUX.1-schnell", + "model_revision": "768d12a373ed5cc9ef9a9dea7504dc09fcc14842", + "model_ability": [ + "text2image" + ] + }, + { + "model_name": "FLUX.1-dev", + "model_family": "stable_diffusion", + "model_id": "black-forest-labs/FLUX.1-dev", + "model_revision": "01aa605f2c300568dd6515476f04565a954fcb59", + "model_ability": [ + "text2image" + ] + }, { "model_name": "sd3-medium", "model_family": "stable_diffusion", "model_id": "stabilityai/stable-diffusion-3-medium-diffusers", "model_revision": "ea42f8cef0f178587cf766dc8129abd379c90671", - "abilities": [ - "text2iamge", + "model_ability": [ + "text2image", "image2image" ] }, @@ -14,8 +32,8 @@ "model_family": "stable_diffusion", "model_id": "stabilityai/sd-turbo", "model_revision": "1681ed09e0cff58eeb41e878a49893228b78b94c", - "abilities": [ - "text2iamge" + "model_ability": [ + "text2image" ] }, { @@ -23,8 +41,8 @@ "model_family": "stable_diffusion", "model_id": "stabilityai/sdxl-turbo", "model_revision": "f4b0486b498f84668e828044de1d0c8ba486e05b", - "abilities": [ - "text2iamge" + "model_ability": [ + "text2image" ] }, { @@ -32,8 +50,8 @@ "model_family": "stable_diffusion", "model_id": "runwayml/stable-diffusion-v1-5", "model_revision": "1d0c4ebf6ff58a5caecab40fa1406526bca4b5b9", - "abilities": [ - "text2iamge", + "model_ability": [ + "text2image", "image2image" ], "controlnet": [ @@ -86,8 +104,8 @@ "model_family": "stable_diffusion", "model_id": "stabilityai/stable-diffusion-xl-base-1.0", "model_revision": "f898a3e026e802f68796b95e9702464bac78d76f", - "abilities": [ - "text2iamge", + "model_ability": [ + "text2image", "image2image" ], "controlnet": [ @@ -116,7 +134,7 @@ "model_family": "stable_diffusion", "model_id": "runwayml/stable-diffusion-inpainting", "model_revision": "51388a731f57604945fddd703ecb5c50e8e7b49d", - "abilities": [ + "model_ability": [ "inpainting" ] }, @@ -125,7 +143,7 @@ "model_family": "stable_diffusion", "model_id": "stabilityai/stable-diffusion-2-inpainting", "model_revision": "81a84f49b15956b60b4272a405ad3daef3da4590", - "abilities": [ + "model_ability": [ "inpainting" ] }, @@ -134,7 +152,7 @@ "model_family": "stable_diffusion", "model_id": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1", "model_revision": "115134f363124c53c7d878647567d04daf26e41e", - "abilities": [ + "model_ability": [ "inpainting" ] } diff --git a/xinference/model/image/model_spec_modelscope.json b/xinference/model/image/model_spec_modelscope.json index 6b4aa340c2..ee07c46632 100644 --- a/xinference/model/image/model_spec_modelscope.json +++ b/xinference/model/image/model_spec_modelscope.json @@ -1,12 +1,32 @@ [ + { + "model_name": "FLUX.1-schnell", + "model_family": "stable_diffusion", + "model_hub": "modelscope", + "model_id": "AI-ModelScope/FLUX.1-schnell", + "model_revision": "master", + "model_ability": [ + "text2image" + ] + }, + { + "model_name": "FLUX.1-dev", + "model_family": "stable_diffusion", + "model_hub": "modelscope", + "model_id": "AI-ModelScope/FLUX.1-dev", + "model_revision": "master", + "model_ability": [ + "text2image" + ] + }, { "model_name": "sd3-medium", "model_family": "stable_diffusion", "model_hub": "modelscope", "model_id": "AI-ModelScope/stable-diffusion-3-medium-diffusers", "model_revision": "master", - "abilities": [ - "text2iamge", + "model_ability": [ + "text2image", "image2image" ] }, @@ -16,8 +36,8 @@ "model_hub": "modelscope", "model_id": "AI-ModelScope/sd-turbo", "model_revision": "master", - "abilities": [ - "text2iamge" + "model_ability": [ + "text2image" ] }, { @@ -26,8 +46,8 @@ "model_hub": "modelscope", "model_id": "AI-ModelScope/sdxl-turbo", "model_revision": "master", - "abilities": [ - "text2iamge" + "model_ability": [ + "text2image" ] }, { @@ -36,8 +56,8 @@ "model_hub": "modelscope", "model_id": "AI-ModelScope/stable-diffusion-v1-5", "model_revision": "master", - "abilities": [ - "text2iamge", + "model_ability": [ + "text2image", "image2image" ], "controlnet": [ @@ -91,8 +111,8 @@ "model_hub": "modelscope", "model_id": "AI-ModelScope/stable-diffusion-xl-base-1.0", "model_revision": "master", - "abilities": [ - "text2iamge", + "model_ability": [ + "text2image", "image2image" ], "controlnet": [ diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index 2c510d42f5..14cb5dbcd3 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -51,7 +51,7 @@ def __init__( self._lora_model = lora_model self._lora_load_kwargs = lora_load_kwargs or {} self._lora_fuse_kwargs = lora_fuse_kwargs or {} - self._abilities = abilities + self._abilities = abilities or [] self._kwargs = kwargs def _apply_lora(self): @@ -89,6 +89,46 @@ def load(self): # The following params crashes on Mac M2 self._kwargs["torch_dtype"] = torch.float16 self._kwargs["use_safetensors"] = True + if isinstance(torch_dtype, str): + self._kwargs["torch_dtype"] = getattr(torch, torch_dtype) + + quantize_text_encoder = self._kwargs.pop("quantize_text_encoder", None) + if quantize_text_encoder: + try: + from transformers import BitsAndBytesConfig, T5EncoderModel + except ImportError: + error_message = "Failed to import module 'transformers'" + installation_guide = [ + "Please make sure 'transformers' is installed. ", + "You can install it by `pip install transformers`\n", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + try: + import bitsandbytes # noqa: F401 + except ImportError: + error_message = "Failed to import module 'bitsandbytes'" + installation_guide = [ + "Please make sure 'bitsandbytes' is installed. ", + "You can install it by `pip install bitsandbytes`\n", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + for text_encoder_name in quantize_text_encoder.split(","): + quantization_config = BitsAndBytesConfig(load_in_8bit=True) + quantization_kwargs = {} + if torch_dtype: + quantization_kwargs["torch_dtype"] = torch_dtype + text_encoder = T5EncoderModel.from_pretrained( + self._model_path, + subfolder=text_encoder_name, + quantization_config=quantization_config, + **quantization_kwargs, + ) + self._kwargs[text_encoder_name] = text_encoder + self._kwargs["device_map"] = "balanced" logger.debug("Loading model %s", AutoPipelineModel) self._model = AutoPipelineModel.from_pretrained( @@ -98,7 +138,7 @@ def load(self): if self._kwargs.get("cpu_offload", False): logger.debug("CPU offloading model") self._model.enable_model_cpu_offload() - else: + elif not self._kwargs.get("device_map"): logger.debug("Loading model to available device") self._model = move_model_to_available_device(self._model) # Recommended if your computer has < 64 GB of RAM @@ -141,6 +181,12 @@ def _gen_base64_image(_img): else: raise ValueError(f"Unsupported response format: {response_format}") + @classmethod + def _filter_kwargs(cls, kwargs: dict): + for arg in ["negative_prompt", "num_inference_steps"]: + if not kwargs.get(arg): + kwargs.pop(arg, None) + def text_to_image( self, prompt: str, @@ -152,6 +198,7 @@ def text_to_image( # References: # https://huggingface.co/docs/diffusers/main/en/api/pipelines/controlnet_sdxl width, height = map(int, re.split(r"[^\d]+", size)) + self._filter_kwargs(kwargs) return self._call_model( prompt=prompt, height=height, @@ -174,6 +221,8 @@ def image_to_image( if "controlnet" in self._kwargs: model = self._model else: + if "image2image" not in self._abilities: + raise RuntimeError(f"{self._model_uid} does not support image2image") if self._i2i_model is not None: model = self._i2i_model else: @@ -186,6 +235,7 @@ def image_to_image( width, height = map(int, re.split(r"[^\d]+", size)) kwargs["width"] = width kwargs["height"] = height + self._filter_kwargs(kwargs) return self._call_model( image=image, prompt=prompt, diff --git a/xinference/web/ui/src/scenes/running_models/index.js b/xinference/web/ui/src/scenes/running_models/index.js index b18973bc52..e91858f2fd 100644 --- a/xinference/web/ui/src/scenes/running_models/index.js +++ b/xinference/web/ui/src/scenes/running_models/index.js @@ -498,6 +498,7 @@ const RunningModels = () => { controlnet: row.controlnet, model_revision: row.model_revision, model_name: row.model_name, + model_ability: row.model_ability, }), }) .then((response) => response.json()) From 957c61352c057dee8aa4383e53736e215cfbe20a Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:20:20 +0800 Subject: [PATCH 242/298] CHORE: Increased frequency of issue processing (#2024) --- .github/workflows/issue.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index d82afc7467..688992e9d2 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -2,6 +2,7 @@ name: Close inactive issues on: schedule: - cron: "0 19 * * *" + workflow_dispatch: jobs: close-issues: @@ -10,7 +11,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v5 + - uses: actions/stale@v9 with: days-before-issue-stale: 7 days-before-issue-close: 5 @@ -19,4 +20,5 @@ jobs: close-issue-message: "This issue was closed because it has been inactive for 5 days since being marked as stale." days-before-pr-stale: -1 days-before-pr-close: -1 + operations-per-run: 500 repo-token: ${{ secrets.GITHUB_TOKEN }} From 54c418e745992a8623596577dc466d2b12f7bc15 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 7 Aug 2024 00:15:38 +0800 Subject: [PATCH 243/298] FEAT: support kolors image model (#2028) --- doc/source/models/builtin/image/kolors.rst | 19 +++++++++++++++++++ xinference/core/image_interface.py | 9 +++++++++ xinference/model/image/model_spec.json | 10 ++++++++++ .../model/image/stable_diffusion/core.py | 1 + 4 files changed, 39 insertions(+) create mode 100644 doc/source/models/builtin/image/kolors.rst diff --git a/doc/source/models/builtin/image/kolors.rst b/doc/source/models/builtin/image/kolors.rst new file mode 100644 index 0000000000..19d11c4201 --- /dev/null +++ b/doc/source/models/builtin/image/kolors.rst @@ -0,0 +1,19 @@ +.. _models_builtin_kolors: + +====== +kolors +====== + +- **Model Name:** kolors +- **Model Family:** stable_diffusion +- **Abilities:** text2image, image2image +- **Available ControlNet:** None + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** Kwai-Kolors/Kolors-diffusers + +Execute the following command to launch the model:: + + xinference launch --model-name kolors --model-type image \ No newline at end of file diff --git a/xinference/core/image_interface.py b/xinference/core/image_interface.py index 791a0c5515..3d80b72df4 100644 --- a/xinference/core/image_interface.py +++ b/xinference/core/image_interface.py @@ -162,6 +162,7 @@ def image_generate_image( n: int, size_width: int, size_height: int, + num_inference_steps: int, ) -> PIL.Image.Image: from ..client import RESTfulClient @@ -174,6 +175,9 @@ def image_generate_image( size = f"{int(size_width)}*{int(size_height)}" else: size = None + num_inference_steps = ( + None if num_inference_steps == -1 else num_inference_steps # type: ignore + ) bio = io.BytesIO() image.save(bio, format="png") @@ -185,6 +189,7 @@ def image_generate_image( image=bio.getvalue(), size=size, response_format="b64_json", + num_inference_steps=num_inference_steps, ) images = [] @@ -217,6 +222,9 @@ def image_generate_image( n = gr.Number(label="Number of image", value=1) size_width = gr.Number(label="Width", value=-1) size_height = gr.Number(label="Height", value=-1) + num_inference_steps = gr.Number( + label="Inference Step Number", value=-1 + ) with gr.Row(): with gr.Column(scale=1): @@ -233,6 +241,7 @@ def image_generate_image( n, size_width, size_height, + num_inference_steps, ], outputs=output_gallery, ) diff --git a/xinference/model/image/model_spec.json b/xinference/model/image/model_spec.json index 847bffbaaf..db062dace7 100644 --- a/xinference/model/image/model_spec.json +++ b/xinference/model/image/model_spec.json @@ -129,6 +129,16 @@ } ] }, + { + "model_name": "kolors", + "model_family": "stable_diffusion", + "model_id": "Kwai-Kolors/Kolors-diffusers", + "model_revision": "7e091c75199e910a26cd1b51ed52c28de5db3711", + "model_ability": [ + "text2image", + "image2image" + ] + }, { "model_name": "stable-diffusion-inpainting", "model_family": "stable_diffusion", diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index 14cb5dbcd3..17c83e9f18 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -88,6 +88,7 @@ def load(self): if sys.platform != "darwin" and torch_dtype is None: # The following params crashes on Mac M2 self._kwargs["torch_dtype"] = torch.float16 + self._kwargs["variant"] = "fp16" self._kwargs["use_safetensors"] = True if isinstance(torch_dtype, str): self._kwargs["torch_dtype"] = getattr(torch, torch_dtype) From 6cf75638dee97b723689291c3842b74c53a8a165 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Thu, 8 Aug 2024 10:02:57 +0800 Subject: [PATCH 244/298] FEAT: Add support for llama-3.1-instruct 405B model (#2025) --- setup.cfg | 8 ++-- xinference/model/llm/llm_family.json | 36 +++++++++++++++++ .../model/llm/llm_family_modelscope.json | 40 +++++++++++++++++++ 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/setup.cfg b/setup.cfg index 278fe9f8fc..19fe165e89 100644 --- a/setup.cfg +++ b/setup.cfg @@ -83,7 +83,7 @@ dev = sphinx-design all = llama-cpp-python>=0.2.25,!=0.2.58 - transformers>=4.34.2 + transformers>=4.43.2 torch accelerate>=0.27.2 sentencepiece @@ -100,7 +100,7 @@ all = auto-gptq ; sys_platform!='darwin' autoawq ; sys_platform!='darwin' optimum - outlines>=0.0.34 + outlines>=0.0.34 sglang>=0.2.7 ; sys_platform=='linux' mlx-lm ; sys_platform=='darwin' and platform_machine=='arm64' attrdict # For deepseek VL @@ -127,7 +127,7 @@ intel = ggml = llama-cpp-python>=0.2.25,!=0.2.58 transformers = - transformers>=4.34.2 + transformers>=4.43.2 torch accelerate>=0.27.2 sentencepiece @@ -145,7 +145,7 @@ transformers = peft vllm = vllm>=0.2.6 -sglang = +sglang = sglang>=0.2.7 ; sys_platform=='linux' vllm>=0.5.2 ; sys_platform=='linux' outlines>=0.0.34 diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index a01f63569b..ffd7f458b7 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1797,6 +1797,16 @@ "none" ], "model_id": "meta-llama/Meta-Llama-3.1-70B" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 405, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "meta-llama/Meta-Llama-3.1-405B" } ] }, @@ -1975,6 +1985,32 @@ "none" ], "model_id": "mlx-community/Meta-Llama-3.1-70B-Instruct-bf16" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 405, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "meta-llama/Meta-Llama-3.1-405B-Instruct" + }, + { + "model_format": "gptq", + "model_size_in_billions": 405, + "quantizations": [ + "Int4" + ], + "model_id": "hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4" + }, + { + "model_format": "awq", + "model_size_in_billions": 405, + "quantizations": [ + "Int4" + ], + "model_id": "hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4" } ], "prompt_style": { diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 37f415a1f1..56b89cc4f5 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -234,6 +234,17 @@ ], "model_id": "LLM-Research/Meta-Llama-3.1-70B", "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 405, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-405B", + "model_hub": "modelscope" } ] }, @@ -325,6 +336,35 @@ ], "model_id": "LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4", "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 405, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-405B-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "awq", + "model_size_in_billions": 405, + "quantizations": [ + "Int4" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-405B-Instruct-AWQ-INT4", + "model_hub": "modelscope" + }, + { + "model_format": "gptq", + "model_size_in_billions": 405, + "quantizations": [ + "Int4" + ], + "model_id": "LLM-Research/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4", + "model_hub": "modelscope" } ], "prompt_style": { From 9b713bc4f9230d767ebc5fa14139098cbe474408 Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 8 Aug 2024 12:29:21 +0800 Subject: [PATCH 245/298] TST: Fix some dependency version issues (#2042) --- .github/workflows/python.yaml | 2 +- setup.cfg | 8 ++++---- xinference/deploy/docker/requirements.txt | 4 ++-- xinference/deploy/docker/requirements_cpu.txt | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 36990e9118..fd818244cc 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -141,7 +141,7 @@ jobs: MODULE: ${{ matrix.module }} run: | if [ "$MODULE" == "gpu" ]; then - ${{ env.SELF_HOST_PYTHON }} -m pip install -U "openai>1" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "openai>1,<1.40" ${{ env.SELF_HOST_PYTHON }} -m pip install -U modelscope ${{ env.SELF_HOST_PYTHON }} -m pip install -U sse_starlette ${{ env.SELF_HOST_PYTHON }} -m pip install -U xoscar diff --git a/setup.cfg b/setup.cfg index 19fe165e89..05e33f9b5a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -42,7 +42,7 @@ install_requires = s3fs==2023.10.0 modelscope>=1.10.0 sse_starlette>=1.6.5 # ensure_bytes API break change: https://github.com/sysid/sse-starlette/issues/65 - openai>1 # For typing + openai>1,<1.40 # For typing python-jose[cryptography] passlib[bcrypt] aioprometheus[starlette]>=23.12.0 @@ -74,7 +74,7 @@ dev = jieba>=0.42.0 flake8>=3.8.0 black - openai>1 + openai>1,<1.40 opencv-contrib-python langchain langchain-community @@ -94,7 +94,7 @@ all = tiktoken sentence-transformers>=2.7.0 vllm>=0.2.6 ; sys_platform=='linux' - diffusers>=0.29.0 + diffusers>=0.25.0 # fix conflict with matcha-tts controlnet_aux orjson auto-gptq ; sys_platform!='darwin' @@ -156,7 +156,7 @@ embedding = rerank = FlagEmbedding image = - diffusers>=0.29.0 + diffusers>=0.25.0 # fix conflict with matcha-tts controlnet_aux audio = funasr diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 848513c78f..66f6d650af 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -16,7 +16,7 @@ fsspec==2023.10.0 s3fs==2023.10.0 modelscope>=1.10.0 sse_starlette>=1.6.5 # ensure_bytes API break change: https://github.com/sysid/sse-starlette/issues/65 -openai>1 # For typing +openai>1,<1.40 # For typing python-jose[cryptography] passlib[bcrypt] aioprometheus[starlette]>=23.12.0 @@ -35,7 +35,7 @@ protobuf einops tiktoken sentence-transformers>=2.7.0 -diffusers>=0.29.0 +diffusers>=0.25.0 # fix conflict with matcha-tts controlnet_aux orjson auto-gptq diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 13039b452d..a117e0c549 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -17,7 +17,7 @@ boto3>=1.28.55,<1.28.65 tensorizer~=2.9.0 modelscope>=1.10.0 sse_starlette>=1.6.5 -openai>1 +openai>1,<1.40 python-jose[cryptography] passlib[bcrypt] aioprometheus[starlette]>=23.12.0 @@ -33,7 +33,7 @@ einops tiktoken sentence-transformers>=2.3.1 FlagEmbedding -diffusers>=0.29.0 +diffusers>=0.25.0 # fix conflict with matcha-tts controlnet_aux orjson auto-gptq From 7d83300a7694a0262b634007ea4164ea753e466f Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:46:38 +0800 Subject: [PATCH 246/298] REF: Mark `Deprecate` for `prompt`, `system_prompt` and `chat_history` parameters in `chat` client interface (#2043) --- .../ja_JP/LC_MESSAGES/reference/index.po | 172 +++++++----------- .../zh_CN/LC_MESSAGES/reference/index.po | 102 +++++------ doc/source/reference/index.rst | 10 - xinference/client/handlers.py | 3 - xinference/client/restful/restful_client.py | 142 +-------------- xinference/core/chat_interface.py | 5 +- xinference/deploy/cmdline.py | 5 +- xinference/deploy/docker/cpu.Dockerfile | 2 +- xinference/types.py | 24 --- 9 files changed, 122 insertions(+), 343 deletions(-) diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/reference/index.po b/doc/source/locale/ja_JP/LC_MESSAGES/reference/index.po index ffc74b6399..769c066c58 100644 --- a/doc/source/locale/ja_JP/LC_MESSAGES/reference/index.po +++ b/doc/source/locale/ja_JP/LC_MESSAGES/reference/index.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-27 15:43+0800\n" +"POT-Creation-Date: 2024-08-08 14:38+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: ja_JP\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/reference/index.rst:5 msgid "API Reference" @@ -30,7 +30,7 @@ msgstr "" #: ../../source/reference/index.rst:25:<autosummary>:1 msgid "" ":py:obj:`xinference.client.Client <xinference.client.Client>`\\ " -"\\(base\\_url\\)" +"\\(base\\_url\\[\\, api\\_key\\]\\)" msgstr "" #: ../../source/reference/index.rst:25:<autosummary>:1 @@ -124,198 +124,166 @@ msgid "Model Handles" msgstr "" #: ../../source/reference/index.rst:31 -msgid "ChatglmCppChatModelHandle" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatglmCppChatModelHandle " -"<xinference.client.handlers.ChatglmCppChatModelHandle>`\\" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -"alias of " -":py:class:`~xinference.client.restful.restful_client.RESTfulChatglmCppChatModelHandle`" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatglmCppChatModelHandle.chat " -"<xinference.client.handlers.ChatglmCppChatModelHandle.chat>`\\ " -"\\(prompt\\)" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -"Given a list of messages comprising a conversation, the ChatGLM model " -"will return a response via RESTful APIs." -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatglmCppChatModelHandle.create_embedding" -" " -"<xinference.client.handlers.ChatglmCppChatModelHandle.create_embedding>`\\" -" \\(input\\)" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -#: ../../source/reference/index.rst:52:<autosummary>:1 -#: ../../source/reference/index.rst:62:<autosummary>:1 -#: ../../source/reference/index.rst:73:<autosummary>:1 -msgid "Create an Embedding from user input via RESTful APIs." -msgstr "" - -#: ../../source/reference/index.rst:42 msgid "ChatModelHandle" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatModelHandle " "<xinference.client.handlers.ChatModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulChatModelHandle`" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatModelHandle.chat " "<xinference.client.handlers.ChatModelHandle.chat>`\\ \\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" "Given a list of messages comprising a conversation, the model will return" " a response via RESTful APIs." msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatModelHandle.create_embedding " -"<xinference.client.handlers.ChatModelHandle.create_embedding>`\\ " -"\\(input\\)" -msgstr "" - -#: ../../source/reference/index.rst:52:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatModelHandle.generate " "<xinference.client.handlers.ChatModelHandle.generate>`\\ \\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:52:<autosummary>:1 -#: ../../source/reference/index.rst:73:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" "Creates a completion for the provided prompt and parameters via RESTful " "APIs." msgstr "" -#: ../../source/reference/index.rst:54 +#: ../../source/reference/index.rst:42 msgid "EmbeddingModelHandle" msgstr "" -#: ../../source/reference/index.rst:62:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.EmbeddingModelHandle " "<xinference.client.handlers.EmbeddingModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:62:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulEmbeddingModelHandle`" msgstr "" -#: ../../source/reference/index.rst:62:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.EmbeddingModelHandle.create_embedding" " <xinference.client.handlers.EmbeddingModelHandle.create_embedding>`\\ " -"\\(input\\)" +"\\(...\\)" +msgstr "" + +#: ../../source/reference/index.rst:50:<autosummary>:1 +msgid "Create an Embedding from user input via RESTful APIs." msgstr "" -#: ../../source/reference/index.rst:64 +#: ../../source/reference/index.rst:52 msgid "GenerateModelHandle" msgstr "" -#: ../../source/reference/index.rst:73:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.GenerateModelHandle " "<xinference.client.handlers.GenerateModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:73:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulGenerateModelHandle`" msgstr "" -#: ../../source/reference/index.rst:73:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.GenerateModelHandle.create_embedding " -"<xinference.client.handlers.GenerateModelHandle.create_embedding>`\\ " -"\\(input\\)" -msgstr "" - -#: ../../source/reference/index.rst:73:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.GenerateModelHandle.generate " "<xinference.client.handlers.GenerateModelHandle.generate>`\\ \\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:75 +#: ../../source/reference/index.rst:62 msgid "ImageModelHandle" msgstr "" -#: ../../source/reference/index.rst:81:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ImageModelHandle " "<xinference.client.handlers.ImageModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:81:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulImageModelHandle`" msgstr "" -#: ../../source/reference/index.rst:81:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ImageModelHandle.text_to_image " "<xinference.client.handlers.ImageModelHandle.text_to_image>`\\ " "\\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:81:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "Creates an image by the input text." msgstr "" -#~ msgid "" -#~ "alias of " -#~ ":py:class:`xinference.client.restful.restful_client.RESTfulChatglmCppChatModelHandle`" -#~ msgstr "" +#: ../../source/reference/index.rst:72 +msgid "AudioModelHandle" +msgstr "" + +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "" +":py:obj:`xinference.client.handlers.AudioModelHandle " +"<xinference.client.handlers.AudioModelHandle>`\\" +msgstr "" + +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "" +"alias of " +":py:class:`~xinference.client.restful.restful_client.RESTfulAudioModelHandle`" +msgstr "" + +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "" +":py:obj:`xinference.client.handlers.AudioModelHandle.transcriptions " +"<xinference.client.handlers.AudioModelHandle.transcriptions>`\\ " +"\\(audio\\)" +msgstr "" + +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "Transcribes audio into the input language." +msgstr "" -#~ msgid "" -#~ "alias of " -#~ ":py:class:`xinference.client.restful.restful_client.RESTfulChatModelHandle`" -#~ msgstr "" +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "" +":py:obj:`xinference.client.handlers.AudioModelHandle.translations " +"<xinference.client.handlers.AudioModelHandle.translations>`\\ \\(audio\\)" +msgstr "" -#~ msgid "" -#~ "alias of " -#~ ":py:class:`xinference.client.restful.restful_client.RESTfulEmbeddingModelHandle`" -#~ msgstr "" +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "Translates audio into English." +msgstr "" -#~ msgid "" -#~ "alias of " -#~ ":py:class:`xinference.client.restful.restful_client.RESTfulGenerateModelHandle`" -#~ msgstr "" +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "" +":py:obj:`xinference.client.handlers.AudioModelHandle.speech " +"<xinference.client.handlers.AudioModelHandle.speech>`\\ \\(input\\)" +msgstr "" -#~ msgid "" -#~ "alias of " -#~ ":py:class:`xinference.client.restful.restful_client.RESTfulImageModelHandle`" -#~ msgstr "" +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "Generates audio from the input text." +msgstr "" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po b/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po index d5ff12e4bc..64ef974c4f 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-11 13:33+0800\n" +"POT-Creation-Date: 2024-08-08 14:38+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.14.0\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/reference/index.rst:5 msgid "API Reference" @@ -30,7 +30,7 @@ msgstr "" #: ../../source/reference/index.rst:25:<autosummary>:1 msgid "" ":py:obj:`xinference.client.Client <xinference.client.Client>`\\ " -"\\(base\\_url\\)" +"\\(base\\_url\\[\\, api\\_key\\]\\)" msgstr "" #: ../../source/reference/index.rst:25:<autosummary>:1 @@ -124,186 +124,166 @@ msgid "Model Handles" msgstr "" #: ../../source/reference/index.rst:31 -msgid "ChatglmCppChatModelHandle" -msgstr "" - -#: ../../source/reference/index.rst:39:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatglmCppChatModelHandle " -"<xinference.client.handlers.ChatglmCppChatModelHandle>`\\" -msgstr "" - -#: ../../source/reference/index.rst:39:<autosummary>:1 -msgid "" -"alias of " -":py:class:`~xinference.client.restful.restful_client.RESTfulChatglmCppChatModelHandle`" -msgstr "" - -#: ../../source/reference/index.rst:39:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatglmCppChatModelHandle.chat " -"<xinference.client.handlers.ChatglmCppChatModelHandle.chat>`\\ " -"\\(prompt\\)" -msgstr "" - -#: ../../source/reference/index.rst:39:<autosummary>:1 -msgid "" -"Given a list of messages comprising a conversation, the ChatGLM model " -"will return a response via RESTful APIs." -msgstr "" - -#: ../../source/reference/index.rst:41 msgid "ChatModelHandle" msgstr "" -#: ../../source/reference/index.rst:50:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatModelHandle " "<xinference.client.handlers.ChatModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:50:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulChatModelHandle`" msgstr "" -#: ../../source/reference/index.rst:50:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatModelHandle.chat " "<xinference.client.handlers.ChatModelHandle.chat>`\\ \\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:50:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" "Given a list of messages comprising a conversation, the model will return" " a response via RESTful APIs." msgstr "" -#: ../../source/reference/index.rst:50:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ChatModelHandle.generate " "<xinference.client.handlers.ChatModelHandle.generate>`\\ \\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:50:<autosummary>:1 -#: ../../source/reference/index.rst:70:<autosummary>:1 +#: ../../source/reference/index.rst:40:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" "Creates a completion for the provided prompt and parameters via RESTful " "APIs." msgstr "" -#: ../../source/reference/index.rst:52 +#: ../../source/reference/index.rst:42 msgid "EmbeddingModelHandle" msgstr "" -#: ../../source/reference/index.rst:60:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.EmbeddingModelHandle " "<xinference.client.handlers.EmbeddingModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:60:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulEmbeddingModelHandle`" msgstr "" -#: ../../source/reference/index.rst:60:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.EmbeddingModelHandle.create_embedding" " <xinference.client.handlers.EmbeddingModelHandle.create_embedding>`\\ " -"\\(input\\)" +"\\(...\\)" msgstr "" -#: ../../source/reference/index.rst:60:<autosummary>:1 +#: ../../source/reference/index.rst:50:<autosummary>:1 msgid "Create an Embedding from user input via RESTful APIs." msgstr "" -#: ../../source/reference/index.rst:62 +#: ../../source/reference/index.rst:52 msgid "GenerateModelHandle" msgstr "" -#: ../../source/reference/index.rst:70:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.GenerateModelHandle " "<xinference.client.handlers.GenerateModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:70:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulGenerateModelHandle`" msgstr "" -#: ../../source/reference/index.rst:70:<autosummary>:1 +#: ../../source/reference/index.rst:60:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.GenerateModelHandle.generate " "<xinference.client.handlers.GenerateModelHandle.generate>`\\ \\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:72 +#: ../../source/reference/index.rst:62 msgid "ImageModelHandle" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ImageModelHandle " "<xinference.client.handlers.ImageModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulImageModelHandle`" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.ImageModelHandle.text_to_image " "<xinference.client.handlers.ImageModelHandle.text_to_image>`\\ " "\\(prompt\\)" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:70:<autosummary>:1 msgid "Creates an image by the input text." msgstr "" -#: ../../source/reference/index.rst:82 +#: ../../source/reference/index.rst:72 msgid "AudioModelHandle" msgstr "" -#: ../../source/reference/index.rst:89:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.AudioModelHandle " "<xinference.client.handlers.AudioModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:89:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulAudioModelHandle`" msgstr "" -#: ../../source/reference/index.rst:89:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.AudioModelHandle.transcriptions " "<xinference.client.handlers.AudioModelHandle.transcriptions>`\\ " "\\(audio\\)" msgstr "" -#: ../../source/reference/index.rst:89:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "Transcribes audio into the input language." msgstr "" -#: ../../source/reference/index.rst:89:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.AudioModelHandle.translations " "<xinference.client.handlers.AudioModelHandle.translations>`\\ \\(audio\\)" msgstr "" -#: ../../source/reference/index.rst:89:<autosummary>:1 +#: ../../source/reference/index.rst:80:<autosummary>:1 msgid "Translates audio into English." msgstr "" +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "" +":py:obj:`xinference.client.handlers.AudioModelHandle.speech " +"<xinference.client.handlers.AudioModelHandle.speech>`\\ \\(input\\)" +msgstr "" + +#: ../../source/reference/index.rst:80:<autosummary>:1 +msgid "Generates audio from the input text." +msgstr "" diff --git a/doc/source/reference/index.rst b/doc/source/reference/index.rst index aca63f17ed..ed382cabe1 100644 --- a/doc/source/reference/index.rst +++ b/doc/source/reference/index.rst @@ -27,16 +27,6 @@ Model Handles ~~~~~~~~~~~~~ -ChatglmCppChatModelHandle -^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autosummary:: - :toctree: generated/ - - xinference.client.handlers.ChatglmCppChatModelHandle - - xinference.client.handlers.ChatglmCppChatModelHandle.chat - - ChatModelHandle ^^^^^^^^^^^^^^^ .. autosummary:: diff --git a/xinference/client/handlers.py b/xinference/client/handlers.py index 522e8e8c61..48e625c83f 100644 --- a/xinference/client/handlers.py +++ b/xinference/client/handlers.py @@ -1,9 +1,6 @@ from .restful.restful_client import ( # noqa: F401 RESTfulAudioModelHandle as AudioModelHandle, ) -from .restful.restful_client import ( # noqa: F401 - RESTfulChatglmCppChatModelHandle as ChatglmCppChatModelHandle, -) from .restful.restful_client import ( # noqa: F401 RESTfulChatModelHandle as ChatModelHandle, ) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index 59e7153856..aa0955f75d 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -13,6 +13,7 @@ # limitations under the License. import json import typing +import warnings from typing import TYPE_CHECKING, Any, Dict, Iterator, List, Optional, Union import requests @@ -24,7 +25,6 @@ ChatCompletion, ChatCompletionChunk, ChatCompletionMessage, - ChatglmCppGenerateConfig, Completion, CompletionChunk, Embedding, @@ -470,81 +470,14 @@ def chat( Report the failure to generate the chat from the server. Detailed information provided in error message. """ - - url = f"{self._base_url}/v1/chat/completions" - - if chat_history is None: - chat_history = [] - - chat_history = handle_system_prompts(chat_history, system_prompt) - chat_history.append({"role": "user", "content": prompt}) # type: ignore - - request_body: Dict[str, Any] = { - "model": self._model_uid, - "messages": chat_history, - } - if tools is not None: - request_body["tools"] = tools - if generate_config is not None: - for key, value in generate_config.items(): - request_body[key] = value - - stream = bool(generate_config and generate_config.get("stream")) - response = requests.post( - url, json=request_body, stream=stream, headers=self.auth_headers + warnings.warn( + "The parameters `prompt`, `system_prompt` and `chat_history` will be deprecated in version v0.15.0, " + "and will be replaced by the parameter `messages`, " + "similar to the OpenAI API: https://platform.openai.com/docs/guides/chat-completions/getting-started", + category=DeprecationWarning, + stacklevel=2, ) - if response.status_code != 200: - raise RuntimeError( - f"Failed to generate chat completion, detail: {_get_error_string(response)}" - ) - - if stream: - return streaming_response_iterator(response.iter_lines()) - - response_data = response.json() - return response_data - - -class RESTfulChatglmCppChatModelHandle(RESTfulModelHandle): - def chat( - self, - prompt: str, - system_prompt: Optional[str] = None, - chat_history: Optional[List["ChatCompletionMessage"]] = None, - tools: Optional[List[Dict]] = None, - generate_config: Optional["ChatglmCppGenerateConfig"] = None, - ) -> Union["ChatCompletion", Iterator["ChatCompletionChunk"]]: - """ - Given a list of messages comprising a conversation, the ChatGLM model will return a response via RESTful APIs. - - Parameters - ---------- - prompt: str - The user's input. - system_prompt: Optional[str] - The system context provide to Model prior to any chats. - chat_history: Optional[List["ChatCompletionMessage"]] - A list of messages comprising the conversation so far. - tools: Optional[List[Dict]] - A tool list. - generate_config: Optional["ChatglmCppGenerateConfig"] - Additional configuration for ChatGLM chat generation. - - Returns - ------- - Union["ChatCompletion", Iterator["ChatCompletionChunk"]] - Stream is a parameter in generate_config. - When stream is set to True, the function will return Iterator["ChatCompletionChunk"]. - When stream is set to False, the function will return "ChatCompletion". - - Raises - ------ - RuntimeError - Report the failure to generate the chat from the server. Detailed information provided in error message. - - """ - url = f"{self._base_url}/v1/chat/completions" if chat_history is None: @@ -580,60 +513,6 @@ def chat( return response_data -class RESTfulChatglmCppGenerateModelHandle(RESTfulChatglmCppChatModelHandle): - def generate( - self, - prompt: str, - generate_config: Optional["ChatglmCppGenerateConfig"] = None, - ) -> Union["Completion", Iterator["CompletionChunk"]]: - """ - Given a prompt, the ChatGLM model will generate a response via RESTful APIs. - - Parameters - ---------- - prompt: str - The user's input. - generate_config: Optional["ChatglmCppGenerateConfig"] - Additional configuration for ChatGLM chat generation. - - Returns - ------- - Union["Completion", Iterator["CompletionChunk"]] - Stream is a parameter in generate_config. - When stream is set to True, the function will return Iterator["CompletionChunk"]. - When stream is set to False, the function will return "Completion". - - Raises - ------ - RuntimeError - Report the failure to generate the content from the server. Detailed information provided in error message. - - """ - - url = f"{self._base_url}/v1/completions" - - request_body: Dict[str, Any] = {"model": self._model_uid, "prompt": prompt} - if generate_config is not None: - for key, value in generate_config.items(): - request_body[key] = value - - stream = bool(generate_config and generate_config.get("stream")) - - response = requests.post( - url, json=request_body, stream=stream, headers=self.auth_headers - ) - if response.status_code != 200: - raise RuntimeError( - f"Failed to generate completion, detail: {response.json()['detail']}" - ) - - if stream: - return streaming_response_iterator(response.iter_lines()) - - response_data = response.json() - return response_data - - class RESTfulAudioModelHandle(RESTfulModelHandle): def transcriptions( self, @@ -1090,7 +969,6 @@ def get_model(self, model_uid: str) -> RESTfulModelHandle: ------- ModelHandle The corresponding Model Handler based on the Model specified in the uid: - - :obj:`xinference.client.handlers.ChatglmCppChatModelHandle` -> provide handle to ChatGLM Model - :obj:`xinference.client.handlers.GenerateModelHandle` -> provide handle to basic generate Model. e.g. Baichuan. - :obj:`xinference.client.handlers.ChatModelHandle` -> provide handle to chat Model. e.g. Baichuan-chat. @@ -1111,11 +989,7 @@ def get_model(self, model_uid: str) -> RESTfulModelHandle: desc = response.json() if desc["model_type"] == "LLM": - if desc["model_format"] == "ggmlv3" and "chatglm" in desc["model_name"]: - return RESTfulChatglmCppGenerateModelHandle( - model_uid, self.base_url, auth_headers=self._headers - ) - elif "chat" in desc["model_ability"]: + if "chat" in desc["model_ability"]: return RESTfulChatModelHandle( model_uid, self.base_url, auth_headers=self._headers ) diff --git a/xinference/core/chat_interface.py b/xinference/core/chat_interface.py index e74516f3a5..c8c647f3a9 100644 --- a/xinference/core/chat_interface.py +++ b/xinference/core/chat_interface.py @@ -24,7 +24,6 @@ from gradio.layouts import Accordion, Column, Row from ..client.restful.restful_client import ( - RESTfulChatglmCppChatModelHandle, RESTfulChatModelHandle, RESTfulGenerateModelHandle, ) @@ -116,9 +115,7 @@ def generate_wrapper( client = RESTfulClient(self.endpoint) client._set_token(self._access_token) model = client.get_model(self.model_uid) - assert isinstance( - model, (RESTfulChatModelHandle, RESTfulChatglmCppChatModelHandle) - ) + assert isinstance(model, RESTfulChatModelHandle) response_content = "" for chunk in model.chat( diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index fcff9b32ac..1ae10fc5b5 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -25,7 +25,6 @@ from .. import __version__ from ..client import RESTfulClient from ..client.restful.restful_client import ( - RESTfulChatglmCppChatModelHandle, RESTfulChatModelHandle, RESTfulGenerateModelHandle, ) @@ -1268,9 +1267,7 @@ async def chat_internal(): task.exception() else: restful_model = client.get_model(model_uid=model_uid) - if not isinstance( - restful_model, (RESTfulChatModelHandle, RESTfulChatglmCppChatModelHandle) - ): + if not isinstance(restful_model, RESTfulChatModelHandle): raise ValueError(f"model {model_uid} has no chat method") while True: diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index 8498f5f341..d7bd45c463 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -21,7 +21,7 @@ ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements_cpu.txt && \ - pip install "llama-cpp-python==0.2.77" --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu && \ + CMAKE_ARGS="-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS" pip install llama-cpp-python && \ cd /opt/inference && \ python setup.py build_web && \ git restore . && \ diff --git a/xinference/types.py b/xinference/types.py index a43989d579..e66e90bee1 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -206,30 +206,6 @@ class ChatCompletionChunk(TypedDict): usage: NotRequired[CompletionUsage] -class ChatglmCppModelConfig(TypedDict, total=False): - pass - - -class ChatglmCppGenerateConfig(TypedDict, total=False): - max_tokens: int - top_p: float - temperature: float - stream: bool - lora_name: Optional[str] - stream_options: Optional[Union[dict, None]] - - -class QWenCppModelConfig(TypedDict, total=False): - pass - - -class QWenCppGenerateConfig(TypedDict, total=False): - max_tokens: int - top_p: float - temperature: float - stream: bool - - StoppingCriteria = Callable[[List[int], List[float]], bool] From 8f0a0be72f253715454fdec559334e2246d82dbe Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Thu, 8 Aug 2024 18:21:29 +0800 Subject: [PATCH 247/298] DOC: Directly launch custom model by `model_path` (#2047) --- .../locale/zh_CN/LC_MESSAGES/models/custom.po | 157 +++++++++++------- doc/source/models/custom.rst | 44 +++++ 2 files changed, 142 insertions(+), 59 deletions(-) diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po index 50174a1f09..dffacd0384 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-09 14:56+0800\n" +"POT-Creation-Date: 2024-08-08 18:01+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.15.0\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/models/custom.rst:5 msgid "Custom Models" @@ -29,16 +29,49 @@ msgid "" "manage, and utilize custom models." msgstr "Xinference 提供了一种灵活而全面的方式来集成、管理和应用自定义模型。" -#: ../../source/models/custom.rst:9 +#: ../../source/models/custom.rst:10 +msgid "Directly launch an existing model" +msgstr "无需注册而直接启动自定义模型" + +#: ../../source/models/custom.rst:11 +msgid "" +"Since ``v0.14.0``, you can directly launch an existing model by passing " +"``model_path`` to the launch interface without downloading it. This way " +"requires that the model's ``model_family`` is among the built-in " +"supported models, and eliminates the hassle of registering the model." +msgstr "从 ``v0.14.0`` 版本开始,如果你需要注册的模型的家族是 Xinference 内置支持的模型," +"你可以直接通过 launch 接口中的 ``model_path`` 参数来启动它,从而免去注册步骤的麻烦。现在非常推荐使用这种方式。" + +#: ../../source/models/custom.rst:15 +msgid "For example:" +msgstr "例如:" + +#: ../../source/models/custom.rst:47 +msgid "" +"The above example demonstrates how to directly launch a qwen1.5-chat " +"model file without registering it." +msgstr "" +"上面的例子展示了当我已有 qwen1.5-chat 模型文件时,如何直接 launch 它。" + +#: ../../source/models/custom.rst:49 +msgid "" +"For distributed scenarios, if your model file is on a specific worker, " +"you can directly launch it using the ``worker_ip`` and ``model_path`` " +"parameters with the launch interface." +msgstr "" +"对于分布式场景,将你的模型文件置于某个 worker ,然后通过 launch 接口的 ``worker_ip`` 和 ``model_path`` 参数" +"来达到直接 launch 的效果。" + +#: ../../source/models/custom.rst:53 msgid "Define a custom LLM model" msgstr "定义自定义大语言模型" -#: ../../source/models/custom.rst:11 +#: ../../source/models/custom.rst:55 msgid "Define a custom LLM model based on the following template:" msgstr "基于以下模板定义一个自定义大语言模型:" -#: ../../source/models/custom.rst:52 ../../source/models/custom.rst:181 -#: ../../source/models/custom.rst:204 +#: ../../source/models/custom.rst:96 ../../source/models/custom.rst:225 +#: ../../source/models/custom.rst:248 msgid "" "model_name: A string defining the name of the model. The name must start " "with a letter or a digit and can only contain letters, digits, " @@ -47,7 +80,7 @@ msgstr "" "model_name: 模型名称。名称必须以字母或数字开头,且只能包含字母、数字、" "下划线或短划线。" -#: ../../source/models/custom.rst:53 +#: ../../source/models/custom.rst:97 msgid "" "context_length: context_length: An optional integer that specifies the " "maximum context size the model was trained to accommodate, encompassing " @@ -57,7 +90,7 @@ msgstr "" "context_length: 一个可选的整数,模型支持的最大上下文长度,包括输入和输出" "长度。如果未定义,默认值为2048个token(约1,500个词)。" -#: ../../source/models/custom.rst:54 +#: ../../source/models/custom.rst:98 msgid "" "model_lang: A list of strings representing the supported languages for " "the model. Example: [\"en\"], which means that the model supports " @@ -66,7 +99,7 @@ msgstr "" "model_lang: 一个字符串列表,表示模型支持的语言。例如:['en'],表示该模型" "支持英语。" -#: ../../source/models/custom.rst:55 +#: ../../source/models/custom.rst:99 msgid "" "model_ability: A list of strings defining the abilities of the model. It " "could include options like \"embed\", \"generate\", and \"chat\". In this" @@ -75,7 +108,7 @@ msgstr "" "model_ability: 一个字符串列表,定义模型的能力。它可以包括像 'embed'、'" "generate' 和 'chat' 这样的选项。示例表示模型具有 'generate' 的能力。" -#: ../../source/models/custom.rst:56 +#: ../../source/models/custom.rst:100 msgid "" "model_family: A required string representing the family of the model you " "want to register. The optional values are the model names of all :ref" @@ -84,29 +117,31 @@ msgid "" " Note that you should choose the model family based on the ability of the" " model you want to register. For example, if you want to register the " "``llama-2`` model, do not fill in ``llama-2-chat`` as the model family." -msgstr "model_family: 必需字段,表示你要注册的模型的家族(类别)。" -"可选值来自于 Xinference :ref:`所有内置模型的模型名 <models_llm_index>`。如果你要注册的模型不在其中,填入 ``other`` 。" -"注意,此字段的值必须根据模型能力填入。例如,如果你注册的是自定义 ``llama-2`` 模型,千万不要填入 ``llama-2-chat`` 。" +msgstr "" +"model_family: 必需字段,表示你要注册的模型的家族(类别)。可选值来自于 " +"Xinference :ref:`所有内置模型的模型名 <models_llm_index>`。如果你要注册的" +"模型不在其中,填入 ``other`` 。注意,此字段的值必须根据模型能力填入。例如" +",如果你注册的是自定义 ``llama-2`` 模型,千万不要填入 ``llama-2-chat`` 。" -#: ../../source/models/custom.rst:62 +#: ../../source/models/custom.rst:106 msgid "" "model_specs: An array of objects defining the specifications of the " "model. These include:" msgstr "model_specs: 一个包含定义模型规格的对象数组。这些规格包括:" -#: ../../source/models/custom.rst:58 +#: ../../source/models/custom.rst:102 msgid "" "model_format: A string that defines the model format, could be " "\"pytorch\" or \"ggmlv3\"." msgstr "model_format: 一个定义模型格式的字符串,可以是 'pytorch' 或 'ggmlv3'。" -#: ../../source/models/custom.rst:59 +#: ../../source/models/custom.rst:103 msgid "" "model_size_in_billions: An integer defining the size of the model in " "billions of parameters." msgstr "model_size_in_billions: 一个整数,定义模型的参数量,以十亿为单位。" -#: ../../source/models/custom.rst:60 +#: ../../source/models/custom.rst:104 msgid "" "quantizations: A list of strings defining the available quantizations for" " the model. For PyTorch models, it could be \"4-bit\", \"8-bit\", or " @@ -117,7 +152,7 @@ msgstr "" "可以是 \"4-bit\"、\"8-bit\" 或 \"none\"。对于 ggmlv3 模型,量化方式应与 `" "`model_file_name_template`` 中的值对应。" -#: ../../source/models/custom.rst:61 +#: ../../source/models/custom.rst:105 msgid "" "model_id: A string representing the model ID, possibly referring to an " "identifier used by Hugging Face. **If model_uri is missing, Xinference " @@ -128,7 +163,7 @@ msgstr "" "如果 model_uri 字段缺失,Xinference 将尝试从此id指示的HuggingFace仓库下载" "该模型。" -#: ../../source/models/custom.rst:62 +#: ../../source/models/custom.rst:106 msgid "" "model_uri: A string representing the URI where the model can be loaded " "from, such as \"file:///path/to/llama-2-7b\". **When the model format is " @@ -142,7 +177,7 @@ msgstr "" "模型文件路径。而当 model_format 是 pytorch 时,此字段必须是一个包含所有" "模型文件的目录。" -#: ../../source/models/custom.rst:63 +#: ../../source/models/custom.rst:107 msgid "" "model_file_name_template: Required by ggml/gguf models. An f-string " "template used for defining the model file name based on the quantization." @@ -153,7 +188,7 @@ msgstr "" "model_file_name_template: ggml 模型所需。一个 f-string 模板,用于根据量化" "定义模型文件名。注意,这里不要填入文件的路径。" -#: ../../source/models/custom.rst:64 +#: ../../source/models/custom.rst:108 msgid "" "prompt_style: If the ``model_family`` field is not ``other``, this field " "does not need to be filled in. ``prompt_style`` is an optional field that" @@ -163,36 +198,37 @@ msgid "" "can also specify this field as a string, which will use the builtin " "prompt style in Xinference. For example:" msgstr "" -"prompt_style: 如果上述 ``model_family`` 字段不是 ``other`` ,则无需设置此字段。 ``prompt_style`` 是一个可选字段,表示 ``chat`` 模型需要的提示词样式。给定的示例将" -"其设置为 None,但可以在引用的文件 xinference/model/llm/tests/test_utils." -"py 中找到更多详细信息。你也可以指定一个字符串,以使用内置模型的提示词样式" -"。" +"prompt_style: 如果上述 ``model_family`` 字段不是 ``other`` ,则无需设置" +"此字段。 ``prompt_style`` 是一个可选字段,表示 ``chat`` 模型需要的提示词" +"样式。给定的示例将其设置为 None,但可以在引用的文件 xinference/model/llm/" +"tests/test_utils.py 中找到更多详细信息。你也可以指定一个字符串,以使用" +"内置模型的提示词样式。" -#: ../../source/models/custom.rst:73 +#: ../../source/models/custom.rst:117 msgid "Xinference supports these builtin prompt styles in common usage:" msgstr "Xinference 支持这些内置、常用的提示词样式:" -#: ../../source/models/custom.rst:77 +#: ../../source/models/custom.rst:121 msgid "baichuan-chat" msgstr "" -#: ../../source/models/custom.rst:96 +#: ../../source/models/custom.rst:140 msgid "chatglm3" msgstr "" -#: ../../source/models/custom.rst:109 +#: ../../source/models/custom.rst:153 msgid "qwen-chat" msgstr "" -#: ../../source/models/custom.rst:126 +#: ../../source/models/custom.rst:170 msgid "llama-2-chat" msgstr "" -#: ../../source/models/custom.rst:147 +#: ../../source/models/custom.rst:191 msgid "vicuna-v1.5" msgstr "" -#: ../../source/models/custom.rst:162 +#: ../../source/models/custom.rst:206 msgid "" "The above lists some commonly used built-in prompt styles. The full list " "of supported prompt styles can be found on the Xinference web UI." @@ -200,25 +236,25 @@ msgstr "" "以上列举出了最常使用的提示词样式。完整的支持列表可以通过 Xinference 页面" "的 register model 面板查看。" -#: ../../source/models/custom.rst:166 +#: ../../source/models/custom.rst:210 msgid "Define a custom embedding model" msgstr "定义自定义 embedding 模型" -#: ../../source/models/custom.rst:168 +#: ../../source/models/custom.rst:212 msgid "Define a custom embedding model based on the following template:" msgstr "基于以下模板定义一个自定义 embedding 模型:" -#: ../../source/models/custom.rst:182 +#: ../../source/models/custom.rst:226 msgid "dimensions: A integer that specifies the embedding dimensions." msgstr "dimensions: 表示 embedding 维度的整型值。" -#: ../../source/models/custom.rst:183 +#: ../../source/models/custom.rst:227 msgid "" "max_tokens: A integer that represents the max sequence length that the " "embedding model supports." msgstr "max_tokens: 表示 embedding 模型支持的最大输入序列长度的整型值。" -#: ../../source/models/custom.rst:184 ../../source/models/custom.rst:206 +#: ../../source/models/custom.rst:228 ../../source/models/custom.rst:250 msgid "" "language: A list of strings representing the supported languages for the " "model. Example: [\"en\"], which means that the model supports English." @@ -226,7 +262,7 @@ msgstr "" "model_lang: 一个字符串列表,表示模型支持的语言。例如:['en'],表示该模型" "支持英语。" -#: ../../source/models/custom.rst:185 ../../source/models/custom.rst:207 +#: ../../source/models/custom.rst:229 ../../source/models/custom.rst:251 msgid "" "model_id: A string representing the model ID, possibly referring to an " "identifier used by Hugging Face." @@ -234,7 +270,7 @@ msgstr "" "model_id: 一个表示模型标识的字符串,类似 HuggingFace 或 ModelScope 使用的" "标识符。" -#: ../../source/models/custom.rst:186 ../../source/models/custom.rst:208 +#: ../../source/models/custom.rst:230 ../../source/models/custom.rst:252 msgid "" "model_uri: A string representing the URI where the model can be loaded " "from, such as \"file:///path/to/your_model\". If model URI is absent, " @@ -245,77 +281,80 @@ msgstr "" "如果模型 URI 不存在,Xinference 将尝试使用 model_id 从 HuggingFace 或 " "ModelScope 下载模型。" -#: ../../source/models/custom.rst:190 +#: ../../source/models/custom.rst:234 msgid "Define a custom Rerank model" msgstr "定义自定义 rerank 模型" -#: ../../source/models/custom.rst:192 +#: ../../source/models/custom.rst:236 msgid "Define a custom rerank model based on the following template:" msgstr "基于以下模板定义一个自定义大语言模型:" -#: ../../source/models/custom.rst:205 +#: ../../source/models/custom.rst:249 msgid "" "type: A string defining the type of the model, including ``normal``, " "``LLM-based`` and ``LLM-based layerwise``." msgstr "" -"type: 表示模型的类型,可选值包括 ``normal``、``LLM-based`` 和 ``LLM-based layerwise``。" +"type: 表示模型的类型,可选值包括 ``normal``、``LLM-based`` 和 ``LLM-based" +" layerwise``。" -#: ../../source/models/custom.rst:212 +#: ../../source/models/custom.rst:256 msgid "Register a Custom Model" msgstr "注册一个自定义模型" -#: ../../source/models/custom.rst:214 +#: ../../source/models/custom.rst:258 msgid "Register a custom model programmatically:" msgstr "以代码的方式注册自定义模型" -#: ../../source/models/custom.rst:229 ../../source/models/custom.rst:247 -#: ../../source/models/custom.rst:262 ../../source/models/custom.rst:317 +#: ../../source/models/custom.rst:273 ../../source/models/custom.rst:291 +#: ../../source/models/custom.rst:306 ../../source/models/custom.rst:361 msgid "Or via CLI:" msgstr "以命令行的方式" -#: ../../source/models/custom.rst:235 +#: ../../source/models/custom.rst:279 msgid "" "Note that replace the ``<model_type>`` above with ``LLM``, ``embedding`` " "or ``rerank``. The same as below." -msgstr "注意将以下部分的 ``<model_type>`` 替换为 ``LLM``、``embedding`` 或 ``rerank`` 。" +msgstr "" +"注意将以下部分的 ``<model_type>`` 替换为 ``LLM``、``embedding`` 或 ``" +"rerank`` 。" -#: ../../source/models/custom.rst:239 +#: ../../source/models/custom.rst:283 msgid "List the Built-in and Custom Models" msgstr "列举内置和自定义模型" -#: ../../source/models/custom.rst:241 +#: ../../source/models/custom.rst:285 msgid "List built-in and custom models programmatically:" msgstr "以代码的方式列举内置和自定义模型" -#: ../../source/models/custom.rst:254 +#: ../../source/models/custom.rst:298 msgid "Launch the Custom Model" msgstr "启动自定义模型" -#: ../../source/models/custom.rst:256 +#: ../../source/models/custom.rst:300 msgid "Launch the custom model programmatically:" msgstr "以代码的方式启动自定义模型" -#: ../../source/models/custom.rst:269 +#: ../../source/models/custom.rst:313 msgid "Interact with the Custom Model" msgstr "使用自定义模型" -#: ../../source/models/custom.rst:271 +#: ../../source/models/custom.rst:315 msgid "Invoke the model programmatically:" msgstr "以代码的方式调用模型" -#: ../../source/models/custom.rst:278 +#: ../../source/models/custom.rst:322 msgid "Result:" msgstr "结果为:" -#: ../../source/models/custom.rst:302 +#: ../../source/models/custom.rst:346 msgid "Or via CLI, replace ``${UID}`` with real model UID:" msgstr "或者以命令行的方式,用实际的模型 UID 替换 ``${UID}``:" -#: ../../source/models/custom.rst:309 +#: ../../source/models/custom.rst:353 msgid "Unregister the Custom Model" msgstr "注销自定义模型" -#: ../../source/models/custom.rst:311 +#: ../../source/models/custom.rst:355 msgid "Unregister the custom model programmatically:" msgstr "以代码的方式注销自定义模型" diff --git a/doc/source/models/custom.rst b/doc/source/models/custom.rst index d19481929e..6224101f68 100644 --- a/doc/source/models/custom.rst +++ b/doc/source/models/custom.rst @@ -5,6 +5,50 @@ Custom Models ============= Xinference provides a flexible and comprehensive way to integrate, manage, and utilize custom models. + +Directly launch an existing model +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Since ``v0.14.0``, you can directly launch an existing model by passing ``model_path`` to the launch interface without downloading it. +This way requires that the model's ``model_family`` is among the built-in supported models, +and eliminates the hassle of registering the model. + +For example: + +.. tabs:: + + .. code-tab:: bash shell + + xinference launch --model_path <model_file_path> --model-engine <engine> -n qwen1.5-chat + + .. code-tab:: bash cURL + + curl -X 'POST' \ + 'http://127.0.0.1:9997/v1/models' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "model_engine": "<engine>", + "model_name": "qwen1.5-chat", + "model_path": "<model_file_path>" + }' + + .. code-tab:: python + + from xinference.client import RESTfulClient + client = RESTfulClient("http://127.0.0.1:9997") + model_uid = client.launch_model( + model_engine="<inference_engine>", + model_name="qwen1.5-chat", + model_path="<model_file_path>" + ) + print('Model uid: ' + model_uid) + + +The above example demonstrates how to directly launch a qwen1.5-chat model file without registering it. + +For distributed scenarios, if your model file is on a specific worker, +you can directly launch it using the ``worker_ip`` and ``model_path`` parameters with the launch interface. + Define a custom LLM model ~~~~~~~~~~~~~~~~~~~~~~~~~ From e3f277dcfaa5a2fe493d353806471166379c2326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dr=2E=20Artificial=E6=9B=BE=E5=B0=8F=E5=81=A5?= <875100501@qq.com> Date: Thu, 8 Aug 2024 20:52:25 +0800 Subject: [PATCH 248/298] DOC: fix typo in README (#2048) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ccbb45d8ab..a77ff62dbb 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ with popular third-party libraries including [LangChain](https://python.langchai ### Jupyter Notebook -The lightest way to experience Xinference is to try our [Juypter Notebook on Google Colab](https://colab.research.google.com/github/xorbitsai/inference/blob/main/examples/Xinference_Quick_Start.ipynb). +The lightest way to experience Xinference is to try our [Jupyter Notebook on Google Colab](https://colab.research.google.com/github/xorbitsai/inference/blob/main/examples/Xinference_Quick_Start.ipynb). ### Docker From a8263723abf1b3f5b7ff11d5a4eca1132946ca11 Mon Sep 17 00:00:00 2001 From: Dawnfz <2912706234@qq.com> Date: Fri, 9 Aug 2024 10:42:57 +0800 Subject: [PATCH 249/298] ENH: Add `stream` option in Benchmark (#2038) --- benchmark/benchmark_latency.py | 75 +++---- benchmark/benchmark_long.py | 89 ++------ benchmark/benchmark_rerank.py | 96 +++++---- benchmark/benchmark_runner.py | 380 +++++++++++++++++++++++++++++++++ benchmark/benchmark_serving.py | 111 +++++----- benchmark/utils.py | 51 +---- 6 files changed, 540 insertions(+), 262 deletions(-) create mode 100644 benchmark/benchmark_runner.py diff --git a/benchmark/benchmark_latency.py b/benchmark/benchmark_latency.py index 20c96ae04e..3ae8125436 100644 --- a/benchmark/benchmark_latency.py +++ b/benchmark/benchmark_latency.py @@ -16,29 +16,27 @@ import asyncio import logging import random -import time -from typing import List, Tuple, Optional import numpy as np -from utils import get_tokenizer, sample_requests, send_request +from utils import get_tokenizer, sample_requests +from benchmark_runner import BenchmarkRunner + logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) -REQUEST_LATENCY: List[Tuple[int, int, float]] = [] - -async def benchmark( - api_url: str, - model_uid: str, - input_requests: List[Tuple[str, int, int]], - api_key: Optional[str] = None, -) -> None: - for request in input_requests: - prompt, prompt_len, output_len = request - await send_request( - api_url, model_uid, prompt, prompt_len, output_len, REQUEST_LATENCY - ) +class LatencyBenchmarkRunner(BenchmarkRunner): + async def _run(self): + total_requests = len(self.input_requests) + for i, request in enumerate(self.input_requests): + await self.send_request(request) + remaining = total_requests - (i + 1) + print( + f"\rProcessed {i + 1}/{total_requests} requests, {remaining} remaining.", + end="", + ) + print("") def main(args: argparse.Namespace): @@ -54,36 +52,17 @@ def main(args: argparse.Namespace): input_requests = sample_requests(args.dataset, args.num_prompts, tokenizer) logger.info("Benchmark starts.") - benchmark_start_time = time.time() - - asyncio.run( - benchmark( - api_url, - model_uid, - input_requests, - api_key=args.api_key, - ) - ) - benchmark_end_time = time.time() - benchmark_time = benchmark_end_time - benchmark_start_time - print(f"Total time: {benchmark_time:.2f} s") - print(f"Throughput: {len(REQUEST_LATENCY) / benchmark_time:.2f} requests/s") - - # Compute the latency statistics. - avg_latency = np.mean([latency for _, _, latency in REQUEST_LATENCY]) - print(f"Average latency: {avg_latency:.2f} s") - avg_per_token_latency = np.mean( - [ - latency / (prompt_len + output_len) - for prompt_len, output_len, latency in REQUEST_LATENCY - ] - ) - print(f"Average latency per token: {avg_per_token_latency:.2f} s") - avg_per_output_token_latency = np.mean( - [latency / output_len for _, output_len, latency in REQUEST_LATENCY] + benchmark = LatencyBenchmarkRunner( + api_url, + model_uid, + input_requests, + args.stream, + args.api_key, ) - print("Average latency per output token: " f"{avg_per_output_token_latency:.2f} s") + asyncio.run(benchmark.run()) + + benchmark.print_stats() if __name__ == "__main__": @@ -109,7 +88,13 @@ def main(args: argparse.Namespace): ) parser.add_argument("--model-uid", type=str, help="Xinference model UID.") parser.add_argument( - "--api-key", type=str, default=None, help="Authorization api key", + "--stream", action="store_true", help="Enable streaming responses." + ) + parser.add_argument( + "--api-key", + type=str, + default=None, + help="Authorization api key", ) args = parser.parse_args() diff --git a/benchmark/benchmark_long.py b/benchmark/benchmark_long.py index 531a8c6858..75a0d43530 100644 --- a/benchmark/benchmark_long.py +++ b/benchmark/benchmark_long.py @@ -16,62 +16,33 @@ import asyncio import logging import random -import time -from typing import List, Tuple, Optional import numpy as np -from utils import generate_sorting_prompts, get_tokenizer, send_request +from utils import generate_sorting_prompts, get_tokenizer +from benchmark_runner import ConcurrentBenchmarkRunner logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) -REQUEST_LATENCY: List[Tuple[int, int, float]] = [] - -class BenchmarkRunner: - - def __init__( - self, - api_url: str, - model_uid: str, - input_requests: List[Tuple[str, int, int]], - concurrency: int, - api_key: Optional[str]=None, - ): - - self.api_url = api_url - self.model_uid = model_uid - self.input_requests = input_requests - self.concurrency = concurrency - self.sent = 0 - self.left = len(input_requests) - self.api_key = api_key - - async def run(self): +class LongBenchmarkRunner(ConcurrentBenchmarkRunner): + async def _run(self): tasks = [] - for i in range(0, self.concurrency): + for i in range(self.concurrency): tasks.append(asyncio.create_task(self.worker(i))) - await asyncio.gather(*tasks) + + await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) async def worker(self, i: int): r = random.Random(i) index = r.randint(0, len(self.input_requests) - 1) - while self.sent < len(self.input_requests): - prompt, prompt_len, output_len = self.input_requests[index] + while self.left > 0: + request = self.input_requests[index] index += 1 - self.sent += 1 index = index % len(self.input_requests) - await send_request( - self.api_url, - self.model_uid, - prompt, - prompt_len, - output_len, - REQUEST_LATENCY, - api_key=self.api_key, - ) + await self.send_request(request) self.left -= 1 # pring longer space to overwrite the previous when left decrease print("\rdone_request, left %d " % (self.left), end="") @@ -85,6 +56,9 @@ def main(args: argparse.Namespace): args.concurrency = args.num_prompts print(args) + random.seed(args.seed) + np.random.seed(args.seed) + api_url = f"http://{args.host}:{args.port}/v1/chat/completions" model_uid = args.model_uid @@ -97,43 +71,18 @@ def main(args: argparse.Namespace): ) logger.info("Benchmark starts.") - benchmark_start_time = time.time() - benchmark = BenchmarkRunner( + benchmark = LongBenchmarkRunner( api_url, model_uid, input_requests, + args.stream, concurrency=args.concurrency, api_key=args.api_key, ) asyncio.run(benchmark.run()) - benchmark_end_time = time.time() - benchmark_time = benchmark_end_time - benchmark_start_time - print(f"Total time: {benchmark_time:.2f} s") - print(f"Throughput: {args.num_prompts / benchmark_time:.2f} requests/s") - - # Compute the latency statistics. - avg_latency = np.mean([latency for _, _, latency in REQUEST_LATENCY]) - print(f"Average latency: {avg_latency:.2f} s") - avg_per_token_latency = np.mean( - [ - latency / (prompt_len + output_len) - for prompt_len, output_len, latency in REQUEST_LATENCY - ] - ) - print(f"Average latency per token: {avg_per_token_latency:.2f} s") - avg_per_output_token_latency = np.mean( - [latency / output_len for _, output_len, latency in REQUEST_LATENCY] - ) - print("Average latency per output token: " f"{avg_per_output_token_latency:.2f} s") - average_io_tokens = np.average( - [(prompt_len + output_len) for prompt_len, output_len, _ in REQUEST_LATENCY] - ) - print(f"Average io length:" f"{average_io_tokens}") - throughput = ( - sum([output_len for _, output_len, _ in REQUEST_LATENCY]) / benchmark_time - ) - print(f"Throughput: {throughput} tokens/s") + + benchmark.print_stats() if __name__ == "__main__": @@ -167,5 +116,9 @@ def main(args: argparse.Namespace): parser.add_argument( "--api-key", type=str, default=None, help="Authorization api key", ) + parser.add_argument("--seed", type=int, default=0) + parser.add_argument( + "--stream", action="store_true", help="Enable streaming responses." + ) args = parser.parse_args() main(args) diff --git a/benchmark/benchmark_rerank.py b/benchmark/benchmark_rerank.py index 8e6e416fac..09e87d8758 100644 --- a/benchmark/benchmark_rerank.py +++ b/benchmark/benchmark_rerank.py @@ -20,85 +20,82 @@ import aiohttp from typing import List, Dict, Optional from datasets import load_dataset +import numpy as np +from benchmark_runner import ConcurrentBenchmarkRunner logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) -REQUEST_LATENCY: List[float] = [] - -class BenchmarkRunner: +class RerankBenchmarkRunner(ConcurrentBenchmarkRunner): def __init__( self, api_url: str, model_uid: str, input_requests: List[Dict], + stream: bool, top_n: int, concurrency: int, - api_key: Optional[str]=None, + api_key: Optional[str] = None, ): - self.api_url = api_url - self.model_uid = model_uid - self.input_requests = input_requests + super().__init__( + api_url, + model_uid, + input_requests, + stream, + concurrency, + api_key, + ) self.top_n = top_n - self.concurrency = concurrency - self.sent = 0 - self.left = len(input_requests) - self.api_key = api_key - async def run(self): + async def _run(self): tasks = [] - for i in range(0, self.concurrency): + for i in range(self.concurrency): tasks.append(asyncio.create_task(self.worker(i))) - await asyncio.gather(*tasks) + + await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) async def worker(self, i: int): r = random.Random(i) index = r.randint(0, len(self.input_requests) - 1) - while self.sent < len(self.input_requests): - item = self.input_requests[index] - prompt, documents = item["query"], item["positive"] + while self.left > 0: + request = self.input_requests[index] index += 1 - self.sent += 1 index = index % len(self.input_requests) - await self.send_request( - self.api_url, - self.model_uid, - prompt, - documents, - ) + await self.send_request(request) self.left -= 1 # pring longer space to overwrite the previous when left decrease print("\rdone_request, left %d " % (self.left), end="") # The last one print("") - async def send_request( - self, api_url: str, model_uid: str, prompt: str, documents: List[str], - api_key: Optional[str]=None, - ): + async def send_request(self, request, warming_up: bool = False): + prompt, documents = request["query"], request["positive"] request_start_time = time.time() pload = { - "model": model_uid, + "model": self.model_uid, "top_n": self.top_n, "query": prompt, "documents": documents, } headers = {"User-Agent": "Benchmark Client"} - if api_key: - headers["Authorization"] = f"Bearer {api_key}" + if self.api_key: + headers["Authorization"] = f"Bearer {self.api_key}" timeout = aiohttp.ClientTimeout(total=3 * 3600) async with aiohttp.ClientSession(timeout=timeout) as session: - async with session.post(api_url, headers=headers, json=pload) as response: + async with session.post( + self.api_url, headers=headers, json=pload + ) as response: resp = await response.json() if response.status == 200: request_end_time = time.time() request_latency = request_end_time - request_start_time - REQUEST_LATENCY.append(request_latency) + if not warming_up: + self.outputs.append(request_latency) else: logger.error(f"Failed to create chat completion: {resp}") @@ -106,11 +103,14 @@ async def send_request( def main(args: argparse.Namespace): print(args) + random.seed(args.seed) + np.random.seed(args.seed) + api_url = f"http://{args.host}:{args.port}/v1/rerank" model_uid = args.model_uid logger.info("Preparing for benchmark.") - dataset = load_dataset("mteb/scidocs-reranking") + dataset = load_dataset(args.dataset) input_requests = dataset["test"].remove_columns("negative").to_list() if args.num_query > 0: input_requests = input_requests[: args.num_query] @@ -118,28 +118,34 @@ def main(args: argparse.Namespace): args.num_query = len(input_requests) logger.info("Benchmark starts.") - benchmark_start_time = time.time() - benchmark = BenchmarkRunner( + benchmark = RerankBenchmarkRunner( api_url, model_uid, input_requests, + args.stream, top_n=args.top_n, concurrency=args.concurrency, api_key=args.api_key, ) asyncio.run(benchmark.run()) - benchmark_end_time = time.time() - benchmark_time = benchmark_end_time - benchmark_start_time - print(f"Total time: {benchmark_time:.2f} s") - print(f"Throughput: {args.num_query / benchmark_time:.2f} requests/s") - # TODO(codingl2k1): We should calculate the tokens / s in the future. + + # TODO: Print the results of request_latency in detail. + # benchmark.print_stats() needs to be overridden + print(f"Total time: {benchmark.benchmark_time:.2f} s") + print(f"Throughput: {args.num_query / benchmark.benchmark_time:.2f} requests/s") if __name__ == "__main__": parser = argparse.ArgumentParser(description="Stress test the rerank model.") parser.add_argument("--host", type=str, default="localhost") parser.add_argument("--port", type=int, default=9997) + parser.add_argument( + "--dataset", + type=str, + default="mteb/scidocs-reranking", + help="Path to the dataset.", + ) parser.add_argument( "--concurrency", "-c", @@ -166,7 +172,13 @@ def main(args: argparse.Namespace): action="store_true", help="Trust remote code from huggingface.", ) - parser.add_argument("--model-uid", type=str, help="Xinference model UID.") + parser.add_argument( + "--model-uid", type=str, required=True, help="Xinference model UID." + ) + parser.add_argument("--seed", type=int, default=0) + parser.add_argument( + "--stream", action="store_true", help="Enable streaming responses." + ) parser.add_argument( "--api-key", type=str, default=None, help="Authorization api key", ) diff --git a/benchmark/benchmark_runner.py b/benchmark/benchmark_runner.py new file mode 100644 index 0000000000..c7a0e29ecb --- /dev/null +++ b/benchmark/benchmark_runner.py @@ -0,0 +1,380 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import aiohttp +import json +import sys +import traceback +import warnings +import logging +from dataclasses import dataclass, field +import time +from typing import List, Optional, Tuple + +import numpy as np + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +AIOHTTP_TIMEOUT = aiohttp.ClientTimeout(total=3 * 3600) + + +def remove_prefix(text: str, prefix: str) -> str: + if text.startswith(prefix): + return text[len(prefix) :].strip() + return text.strip() + + +@dataclass +class RequestOutput: + success: bool = False + prompt_len: int = 0 + completion_tokens: int = 0 + latency: float = 0.0 + ttft: float = 0.0 + itl: List[float] = field(default_factory=list) # List of inter-token latencies + error: str = "" + + +class BenchmarkRunner: + def __init__( + self, + api_url: str, + model_uid: str, + input_requests: List[Tuple[str, int, int]], + stream: bool, + api_key: Optional[str]=None, + ): + self.api_url = api_url + self.model_uid = model_uid + self.input_requests = input_requests + self.outputs: List[RequestOutput] = [] + self.benchmark_time = None + self.stream = stream + self.api_key = api_key + + async def run(self): + await self.warm_up() + start_time = time.time() + await self._run() + end_time = time.time() + self.benchmark_time = end_time - start_time + + async def warm_up(self, num_requests: int = 5): + logger.info("Warming up...") + for i in range(min(num_requests, len(self.input_requests))): + request = self.input_requests[i] + await self.send_request(request, warming_up=True) + logger.info("Warm-up completed.") + + async def _run(self): + pass + + async def send_request(self, request: tuple, warming_up: bool = False): + prompt, prompt_len, output_len = request + + if self.stream: + pload = { + "model": self.model_uid, + "n": 1, + "temperature": 0.6, + "top_p": 0.9, + "max_tokens": output_len, + "stream": True, + "messages": [{"role": "user", "content": prompt}], + "stream_options": {"include_usage": True}, + } + else: + pload = { + "model": self.model_uid, + "n": 1, + "temperature": 0.6, + "top_p": 0.9, + "max_tokens": output_len, + "stream": False, + "messages": [{"role": "user", "content": prompt}], + } + + headers = {"User-Agent": "Benchmark Client"} + if self.api_key: + headers["Authorization"] = f"Bearer {self.api_key}" + + async with aiohttp.ClientSession(timeout=AIOHTTP_TIMEOUT) as session: + output = RequestOutput(prompt_len=prompt_len) + ttft = 0.0 + st = time.perf_counter() + most_recent_timestamp = st + + try: + async with session.post( + self.api_url, headers=headers, json=pload + ) as response: + if response.status == 200: + if self.stream: + async for chunk_bytes in response.content: + # { + # "id": "chataec79465-dfea-46af-81b9-c28124063fc0", + # "model": "llama-3-instruct", + # "created": 1721202668, + # "object": "chat.completion.chunk", + # "choices": [ + # { + # "index": 0, + # "delta": {"role": "assistant", "content": ""}, + # "finish_reason": null, + # } + # ], + # } + chunk_bytes = chunk_bytes.strip() + if not chunk_bytes: + continue + + chunk = remove_prefix(chunk_bytes.decode("utf-8"), "data:") + + if chunk == "[DONE]": + latency = time.perf_counter() - st + else: + timestamp = time.perf_counter() + data = json.loads(chunk) + + # First token + if ttft == 0.0: + ttft = time.perf_counter() - st + output.ttft = ttft + + # Decoding phase + else: + output.itl.append(timestamp - most_recent_timestamp) + + most_recent_timestamp = timestamp + + output.latency = latency + output.success = True + output.completion_tokens = data["usage"]["completion_tokens"] + else: + resp = await response.json() + output.latency = time.perf_counter() - st + output.success = True + output.completion_tokens = resp["usage"]["completion_tokens"] + except Exception: + output.success = False + exc_info = sys.exc_info() + output.error = "".join(traceback.format_exception(*exc_info)) + + if not warming_up: + self.outputs.append(output) + + def print_stats(self): + total_time = self.benchmark_time + + if self.stream: + # Initialize variables for metrics + total_input = 0 + completed = 0 + actual_output_lens = [] + itls = [] + tpots = [] + ttfts = [] + + for output in self.outputs: + if output.success: + actual_output_lens.append(output.completion_tokens) + total_input += output.prompt_len + if output.completion_tokens > 1: + tpots.append( + (output.latency - output.ttft) + / (output.completion_tokens - 1) + ) + itls += output.itl + ttfts.append(output.ttft) + completed += 1 + else: + actual_output_lens.append(0) + + if completed == 0: + warnings.warn( + "All requests failed. This is likely due to a misconfiguration " + "on the benchmark arguments.", + stacklevel=2, + ) + + # Calculate statistics + total_output = sum(actual_output_lens) + request_throughput = completed / total_time if total_time > 0 else 0 + input_throughput = total_input / total_time if total_time > 0 else 0 + output_throughput = total_output / total_time if total_time > 0 else 0 + + mean_ttft = np.mean(ttfts) * 1000 if ttfts else 0 + median_ttft = np.median(ttfts) * 1000 if ttfts else 0 + std_ttft = np.std(ttfts) * 1000 if ttfts else 0 + p99_ttft = np.percentile(ttfts, 99) * 1000 if ttfts else 0 + + mean_tpot = np.mean(tpots) * 1000 if tpots else 0 + median_tpot = np.median(tpots) * 1000 if tpots else 0 + std_tpot = np.std(tpots) * 1000 if tpots else 0 + p99_tpot = np.percentile(tpots, 99) * 1000 if tpots else 0 + + mean_itl = np.mean(itls) * 1000 if itls else 0 + median_itl = np.median(itls) * 1000 if itls else 0 + std_itl = np.std(itls) * 1000 if itls else 0 + p99_itl = np.percentile(itls, 99) * 1000 if itls else 0 + + # Print benchmark results + print("{s:{c}^{n}}".format(s=" Serving Benchmark Result ", n=50, c="=")) + print("{:<40} {:<10}".format("Successful requests:", completed)) + print("{:<40} {:<10.2f}".format("Benchmark duration (s):", total_time)) + print("{:<40} {:<10}".format("Total input tokens:", total_input)) + print("{:<40} {:<10}".format("Total generated tokens:", total_output)) + print( + "{:<40} {:<10.2f}".format( + "Request throughput (req/s):", request_throughput + ) + ) + print( + "{:<40} {:<10.2f}".format( + "Input token throughput (tok/s):", input_throughput + ) + ) + print( + "{:<40} {:<10.2f}".format( + "Output token throughput (tok/s):", output_throughput + ) + ) + + print("{s:{c}^{n}}".format(s="Time to First Token", n=50, c="-")) + print("{:<40} {:<10.4f}".format("Mean TTFT (ms):", mean_ttft)) + print("{:<40} {:<10.4f}".format("Median TTFT (ms):", median_ttft)) + print("{:<40} {:<10.4f}".format("Std TTFT (ms):", std_ttft)) + print("{:<40} {:<10.4f}".format("P99 TTFT (ms):", p99_ttft)) + + print( + "{s:{c}^{n}}".format( + s="Time per Output Token (excl. 1st token)", n=50, c="-" + ) + ) + print("{:<40} {:<10.4f}".format("Mean TPOT (ms):", mean_tpot)) + print("{:<40} {:<10.4f}".format("Median TPOT (ms):", median_tpot)) + print("{:<40} {:<10.4f}".format("Std TPOT (ms):", std_tpot)) + print("{:<40} {:<10.4f}".format("P99 TPOT (ms):", p99_tpot)) + + print("{s:{c}^{n}}".format(s="Inter-token Latency", n=50, c="-")) + print("{:<40} {:<10.4f}".format("Mean ITL (ms):", mean_itl)) + print("{:<40} {:<10.4f}".format("Median ITL (ms):", median_itl)) + print("{:<40} {:<10.4f}".format("Std ITL (ms):", std_itl)) + print("{:<40} {:<10.4f}".format("P99 ITL (ms):", p99_itl)) + + print("=" * 50) + else: + # Initialize variables for metrics + total_input = 0 + completed = 0 + actual_output_lens = [] + latencies = [] + per_token_latencies = [] + per_output_token_latencies = [] + + for output in self.outputs: + if output.success: + actual_output_lens.append(output.completion_tokens) + total_input += output.prompt_len + latencies.append(output.latency) + per_token_latencies.append( + output.latency / (output.prompt_len + output.completion_tokens) + ) + if output.completion_tokens > 0: + per_output_token_latencies.append( + output.latency / output.completion_tokens + ) + completed += 1 + else: + actual_output_lens.append(0) + + if completed == 0: + warnings.warn( + "All requests failed. This is likely due to a misconfiguration " + "on the benchmark arguments.", + stacklevel=2, + ) + + # Calculate statistics + total_output = sum(actual_output_lens) + request_throughput = len(self.outputs) / total_time if total_time > 0 else 0 + input_throughput = total_input / total_time if total_time > 0 else 0 + output_throughput = total_output / total_time if total_time > 0 else 0 + + mean_latency = np.mean(latencies) if latencies else 0 + mean_per_token_latency = ( + np.mean(per_token_latencies) if per_token_latencies else 0 + ) + mean_per_output_token_latency = ( + np.mean(per_output_token_latencies) if per_output_token_latencies else 0 + ) + + # Print benchmark results + print("{s:{c}^{n}}".format(s=" Benchmark Result ", n=50, c="=")) + print("{:<40} {:<10}".format("Successful requests:", completed)) + print("{:<40} {:<10.2f}".format("Benchmark duration (s):", total_time)) + print("{:<40} {:<10}".format("Total input tokens:", total_input)) + print("{:<40} {:<10}".format("Total generated tokens:", total_output)) + print( + "{:<40} {:<10.2f}".format( + "Request throughput (req/s):", request_throughput + ) + ) + print( + "{:<40} {:<10.2f}".format( + "Input token throughput (tok/s):", input_throughput + ) + ) + print( + "{:<40} {:<10.2f}".format( + "Output token throughput (tok/s):", output_throughput + ) + ) + + print("{s:{c}^{n}}".format(s="Latency Statistics", n=50, c="-")) + print("{:<40} {:<10.4f}".format("Mean latency (s):", mean_latency)) + print( + "{:<40} {:<10.4f}".format( + "Mean latency per token (s):", mean_per_token_latency + ) + ) + print( + "{:<40} {:<10.4f}".format( + "Mean latency per output token (s):", mean_per_output_token_latency + ) + ) + + print("=" * 50) + + print(f"Total time: {total_time:.2f} s") + print(f"Throughput: {len(self.outputs) / total_time:.2f} requests/s") + + +class ConcurrentBenchmarkRunner(BenchmarkRunner): + def __init__( + self, + api_url: str, + model_uid: str, + input_requests: List[Tuple[str, int, int]], + stream: bool, + concurrency: int, + api_key: Optional[str]=None, + ): + super().__init__(api_url, model_uid, input_requests, stream, api_key) + self.concurrency = concurrency + self.left = len(input_requests) + + async def worker(self): + pass diff --git a/benchmark/benchmark_serving.py b/benchmark/benchmark_serving.py index d60b6da7bb..495ccd3176 100644 --- a/benchmark/benchmark_serving.py +++ b/benchmark/benchmark_serving.py @@ -16,55 +16,53 @@ import asyncio import logging import random -import time from typing import List, Tuple, Optional import numpy as np -from utils import sample_requests, get_tokenizer, send_request +from utils import sample_requests, get_tokenizer +from benchmark_runner import ConcurrentBenchmarkRunner logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) -REQUEST_LATENCY: List[Tuple[int, int, float]] = [] - - -class BenchmarkRunner: +class ServingBenchmarkRunner(ConcurrentBenchmarkRunner): def __init__( self, api_url: str, model_uid: str, input_requests: List[Tuple[str, int, int]], - request_rate: float, + stream: bool, concurrency: int, + request_rate: float, api_key: Optional[str] = None, ): - - self.api_url = api_url - self.model_uid = model_uid - self.input_requests = input_requests - self.concurrency = concurrency + super().__init__( + api_url, + model_uid, + input_requests, + stream, + concurrency, + api_key, + ) self.request_rate = request_rate - self.queue = asyncio.Queue(concurrency or 100) - self.left = len(input_requests) - self.api_key = api_key + self.queue = asyncio.Queue(len(input_requests)) - async def run(self): + async def _run(self): tasks = [] - for _i in range(0, self.concurrency): + + for _ in range(self.concurrency): tasks.append(asyncio.create_task(self.worker())) + await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) + + async def warm_up(self, num_requests: int = 5): + logger.info(f"Enqueuing {len(self.input_requests)} requests.") for req in iter(self.input_requests): - if self.request_rate != float("inf"): - # If the request rate is infinity, then we don't need to wait. - # Sample the request interval from the exponential distribution. - interval = np.random.exponential(1.0 / self.request_rate) - # The next request will be sent after the interval. - await asyncio.sleep(interval) await self.queue.put(req) - await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) + await super().warm_up(num_requests) async def worker(self): """ @@ -72,20 +70,17 @@ async def worker(self): When all request is done, most worker will hang on self.queue, but at least one worker will exit""" while self.left > 0: - prompt, prompt_len, output_len = await self.queue.get() - await send_request( - self.api_url, - self.model_uid, - prompt, - prompt_len, - output_len, - REQUEST_LATENCY, - api_key=self.api_key, - ) + request = await self.queue.get() + await self.send_request(request) self.left -= 1 - # pring longer space to overwrite the previous when left decrease print("\rdone_request, left %d " % (self.left), end="") - # The last one + + if self.request_rate != float("inf"): + # If the request rate is infinity, then we don't need to wait. + # Sample the request interval from the exponential distribution. + interval = np.random.exponential(1.0 / self.request_rate) + # The next request will be sent after the interval. + await asyncio.sleep(interval) print("") @@ -103,43 +98,27 @@ def main(args: argparse.Namespace): logger.info("Preparing for benchmark.") tokenizer = get_tokenizer(args.tokenizer, trust_remote_code=args.trust_remote_code) - input_requests = sample_requests(args.dataset, args.num_prompts, tokenizer, prompt_len_limit=args.prompt_len_limit) + input_requests = sample_requests( + args.dataset, + args.num_prompts, + tokenizer, + prompt_len_limit=args.prompt_len_limit, + ) logger.info("Benchmark starts.") - benchmark_start_time = time.time() - benchmark = BenchmarkRunner( + benchmark = ServingBenchmarkRunner( api_url, model_uid, input_requests, + args.stream, request_rate=args.request_rate, concurrency=args.concurrency, api_key=args.api_key, ) asyncio.run(benchmark.run()) - benchmark_end_time = time.time() - benchmark_time = benchmark_end_time - benchmark_start_time - print(f"Total time: {benchmark_time:.2f} s") - print(f"Throughput: {args.num_prompts / benchmark_time:.2f} requests/s") - - # Compute the latency statistics. - avg_latency = np.mean([latency for _, _, latency in REQUEST_LATENCY]) - print(f"Average latency: {avg_latency:.2f} s") - avg_per_token_latency = np.mean( - [ - latency / (prompt_len + output_len) - for prompt_len, output_len, latency in REQUEST_LATENCY - ] - ) - print(f"Average latency per token: {avg_per_token_latency:.2f} s") - avg_per_output_token_latency = np.mean( - [latency / output_len for _, output_len, latency in REQUEST_LATENCY] - ) - print("Average latency per output token: " f"{avg_per_output_token_latency:.2f} s") - throughput = ( - sum([output_len for _, output_len, _ in REQUEST_LATENCY]) / benchmark_time - ) - print(f"Throughput: {throughput} tokens/s") + + benchmark.print_stats() if __name__ == "__main__": @@ -161,7 +140,10 @@ def main(args: argparse.Namespace): "--prompt-len-limit", type=int, default=1024, help="Prompt length limitation." ) parser.add_argument( - "--api-key", type=str, default=None, help="Authorization api key", + "--api-key", + type=str, + default=None, + help="Authorization api key", ) parser.add_argument( "--concurrency", @@ -186,5 +168,8 @@ def main(args: argparse.Namespace): help="Trust remote code from huggingface.", ) parser.add_argument("--model-uid", type=str, help="Xinference model UID.") + parser.add_argument( + "--stream", action="store_true", help="Enable streaming responses." + ) args = parser.parse_args() main(args) diff --git a/benchmark/utils.py b/benchmark/utils.py index 345dcaa437..8372d2e916 100644 --- a/benchmark/utils.py +++ b/benchmark/utils.py @@ -12,16 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -import aiohttp import json import logging import random -import time -from typing import TYPE_CHECKING, List, Tuple, Optional +from typing import TYPE_CHECKING, List, Tuple -import openai from transformers import AutoTokenizer, PreTrainedTokenizerFast +logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @@ -97,7 +95,7 @@ def sample_requests( dataset_path: str, num_requests: int, tokenizer: "PreTrainedTokenizerBase", - prompt_len_limit: int = 1024 + prompt_len_limit: int = 1024, ) -> List[Tuple[str, int, int]]: # Load the dataset. with open(dataset_path) as f: @@ -129,7 +127,10 @@ def sample_requests( # This is because TGI causes errors when the input or output length # is too short. continue - if prompt_len > prompt_len_limit or prompt_len + output_len > prompt_len_limit * 2: + if ( + prompt_len > prompt_len_limit + or prompt_len + output_len > prompt_len_limit * 2 + ): # Prune too long sequences. continue filtered_dataset.append((prompt, prompt_len, output_len)) @@ -164,41 +165,3 @@ def generate_sorting_prompts( prompt_len = len(prompt_token_ids[i]) dataset.append((prompts[i], prompt_len, context_length - prompt_len)) return dataset - - -async def send_request( - api_url: str, - model_uid: str, - prompt: str, - prompt_len: int, - output_len: int, - stats: List[Tuple[int, int, float]], # output. - api_key: Optional[str]=None, -) -> None: - request_start_time = time.time() - - pload = { - "model": model_uid, - "n": 1, - "temperature": 1.0, - "top_p": 1.0, - "max_tokens": output_len, - "stream": False, - "messages": [{"role": "user", "content": prompt}], - } - - headers = {"User-Agent": "Benchmark Client"} - if api_key: - headers["Authorization"] = f"Bearer {api_key}" - - timeout = aiohttp.ClientTimeout(total=3 * 3600) - async with aiohttp.ClientSession(timeout=timeout) as session: - async with session.post(api_url, headers=headers, json=pload) as response: - resp = await response.json() - if response.status == 200: - completion_tokens = resp["usage"]["completion_tokens"] - request_end_time = time.time() - request_latency = request_end_time - request_start_time - stats.append((prompt_len, completion_tokens, request_latency)) - else: - logger.error(f"Failed to create chat completion: {resp}") From 9a02b40b96d6840a91d7dd3f6450300a9269612f Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 9 Aug 2024 11:04:42 +0800 Subject: [PATCH 250/298] ENH: optimize availability of vLLM (#2046) --- xinference/core/model.py | 3 +++ xinference/core/worker.py | 2 ++ xinference/model/llm/vllm/core.py | 38 +++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/xinference/core/model.py b/xinference/core/model.py index 6017625469..7fc41b9c53 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -145,6 +145,9 @@ async def __pre_destroy__(self): f"Destroy scheduler actor failed, address: {self.address}, error: {e}" ) + if hasattr(self._model, "stop") and callable(self._model.stop): + self._model.stop() + if ( isinstance(self._model, (LLMPytorchModel, LLMVLLMModel)) and self._model.model_spec.model_format == "pytorch" diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 3b18aa095d..b5a58a602d 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -158,6 +158,8 @@ async def recover_sub_pool(self, address): except Exception as e: # Report callback error can be log and ignore, should not interrupt the Process logger.error("report_event error: %s" % (e)) + finally: + del event_model_uid self._model_uid_to_recover_count[model_uid] = ( recover_count - 1 diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index eb633db0b7..69d088a0ab 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -12,9 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio import json import logging import multiprocessing +import os import time import uuid from typing import ( @@ -240,6 +242,42 @@ def load(self): ) self._engine = AsyncLLMEngine.from_engine_args(engine_args) + self._check_health_task = None + if hasattr(self._engine, "check_health"): + # vLLM introduced `check_health` since v0.4.1 + self._check_health_task = asyncio.create_task(self._check_healthy()) + + def stop(self): + # though the vLLM engine will shutdown when deleted, + # but some issue e.g. GH#1682 reported + # when deleting, the engine exists still + logger.info("Stopping vLLM engine") + if self._check_health_task: + self._check_health_task.cancel() + if model_executor := getattr(self._engine, "model_executor", None): + model_executor.shutdown() + self._engine = None + + async def _check_healthy(self, interval: int = 30): + from vllm.engine.async_llm_engine import AsyncEngineDeadError + + logger.debug("Begin to check health of vLLM") + + while self._engine is not None: + try: + await self._engine.check_health() + except (AsyncEngineDeadError, RuntimeError): + logger.info("Detecting vLLM is not health, prepare to quit the process") + try: + self.stop() + except: + # ignore error when stop + pass + # Just kill the process and let xinference auto-recover the model + os._exit(1) + else: + await asyncio.sleep(interval) + def _sanitize_model_config( self, model_config: Optional[VLLMModelConfig] ) -> VLLMModelConfig: From 93e6604092123b5a16533566b89ecd71ab2f99dc Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Fri, 9 Aug 2024 11:20:06 +0800 Subject: [PATCH 251/298] ENH: [worker] Allow init supervisor_ref lazy (#1958) --- xinference/core/worker.py | 208 +++++++++++++++++++++++--------------- 1 file changed, 124 insertions(+), 84 deletions(-) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index b5a58a602d..9524bd604a 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -68,7 +68,7 @@ def __init__( # static attrs. self._total_gpu_devices = gpu_devices self._supervisor_address = supervisor_address - self._supervisor_ref = None + self._supervisor_ref: Optional[xo.ActorRefType] = None self._main_pool = main_pool self._main_pool.recover_sub_pool = self.recover_sub_pool @@ -147,14 +147,15 @@ async def recover_sub_pool(self, address): ) event_model_uid, _, __ = parse_replica_model_uid(model_uid) try: - await self._event_collector_ref.report_event( - event_model_uid, - Event( - event_type=EventType.WARNING, - event_ts=int(time.time()), - event_content="Recreate model", - ), - ) + if self._event_collector_ref is not None: + await self._event_collector_ref.report_event( + event_model_uid, + Event( + event_type=EventType.WARNING, + event_ts=int(time.time()), + event_content="Recreate model", + ), + ) except Exception as e: # Report callback error can be log and ignore, should not interrupt the Process logger.error("report_event error: %s" % (e)) @@ -177,80 +178,39 @@ def uid(cls) -> str: return "worker" async def __post_create__(self): - from ..isolation import Isolation - from .cache_tracker import CacheTrackerActor - from .status_guard import StatusGuardActor - from .supervisor import SupervisorActor - - self._status_guard_ref: xo.ActorRefType[ # type: ignore - "StatusGuardActor" - ] = await xo.actor_ref( - address=self._supervisor_address, uid=StatusGuardActor.uid() - ) - self._event_collector_ref: xo.ActorRefType[ # type: ignore - EventCollectorActor - ] = await xo.actor_ref( - address=self._supervisor_address, uid=EventCollectorActor.uid() - ) - self._cache_tracker_ref: xo.ActorRefType[ # type: ignore - "CacheTrackerActor" - ] = await xo.actor_ref( - address=self._supervisor_address, uid=CacheTrackerActor.uid() - ) - self._supervisor_ref: xo.ActorRefType["SupervisorActor"] = await xo.actor_ref( # type: ignore - address=self._supervisor_address, uid=SupervisorActor.uid() - ) - await self._supervisor_ref.add_worker(self.address) - if not XINFERENCE_DISABLE_HEALTH_CHECK: - # Run _periodical_report_status() in a dedicated thread. - self._isolation = Isolation(asyncio.new_event_loop(), threaded=True) - self._isolation.start() - asyncio.run_coroutine_threadsafe( - self._periodical_report_status(), loop=self._isolation.loop - ) - logger.info(f"Xinference worker {self.address} started") - logger.info("Purge cache directory: %s", XINFERENCE_CACHE_DIR) - purge_dir(XINFERENCE_CACHE_DIR) - from ..model.audio import ( CustomAudioModelFamilyV1, generate_audio_description, - get_audio_model_descriptions, register_audio, unregister_audio, ) from ..model.embedding import ( CustomEmbeddingModelSpec, generate_embedding_description, - get_embedding_model_descriptions, register_embedding, unregister_embedding, ) from ..model.flexible import ( FlexibleModelSpec, generate_flexible_model_description, - get_flexible_model_descriptions, register_flexible_model, unregister_flexible_model, ) from ..model.image import ( CustomImageModelFamilyV1, generate_image_description, - get_image_model_descriptions, register_image, unregister_image, ) from ..model.llm import ( CustomLLMFamilyV1, generate_llm_description, - get_llm_model_descriptions, register_llm, unregister_llm, ) from ..model.rerank import ( CustomRerankModelSpec, generate_rerank_description, - get_rerank_model_descriptions, register_rerank, unregister_rerank, ) @@ -294,24 +254,33 @@ async def __post_create__(self): ), } - # record model version - model_version_infos: Dict[str, List[Dict]] = {} # type: ignore - model_version_infos.update(get_llm_model_descriptions()) - model_version_infos.update(get_embedding_model_descriptions()) - model_version_infos.update(get_rerank_model_descriptions()) - model_version_infos.update(get_image_model_descriptions()) - model_version_infos.update(get_audio_model_descriptions()) - model_version_infos.update(get_flexible_model_descriptions()) - await self._cache_tracker_ref.record_model_version( - model_version_infos, self.address - ) + logger.info("Purge cache directory: %s", XINFERENCE_CACHE_DIR) + purge_dir(XINFERENCE_CACHE_DIR) + + try: + await self.get_supervisor_ref(add_worker=True) + except Exception as e: + # Do not crash the worker if supervisor is down, auto re-connect later + logger.error(f"cannot connect to supervisor {e}") + + if not XINFERENCE_DISABLE_HEALTH_CHECK: + from ..isolation import Isolation + + # Run _periodical_report_status() in a dedicated thread. + self._isolation = Isolation(asyncio.new_event_loop(), threaded=True) + self._isolation.start() + asyncio.run_coroutine_threadsafe( + self._periodical_report_status(), loop=self._isolation.loop + ) + logger.info(f"Xinference worker {self.address} started") # Windows does not have signal handler if os.name != "nt": async def signal_handler(): try: - await self._supervisor_ref.remove_worker(self.address) + supervisor_ref = await self.get_supervisor_ref(add_worker=False) + await supervisor_ref.remove_worker(self.address) except Exception as e: # Ignore the error of rpc, anyway we are exiting logger.exception("remove worker rpc error: %s", e) @@ -333,6 +302,64 @@ async def trigger_exit(self) -> bool: return False return True + async def get_supervisor_ref(self, add_worker: bool = True) -> xo.ActorRefType: + """ + Try connect to supervisor and return ActorRef. Raise exception on error + Params: + add_worker: By default will call supervisor.add_worker after first connect + """ + from .status_guard import StatusGuardActor + from .supervisor import SupervisorActor + + if self._supervisor_ref is not None: + return self._supervisor_ref + self._supervisor_ref: xo.ActorRefType["SupervisorActor"] = await xo.actor_ref( # type: ignore + address=self._supervisor_address, uid=SupervisorActor.uid() + ) + if add_worker and len(self._model_uid_to_model) == 0: + # Newly started (or restarted), has no model, notify supervisor + await self._supervisor_ref.add_worker(self.address) + logger.info("Connected to supervisor as a fresh worker") + + self._status_guard_ref: xo.ActorRefType[ # type: ignore + "StatusGuardActor" + ] = await xo.actor_ref( + address=self._supervisor_address, uid=StatusGuardActor.uid() + ) + + self._event_collector_ref: xo.ActorRefType[ # type: ignore + EventCollectorActor + ] = await xo.actor_ref( + address=self._supervisor_address, uid=EventCollectorActor.uid() + ) + from .cache_tracker import CacheTrackerActor + + self._cache_tracker_ref: xo.ActorRefType[ # type: ignore + "CacheTrackerActor" + ] = await xo.actor_ref( + address=self._supervisor_address, uid=CacheTrackerActor.uid() + ) + # cache_tracker is on supervisor + from ..model.audio import get_audio_model_descriptions + from ..model.embedding import get_embedding_model_descriptions + from ..model.flexible import get_flexible_model_descriptions + from ..model.image import get_image_model_descriptions + from ..model.llm import get_llm_model_descriptions + from ..model.rerank import get_rerank_model_descriptions + + # record model version + model_version_infos: Dict[str, List[Dict]] = {} # type: ignore + model_version_infos.update(get_llm_model_descriptions()) + model_version_infos.update(get_embedding_model_descriptions()) + model_version_infos.update(get_rerank_model_descriptions()) + model_version_infos.update(get_image_model_descriptions()) + model_version_infos.update(get_audio_model_descriptions()) + model_version_infos.update(get_flexible_model_descriptions()) + await self._cache_tracker_ref.record_model_version( + model_version_infos, self.address + ) + return self._supervisor_ref + @staticmethod def get_devices_count(): from ..device_utils import gpu_count @@ -344,9 +371,9 @@ def get_model_count(self) -> int: return len(self._model_uid_to_model) async def is_model_vllm_backend(self, model_uid: str) -> bool: - assert self._supervisor_ref is not None _model_uid, _, _ = parse_replica_model_uid(model_uid) - model_ref = await self._supervisor_ref.get_model(_model_uid) + supervisor_ref = await self.get_supervisor_ref() + model_ref = await supervisor_ref.get_model(_model_uid) return await model_ref.is_vllm_backend() async def allocate_devices_for_embedding(self, model_uid: str) -> int: @@ -764,14 +791,15 @@ async def launch_builtin_model( logger.exception(e) raise try: - await self._event_collector_ref.report_event( - origin_uid, - Event( - event_type=EventType.INFO, - event_ts=int(time.time()), - event_content="Launch model", - ), - ) + if self._event_collector_ref is not None: + await self._event_collector_ref.report_event( + origin_uid, + Event( + event_type=EventType.INFO, + event_ts=int(time.time()), + event_content="Launch model", + ), + ) except Exception as e: # Report callback error can be log and ignore, should not interrupt the Process logger.error("report_event error: %s" % (e)) @@ -867,6 +895,11 @@ async def launch_builtin_model( # update status to READY abilities = await self._get_model_ability(model, model_type) + _ = await self.get_supervisor_ref(add_worker=False) + + if self._status_guard_ref is None: + _ = await self.get_supervisor_ref() + assert self._status_guard_ref is not None await self._status_guard_ref.update_instance_info( origin_uid, {"model_ability": abilities, "status": LaunchStatus.READY.name}, @@ -879,21 +912,23 @@ async def terminate_model(self, model_uid: str): raise ValueError(f"{model_uid} is launching") origin_uid, _, __ = parse_replica_model_uid(model_uid) try: - await self._event_collector_ref.report_event( - origin_uid, - Event( - event_type=EventType.INFO, - event_ts=int(time.time()), - event_content="Terminate model", - ), - ) + if self._event_collector_ref is not None: + await self._event_collector_ref.report_event( + origin_uid, + Event( + event_type=EventType.INFO, + event_ts=int(time.time()), + event_content="Terminate model", + ), + ) except Exception as e: # Report callback error can be log and ignore, should not interrupt the Process logger.error("report_event error: %s" % (e)) - await self._status_guard_ref.update_instance_info( - origin_uid, {"status": LaunchStatus.TERMINATING.name} - ) + if self._status_guard_ref is not None: + await self._status_guard_ref.update_instance_info( + origin_uid, {"status": LaunchStatus.TERMINATING.name} + ) model_ref = self._model_uid_to_model.get(model_uid, None) if model_ref is None: logger.debug("Model not found, uid: %s", model_uid) @@ -918,6 +953,10 @@ async def terminate_model(self, model_uid: str): self._model_uid_to_addr.pop(model_uid, None) self._model_uid_to_recover_count.pop(model_uid, None) self._model_uid_to_launch_args.pop(model_uid, None) + + if self._status_guard_ref is None: + _ = await self.get_supervisor_ref() + assert self._status_guard_ref is not None await self._status_guard_ref.update_instance_info( origin_uid, {"status": LaunchStatus.TERMINATED.name} ) @@ -970,7 +1009,8 @@ async def report_status(self): raise except Exception: logger.exception("Report status got error.") - await self._supervisor_ref.report_worker_status(self.address, status) + supervisor_ref = await self.get_supervisor_ref() + await supervisor_ref.report_worker_status(self.address, status) async def _periodical_report_status(self): while True: From cbdc811cb98d7f4c15df9a9e4a5c182ad8dbe118 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 9 Aug 2024 14:11:09 +0800 Subject: [PATCH 252/298] ENH: optimize performance of sglang (#2050) --- xinference/core/model.py | 6 +- xinference/model/llm/sglang/core.py | 106 +++++++++++++++++++--------- xinference/model/llm/vllm/core.py | 2 +- 3 files changed, 77 insertions(+), 37 deletions(-) diff --git a/xinference/core/model.py b/xinference/core/model.py index 7fc41b9c53..bd70996204 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -133,6 +133,7 @@ def gen_uid(cls, model: "LLM"): async def __pre_destroy__(self): from ..model.embedding.core import EmbeddingModel from ..model.llm.pytorch.core import PytorchModel as LLMPytorchModel + from ..model.llm.sglang.core import SGLANGModel from ..model.llm.vllm.core import VLLMModel as LLMVLLMModel if self.allow_batching(): @@ -149,7 +150,7 @@ async def __pre_destroy__(self): self._model.stop() if ( - isinstance(self._model, (LLMPytorchModel, LLMVLLMModel)) + isinstance(self._model, (LLMPytorchModel, LLMVLLMModel, SGLANGModel)) and self._model.model_spec.model_format == "pytorch" ) or isinstance(self._model, EmbeddingModel): try: @@ -177,6 +178,7 @@ def __init__( ): super().__init__() from ..model.llm.pytorch.core import PytorchModel + from ..model.llm.sglang.core import SGLANGModel from ..model.llm.vllm.core import VLLMModel self._worker_address = worker_address @@ -190,7 +192,7 @@ def __init__( self._current_generator = lambda: None self._lock = ( None - if isinstance(self._model, (PytorchModel, VLLMModel)) + if isinstance(self._model, (PytorchModel, VLLMModel, SGLANGModel)) else asyncio.locks.Lock() ) self._worker_ref = None diff --git a/xinference/model/llm/sglang/core.py b/xinference/model/llm/sglang/core.py index acde859066..44f71fc59b 100644 --- a/xinference/model/llm/sglang/core.py +++ b/xinference/model/llm/sglang/core.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json import logging import time import uuid @@ -122,6 +123,10 @@ def load(self): **self._model_config, ) + def stop(self): + logger.info("Stopping SGLang engine") + self._engine.shutdown() + def _sanitize_model_config( self, model_config: Optional[SGLANGModelConfig] ) -> SGLANGModelConfig: @@ -132,18 +137,20 @@ def _sanitize_model_config( model_config.setdefault("tokenizer_mode", "auto") model_config.setdefault("trust_remote_code", True) model_config.setdefault("tp_size", cuda_count) - # See https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/server_args.py#L37 - mem_fraction_static = model_config.pop("mem_fraction_static", None) + # See https://github.com/sgl-project/sglang/blob/00023d622a6d484e67ef4a0e444f708b8fc861c8/python/sglang/srt/server_args.py#L100-L109 + mem_fraction_static = model_config.get("mem_fraction_static") if mem_fraction_static is None: tp_size = model_config.get("tp_size", cuda_count) - if tp_size >= 8: - model_config["mem_fraction_static"] = 0.80 + if tp_size >= 16: + model_config["mem_fraction_static"] = 0.79 + elif tp_size >= 8: + model_config["mem_fraction_static"] = 0.83 elif tp_size >= 4: - model_config["mem_fraction_static"] = 0.82 - elif tp_size >= 2: model_config["mem_fraction_static"] = 0.85 + elif tp_size >= 2: + model_config["mem_fraction_static"] = 0.87 else: - model_config["mem_fraction_static"] = 0.90 + model_config["mem_fraction_static"] = 0.88 model_config.setdefault("log_level", "info") model_config.setdefault("attention_reduce_in_fp32", False) @@ -249,28 +256,64 @@ def _convert_state_to_completion( usage=usage, ) + @classmethod + def _filter_sampling_params(cls, sampling_params: dict): + if not sampling_params.get("lora_name"): + sampling_params.pop("lora_name", None) + return sampling_params + + async def _stream_generate(self, prompt: str, **sampling_params): + import aiohttp + + sampling_params = self._filter_sampling_params(sampling_params) + json_data = { + "text": prompt, + "sampling_params": sampling_params, + "stream": True, + } + pos = 0 + + timeout = aiohttp.ClientTimeout(total=3 * 3600) + async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session: + async with session.post( + self._engine.generate_url, json=json_data # type: ignore + ) as response: + async for chunk, _ in response.content.iter_chunks(): + chunk = chunk.decode("utf-8") + if chunk and chunk.startswith("data:"): + stop = "data: [DONE]\n\n" + need_stop = False + if chunk.endswith(stop): + chunk = chunk[: -len(stop)] + need_stop = True + if chunk: + data = json.loads(chunk[5:].strip("\n")) + cur = data["text"][pos:] + if cur: + yield data["meta_info"], cur + pos += len(cur) + if need_stop: + break + + async def _non_stream_generate(self, prompt: str, **sampling_params) -> dict: + import aiohttp + + sampling_params = self._filter_sampling_params(sampling_params) + json_data = { + "text": prompt, + "sampling_params": sampling_params, + } + async with aiohttp.ClientSession(trust_env=True) as session: + async with session.post( + self._engine.generate_url, json=json_data # type: ignore + ) as response: + return await response.json() + async def async_generate( self, prompt: str, generate_config: Optional[SGLANGGenerateConfig] = None, ) -> Union[Completion, AsyncGenerator[CompletionChunk, None]]: - try: - import sglang as sgl - from sglang import assistant, gen, user - except ImportError: - error_message = "Failed to import module 'sglang'" - installation_guide = [ - "Please make sure 'sglang' is installed. ", - "You can install it by `pip install sglang[all]`\n", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - @sgl.function - def pipeline(s, question): - s += user(question) - s += assistant(gen("answer")) - sanitized_generate_config = self._sanitize_generate_config(generate_config) logger.debug( "Enter generate, prompt: %s, generate config: %s", prompt, generate_config @@ -285,25 +328,20 @@ def pipeline(s, question): ) request_id = str(uuid.uuid1()) - state = pipeline.run( - question=prompt, - backend=self._engine, - stream=stream, - **sanitized_generate_config, - ) if not stream: + state = await self._non_stream_generate(prompt, **sanitized_generate_config) return self._convert_state_to_completion( request_id, model=self.model_uid, - output_text=state["answer"], - meta_info=state.get_meta_info(name="answer"), + output_text=state["text"], + meta_info=state["meta_info"], ) else: async def stream_results() -> AsyncGenerator[CompletionChunk, None]: prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 - async for out, meta_info in state.text_async_iter( - var_name="answer", return_meta_data=True + async for meta_info, out in self._stream_generate( + prompt, **sanitized_generate_config ): chunk = self._convert_state_to_completion_chunk( request_id, self.model_uid, output_text=out diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 69d088a0ab..0f1ce1ee4e 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -254,7 +254,7 @@ def stop(self): logger.info("Stopping vLLM engine") if self._check_health_task: self._check_health_task.cancel() - if model_executor := getattr(self._engine, "model_executor", None): + if model_executor := getattr(self._engine.engine, "model_executor", None): model_executor.shutdown() self._engine = None From 3ebe1f32fa2b9885e4fde30865c1b79b8454ab32 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:02:32 +0200 Subject: [PATCH 253/298] FEAT: Support CogVideoX video model (#2049) Co-authored-by: qinxuye <qinxuye@gmail.com> --- setup.cfg | 4 + xinference/api/restful_api.py | 52 +++++ xinference/client/restful/restful_client.py | 43 +++++ xinference/constants.py | 1 + xinference/core/model.py | 21 ++ xinference/core/supervisor.py | 37 ++++ xinference/core/worker.py | 2 + xinference/deploy/docker/requirements.txt | 1 + xinference/deploy/docker/requirements_cpu.txt | 1 + xinference/model/core.py | 12 ++ xinference/model/video/__init__.py | 62 ++++++ xinference/model/video/core.py | 178 +++++++++++++++++ xinference/model/video/diffusers.py | 180 ++++++++++++++++++ xinference/model/video/model_spec.json | 11 ++ .../model/video/model_spec_modelscope.json | 12 ++ xinference/model/video/tests/__init__.py | 13 ++ .../model/video/tests/test_diffusers_video.py | 63 ++++++ xinference/types.py | 10 + .../web/ui/src/scenes/launch_model/index.js | 4 + .../web/ui/src/scenes/running_models/index.js | 24 +++ 20 files changed, 731 insertions(+) create mode 100644 xinference/model/video/__init__.py create mode 100644 xinference/model/video/core.py create mode 100644 xinference/model/video/diffusers.py create mode 100644 xinference/model/video/model_spec.json create mode 100644 xinference/model/video/model_spec_modelscope.json create mode 100644 xinference/model/video/tests/__init__.py create mode 100644 xinference/model/video/tests/test_diffusers_video.py diff --git a/setup.cfg b/setup.cfg index 05e33f9b5a..8664c59fdd 100644 --- a/setup.cfg +++ b/setup.cfg @@ -95,6 +95,7 @@ all = sentence-transformers>=2.7.0 vllm>=0.2.6 ; sys_platform=='linux' diffusers>=0.25.0 # fix conflict with matcha-tts + imageio-ffmpeg # For video controlnet_aux orjson auto-gptq ; sys_platform!='darwin' @@ -158,6 +159,9 @@ rerank = image = diffusers>=0.25.0 # fix conflict with matcha-tts controlnet_aux +video = + diffusers + imageio-ffmpeg audio = funasr omegaconf~=2.3.0 diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 87e19d98cf..47b4848c80 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -65,6 +65,7 @@ CreateCompletion, ImageList, PeftModelConfig, + VideoList, max_tokens_field, ) from .oauth2.auth_service import AuthService @@ -123,6 +124,14 @@ class TextToImageRequest(BaseModel): user: Optional[str] = None +class TextToVideoRequest(BaseModel): + model: str + prompt: Union[str, List[str]] = Field(description="The input to embed.") + n: Optional[int] = 1 + kwargs: Optional[str] = None + user: Optional[str] = None + + class SpeechRequest(BaseModel): model: str input: str @@ -512,6 +521,17 @@ async def internal_exception_handler(request: Request, exc: Exception): else None ), ) + self._router.add_api_route( + "/v1/video/generations", + self.create_videos, + methods=["POST"], + response_model=VideoList, + dependencies=( + [Security(self._auth_service, scopes=["models:read"])] + if self.is_authenticated() + else None + ), + ) self._router.add_api_route( "/v1/chat/completions", self.create_chat_completion, @@ -1546,6 +1566,38 @@ async def create_flexible_infer(self, request: Request) -> Response: await self._report_error_event(model_uid, str(e)) raise HTTPException(status_code=500, detail=str(e)) + async def create_videos(self, request: Request) -> Response: + body = TextToVideoRequest.parse_obj(await request.json()) + model_uid = body.model + try: + model = await (await self._get_supervisor_ref()).get_model(model_uid) + except ValueError as ve: + logger.error(str(ve), exc_info=True) + await self._report_error_event(model_uid, str(ve)) + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + logger.error(e, exc_info=True) + await self._report_error_event(model_uid, str(e)) + raise HTTPException(status_code=500, detail=str(e)) + + try: + kwargs = json.loads(body.kwargs) if body.kwargs else {} + video_list = await model.text_to_video( + prompt=body.prompt, + n=body.n, + **kwargs, + ) + return Response(content=video_list, media_type="application/json") + except RuntimeError as re: + logger.error(re, exc_info=True) + await self._report_error_event(model_uid, str(re)) + self.handle_request_limit_error(re) + raise HTTPException(status_code=400, detail=str(re)) + except Exception as e: + logger.error(e, exc_info=True) + await self._report_error_event(model_uid, str(e)) + raise HTTPException(status_code=500, detail=str(e)) + async def create_chat_completion(self, request: Request) -> Response: raw_body = await request.json() body = CreateChatCompletion.parse_obj(raw_body) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index aa0955f75d..c11c30c29f 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -31,6 +31,7 @@ ImageList, LlamaCppGenerateConfig, PytorchGenerateConfig, + VideoList, ) @@ -370,6 +371,44 @@ def inpainting( return response_data +class RESTfulVideoModelHandle(RESTfulModelHandle): + def text_to_video( + self, + prompt: str, + n: int = 1, + **kwargs, + ) -> "VideoList": + """ + Creates a video by the input text. + + Parameters + ---------- + prompt: `str` or `List[str]` + The prompt or prompts to guide video generation. If not defined, you need to pass `prompt_embeds`. + n: `int`, defaults to 1 + The number of videos to generate per prompt. Must be between 1 and 10. + Returns + ------- + VideoList + A list of video objects. + """ + url = f"{self._base_url}/v1/video/generations" + request_body = { + "model": self._model_uid, + "prompt": prompt, + "n": n, + "kwargs": json.dumps(kwargs), + } + response = requests.post(url, json=request_body, headers=self.auth_headers) + if response.status_code != 200: + raise RuntimeError( + f"Failed to create the video, detail: {_get_error_string(response)}" + ) + + response_data = response.json() + return response_data + + class RESTfulGenerateModelHandle(RESTfulModelHandle): def generate( self, @@ -1015,6 +1054,10 @@ def get_model(self, model_uid: str) -> RESTfulModelHandle: return RESTfulAudioModelHandle( model_uid, self.base_url, auth_headers=self._headers ) + elif desc["model_type"] == "video": + return RESTfulVideoModelHandle( + model_uid, self.base_url, auth_headers=self._headers + ) elif desc["model_type"] == "flexible": return RESTfulFlexibleModelHandle( model_uid, self.base_url, auth_headers=self._headers diff --git a/xinference/constants.py b/xinference/constants.py index 3efad56ed3..c9ba4e5ddc 100644 --- a/xinference/constants.py +++ b/xinference/constants.py @@ -47,6 +47,7 @@ def get_xinference_home() -> str: XINFERENCE_MODEL_DIR = os.path.join(XINFERENCE_HOME, "model") XINFERENCE_LOG_DIR = os.path.join(XINFERENCE_HOME, "logs") XINFERENCE_IMAGE_DIR = os.path.join(XINFERENCE_HOME, "image") +XINFERENCE_VIDEO_DIR = os.path.join(XINFERENCE_HOME, "video") XINFERENCE_AUTH_DIR = os.path.join(XINFERENCE_HOME, "auth") XINFERENCE_CSG_ENDPOINT = str( os.environ.get(XINFERENCE_ENV_CSG_ENDPOINT, "https://hub-stg.opencsg.com/") diff --git a/xinference/core/model.py b/xinference/core/model.py index bd70996204..4c8ddee893 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -776,6 +776,27 @@ async def infer( f"Model {self._model.model_spec} is not for flexible infer." ) + @log_async(logger=logger) + @request_limit + async def text_to_video( + self, + prompt: str, + n: int = 1, + *args, + **kwargs, + ): + if hasattr(self._model, "text_to_video"): + return await self._call_wrapper_json( + self._model.text_to_video, + prompt, + n, + *args, + **kwargs, + ) + raise AttributeError( + f"Model {self._model.model_spec} is not for creating video." + ) + async def record_metrics(self, name, op, kwargs): worker_ref = await self._get_worker_ref() await worker_ref.record_metrics(name, op, kwargs) diff --git a/xinference/core/supervisor.py b/xinference/core/supervisor.py index 54e4b65849..2b6f7b9fc5 100644 --- a/xinference/core/supervisor.py +++ b/xinference/core/supervisor.py @@ -64,6 +64,7 @@ from ..model.image import ImageModelFamilyV1 from ..model.llm import LLMFamilyV1 from ..model.rerank import RerankModelSpec + from ..model.video import VideoModelFamilyV1 from .worker import WorkerActor @@ -484,6 +485,31 @@ async def _to_audio_model_reg( res["model_instance_count"] = instance_cnt return res + async def _to_video_model_reg( + self, model_family: "VideoModelFamilyV1", is_builtin: bool + ) -> Dict[str, Any]: + from ..model.video import get_cache_status + + instance_cnt = await self.get_instance_count(model_family.model_name) + version_cnt = await self.get_model_version_count(model_family.model_name) + + if self.is_local_deployment(): + # TODO: does not work when the supervisor and worker are running on separate nodes. + cache_status = get_cache_status(model_family) + res = { + **model_family.dict(), + "cache_status": cache_status, + "is_builtin": is_builtin, + } + else: + res = { + **model_family.dict(), + "is_builtin": is_builtin, + } + res["model_version_count"] = version_cnt + res["model_instance_count"] = instance_cnt + return res + async def _to_flexible_model_reg( self, model_spec: "FlexibleModelSpec", is_builtin: bool ) -> Dict[str, Any]: @@ -602,6 +628,17 @@ def sort_helper(item): {"model_name": model_spec.model_name, "is_builtin": False} ) + ret.sort(key=sort_helper) + return ret + elif model_type == "video": + from ..model.video import BUILTIN_VIDEO_MODELS + + for model_name, family in BUILTIN_VIDEO_MODELS.items(): + if detailed: + ret.append(await self._to_video_model_reg(family, is_builtin=True)) + else: + ret.append({"model_name": model_name, "is_builtin": True}) + ret.sort(key=sort_helper) return ret elif model_type == "rerank": diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 9524bd604a..cfffd7fb17 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -735,6 +735,8 @@ async def _get_model_ability(self, model: Any, model_type: str) -> List[str]: return ["text_to_image"] elif model_type == "audio": return ["audio_to_text"] + elif model_type == "video": + return ["text_to_video"] elif model_type == "flexible": return ["flexible"] else: diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 66f6d650af..1830a7de25 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -60,6 +60,7 @@ onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # Fo openai-whisper # For CosyVoice boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 +imageio-ffmpeg # For video # sglang outlines>=0.0.44 diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index a117e0c549..7ae0a2544d 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -55,3 +55,4 @@ matcha-tts # For CosyVoice onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice openai-whisper # For CosyVoice +imageio-ffmpeg # For video diff --git a/xinference/model/core.py b/xinference/model/core.py index 09cb4104a4..4591d255b0 100644 --- a/xinference/model/core.py +++ b/xinference/model/core.py @@ -65,6 +65,7 @@ def create_model_instance( from .image.core import create_image_model_instance from .llm.core import create_llm_model_instance from .rerank.core import create_rerank_model_instance + from .video.core import create_video_model_instance if model_type == "LLM": return create_llm_model_instance( @@ -127,6 +128,17 @@ def create_model_instance( model_path, **kwargs, ) + elif model_type == "video": + kwargs.pop("trust_remote_code", None) + return create_video_model_instance( + subpool_addr, + devices, + model_uid, + model_name, + download_hub, + model_path, + **kwargs, + ) elif model_type == "flexible": kwargs.pop("trust_remote_code", None) return create_flexible_model_instance( diff --git a/xinference/model/video/__init__.py b/xinference/model/video/__init__.py new file mode 100644 index 0000000000..e1325b0bbb --- /dev/null +++ b/xinference/model/video/__init__.py @@ -0,0 +1,62 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import codecs +import json +import os +from itertools import chain + +from .core import ( + BUILTIN_VIDEO_MODELS, + MODEL_NAME_TO_REVISION, + MODELSCOPE_VIDEO_MODELS, + VIDEO_MODEL_DESCRIPTIONS, + VideoModelFamilyV1, + generate_video_description, + get_cache_status, + get_video_model_descriptions, +) + +_model_spec_json = os.path.join(os.path.dirname(__file__), "model_spec.json") +_model_spec_modelscope_json = os.path.join( + os.path.dirname(__file__), "model_spec_modelscope.json" +) +BUILTIN_VIDEO_MODELS.update( + dict( + (spec["model_name"], VideoModelFamilyV1(**spec)) + for spec in json.load(codecs.open(_model_spec_json, "r", encoding="utf-8")) + ) +) +for model_name, model_spec in BUILTIN_VIDEO_MODELS.items(): + MODEL_NAME_TO_REVISION[model_name].append(model_spec.model_revision) + +MODELSCOPE_VIDEO_MODELS.update( + dict( + (spec["model_name"], VideoModelFamilyV1(**spec)) + for spec in json.load( + codecs.open(_model_spec_modelscope_json, "r", encoding="utf-8") + ) + ) +) +for model_name, model_spec in MODELSCOPE_VIDEO_MODELS.items(): + MODEL_NAME_TO_REVISION[model_name].append(model_spec.model_revision) + +# register model description +for model_name, model_spec in chain( + MODELSCOPE_VIDEO_MODELS.items(), BUILTIN_VIDEO_MODELS.items() +): + VIDEO_MODEL_DESCRIPTIONS.update(generate_video_description(model_spec)) + +del _model_spec_json +del _model_spec_modelscope_json diff --git a/xinference/model/video/core.py b/xinference/model/video/core.py new file mode 100644 index 0000000000..3b9f96ad9a --- /dev/null +++ b/xinference/model/video/core.py @@ -0,0 +1,178 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging +import os +from collections import defaultdict +from typing import Dict, List, Literal, Optional, Tuple + +from ...constants import XINFERENCE_CACHE_DIR +from ..core import CacheableModelSpec, ModelDescription +from ..utils import valid_model_revision +from .diffusers import DiffUsersVideoModel + +MAX_ATTEMPTS = 3 + +logger = logging.getLogger(__name__) + +MODEL_NAME_TO_REVISION: Dict[str, List[str]] = defaultdict(list) +VIDEO_MODEL_DESCRIPTIONS: Dict[str, List[Dict]] = defaultdict(list) +BUILTIN_VIDEO_MODELS: Dict[str, "VideoModelFamilyV1"] = {} +MODELSCOPE_VIDEO_MODELS: Dict[str, "VideoModelFamilyV1"] = {} + + +def get_video_model_descriptions(): + import copy + + return copy.deepcopy(VIDEO_MODEL_DESCRIPTIONS) + + +class VideoModelFamilyV1(CacheableModelSpec): + model_family: str + model_name: str + model_id: str + model_revision: str + model_hub: str = "huggingface" + model_ability: Optional[List[str]] + + +class VideoModelDescription(ModelDescription): + def __init__( + self, + address: Optional[str], + devices: Optional[List[str]], + model_spec: VideoModelFamilyV1, + model_path: Optional[str] = None, + ): + super().__init__(address, devices, model_path=model_path) + self._model_spec = model_spec + + def to_dict(self): + return { + "model_type": "video", + "address": self.address, + "accelerators": self.devices, + "model_name": self._model_spec.model_name, + "model_family": self._model_spec.model_family, + "model_revision": self._model_spec.model_revision, + "model_ability": self._model_spec.model_ability, + } + + def to_version_info(self): + if self._model_path is None: + is_cached = get_cache_status(self._model_spec) + file_location = get_cache_dir(self._model_spec) + else: + is_cached = True + file_location = self._model_path + + return [ + { + "model_version": self._model_spec.model_name, + "model_file_location": file_location, + "cache_status": is_cached, + } + ] + + +def generate_video_description( + video_model: VideoModelFamilyV1, +) -> Dict[str, List[Dict]]: + res = defaultdict(list) + res[video_model.model_name].extend( + VideoModelDescription(None, None, video_model).to_version_info() + ) + return res + + +def match_diffusion( + model_name: str, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, +) -> VideoModelFamilyV1: + from ..utils import download_from_modelscope + from . import BUILTIN_VIDEO_MODELS, MODELSCOPE_VIDEO_MODELS + + if download_hub == "modelscope" and model_name in MODELSCOPE_VIDEO_MODELS: + logger.debug(f"Video model {model_name} found in ModelScope.") + return MODELSCOPE_VIDEO_MODELS[model_name] + elif download_hub == "huggingface" and model_name in BUILTIN_VIDEO_MODELS: + logger.debug(f"Video model {model_name} found in Huggingface.") + return BUILTIN_VIDEO_MODELS[model_name] + elif download_from_modelscope() and model_name in MODELSCOPE_VIDEO_MODELS: + logger.debug(f"Video model {model_name} found in ModelScope.") + return MODELSCOPE_VIDEO_MODELS[model_name] + elif model_name in BUILTIN_VIDEO_MODELS: + logger.debug(f"Video model {model_name} found in Huggingface.") + return BUILTIN_VIDEO_MODELS[model_name] + else: + raise ValueError( + f"Video model {model_name} not found, available" + f"model list: {BUILTIN_VIDEO_MODELS.keys()}" + ) + + +def cache(model_spec: VideoModelFamilyV1): + from ..utils import cache + + return cache(model_spec, VideoModelDescription) + + +def get_cache_dir(model_spec: VideoModelFamilyV1): + return os.path.realpath(os.path.join(XINFERENCE_CACHE_DIR, model_spec.model_name)) + + +def get_cache_status( + model_spec: VideoModelFamilyV1, +) -> bool: + cache_dir = get_cache_dir(model_spec) + meta_path = os.path.join(cache_dir, "__valid_download") + + model_name = model_spec.model_name + if model_name in BUILTIN_VIDEO_MODELS and model_name in MODELSCOPE_VIDEO_MODELS: + hf_spec = BUILTIN_VIDEO_MODELS[model_name] + ms_spec = MODELSCOPE_VIDEO_MODELS[model_name] + + return any( + [ + valid_model_revision(meta_path, hf_spec.model_revision), + valid_model_revision(meta_path, ms_spec.model_revision), + ] + ) + else: # Usually for UT + return valid_model_revision(meta_path, model_spec.model_revision) + + +def create_video_model_instance( + subpool_addr: str, + devices: List[str], + model_uid: str, + model_name: str, + download_hub: Optional[Literal["huggingface", "modelscope", "csghub"]] = None, + model_path: Optional[str] = None, + **kwargs, +) -> Tuple[DiffUsersVideoModel, VideoModelDescription]: + model_spec = match_diffusion(model_name, download_hub) + if not model_path: + model_path = cache(model_spec) + assert model_path is not None + + model = DiffUsersVideoModel( + model_uid, + model_path, + model_spec, + **kwargs, + ) + model_description = VideoModelDescription( + subpool_addr, devices, model_spec, model_path=model_path + ) + return model, model_description diff --git a/xinference/model/video/diffusers.py b/xinference/model/video/diffusers.py new file mode 100644 index 0000000000..b9b8569918 --- /dev/null +++ b/xinference/model/video/diffusers.py @@ -0,0 +1,180 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import base64 +import logging +import os +import sys +import time +import uuid +from concurrent.futures import ThreadPoolExecutor +from functools import partial +from typing import TYPE_CHECKING, List, Union + +import numpy as np +import PIL.Image +import torch + +from ...constants import XINFERENCE_VIDEO_DIR +from ...device_utils import move_model_to_available_device +from ...types import Video, VideoList + +if TYPE_CHECKING: + from .core import VideoModelFamilyV1 + + +logger = logging.getLogger(__name__) + + +def export_to_video_imageio( + video_frames: Union[List[np.ndarray], List["PIL.Image.Image"]], + output_video_path: str, + fps: int = 8, +) -> str: + """ + Export the video frames to a video file using imageio lib to Avoid "green screen" issue (for example CogVideoX) + """ + import imageio + + if isinstance(video_frames[0], PIL.Image.Image): + video_frames = [np.array(frame) for frame in video_frames] + with imageio.get_writer(output_video_path, fps=fps) as writer: + for frame in video_frames: + writer.append_data(frame) + return output_video_path + + +class DiffUsersVideoModel: + def __init__( + self, + model_uid: str, + model_path: str, + model_spec: "VideoModelFamilyV1", + **kwargs, + ): + self._model_uid = model_uid + self._model_path = model_path + self._model_spec = model_spec + self._model = None + self._kwargs = kwargs + + @property + def model_spec(self): + return self._model_spec + + def load(self): + import torch + + torch_dtype = self._kwargs.get("torch_dtype") + if sys.platform != "darwin" and torch_dtype is None: + # The following params crashes on Mac M2 + self._kwargs["torch_dtype"] = torch.float16 + self._kwargs["variant"] = "fp16" + self._kwargs["use_safetensors"] = True + if isinstance(torch_dtype, str): + self._kwargs["torch_dtype"] = getattr(torch, torch_dtype) + + if self._model_spec.model_family == "CogVideoX": + from diffusers import CogVideoXPipeline + + self._model = CogVideoXPipeline.from_pretrained( + self._model_path, **self._kwargs + ) + else: + raise Exception( + f"Unsupported model family: {self._model_spec.model_family}" + ) + + if self._kwargs.get("cpu_offload", False): + logger.debug("CPU offloading model") + self._model.enable_model_cpu_offload() + elif not self._kwargs.get("device_map"): + logger.debug("Loading model to available device") + self._model = move_model_to_available_device(self._model) + # Recommended if your computer has < 64 GB of RAM + self._model.enable_attention_slicing() + + def text_to_video( + self, + prompt: str, + n: int = 1, + num_inference_steps: int = 50, + guidance_scale: int = 6, + response_format: str = "b64_json", + **kwargs, + ) -> VideoList: + import gc + + # cv2 bug will cause the video cannot be normally displayed + # thus we use the imageio one + # from diffusers.utils import export_to_video + from ...device_utils import empty_cache + + logger.debug( + "diffusers text_to_video args: %s", + kwargs, + ) + assert self._model is not None + if self._kwargs.get("cpu_offload"): + # if enabled cpu offload, + # the model.device would be CPU + device = "cuda" + else: + device = self._model.device + prompt_embeds, _ = self._model.encode_prompt( + prompt=prompt, + do_classifier_free_guidance=True, + num_videos_per_prompt=n, + max_sequence_length=226, + device=device, + dtype=torch.float16, + ) + assert callable(self._model) + output = self._model( + num_inference_steps=num_inference_steps, + guidance_scale=guidance_scale, + prompt_embeds=prompt_embeds, + **kwargs, + ) + + # clean cache + gc.collect() + empty_cache() + + os.makedirs(XINFERENCE_VIDEO_DIR, exist_ok=True) + urls = [] + for f in output.frames: + path = os.path.join(XINFERENCE_VIDEO_DIR, uuid.uuid4().hex + ".mp4") + p = export_to_video_imageio(f, path, fps=8) + urls.append(p) + if response_format == "url": + return VideoList( + created=int(time.time()), + data=[Video(url=url, b64_json=None) for url in urls], + ) + elif response_format == "b64_json": + + def _gen_base64_video(_video_url): + try: + with open(_video_url, "rb") as f: + return base64.b64encode(f.read()).decode() + finally: + os.remove(_video_url) + + with ThreadPoolExecutor() as executor: + results = list(map(partial(executor.submit, _gen_base64_video), urls)) # type: ignore + video_list = [Video(url=None, b64_json=s.result()) for s in results] + return VideoList(created=int(time.time()), data=video_list) + else: + raise ValueError(f"Unsupported response format: {response_format}") diff --git a/xinference/model/video/model_spec.json b/xinference/model/video/model_spec.json new file mode 100644 index 0000000000..52b748fd6a --- /dev/null +++ b/xinference/model/video/model_spec.json @@ -0,0 +1,11 @@ +[ + { + "model_name": "CogVideoX-2b", + "model_family": "CogVideoX", + "model_id": "THUDM/CogVideoX-2b", + "model_revision": "4bbfb1de622b80bc1b77b6e9aced75f816be0e38", + "model_ability": [ + "text2video" + ] + } +] diff --git a/xinference/model/video/model_spec_modelscope.json b/xinference/model/video/model_spec_modelscope.json new file mode 100644 index 0000000000..e3cb604921 --- /dev/null +++ b/xinference/model/video/model_spec_modelscope.json @@ -0,0 +1,12 @@ +[ + { + "model_name": "CogVideoX-2b", + "model_family": "CogVideoX", + "model_hub": "modelscope", + "model_id": "ZhipuAI/CogVideoX-2b", + "model_revision": "master", + "model_ability": [ + "text2video" + ] + } +] diff --git a/xinference/model/video/tests/__init__.py b/xinference/model/video/tests/__init__.py new file mode 100644 index 0000000000..37f6558d95 --- /dev/null +++ b/xinference/model/video/tests/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/xinference/model/video/tests/test_diffusers_video.py b/xinference/model/video/tests/test_diffusers_video.py new file mode 100644 index 0000000000..3676612c05 --- /dev/null +++ b/xinference/model/video/tests/test_diffusers_video.py @@ -0,0 +1,63 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging + +import pytest + +from .. import BUILTIN_VIDEO_MODELS +from ..core import cache +from ..diffusers import DiffUsersVideoModel + +logger = logging.getLogger(__name__) + + +@pytest.mark.skip(reason="Video model requires too many GRAM.") +def test_model(): + test_model_spec = next(iter(BUILTIN_VIDEO_MODELS.values())) + model_path = cache(test_model_spec) + model = DiffUsersVideoModel("mock", model_path, test_model_spec) + # input is a string + input_text = "an apple" + model.load() + r = model.text_to_image(input_text) + assert r + + +@pytest.mark.skip(reason="Video model requires too many GRAM.") +def test_client(setup): + endpoint, _ = setup + from ....client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_uid="my_video_model", + model_name="CogVideoX-2b", + model_type="video", + ) + model = client.get_model(model_uid) + assert model + + r = model.text_to_video( + prompt="A panda, dressed in a small, red jacket and a tiny hat, " + "sits on a wooden stool in a serene bamboo forest. " + "The panda's fluffy paws strum a miniature acoustic guitar, " + "producing soft, melodic tunes. Nearby, a few other pandas gather, " + "watching curiously and some clapping in rhythm. " + "Sunlight filters through the tall bamboo, casting a gentle glow on the scene. " + "The panda's face is expressive, showing concentration and joy as it plays. " + "The background includes a small, flowing stream and vibrant green foliage, " + "enhancing the peaceful and magical atmosphere of this unique musical performance." + ) + assert r diff --git a/xinference/types.py b/xinference/types.py index e66e90bee1..3f636d94c3 100644 --- a/xinference/types.py +++ b/xinference/types.py @@ -52,6 +52,16 @@ class ImageList(TypedDict): data: List[Image] +class Video(TypedDict): + url: Optional[str] + b64_json: Optional[str] + + +class VideoList(TypedDict): + created: int + data: List[Video] + + class EmbeddingUsage(TypedDict): prompt_tokens: int total_tokens: int diff --git a/xinference/web/ui/src/scenes/launch_model/index.js b/xinference/web/ui/src/scenes/launch_model/index.js index 1339e94d4f..55f05747bd 100644 --- a/xinference/web/ui/src/scenes/launch_model/index.js +++ b/xinference/web/ui/src/scenes/launch_model/index.js @@ -69,6 +69,7 @@ const LaunchModel = () => { <Tab label="Rerank Models" value="/launch_model/rerank" /> <Tab label="Image Models" value="/launch_model/image" /> <Tab label="Audio Models" value="/launch_model/audio" /> + <Tab label="Video Models" value="/launch_model/video" /> <Tab label="Custom Models" value="/launch_model/custom/llm" /> </TabList> </Box> @@ -93,6 +94,9 @@ const LaunchModel = () => { <TabPanel value="/launch_model/audio" sx={{ padding: 0 }}> <LaunchModelComponent modelType={'audio'} /> </TabPanel> + <TabPanel value="/launch_model/video" sx={{ padding: 0 }}> + <LaunchModelComponent modelType={'video'} /> + </TabPanel> <TabPanel value="/launch_model/custom/llm" sx={{ padding: 0 }}> <LaunchCustom gpuAvailable={gpuAvailable} /> </TabPanel> diff --git a/xinference/web/ui/src/scenes/running_models/index.js b/xinference/web/ui/src/scenes/running_models/index.js index e91858f2fd..9f9486651a 100644 --- a/xinference/web/ui/src/scenes/running_models/index.js +++ b/xinference/web/ui/src/scenes/running_models/index.js @@ -21,6 +21,7 @@ const RunningModels = () => { const [embeddingModelData, setEmbeddingModelData] = useState([]) const [imageModelData, setImageModelData] = useState([]) const [audioModelData, setAudioModelData] = useState([]) + const [videoModelData, setVideoModelData] = useState([]) const [rerankModelData, setRerankModelData] = useState([]) const [flexibleModelData, setFlexibleModelData] = useState([]) const { isCallingApi, setIsCallingApi } = useContext(ApiContext) @@ -53,6 +54,9 @@ const RunningModels = () => { setAudioModelData([ { id: 'Loading, do not refresh page...', url: 'IS_LOADING' }, ]) + setVideoModelData([ + { id: 'Loading, do not refresh page...', url: 'IS_LOADING' }, + ]) setImageModelData([ { id: 'Loading, do not refresh page...', url: 'IS_LOADING' }, ]) @@ -72,6 +76,7 @@ const RunningModels = () => { const newEmbeddingModelData = [] const newImageModelData = [] const newAudioModelData = [] + const newVideoModelData = [] const newRerankModelData = [] const newFlexibleModelData = [] response.data.forEach((model) => { @@ -86,6 +91,8 @@ const RunningModels = () => { newEmbeddingModelData.push(newValue) } else if (newValue.model_type === 'audio') { newAudioModelData.push(newValue) + } else if (newValue.model_type === 'video') { + newVideoModelData.push(newValue) } else if (newValue.model_type === 'image') { newImageModelData.push(newValue) } else if (newValue.model_type === 'rerank') { @@ -97,6 +104,7 @@ const RunningModels = () => { setLlmData(newLlmData) setEmbeddingModelData(newEmbeddingModelData) setAudioModelData(newAudioModelData) + setVideoModelData(newVideoModelData) setImageModelData(newImageModelData) setRerankModelData(newRerankModelData) setFlexibleModelData(newFlexibleModelData) @@ -591,6 +599,7 @@ const RunningModels = () => { }, ] const audioModelColumns = embeddingModelColumns + const videoModelColumns = embeddingModelColumns const rerankModelColumns = embeddingModelColumns const flexibleModelColumns = embeddingModelColumns @@ -652,6 +661,7 @@ const RunningModels = () => { <Tab label="Rerank models" value="/running_models/rerank" /> <Tab label="Image models" value="/running_models/image" /> <Tab label="Audio models" value="/running_models/audio" /> + <Tab label="Video models" value="/running_models/video" /> <Tab label="Flexible models" value="/running_models/flexible" /> </TabList> </Box> @@ -725,6 +735,20 @@ const RunningModels = () => { /> </Box> </TabPanel> + <TabPanel value="/running_models/video" sx={{ padding: 0 }}> + <Box sx={{ height: '100%', width: '100%' }}> + <DataGrid + rows={videoModelData} + columns={videoModelColumns} + autoHeight={true} + sx={dataGridStyle} + slots={{ + noRowsOverlay: noRowsOverlay, + noResultsOverlay: noResultsOverlay, + }} + /> + </Box> + </TabPanel> <TabPanel value="/running_models/flexible" sx={{ padding: 0 }}> <Box sx={{ height: '100%', width: '100%' }}> <DataGrid From 3e7ed865c3b3de601c92edbd9744f2bff9054051 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Fri, 9 Aug 2024 18:03:26 +0800 Subject: [PATCH 254/298] FEAT: Support MiniCPM-v-2_6 (#2031) Co-authored-by: qinxuye <qinxuye@gmail.com> --- xinference/model/llm/__init__.py | 2 + xinference/model/llm/llm_family.json | 48 +++- .../model/llm/llm_family_modelscope.json | 46 +++- xinference/model/llm/pytorch/core.py | 1 + xinference/model/llm/pytorch/minicpmv26.py | 247 ++++++++++++++++++ 5 files changed, 342 insertions(+), 2 deletions(-) create mode 100644 xinference/model/llm/pytorch/minicpmv26.py diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 749596fdbe..0870d6735e 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -125,6 +125,7 @@ def _install(): from .pytorch.internlm2 import Internlm2PytorchChatModel from .pytorch.llama_2 import LlamaPytorchChatModel, LlamaPytorchModel from .pytorch.minicpmv25 import MiniCPMV25Model + from .pytorch.minicpmv26 import MiniCPMV26Model from .pytorch.qwen_vl import QwenVLChatModel from .pytorch.vicuna import VicunaPytorchChatModel from .pytorch.yi_vl import YiVLChatModel @@ -167,6 +168,7 @@ def _install(): PytorchModel, CogVLM2Model, MiniCPMV25Model, + MiniCPMV26Model, Glm4VModel, ] ) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index ffd7f458b7..13ebe41585 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -6807,7 +6807,7 @@ }, { "version":1, - "context_length":2048, + "context_length":8192, "model_name":"MiniCPM-Llama3-V-2_5", "model_lang":[ "en", @@ -6847,6 +6847,52 @@ ] } }, + { + "version":1, + "context_length":32768, + "model_name":"MiniCPM-V-2.6", + "model_lang":[ + "en", + "zh" + ], + "model_ability":[ + "chat", + "vision" + ], + "model_description":"MiniCPM-V 2.6 is the latest model in the MiniCPM-V series. The model is built on SigLip-400M and Qwen2-7B with a total of 8B parameters.", + "model_specs":[ + { + "model_format":"pytorch", + "model_size_in_billions":8, + "quantizations":[ + "none" + ], + "model_id":"openbmb/MiniCPM-V-2_6", + "model_revision":"3f7a8da1b7a8b928b5ee229fae33cf43fd64cf31" + }, + { + "model_format":"pytorch", + "model_size_in_billions":8, + "quantizations":[ + "4-bit" + ], + "model_id":"openbmb/MiniCPM-V-2_6-int4", + "model_revision":"051e2df6505f1fc4305f2c9bd42ed90db8bf4874" + } + ], + "prompt_style":{ + "style_name":"QWEN", + "system_prompt":"You are a helpful assistant", + "roles":[ + "user", + "assistant" + ], + "stop": [ + "<|im_end|>", + "<|endoftext|>" + ] + } + }, { "version": 1, "context_length": 4096, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 56b89cc4f5..91b22ef070 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -4549,7 +4549,7 @@ }, { "version":1, - "context_length":2048, + "context_length":8192, "model_name":"MiniCPM-Llama3-V-2_5", "model_lang":[ "en", @@ -4591,6 +4591,50 @@ ] } }, + { + "version":1, + "context_length":32768, + "model_name":"MiniCPM-V-2.6", + "model_lang":[ + "en", + "zh" + ], + "model_ability":[ + "chat", + "vision" + ], + "model_description":"MiniCPM-V 2.6 is the latest model in the MiniCPM-V series. The model is built on SigLip-400M and Qwen2-7B with a total of 8B parameters.", + "model_specs":[ + { + "model_format":"pytorch", + "model_size_in_billions":8, + "quantizations":[ + "none" + ], + "model_hub": "modelscope", + "model_id":"OpenBMB/MiniCPM-V-2_6", + "model_revision":"master" + }, + { + "model_format":"pytorch", + "model_size_in_billions":8, + "quantizations":[ + "4-bit" + ], + "model_hub": "modelscope", + "model_id":"OpenBMB/MiniCPM-V-2_6-int4", + "model_revision":"master" + } + ], + "prompt_style":{ + "style_name":"QWEN", + "system_prompt":"You are a helpful assistant", + "roles":[ + "user", + "assistant" + ] + } + }, { "version": 1, "context_length": 2048, diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/pytorch/core.py index ee5eb7ff70..16ec02b8a1 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/pytorch/core.py @@ -72,6 +72,7 @@ "mini-internvl-chat", "cogvlm2", "MiniCPM-Llama3-V-2_5", + "MiniCPM-V-2.6", "glm-4v", ] diff --git a/xinference/model/llm/pytorch/minicpmv26.py b/xinference/model/llm/pytorch/minicpmv26.py new file mode 100644 index 0000000000..4a5b88584f --- /dev/null +++ b/xinference/model/llm/pytorch/minicpmv26.py @@ -0,0 +1,247 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import base64 +import json +import logging +import time +import uuid +from concurrent.futures import ThreadPoolExecutor +from io import BytesIO +from typing import Dict, Iterator, List, Optional, Union + +import requests +import torch +from PIL import Image + +from ....types import ( + ChatCompletion, + ChatCompletionChunk, + ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionChunk, + CompletionUsage, +) +from ...utils import select_device +from ..llm_family import LLMFamilyV1, LLMSpecV1 +from .core import PytorchChatModel, PytorchGenerateConfig + +logger = logging.getLogger(__name__) + + +class MiniCPMV26Model(PytorchChatModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._device = None + self._tokenizer = None + self._model = None + + @classmethod + def match( + cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str + ) -> bool: + family = model_family.model_family or model_family.model_name + if "MiniCPM-V-2.6".lower() in family.lower(): + return True + return False + + def _get_model_class(self): + from transformers import AutoModel + + return AutoModel + + def load(self, **kwargs): + from transformers import AutoModel, AutoTokenizer + from transformers.generation import GenerationConfig + + device = self._pytorch_model_config.get("device", "auto") + self._device = select_device(device) + self._device = ( + "auto" + if self._device == "cuda" and self.quantization is None + else self._device + ) + + if "int4" in self.model_path and device == "mps": + logger.error( + "Error: running int4 model with bitsandbytes on Mac is not supported right now." + ) + exit() + + if self._check_tensorizer_integrity(): + self._model, self._tokenizer = self._load_tensorizer() + return + + if "int4" in self.model_path: + model = AutoModel.from_pretrained(self.model_path, trust_remote_code=True) + else: + model = AutoModel.from_pretrained( + self.model_path, + trust_remote_code=True, + torch_dtype=torch.float16, + device_map=self._device, + ) + tokenizer = AutoTokenizer.from_pretrained( + self.model_path, trust_remote_code=True + ) + self._model = model.eval() + self._tokenizer = tokenizer + + # Specify hyperparameters for generation + self._model.generation_config = GenerationConfig.from_pretrained( + self.model_path, + trust_remote_code=True, + ) + self._save_tensorizer() + + def _message_content_to_chat(self, content): + def _load_image(_url): + if _url.startswith("data:"): + logging.info("Parse url by base64 decoder.") + # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images + # e.g. f"data:image/jpeg;base64,{base64_image}" + _type, data = _url.split(";") + _, ext = _type.split("/") + data = data[len("base64,") :] + data = base64.b64decode(data.encode("utf-8")) + return Image.open(BytesIO(data)).convert("RGB") + else: + try: + response = requests.get(_url) + except requests.exceptions.MissingSchema: + return Image.open(_url).convert("RGB") + else: + return Image.open(BytesIO(response.content)).convert("RGB") + + if not isinstance(content, str): + texts = [] + image_urls = [] + for c in content: + c_type = c.get("type") + if c_type == "text": + texts.append(c["text"]) + elif c_type == "image_url": + image_urls.append(c["image_url"]["url"]) + image_futures = [] + with ThreadPoolExecutor() as executor: + for image_url in image_urls: + fut = executor.submit(_load_image, image_url) + image_futures.append(fut) + images = [fut.result() for fut in image_futures] + text = " ".join(texts) + if len(images) == 0: + return text, [] + elif len(images) == 1: + return text, images + else: + raise RuntimeError("Only one image per message is supported") + return content, [] + + def chat( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[PytorchGenerateConfig] = None, + ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + stream = generate_config.get("stream", False) if generate_config else False + content, images_chat = self._message_content_to_chat(prompt) + + msgs = [] + query_to_response: List[Dict] = [] + images_history = [] + for h in chat_history or []: + role = h["role"] + content_h, images_tmp = self._message_content_to_chat(h["content"]) + if images_tmp != []: + images_history = images_tmp + if len(query_to_response) == 0 and role == "user": + query_to_response.append({"role": "user", "content": content_h}) + if len(query_to_response) == 1 and role == "assistant": + query_to_response.append({"role": "assistant", "content": content_h}) + if len(query_to_response) == 2: + msgs.extend(query_to_response) + query_to_response = [] + image = None + if len(images_chat) > 0: + image = images_chat[0] + elif len(images_history) > 0: + image = images_history[0] + msgs.append({"role": "user", "content": content}) + + chat = self._model.chat( + image=image, + msgs=json.dumps(msgs, ensure_ascii=True), + tokenizer=self._tokenizer, + sampling=True, + **generate_config + ) + if stream: + it = self.chat_stream(chat) + return self._to_chat_completion_chunks(it) + else: + c = Completion( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=chat, finish_reason="stop", logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + return self._to_chat_completion(c) + + def chat_stream(self, chat) -> Iterator[CompletionChunk]: + completion_id = str(uuid.uuid1()) + for new_text in chat: + completion_choice = CompletionChoice( + text=new_text, index=0, logprobs=None, finish_reason=None + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk + + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=-1, + completion_tokens=-1, + total_tokens=-1, + ) + chunk["usage"] = completion_usage + yield chunk From c4cbd380fa920f0d6fa2362a7271ca81b6213942 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Sat, 10 Aug 2024 21:07:24 +0800 Subject: [PATCH 255/298] DOC: update readme & add tips for large image models (#2056) --- README.md | 10 +- README_zh_CN.md | 10 +- .../models/model_abilities/audio.po | 51 +++++----- .../models/model_abilities/image.po | 93 ++++++++++++++----- .../models/model_abilities/vision.po | 20 ++-- doc/source/models/model_abilities/image.rst | 46 +++++++-- 6 files changed, 160 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index a77ff62dbb..fbee3a41e5 100644 --- a/README.md +++ b/README.md @@ -34,14 +34,14 @@ potential of cutting-edge AI models. - Support speech recognition model: [#929](https://github.com/xorbitsai/inference/pull/929) - Metrics support: [#906](https://github.com/xorbitsai/inference/pull/906) ### New Models +- Built-in support for [CogVideoX](https://github.com/THUDM/CogVideo): [#2049](https://github.com/xorbitsai/inference/pull/2049) +- Built-in support for [flux.1-schnell & flux.1-dev](https://www.basedlabs.ai/tools/flux1): [#2007](https://github.com/xorbitsai/inference/pull/2007) +- Built-in support for [MiniCPM-V 2.6](https://github.com/OpenBMB/MiniCPM-V): [#2031](https://github.com/xorbitsai/inference/pull/2031) +- Built-in support for [Kolors](https://huggingface.co/Kwai-Kolors/Kolors): [#2028](https://github.com/xorbitsai/inference/pull/2028) +- Built-in support for [SenseVoice](https://github.com/FunAudioLLM/SenseVoice): [#2008](https://github.com/xorbitsai/inference/pull/2008) - Built-in support for [Mistral Large 2](https://mistral.ai/news/mistral-large-2407/): [#1944](https://github.com/xorbitsai/inference/pull/1944) - Built-in support for [llama3.1](https://ai.meta.com/blog/meta-llama-3-1/): [#1932](https://github.com/xorbitsai/inference/pull/1932) - Built-in support for [Mistral Nemo](https://mistral.ai/news/mistral-nemo/): [#1936](https://github.com/xorbitsai/inference/pull/1936) -- Built-in support for [CosyVoice](https://github.com/FunAudioLLM/CosyVoice): [#1881](https://github.com/xorbitsai/inference/pull/1881) -- Built-in support for [codegeex4](https://github.com/THUDM/CodeGeeX4): [#1888](https://github.com/xorbitsai/inference/pull/1888) -- Built-in support for [Gemma-2-it](https://huggingface.co/blog/gemma2): [#1774](https://github.com/xorbitsai/inference/pull/1774) -- Built-in support for [jina-reranker-v2](https://huggingface.co/jinaai/jina-reranker-v2-base-multilingual): [#1733](https://github.com/xorbitsai/inference/pull/1733) -- Built-in support for [Qwen2](https://github.com/QwenLM/Qwen2): [#1509](https://github.com/xorbitsai/inference/pull/1597) ### Integrations - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): an LLMOps platform that enables developers (and even non-developers) to quickly build useful applications based on large language models, ensuring they are visual, operable, and improvable. - [FastGPT](https://github.com/labring/FastGPT): a knowledge-based platform built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization. diff --git a/README_zh_CN.md b/README_zh_CN.md index 261638bc7b..34b9c4621e 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -31,14 +31,14 @@ Xorbits Inference(Xinference)是一个性能强大且功能全面的分布 - 支持语音识别模型: [#929](https://github.com/xorbitsai/inference/pull/929) - 增加 Metrics 统计信息: [#906](https://github.com/xorbitsai/inference/pull/906) ### 新模型 +- 内置 [CogVideoX](https://github.com/THUDM/CogVideo): [#2049](https://github.com/xorbitsai/inference/pull/2049) +- 内置 [flux.1-schnell & flux.1-dev](https://www.basedlabs.ai/tools/flux1): [#2007](https://github.com/xorbitsai/inference/pull/2007) +- 内置 [MiniCPM-V 2.6](https://github.com/OpenBMB/MiniCPM-V): [#2031](https://github.com/xorbitsai/inference/pull/2031) +- 内置 [Kolors](https://huggingface.co/Kwai-Kolors/Kolors): [#2028](https://github.com/xorbitsai/inference/pull/2028) +- 内置 [SenseVoice](https://github.com/FunAudioLLM/SenseVoice): [#2008](https://github.com/xorbitsai/inference/pull/2008) - 内置 [Mistral Large 2](https://mistral.ai/news/mistral-large-2407/): [#1944](https://github.com/xorbitsai/inference/pull/1944) - 内置 [llama3.1](https://ai.meta.com/blog/meta-llama-3-1/): [#1932](https://github.com/xorbitsai/inference/pull/1932) - 内置 [Mistral Nemo](https://mistral.ai/news/mistral-nemo/): [#1936](https://github.com/xorbitsai/inference/pull/1936) -- 内置 [CosyVoice](https://github.com/FunAudioLLM/CosyVoice): [#1881](https://github.com/xorbitsai/inference/pull/1881) -- 内置 [codegeex4](https://github.com/THUDM/CodeGeeX4): [#1888](https://github.com/xorbitsai/inference/pull/1888) -- 内置 [Gemma-2-it](https://huggingface.co/blog/gemma2): [#1774](https://github.com/xorbitsai/inference/pull/1774) -- 内置 [jina-reranker-v2](https://huggingface.co/jinaai/jina-reranker-v2-base-multilingual): [#1733](https://github.com/xorbitsai/inference/pull/1733) -- 内置 [Qwen2](https://github.com/QwenLM/Qwen2): [#1509](https://github.com/xorbitsai/inference/pull/1597) ### 集成 - [FastGPT](https://doc.fastai.site/docs/development/custom-models/xinference/):一个基于 LLM 大模型的开源 AI 知识库构建平台。提供了开箱即用的数据处理、模型调用、RAG 检索、可视化 AI 工作流编排等能力,帮助您轻松实现复杂的问答场景。 - [Dify](https://docs.dify.ai/advanced/model-configuration/xinference): 一个涵盖了大型语言模型开发、部署、维护和优化的 LLMOps 平台。 diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po index b9478b448e..f2acf64572 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-30 21:20+0800\n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -131,27 +131,31 @@ msgstr "" msgid "Belle-whisper-large-v3-zh" msgstr "" -#: ../../source/models/model_abilities/audio.rst:60 +#: ../../source/models/model_abilities/audio.rst:57 +msgid "SenseVoiceSmall" +msgstr "" + +#: ../../source/models/model_abilities/audio.rst:61 msgid "Text to audio" msgstr "文本转语音" -#: ../../source/models/model_abilities/audio.rst:62 +#: ../../source/models/model_abilities/audio.rst:63 msgid "ChatTTS" msgstr "" -#: ../../source/models/model_abilities/audio.rst:63 +#: ../../source/models/model_abilities/audio.rst:64 msgid "CosyVoice" msgstr "" -#: ../../source/models/model_abilities/audio.rst:66 +#: ../../source/models/model_abilities/audio.rst:67 msgid "Quickstart" msgstr "快速入门" -#: ../../source/models/model_abilities/audio.rst:69 +#: ../../source/models/model_abilities/audio.rst:70 msgid "Transcription" msgstr "转录" -#: ../../source/models/model_abilities/audio.rst:71 +#: ../../source/models/model_abilities/audio.rst:72 msgid "" "The Transcription API mimics OpenAI's `create transcriptions API " "<https://platform.openai.com/docs/api-" @@ -163,11 +167,11 @@ msgstr "" "可以通过 cURL、OpenAI Client 或者 Xinference 的 Python 客户端来尝试 " "Transcription API:" -#: ../../source/models/model_abilities/audio.rst:122 +#: ../../source/models/model_abilities/audio.rst:123 msgid "Translation" msgstr "翻译" -#: ../../source/models/model_abilities/audio.rst:124 +#: ../../source/models/model_abilities/audio.rst:125 msgid "" "The Translation API mimics OpenAI's `create translations API " "<https://platform.openai.com/docs/api-" @@ -179,11 +183,11 @@ msgstr "" "通过 cURL、OpenAI Client 或 Xinference 的 Python 客户端来尝试使用 " "Translation API:" -#: ../../source/models/model_abilities/audio.rst:174 +#: ../../source/models/model_abilities/audio.rst:175 msgid "Speech" msgstr "语音" -#: ../../source/models/model_abilities/audio.rst:176 +#: ../../source/models/model_abilities/audio.rst:177 msgid "" "The Speech API mimics OpenAI's `create speech API " "<https://platform.openai.com/docs/api-reference/audio/createSpeech>`_. We" @@ -194,44 +198,47 @@ msgstr "" "openai.com/docs/api-reference/audio/createSpeech>`_。你可以通过 cURL、" "OpenAI Client 或者 Xinference 的 Python 客户端来尝试 Speech API:" -#: ../../source/models/model_abilities/audio.rst:179 +#: ../../source/models/model_abilities/audio.rst:180 msgid "Speech API use non-stream by default as" msgstr "Speech API 默认使用非流式" -#: ../../source/models/model_abilities/audio.rst:181 +#: ../../source/models/model_abilities/audio.rst:182 msgid "" "The stream output of ChatTTS is not as good as the non-stream output, " "please refer to: https://github.com/2noise/ChatTTS/pull/564" msgstr "" -"ChatTTS 的流式输出不如非流式的效果好,参考:https://github.com/2noise/ChatTTS/pull/564" +"ChatTTS 的流式输出不如非流式的效果好,参考:https://github.com/2noise/" +"ChatTTS/pull/564" -#: ../../source/models/model_abilities/audio.rst:182 +#: ../../source/models/model_abilities/audio.rst:183 msgid "" "The stream requires ffmpeg<7: " "https://pytorch.org/audio/stable/installation.html#optional-dependencies" -msgstr "流式要求 ffmpeg<7:https://pytorch.org/audio/stable/installation.html#optional-dependencies" +msgstr "" +"流式要求 ffmpeg<7:https://pytorch.org/audio/stable/installation.html#" +"optional-dependencies" -#: ../../source/models/model_abilities/audio.rst:234 +#: ../../source/models/model_abilities/audio.rst:235 msgid "CosyVoice Usage" msgstr "CosyVoice 模型使用" -#: ../../source/models/model_abilities/audio.rst:236 +#: ../../source/models/model_abilities/audio.rst:237 msgid "Basic usage, launch model ``CosyVoice-300M-SFT``." msgstr "基本使用,加载模型 ``CosyVoice-300M-SFT``。" -#: ../../source/models/model_abilities/audio.rst:285 +#: ../../source/models/model_abilities/audio.rst:286 msgid "Clone voice, launch model ``CosyVoice-300M``." msgstr "克隆声音,加载模型 ``CosyVoice-300M``。" -#: ../../source/models/model_abilities/audio.rst:308 +#: ../../source/models/model_abilities/audio.rst:309 msgid "Cross lingual usage, launch model ``CosyVoice-300M``." msgstr "跨语言使用,加载模型 ``CosyVoice-300M``。" -#: ../../source/models/model_abilities/audio.rst:327 +#: ../../source/models/model_abilities/audio.rst:328 msgid "Instruction based, launch model ``CosyVoice-300M-Instruct``." msgstr "基于指令的声音合成,加载模型 ``CosyVoice-300M-Instruct``。" -#: ../../source/models/model_abilities/audio.rst:344 +#: ../../source/models/model_abilities/audio.rst:345 msgid "" "More instructions and examples, could be found at https://fun-audio-" "llm.github.io/ ." diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po index 2b3bb24a45..1207f7f27b 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-26 12:25+0000\n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -20,8 +20,8 @@ msgstr "" "Generated-By: Babel 2.14.0\n" #: ../../source/models/model_abilities/image.rst:5 -msgid "Images (Experimental)" -msgstr "图像(实验性质)" +msgid "Images" +msgstr "图像" #: ../../source/models/model_abilities/image.rst:7 msgid "Learn how to generate images with Xinference." @@ -101,15 +101,23 @@ msgstr "" msgid "sd3-medium" msgstr "" -#: ../../source/models/model_abilities/image.rst:47 +#: ../../source/models/model_abilities/image.rst:44 +msgid "FLUX.1-schnell" +msgstr "" + +#: ../../source/models/model_abilities/image.rst:45 +msgid "FLUX.1-dev" +msgstr "" + +#: ../../source/models/model_abilities/image.rst:49 msgid "Quickstart" msgstr "快速入门" -#: ../../source/models/model_abilities/image.rst:50 +#: ../../source/models/model_abilities/image.rst:52 msgid "Text-to-image" msgstr "文生图" -#: ../../source/models/model_abilities/image.rst:52 +#: ../../source/models/model_abilities/image.rst:54 msgid "" "The Text-to-image API mimics OpenAI's `create images API " "<https://platform.openai.com/docs/api-reference/images/create>`_. We can " @@ -119,38 +127,77 @@ msgstr "" "可以通过 cURL、OpenAI Client 或 Xinference 的方式尝试使用 Text-to-image " "API。" -#: ../../source/models/model_abilities/image.rst:108 +#: ../../source/models/model_abilities/image.rst:109 +msgid "Tips for Large Image models including sd3-medium, FLUX.1" +msgstr "大型图像模型部署(sd3-medium、FLUX.1 系列)贴士" + +#: ../../source/models/model_abilities/image.rst:111 +msgid "Useful extra parameters can be passed to launch including:" +msgstr "有用的传递给加载模型的额外参数包括:" + +#: ../../source/models/model_abilities/image.rst:113 msgid "" -"If you are running ``sd3-medium`` on a GPU less than 24GB and " -"encountering out of memory, consider to add an extra param for launching " -"according to `this article " -"<https://huggingface.co/docs/diffusers/v0.29.1/en/api/pipelines/stable_diffusion/stable_diffusion_3" -"#dropping-the-t5-text-encoder-during-inference>`_." +"``--cpu_offload True``: specifying ``True`` will offload the components " +"of the model to CPU during inference in order to save memory, while " +"seeing a slight increase in inference latency. Model offloading will only" +" move a model component onto the GPU when it needs to be executed, while " +"keeping the remaining components on the CPU." msgstr "" -"如果你在小于 24GB 的显卡上运行 ``sd3-medium`` 碰到内存不足的问题时,根据 " -"`这篇文章 <https://huggingface.co/docs/diffusers/v0.29.1/en/api/" -"pipelines/stable_diffusion/stable_diffusion_3#dropping-the-t5-text-" -"encoder-during-inference>`_ 考虑在加载模型时增加额外选项。" +"``--cpu_offload True``:指定 ``True`` 会在推理过程中将模型的组件卸载到 CPU 上以节省内存," +"这会导致推理延迟略有增加。模型卸载仅会在需要执行时将模型组件移动到 GPU 上,同时保持其余组件在 CPU 上" -#: ../../source/models/model_abilities/image.rst:111 +#: ../../source/models/model_abilities/image.rst:117 msgid "" -"xinference launch --model-name sd3-medium --model-type image " -"--text_encoder_3 None" +"``--quantize_text_encoder <text encoder layer>``: We leveraged the " +"``bitsandbytes`` library to load and quantize the T5-XXL text encoder to " +"8-bit precision. This allows you to keep using all text encoders " +"while only slightly impacting performance." +msgstr "``--quantize_text_encoder <text encoder layer>``:我们利用 ``bitsandbytes`` 库" +"加载并量化 T5-XXL 文本编码器至8位精度。这使得你能够在仅轻微影响性能的情况下继续使用全部文本编码器。" + +#: ../../source/models/model_abilities/image.rst:120 +msgid "" +"``--text_encoder_3 None``, for sd3-medium, removing the memory-intensive " +"4.7B parameter T5-XXL text encoder during inference can significantly " +"decrease the memory requirements with only a slight loss in performance." msgstr "" +"``--text_encoder_3 None``,对于 sd3-medium," +"移除在推理过程中内存密集型的47亿参数T5-XXL文本编码器可以显著降低内存需求,而仅造成性能上的轻微损失。" + +#: ../../source/models/model_abilities/image.rst:124 +msgid "" +"If you are trying to run large image models liek sd3-medium or FLUX.1 " +"series on GPU card that has less memory than 24GB, you may encounter OOM " +"when launching or inference. Try below solutions." +msgstr "如果你试图在显存小于24GB的GPU上运行像sd3-medium或FLUX.1系列这样的大型图像模型," +"你在启动或推理过程中可能会遇到显存溢出(OOM)的问题。尝试以下解决方案。" -#: ../../source/models/model_abilities/image.rst:114 +#: ../../source/models/model_abilities/image.rst:128 +msgid "For FLUX.1 series, try to apply quantization." +msgstr "对于 FLUX.1 系列,尝试应用量化。" + +#: ../../source/models/model_abilities/image.rst:134 +msgid "For sd3-medium, apply quantization to ``text_encoder_3``." +msgstr "对于 sd3-medium 模型,对 ``text_encoder_3`` 应用量化。" + +#: ../../source/models/model_abilities/image.rst:141 +msgid "Or removing memory-intensive T5-XXL text encoder for sd3-medium." +msgstr "或者,移除 sd3-medium 模型中内存密集型的 T5-XXL 文本编码器。" + +#: ../../source/models/model_abilities/image.rst:148 msgid "Image-to-image" msgstr "图生图" -#: ../../source/models/model_abilities/image.rst:116 +#: ../../source/models/model_abilities/image.rst:150 msgid "You can find more examples of Images API in the tutorial notebook:" msgstr "你可以在教程笔记本中找到更多 Images API 的示例。" -#: ../../source/models/model_abilities/image.rst:120 +#: ../../source/models/model_abilities/image.rst:154 msgid "Stable Diffusion ControlNet" msgstr "" -#: ../../source/models/model_abilities/image.rst:123 +#: ../../source/models/model_abilities/image.rst:157 msgid "Learn from a Stable Diffusion ControlNet example" msgstr "学习一个 Stable Diffusion 控制网络的示例" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po index e191fc7320..35b5311ca0 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-05 12:48+0800\n" +"POT-Creation-Date: 2024-07-28 22:01+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -79,11 +79,15 @@ msgstr "" msgid ":ref:`MiniCPM-Llama3-V 2.5 <models_llm_minicpm-llama3-v-2_5>`" msgstr "" -#: ../../source/models/model_abilities/vision.rst:33 +#: ../../source/models/model_abilities/vision.rst:30 +msgid ":ref:`GLM-4V <models_llm_glm-4v>`" +msgstr "" + +#: ../../source/models/model_abilities/vision.rst:34 msgid "Quickstart" msgstr "快速入门" -#: ../../source/models/model_abilities/vision.rst:35 +#: ../../source/models/model_abilities/vision.rst:36 msgid "" "Images are made available to the model in two main ways: by passing a " "link to the image or by passing the base64 encoded image directly in the " @@ -92,23 +96,23 @@ msgstr "" "模型可以通过两种主要方式获取图像:通过传递图像的链接或直接在请求中传递 " "base64 编码的图像。" -#: ../../source/models/model_abilities/vision.rst:39 +#: ../../source/models/model_abilities/vision.rst:40 msgid "Example using OpenAI Client" msgstr "使用 OpenAI 客户端的示例" -#: ../../source/models/model_abilities/vision.rst:70 +#: ../../source/models/model_abilities/vision.rst:71 msgid "Uploading base 64 encoded images" msgstr "上传 Base64 编码的图片" -#: ../../source/models/model_abilities/vision.rst:112 +#: ../../source/models/model_abilities/vision.rst:113 msgid "You can find more examples of ``vision`` ability in the tutorial notebook:" msgstr "你可以在教程笔记本中找到更多关于 ``vision`` 能力的示例。" -#: ../../source/models/model_abilities/vision.rst:116 +#: ../../source/models/model_abilities/vision.rst:117 msgid "Qwen VL Chat" msgstr "" -#: ../../source/models/model_abilities/vision.rst:119 +#: ../../source/models/model_abilities/vision.rst:120 msgid "Learn vision ability from a example using qwen-vl-chat" msgstr "通过使用 qwen-vl-chat 的示例来学习使用 LLM 的视觉能力" diff --git a/doc/source/models/model_abilities/image.rst b/doc/source/models/model_abilities/image.rst index 5407d06c79..e2e65fab3c 100644 --- a/doc/source/models/model_abilities/image.rst +++ b/doc/source/models/model_abilities/image.rst @@ -1,8 +1,8 @@ .. _image: -===================== -Images (Experimental) -===================== +====== +Images +====== Learn how to generate images with Xinference. @@ -41,6 +41,8 @@ The Text-to-image API is supported with the following models in Xinference: * stable-diffusion-v1.5 * stable-diffusion-xl-base-1.0 * sd3-medium +* FLUX.1-schnell +* FLUX.1-dev Quickstart @@ -103,12 +105,42 @@ We can try Text-to-image API out either via cURL, OpenAI Client, or Xinference's } -.. note:: +Tips for Large Image models including sd3-medium, FLUX.1 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - If you are running ``sd3-medium`` on a GPU less than 24GB and encountering out of memory, - consider to add an extra param for launching according to `this article <https://huggingface.co/docs/diffusers/v0.29.1/en/api/pipelines/stable_diffusion/stable_diffusion_3#dropping-the-t5-text-encoder-during-inference>`_. +Useful extra parameters can be passed to launch including: - .. code:: bash +* ``--cpu_offload True``: specifying ``True`` will offload the components of the model to CPU during + inference in order to save memory, while seeing a slight increase in inference latency. + Model offloading will only move a model component onto the GPU when it needs to be executed, + while keeping the remaining components on the CPU. +* ``--quantize_text_encoder <text encoder layer>``: We leveraged the ``bitsandbytes`` library + to load and quantize the T5-XXL text encoder to 8-bit precision. + This allows you to keep using all text encoders while only slightly impacting performance. +* ``--text_encoder_3 None``, for sd3-medium, removing the memory-intensive 4.7B parameter + T5-XXL text encoder during inference can significantly decrease the memory requirements + with only a slight loss in performance. + +If you are trying to run large image models liek sd3-medium or FLUX.1 series on GPU card +that has less memory than 24GB, you may encounter OOM when launching or inference. +Try below solutions. + +For FLUX.1 series, try to apply quantization. + +.. code:: bash + + xinference launch --model-name FLUX.1-dev --model-type image --quantize_text_encoder text_encoder_2 + +For sd3-medium, apply quantization to ``text_encoder_3``. + +.. code:: bash + + xinference launch --model-name sd3-medium --model-type image --quantize_text_encoder text_encoder_3 + + +Or removing memory-intensive T5-XXL text encoder for sd3-medium. + +.. code:: bash xinference launch --model-name sd3-medium --model-type image --text_encoder_3 None From 9afee766a3c5cc53e6035490400a4291b78e72ff Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Mon, 12 Aug 2024 12:36:32 +0800 Subject: [PATCH 256/298] BUG: limit AutoAWQ version to fix docker issue (#2067) --- setup.cfg | 4 ++-- xinference/deploy/docker/requirements.txt | 2 +- xinference/deploy/docker/requirements_cpu.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.cfg b/setup.cfg index 8664c59fdd..3a2f026f0c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -99,7 +99,7 @@ all = controlnet_aux orjson auto-gptq ; sys_platform!='darwin' - autoawq ; sys_platform!='darwin' + autoawq<0.2.6 ; sys_platform!='darwin' # autoawq 0.2.6 pinned torch to 2.3 optimum outlines>=0.0.34 sglang>=0.2.7 ; sys_platform=='linux' @@ -138,7 +138,7 @@ transformers = einops tiktoken auto-gptq ; sys_platform!='darwin' - autoawq ; sys_platform!='darwin' + autoawq<0.2.6 ; sys_platform!='darwin' # autoawq 0.2.6 pinned torch to 2.3 optimum attrdict # For deepseek VL timm>=0.9.16 # For deepseek VL diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 1830a7de25..50cae984f8 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -39,7 +39,7 @@ diffusers>=0.25.0 # fix conflict with matcha-tts controlnet_aux orjson auto-gptq -autoawq +autoawq<0.2.6 # autoawq 0.2.6 pinned torch to 2.3 optimum attrdict # For deepseek VL timm>=0.9.16 # For deepseek VL diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 7ae0a2544d..ffc266e315 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -37,7 +37,7 @@ diffusers>=0.25.0 # fix conflict with matcha-tts controlnet_aux orjson auto-gptq -autoawq +autoawq<0.2.6 # autoawq 0.2.6 pinned torch to 2.3 optimum peft timm From de06eb7fd23f4d82c4d309c372b47a0ad1682ce4 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 14 Aug 2024 14:45:58 +0800 Subject: [PATCH 257/298] FEAT: add gemma-2-it 2b & internlm2.5-chat 1.8b and 20b & update video and sglang docs (#2080) --- doc/source/gen_docs.py | 19 ++++ doc/source/getting_started/installation.rst | 4 +- .../getting_started/installation.po | 56 ++++------ .../models/builtin/image/flux.1-dev.po | 53 +++++++++ .../models/builtin/image/flux.1-schnell.po | 53 +++++++++ .../LC_MESSAGES/models/builtin/image/index.po | 29 +++++ .../models/builtin/image/kolors.po | 53 +++++++++ .../models/builtin/image/sd-turbo.po | 53 +++++++++ .../models/builtin/image/sd3-medium.po | 53 +++++++++ .../models/builtin/image/sdxl-turbo.po | 53 +++++++++ .../image/stable-diffusion-2-inpainting.po | 53 +++++++++ .../image/stable-diffusion-inpainting.po | 53 +++++++++ .../builtin/image/stable-diffusion-v1.5.po | 55 +++++++++ .../image/stable-diffusion-xl-base-1.0.po | 53 +++++++++ .../image/stable-diffusion-xl-inpainting.po | 53 +++++++++ .../models/builtin/video/cogvideox-2b.po | 49 +++++++++ .../LC_MESSAGES/models/builtin/video/index.po | 29 +++++ .../locale/zh_CN/LC_MESSAGES/models/index.po | 62 +++++++---- .../models/model_abilities/image.po | 2 +- .../models/model_abilities/video.po | 101 +++++++++++++++++ .../zh_CN/LC_MESSAGES/reference/index.po | 24 ++-- .../zh_CN/LC_MESSAGES/user_guide/backends.po | 23 ++-- doc/source/models/builtin/embedding/index.rst | 2 + doc/source/models/builtin/image/index.rst | 2 + doc/source/models/builtin/index.rst | 1 + .../models/builtin/llm/c4ai-command-r-v01.rst | 2 +- doc/source/models/builtin/llm/gemma-2-it.rst | 104 ++++++++++++++++-- doc/source/models/builtin/llm/gemma-it.rst | 4 +- doc/source/models/builtin/llm/index.rst | 9 +- .../models/builtin/llm/internlm2.5-chat.rst | 76 ++++++++++++- .../models/builtin/llm/llama-2-chat.rst | 18 +-- doc/source/models/builtin/llm/llama-2.rst | 18 +-- .../models/builtin/llm/llama-3-instruct.rst | 36 +++++- .../models/builtin/llm/llama-3.1-instruct.rst | 60 +++++++++- doc/source/models/builtin/llm/llama-3.1.rst | 20 +++- doc/source/models/builtin/llm/llama-3.rst | 4 +- .../builtin/llm/minicpm-llama3-v-2_5.rst | 2 +- .../models/builtin/llm/minicpm-v-2.6.rst | 47 ++++++++ .../builtin/llm/mistral-instruct-v0.1.rst | 6 +- .../builtin/llm/mistral-instruct-v0.2.rst | 6 +- .../models/builtin/llm/mistral-v0.1.rst | 2 +- .../builtin/llm/mixtral-instruct-v0.1.rst | 6 +- .../models/builtin/llm/mixtral-v0.1.rst | 4 +- doc/source/models/builtin/llm/qwen-chat.rst | 16 +-- .../models/builtin/llm/qwen1.5-chat.rst | 48 ++++---- .../models/builtin/llm/qwen2-instruct.rst | 24 ++-- .../models/builtin/llm/qwen2-moe-instruct.rst | 4 +- .../models/builtin/video/cogvideox-2b.rst | 18 +++ doc/source/models/builtin/video/index.rst | 15 +++ doc/source/models/index.rst | 12 ++ doc/source/models/model_abilities/image.rst | 2 +- doc/source/models/model_abilities/index.rst | 2 +- doc/source/models/model_abilities/video.rst | 82 ++++++++++++++ doc/source/reference/index.rst | 10 ++ doc/source/user_guide/backends.rst | 4 +- doc/templates/llm.rst.jinja | 6 +- doc/templates/video.rst.jinja | 18 +++ doc/templates/video_index.rst.jinja | 15 +++ xinference/locale/__init__.py | 13 --- xinference/locale/utils.py | 39 ------- xinference/locale/zh_CN.json | 26 ----- xinference/model/llm/llm_family.json | 103 +++++++++++++++++ .../model/llm/llm_family_modelscope.json | 47 ++++++++ 63 files changed, 1642 insertions(+), 274 deletions(-) create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/flux.1-dev.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/flux.1-schnell.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/index.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/kolors.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sd-turbo.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sd3-medium.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sdxl-turbo.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-2-inpainting.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-inpainting.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-v1.5.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-xl-base-1.0.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-xl-inpainting.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/video/cogvideox-2b.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/video/index.po create mode 100644 doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/video.po create mode 100644 doc/source/models/builtin/llm/minicpm-v-2.6.rst create mode 100644 doc/source/models/builtin/video/cogvideox-2b.rst create mode 100644 doc/source/models/builtin/video/index.rst create mode 100644 doc/source/models/model_abilities/video.rst create mode 100644 doc/templates/video.rst.jinja create mode 100644 doc/templates/video_index.rst.jinja delete mode 100644 xinference/locale/__init__.py delete mode 100644 xinference/locale/utils.py delete mode 100644 xinference/locale/zh_CN.json diff --git a/doc/source/gen_docs.py b/doc/source/gen_docs.py index c344432917..a33d6d2c8a 100644 --- a/doc/source/gen_docs.py +++ b/doc/source/gen_docs.py @@ -222,6 +222,25 @@ def get_unique_id(spec): rendered_index = env.get_template('audio_index.rst.jinja').render(models=sorted_models) file.write(rendered_index) + with open('../../xinference/model/video/model_spec.json', 'r') as file: + models = json.load(file) + + sorted_models = sorted(models, key=lambda x: x['model_name'].lower()) + output_dir = './models/builtin/video' + os.makedirs(output_dir, exist_ok=True) + + for model in sorted_models: + model["model_ability"] = ', '.join(model.get("model_ability")) + rendered = env.get_template('video.rst.jinja').render(model) + output_file_path = os.path.join(output_dir, f"{model['model_name'].lower()}.rst") + with open(output_file_path, 'w') as output_file: + output_file.write(rendered) + + index_file_path = os.path.join(output_dir, "index.rst") + with open(index_file_path, "w") as file: + rendered_index = env.get_template('video_index.rst.jinja').render(models=sorted_models) + file.write(rendered_index) + if VLLM_INSTALLED: vllm_models = gen_vllm_models() groups = [', '.join("``%s``" % m for m in group) for group in vllm_models] diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index f066c3e68e..0ddbfd58b1 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -39,7 +39,7 @@ Currently, supported models include: .. vllm_start -- ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``, ``llama-3.1``, ``llama-3.1-instruct`` +- ``llama-2``, ``llama-3``, ``llama-3.1``, ``llama-2-chat``, ``llama-3-instruct``, ``llama-3.1-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-instruct`` @@ -58,7 +58,7 @@ Currently, supported models include: - ``codegeex4`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``qwen2-instruct``, ``qwen2-moe-instruct`` -- ``gemma-it`` +- ``gemma-it``, ``gemma-2-it`` - ``orion-chat``, ``orion-chat-rag`` - ``c4ai-command-r-v01`` .. vllm_end diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po index 4496b34859..9d4eae461d 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-30 17:00+0800\n" +"POT-Creation-Date: 2024-08-13 17:44+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -117,8 +117,8 @@ msgstr "目前,支持的模型包括:" #: ../../source/getting_started/installation.rst:42 msgid "" -"``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``, " -"``llama-3.1``, ``llama-3.1-instruct``" +"``llama-2``, ``llama-3``, ``llama-3.1``, ``llama-2-chat``, " +"``llama-3-instruct``, ``llama-3.1-instruct``" msgstr "" #: ../../source/getting_started/installation.rst:43 @@ -201,7 +201,7 @@ msgid "``qwen2-instruct``, ``qwen2-moe-instruct``" msgstr "" #: ../../source/getting_started/installation.rst:61 -msgid "``gemma-it``" +msgid "``gemma-it``, ``gemma-2-it``" msgstr "" #: ../../source/getting_started/installation.rst:62 @@ -216,11 +216,11 @@ msgstr "" msgid "To install Xinference and vLLM::" msgstr "安装 xinference 和 vLLM:" -#: ../../source/getting_started/installation.rst:73 +#: ../../source/getting_started/installation.rst:79 msgid "Llama.cpp Backend" msgstr "Llama.cpp 引擎" -#: ../../source/getting_started/installation.rst:74 +#: ../../source/getting_started/installation.rst:80 msgid "" "Xinference supports models in ``gguf`` and ``ggml`` format via ``llama-" "cpp-python``. It's advised to install the llama.cpp-related dependencies " @@ -229,33 +229,33 @@ msgstr "" "Xinference 通过 ``llama-cpp-python`` 支持 ``gguf`` 和 ``ggml`` 格式的模型" "。建议根据当前使用的硬件手动安装依赖,从而获得最佳的加速效果。" -#: ../../source/getting_started/installation.rst:76 -#: ../../source/getting_started/installation.rst:99 -#: ../../source/getting_started/installation.rst:108 +#: ../../source/getting_started/installation.rst:82 +#: ../../source/getting_started/installation.rst:105 +#: ../../source/getting_started/installation.rst:118 msgid "Initial setup::" msgstr "初始步骤:" -#: ../../source/getting_started/installation.rst:80 +#: ../../source/getting_started/installation.rst:86 msgid "Hardware-Specific installations:" msgstr "不同硬件的安装方式:" -#: ../../source/getting_started/installation.rst:82 +#: ../../source/getting_started/installation.rst:88 msgid "Apple Silicon::" msgstr "Apple M系列" -#: ../../source/getting_started/installation.rst:86 +#: ../../source/getting_started/installation.rst:92 msgid "Nvidia cards::" msgstr "英伟达显卡:" -#: ../../source/getting_started/installation.rst:90 +#: ../../source/getting_started/installation.rst:96 msgid "AMD cards::" msgstr "AMD 显卡:" -#: ../../source/getting_started/installation.rst:96 +#: ../../source/getting_started/installation.rst:102 msgid "SGLang Backend" msgstr "SGLang 引擎" -#: ../../source/getting_started/installation.rst:97 +#: ../../source/getting_started/installation.rst:103 msgid "" "SGLang has a high-performance inference runtime with RadixAttention. It " "significantly accelerates the execution of complex LLM programs by " @@ -266,38 +266,20 @@ msgstr "" "自动重用KV缓存,显著加速了复杂 LLM 程序的执行。它还支持其他常见推理技术," "如连续批处理和张量并行处理。" -#: ../../source/getting_started/installation.rst:105 +#: ../../source/getting_started/installation.rst:115 #, fuzzy msgid "MLX Backend" msgstr "vLLM 引擎" -#: ../../source/getting_started/installation.rst:106 +#: ../../source/getting_started/installation.rst:116 msgid "MLX-lm is designed for Apple silicon users to run LLM efficiently." msgstr "MLX-lm 用来在苹果 silicon 芯片上提供高效的 LLM 推理。" -#: ../../source/getting_started/installation.rst:113 +#: ../../source/getting_started/installation.rst:123 msgid "Other Platforms" msgstr "其他平台" -#: ../../source/getting_started/installation.rst:115 +#: ../../source/getting_started/installation.rst:125 msgid ":ref:`Ascend NPU <installation_npu>`" msgstr "" -#~ msgid "``Yi``, ``Yi-chat``" -#~ msgstr "" - -#~ msgid "``c4ai-command-r-v01``, ``c4ai-command-r-v01-4bit``" -#~ msgstr "" - -#~ msgid "``deepseek-chat``, ``deepseek-coder-instruct``" -#~ msgstr "" - -#~ msgid "``codeqwen1.5-chat``" -#~ msgstr "" - -#~ msgid "``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``" -#~ msgstr "" - -#~ msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" -#~ msgstr "" - diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/flux.1-dev.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/flux.1-dev.po new file mode 100644 index 0000000000..bf5a08b979 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/flux.1-dev.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/flux.1-dev.rst:5 +msgid "FLUX.1-dev" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-dev.rst:7 +msgid "**Model Name:** FLUX.1-dev" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-dev.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-dev.rst:9 +msgid "**Abilities:** text2image" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-dev.rst:10 +msgid "**Available ControlNet:** None" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-dev.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-dev.rst:15 +msgid "**Model ID:** black-forest-labs/FLUX.1-dev" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-dev.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/flux.1-schnell.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/flux.1-schnell.po new file mode 100644 index 0000000000..a41f15bcb2 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/flux.1-schnell.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/flux.1-schnell.rst:5 +msgid "FLUX.1-schnell" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-schnell.rst:7 +msgid "**Model Name:** FLUX.1-schnell" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-schnell.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-schnell.rst:9 +msgid "**Abilities:** text2image" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-schnell.rst:10 +msgid "**Available ControlNet:** None" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-schnell.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-schnell.rst:15 +msgid "**Model ID:** black-forest-labs/FLUX.1-schnell" +msgstr "" + +#: ../../source/models/builtin/image/flux.1-schnell.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/index.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/index.po new file mode 100644 index 0000000000..99bd9d9719 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/index.po @@ -0,0 +1,29 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-03-11 13:33+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/index.rst:5 +msgid "Image Models" +msgstr "图像模型" + +#: ../../source/models/builtin/image/index.rst:7 +msgid "The following is a list of built-in image models in Xinference:" +msgstr "以下是 Xinference 中内置的图像模型列表:" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/kolors.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/kolors.po new file mode 100644 index 0000000000..a922c2144c --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/kolors.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/kolors.rst:5 +msgid "kolors" +msgstr "" + +#: ../../source/models/builtin/image/kolors.rst:7 +msgid "**Model Name:** kolors" +msgstr "" + +#: ../../source/models/builtin/image/kolors.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/kolors.rst:9 +msgid "**Abilities:** text2image, image2image" +msgstr "" + +#: ../../source/models/builtin/image/kolors.rst:10 +msgid "**Available ControlNet:** None" +msgstr "" + +#: ../../source/models/builtin/image/kolors.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/kolors.rst:15 +msgid "**Model ID:** Kwai-Kolors/Kolors-diffusers" +msgstr "" + +#: ../../source/models/builtin/image/kolors.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sd-turbo.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sd-turbo.po new file mode 100644 index 0000000000..b7c9b2c84e --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sd-turbo.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/sd-turbo.rst:5 +msgid "sd-turbo" +msgstr "" + +#: ../../source/models/builtin/image/sd-turbo.rst:7 +msgid "**Model Name:** sd-turbo" +msgstr "" + +#: ../../source/models/builtin/image/sd-turbo.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/sd-turbo.rst:9 +msgid "**Abilities:** text2image" +msgstr "" + +#: ../../source/models/builtin/image/sd-turbo.rst:10 +msgid "**Available ControlNet:** None" +msgstr "" + +#: ../../source/models/builtin/image/sd-turbo.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/sd-turbo.rst:15 +msgid "**Model ID:** stabilityai/sd-turbo" +msgstr "" + +#: ../../source/models/builtin/image/sd-turbo.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sd3-medium.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sd3-medium.po new file mode 100644 index 0000000000..dbc54fdbef --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sd3-medium.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/sd3-medium.rst:5 +msgid "sd3-medium" +msgstr "" + +#: ../../source/models/builtin/image/sd3-medium.rst:7 +msgid "**Model Name:** sd3-medium" +msgstr "" + +#: ../../source/models/builtin/image/sd3-medium.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/sd3-medium.rst:9 +msgid "**Abilities:** text2image, image2image" +msgstr "" + +#: ../../source/models/builtin/image/sd3-medium.rst:10 +msgid "**Available ControlNet:** None" +msgstr "" + +#: ../../source/models/builtin/image/sd3-medium.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/sd3-medium.rst:15 +msgid "**Model ID:** stabilityai/stable-diffusion-3-medium-diffusers" +msgstr "" + +#: ../../source/models/builtin/image/sd3-medium.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sdxl-turbo.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sdxl-turbo.po new file mode 100644 index 0000000000..01cc607778 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/sdxl-turbo.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/sdxl-turbo.rst:5 +msgid "sdxl-turbo" +msgstr "" + +#: ../../source/models/builtin/image/sdxl-turbo.rst:7 +msgid "**Model Name:** sdxl-turbo" +msgstr "" + +#: ../../source/models/builtin/image/sdxl-turbo.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/sdxl-turbo.rst:9 +msgid "**Abilities:** text2image" +msgstr "" + +#: ../../source/models/builtin/image/sdxl-turbo.rst:10 +msgid "**Available ControlNet:** None" +msgstr "" + +#: ../../source/models/builtin/image/sdxl-turbo.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/sdxl-turbo.rst:15 +msgid "**Model ID:** stabilityai/sdxl-turbo" +msgstr "" + +#: ../../source/models/builtin/image/sdxl-turbo.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-2-inpainting.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-2-inpainting.po new file mode 100644 index 0000000000..08518a4c3b --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-2-inpainting.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-07-28 22:01+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/stable-diffusion-2-inpainting.rst:5 +msgid "stable-diffusion-2-inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-2-inpainting.rst:7 +msgid "**Model Name:** stable-diffusion-2-inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-2-inpainting.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-2-inpainting.rst:9 +msgid "**Abilities:** inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-2-inpainting.rst:10 +msgid "**Available ControlNet:** None" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-2-inpainting.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-2-inpainting.rst:15 +msgid "**Model ID:** stabilityai/stable-diffusion-2-inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-2-inpainting.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-inpainting.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-inpainting.po new file mode 100644 index 0000000000..d015dc4cb7 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-inpainting.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-07-28 22:01+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/stable-diffusion-inpainting.rst:5 +msgid "stable-diffusion-inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-inpainting.rst:7 +msgid "**Model Name:** stable-diffusion-inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-inpainting.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-inpainting.rst:9 +msgid "**Abilities:** inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-inpainting.rst:10 +msgid "**Available ControlNet:** None" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-inpainting.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-inpainting.rst:15 +msgid "**Model ID:** runwayml/stable-diffusion-inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-inpainting.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-v1.5.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-v1.5.po new file mode 100644 index 0000000000..7c377fe935 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-v1.5.po @@ -0,0 +1,55 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/stable-diffusion-v1.5.rst:5 +msgid "stable-diffusion-v1.5" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-v1.5.rst:7 +msgid "**Model Name:** stable-diffusion-v1.5" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-v1.5.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-v1.5.rst:9 +msgid "**Abilities:** text2image, image2image" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-v1.5.rst:10 +msgid "" +"**Available ControlNet:** ['canny', 'mlsd', 'hed', 'scribble', " +"'openpose', 'normal', 'seg']" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-v1.5.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-v1.5.rst:15 +msgid "**Model ID:** runwayml/stable-diffusion-v1-5" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-v1.5.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-xl-base-1.0.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-xl-base-1.0.po new file mode 100644 index 0000000000..8ea547b71c --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-xl-base-1.0.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-09 19:13+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/stable-diffusion-xl-base-1.0.rst:5 +msgid "stable-diffusion-xl-base-1.0" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-base-1.0.rst:7 +msgid "**Model Name:** stable-diffusion-xl-base-1.0" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-base-1.0.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-base-1.0.rst:9 +msgid "**Abilities:** text2image, image2image" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-base-1.0.rst:10 +msgid "**Available ControlNet:** ['canny', 'depth', 'zoe-depth']" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-base-1.0.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-base-1.0.rst:15 +msgid "**Model ID:** stabilityai/stable-diffusion-xl-base-1.0" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-base-1.0.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-xl-inpainting.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-xl-inpainting.po new file mode 100644 index 0000000000..abb05df510 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/image/stable-diffusion-xl-inpainting.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-07-28 22:01+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/image/stable-diffusion-xl-inpainting.rst:5 +msgid "stable-diffusion-xl-inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-inpainting.rst:7 +msgid "**Model Name:** stable-diffusion-xl-inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-inpainting.rst:8 +msgid "**Model Family:** stable_diffusion" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-inpainting.rst:9 +msgid "**Abilities:** inpainting" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-inpainting.rst:10 +msgid "**Available ControlNet:** None" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-inpainting.rst:13 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-inpainting.rst:15 +msgid "**Model ID:** diffusers/stable-diffusion-xl-1.0-inpainting-0.1" +msgstr "" + +#: ../../source/models/builtin/image/stable-diffusion-xl-inpainting.rst:17 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/video/cogvideox-2b.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/video/cogvideox-2b.po new file mode 100644 index 0000000000..5653fa0839 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/video/cogvideox-2b.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 17:44+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/video/cogvideox-2b.rst:5 +msgid "CogVideoX-2b" +msgstr "" + +#: ../../source/models/builtin/video/cogvideox-2b.rst:7 +msgid "**Model Name:** CogVideoX-2b" +msgstr "" + +#: ../../source/models/builtin/video/cogvideox-2b.rst:8 +msgid "**Model Family:** CogVideoX" +msgstr "" + +#: ../../source/models/builtin/video/cogvideox-2b.rst:9 +msgid "**Abilities:** text2video" +msgstr "" + +#: ../../source/models/builtin/video/cogvideox-2b.rst:12 +msgid "Specifications" +msgstr "" + +#: ../../source/models/builtin/video/cogvideox-2b.rst:14 +msgid "**Model ID:** THUDM/CogVideoX-2b" +msgstr "" + +#: ../../source/models/builtin/video/cogvideox-2b.rst:16 +msgid "Execute the following command to launch the model::" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/video/index.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/video/index.po new file mode 100644 index 0000000000..436fa8d3ec --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/builtin/video/index.po @@ -0,0 +1,29 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 17:44+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/builtin/video/index.rst:5 +msgid "Video Models" +msgstr "视频模型" + +#: ../../source/models/builtin/video/index.rst:7 +msgid "The following is a list of built-in video models in Xinference:" +msgstr "以下是 Xinference 中内置的视频模型列表:" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/index.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/index.po index 1993ec6576..d3951e82e0 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/index.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/index.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-31 11:46+0800\n" +"POT-Creation-Date: 2024-08-13 17:44+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -77,7 +77,15 @@ msgstr "" msgid "Rerank models" msgstr "重排序模型" -#: ../../source/models/index.rst:69 +#: ../../source/models/index.rst:67 +msgid "video" +msgstr "" + +#: ../../source/models/index.rst:71 +msgid "Video models" +msgstr "视频模型" + +#: ../../source/models/index.rst:75 msgid "" "You can see all the built-in models supported by xinference :ref:`here " "<models_builtin_index>`. If the model you need is not available, " @@ -88,11 +96,11 @@ msgstr "" "内置模型。如果你需要的模型不可用,Xinference 还允许你注册自己的 :ref:`" "自定义模型 <models_custom>`。" -#: ../../source/models/index.rst:74 +#: ../../source/models/index.rst:80 msgid "Launch and Terminate Model" msgstr "启动和停止模型" -#: ../../source/models/index.rst:76 +#: ../../source/models/index.rst:82 msgid "" "Each running model instance will be assigned a unique model uid. By " "default, the model uid is equal to the model name. This unique id can be " @@ -103,13 +111,13 @@ msgstr "" "名。这个 ID 是后续使用模型实例的句柄,启动命令 ``--model-uid`` 选项可以" "手动指定它。" -#: ../../source/models/index.rst:80 +#: ../../source/models/index.rst:86 msgid "" "You can launch a model in Xinference either via command line or " "Xinference's Python client:" msgstr "你可以通过命令行或者 Xinference 的 Python 客户端来启动一个模型。" -#: ../../source/models/index.rst:107 +#: ../../source/models/index.rst:113 msgid "" "For model type ``LLM``, launching the model requires not only specifying " "the model name, but also the size of the parameters , the model format " @@ -119,75 +127,83 @@ msgstr "" "对于模型类型 ``LLM``,启动模型不仅需要指定模型名称,还需要参数的大小、" "模型格式以及模型引擎。请参考 :ref:`models_llm_index` 文档。" -#: ../../source/models/index.rst:110 +#: ../../source/models/index.rst:116 msgid "" "The following command gives you the currently running models in " "Xinference:" msgstr "以下命令可以列出 Xinference 中正在运行的模型:" -#: ../../source/models/index.rst:131 +#: ../../source/models/index.rst:137 msgid "" "When you no longer need a model that is currently running, you can remove" " it in the following way to free up the resources it occupies:" msgstr "当你不再需要当前正在运行的模型时,以下列方式释放其占用的资源:" -#: ../../source/models/index.rst:155 +#: ../../source/models/index.rst:161 msgid "Model Usage" msgstr "模型使用" -#: ../../source/models/index.rst:160 +#: ../../source/models/index.rst:166 msgid "Chat & Generate" msgstr "聊天 & 生成" -#: ../../source/models/index.rst:164 +#: ../../source/models/index.rst:170 msgid "Learn how to chat with LLMs in Xinference." msgstr "学习如何在 Xinference 中与 LLM聊天。" -#: ../../source/models/index.rst:166 +#: ../../source/models/index.rst:172 msgid "Tools" msgstr "工具" -#: ../../source/models/index.rst:170 +#: ../../source/models/index.rst:176 msgid "Learn how to connect LLM with external tools." msgstr "学习如何将 LLM 与外部工具连接起来。" -#: ../../source/models/index.rst:175 +#: ../../source/models/index.rst:181 msgid "Embeddings" msgstr "嵌入" -#: ../../source/models/index.rst:179 +#: ../../source/models/index.rst:185 msgid "Learn how to create text embeddings in Xinference." msgstr "学习如何在 Xinference 中创建文本嵌入。" -#: ../../source/models/index.rst:181 +#: ../../source/models/index.rst:187 msgid "Rerank" msgstr "重排序" -#: ../../source/models/index.rst:185 +#: ../../source/models/index.rst:191 msgid "Learn how to use rerank models in Xinference." msgstr "学习如何在 Xinference 中使用重排序模型。" -#: ../../source/models/index.rst:190 +#: ../../source/models/index.rst:196 msgid "Images" msgstr "图像" -#: ../../source/models/index.rst:194 +#: ../../source/models/index.rst:200 msgid "Learn how to generate images with Xinference." msgstr "学习如何使用Xinference生成图像。" -#: ../../source/models/index.rst:196 +#: ../../source/models/index.rst:202 msgid "Vision" msgstr "视觉" -#: ../../source/models/index.rst:200 +#: ../../source/models/index.rst:206 msgid "Learn how to process image with LLMs." msgstr "学习如何使用 LLM 处理图像。" -#: ../../source/models/index.rst:205 +#: ../../source/models/index.rst:211 msgid "Audio" msgstr "音频" -#: ../../source/models/index.rst:209 +#: ../../source/models/index.rst:215 msgid "Learn how to turn audio into text or text into audio with Xinference." msgstr "学习如何使用 Xinference 将音频转换为文本或将文本转换为音频。" +#: ../../source/models/index.rst:217 +msgid "Video" +msgstr "视频" + +#: ../../source/models/index.rst:221 +msgid "Learn how to generate video with Xinference." +msgstr "学习如何使用Xinference生成视频。" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po index 1207f7f27b..66b4935516 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/image.po @@ -128,7 +128,7 @@ msgstr "" "API。" #: ../../source/models/model_abilities/image.rst:109 -msgid "Tips for Large Image models including sd3-medium, FLUX.1" +msgid "Tips for Large Image Models including SD3-Medium, FLUX.1" msgstr "大型图像模型部署(sd3-medium、FLUX.1 系列)贴士" #: ../../source/models/model_abilities/image.rst:111 diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/video.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/video.po new file mode 100644 index 0000000000..15660a07c4 --- /dev/null +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/video.po @@ -0,0 +1,101 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2023, Xorbits Inc. +# This file is distributed under the same license as the Xinference package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Xinference \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 17:44+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.14.0\n" + +#: ../../source/models/model_abilities/video.rst:5 +msgid "Video (Experimental)" +msgstr "视频(实验性质)" + +#: ../../source/models/model_abilities/video.rst:7 +msgid "Learn how to generate videos with Xinference." +msgstr "学习如何使用 Xinference 生成视频" + +#: ../../source/models/model_abilities/video.rst:11 +msgid "Introduction" +msgstr "介绍" + +#: ../../source/models/model_abilities/video.rst:14 +msgid "The Video API provides the ability to interact with videos:" +msgstr "Video API 提供了和视频交互的方式:" + +#: ../../source/models/model_abilities/video.rst:17 +msgid "" +"The text-to-video endpoint create videos from scratch based on a text " +"prompt." +msgstr "Text-to-video 端点将一段文本提示词从头开始创建视频" + +#: ../../source/models/model_abilities/video.rst:24 +msgid "API ENDPOINT" +msgstr "API 端点" + +#: ../../source/models/model_abilities/video.rst:25 +msgid "OpenAI-compatible ENDPOINT" +msgstr "OpenAI 兼容端点" + +#: ../../source/models/model_abilities/video.rst:27 +msgid "Text-to-Video API" +msgstr "" + +#: ../../source/models/model_abilities/video.rst:28 +msgid "/v1/video/generations" +msgstr "" + +#: ../../source/models/model_abilities/video.rst:31 +msgid "Supported models" +msgstr "支持的模型列表" + +#: ../../source/models/model_abilities/video.rst:33 +msgid "" +"The Text-to-video API is supported with the following models in " +"Xinference:" +msgstr "Text-to-video API 在 Xinference 中支持以下模型:" + +#: ../../source/models/model_abilities/video.rst:35 +msgid "CogVideoX-2b" +msgstr "" + +#: ../../source/models/model_abilities/video.rst:39 +msgid "Quickstart" +msgstr "快速入门" + +#: ../../source/models/model_abilities/video.rst:42 +msgid "Text-to-video" +msgstr "文生视频" + +#: ../../source/models/model_abilities/video.rst:44 +msgid "" +"You can try Text-to-video API out either via cURL, or Xinference's python" +" client:" +msgstr "可以通过 cURL 或 Xinference 的方式尝试使用 Text-to-video API" + +#: ../../source/models/model_abilities/video.rst:72 +msgid "Tips when running on GPU whose memory less than 24GB" +msgstr "在小于 24GB 显存的 GPU 上运行贴士" + +#: ../../source/models/model_abilities/video.rst:74 +msgid "" +"Text-to-video will occupy huge GPU memory, for instance, running " +"CogVideoX may require up to around 35 GB GPU memory. When running on GPU " +"whose memory is less than 24 GB, we recommend to add ``--cpu_offload " +"True`` when launching model." +msgstr "" +"Text-to-video 会占用大量显存,举例来说,运行 CogVideoX 可能会使用到约 35 GB 的显存," +"当在小于 24 GB 的 GPU 上运行时,推荐添加 ``--cpu_offload True`` 来加载模型。" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po b/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po index 64ef974c4f..7612ac1155 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/reference/index.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-08 14:38+0800\n" +"POT-Creation-Date: 2024-08-13 17:44+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.11.0\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/reference/index.rst:5 msgid "API Reference" @@ -244,46 +244,50 @@ msgstr "" msgid "AudioModelHandle" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:82:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.AudioModelHandle " "<xinference.client.handlers.AudioModelHandle>`\\" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:82:<autosummary>:1 msgid "" "alias of " ":py:class:`~xinference.client.restful.restful_client.RESTfulAudioModelHandle`" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:82:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.AudioModelHandle.transcriptions " "<xinference.client.handlers.AudioModelHandle.transcriptions>`\\ " "\\(audio\\)" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:82:<autosummary>:1 msgid "Transcribes audio into the input language." msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:82:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.AudioModelHandle.translations " "<xinference.client.handlers.AudioModelHandle.translations>`\\ \\(audio\\)" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:82:<autosummary>:1 msgid "Translates audio into English." msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:82:<autosummary>:1 msgid "" ":py:obj:`xinference.client.handlers.AudioModelHandle.speech " "<xinference.client.handlers.AudioModelHandle.speech>`\\ \\(input\\)" msgstr "" -#: ../../source/reference/index.rst:80:<autosummary>:1 +#: ../../source/reference/index.rst:82:<autosummary>:1 msgid "Generates audio from the input text." msgstr "" +#: ../../source/reference/index.rst:84 +msgid "VideoModelHandle" +msgstr "" + diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po index 686eca5f64..07e9d11568 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-30 17:04+0800\n" +"POT-Creation-Date: 2024-08-13 17:44+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -140,8 +140,8 @@ msgstr "目前,支持的模型包括:" #: ../../source/user_guide/backends.rst:49 msgid "" -"``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``, " -"``llama-3.1``, ``llama-3.1-instruct``" +"``llama-2``, ``llama-3``, ``llama-3.1``, ``llama-2-chat``, " +"``llama-3-instruct``, ``llama-3.1-instruct``" msgstr "" #: ../../source/user_guide/backends.rst:50 @@ -224,7 +224,7 @@ msgid "``qwen2-instruct``, ``qwen2-moe-instruct``" msgstr "" #: ../../source/user_guide/backends.rst:68 -msgid "``gemma-it``" +msgid "``gemma-it``, ``gemma-2-it``" msgstr "" #: ../../source/user_guide/backends.rst:69 @@ -262,9 +262,9 @@ msgid "" "to use for Mac users when running on Apple silicon if the model has MLX " "format support." msgstr "" -"`MLX <https://github.com/ml-explore/mlx-examples/tree/main/llms>`_ " -"提供在苹果 silicon 芯片上高效运行 LLM 的方式。在模型包含 MLX 格式的时候," -"推荐使用苹果 silicon 芯片的 Mac 用户使用 MLX 引擎。" +"`MLX <https://github.com/ml-explore/mlx-examples/tree/main/llms>`_ 提供在" +"苹果 silicon 芯片上高效运行 LLM 的方式。在模型包含 MLX 格式的时候,推荐" +"使用苹果 silicon 芯片的 Mac 用户使用 MLX 引擎。" #~ msgid "``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``" #~ msgstr "" @@ -272,3 +272,12 @@ msgstr "" #~ msgid "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``" #~ msgstr "" +#~ msgid "" +#~ "``llama-2``, ``llama-3``, ``llama-2-chat``, " +#~ "``llama-3-instruct``, ``llama-3.1``, " +#~ "``llama-3.1-instruct``" +#~ msgstr "" + +#~ msgid "``gemma-it``" +#~ msgstr "" + diff --git a/doc/source/models/builtin/embedding/index.rst b/doc/source/models/builtin/embedding/index.rst index 11b16d117f..5afa52c21d 100644 --- a/doc/source/models/builtin/embedding/index.rst +++ b/doc/source/models/builtin/embedding/index.rst @@ -45,6 +45,8 @@ The following is a list of built-in embedding models in Xinference: gte-large + gte-qwen2 + jina-embeddings-v2-base-en jina-embeddings-v2-base-zh diff --git a/doc/source/models/builtin/image/index.rst b/doc/source/models/builtin/image/index.rst index c1b00f57fb..5bc8744338 100644 --- a/doc/source/models/builtin/image/index.rst +++ b/doc/source/models/builtin/image/index.rst @@ -15,6 +15,8 @@ The following is a list of built-in image models in Xinference: flux.1-schnell + kolors + sd-turbo sd3-medium diff --git a/doc/source/models/builtin/index.rst b/doc/source/models/builtin/index.rst index 6e1d55b906..6b3ac98cee 100644 --- a/doc/source/models/builtin/index.rst +++ b/doc/source/models/builtin/index.rst @@ -12,3 +12,4 @@ Builtin Models image/index audio/index rerank/index + video/index diff --git a/doc/source/models/builtin/llm/c4ai-command-r-v01.rst b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst index af9eba23dc..22594c385c 100644 --- a/doc/source/models/builtin/llm/c4ai-command-r-v01.rst +++ b/doc/source/models/builtin/llm/c4ai-command-r-v01.rst @@ -22,7 +22,7 @@ Model Spec 1 (pytorch, 35 Billion) - **Quantizations:** none - **Engines**: vLLM, Transformers - **Model ID:** CohereForAI/c4ai-command-r-v01 -- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-v01>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/c4ai-command-r-v01>`__ +- **Model Hubs**: `Hugging Face <https://huggingface.co/CohereForAI/c4ai-command-r-v01>`__, `ModelScope <https://modelscope.cn/models/mirror013/c4ai-command-r-v01-4bit>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: diff --git a/doc/source/models/builtin/llm/gemma-2-it.rst b/doc/source/models/builtin/llm/gemma-2-it.rst index 5e6047114d..780e4b1c5f 100644 --- a/doc/source/models/builtin/llm/gemma-2-it.rst +++ b/doc/source/models/builtin/llm/gemma-2-it.rst @@ -14,13 +14,29 @@ Specifications ^^^^^^^^^^^^^^ -Model Spec 1 (pytorch, 9 Billion) +Model Spec 1 (pytorch, 2 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 2 +- **Quantizations:** none, 4-bit, 8-bit +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) +- **Model ID:** google/gemma-2-2b-it +- **Model Hubs**: `Hugging Face <https://huggingface.co/google/gemma-2-2b-it>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/gemma-2-2b-it>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 2 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 9 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch - **Model Size (in billions):** 9 - **Quantizations:** none, 4-bit, 8-bit -- **Engines**: Transformers +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** google/gemma-2-9b-it - **Model Hubs**: `Hugging Face <https://huggingface.co/google/gemma-2-9b-it>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/gemma-2-9b-it>`__ @@ -30,13 +46,13 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format pytorch --quantization ${quantization} -Model Spec 2 (pytorch, 27 Billion) +Model Spec 3 (pytorch, 27 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch - **Model Size (in billions):** 27 - **Quantizations:** none, 4-bit, 8-bit -- **Engines**: Transformers +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** google/gemma-2-27b-it - **Model Hubs**: `Hugging Face <https://huggingface.co/google/gemma-2-27b-it>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/gemma-2-27b-it>`__ @@ -46,7 +62,23 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 27 --model-format pytorch --quantization ${quantization} -Model Spec 3 (ggufv2, 9 Billion) +Model Spec 4 (ggufv2, 2 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 2 +- **Quantizations:** Q3_K_L, Q4_K_M, Q4_K_S, Q5_K_M, Q5_K_S, Q6_K, Q6_K_L, Q8_0, f32 +- **Engines**: llama.cpp +- **Model ID:** bartowski/gemma-2-2b-it-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/bartowski/gemma-2-2b-it-GGUF>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 2 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 5 (ggufv2, 9 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -62,7 +94,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format ggufv2 --quantization ${quantization} -Model Spec 4 (ggufv2, 27 Billion) +Model Spec 6 (ggufv2, 27 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -78,7 +110,55 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 27 --model-format ggufv2 --quantization ${quantization} -Model Spec 5 (mlx, 9 Billion) +Model Spec 7 (mlx, 2 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 2 +- **Quantizations:** 4-bit +- **Engines**: MLX +- **Model ID:** mlx-community/gemma-2-2b-it-4bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/gemma-2-2b-it-4bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 2 --model-format mlx --quantization ${quantization} + + +Model Spec 8 (mlx, 2 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 2 +- **Quantizations:** 8-bit +- **Engines**: MLX +- **Model ID:** mlx-community/gemma-2-2b-it-8bit +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/gemma-2-2b-it-8bit>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 2 --model-format mlx --quantization ${quantization} + + +Model Spec 9 (mlx, 2 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** mlx +- **Model Size (in billions):** 2 +- **Quantizations:** None +- **Engines**: MLX +- **Model ID:** mlx-community/gemma-2-2b-it +- **Model Hubs**: `Hugging Face <https://huggingface.co/mlx-community/gemma-2-2b-it>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 2 --model-format mlx --quantization ${quantization} + + +Model Spec 10 (mlx, 9 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -94,7 +174,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format mlx --quantization ${quantization} -Model Spec 6 (mlx, 9 Billion) +Model Spec 11 (mlx, 9 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -110,7 +190,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format mlx --quantization ${quantization} -Model Spec 7 (mlx, 9 Billion) +Model Spec 12 (mlx, 9 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -126,7 +206,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 9 --model-format mlx --quantization ${quantization} -Model Spec 8 (mlx, 27 Billion) +Model Spec 13 (mlx, 27 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -142,7 +222,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 27 --model-format mlx --quantization ${quantization} -Model Spec 9 (mlx, 27 Billion) +Model Spec 14 (mlx, 27 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -158,7 +238,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name gemma-2-it --size-in-billions 27 --model-format mlx --quantization ${quantization} -Model Spec 10 (mlx, 27 Billion) +Model Spec 15 (mlx, 27 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx diff --git a/doc/source/models/builtin/llm/gemma-it.rst b/doc/source/models/builtin/llm/gemma-it.rst index cee7c7eb1f..687a812fb0 100644 --- a/doc/source/models/builtin/llm/gemma-it.rst +++ b/doc/source/models/builtin/llm/gemma-it.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 - **Quantizations:** none, 4-bit, 8-bit -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** google/gemma-2b-it - **Model Hubs**: `Hugging Face <https://huggingface.co/google/gemma-2b-it>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/gemma-2b-it>`__ @@ -36,7 +36,7 @@ Model Spec 2 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** none, 4-bit, 8-bit -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** google/gemma-7b-it - **Model Hubs**: `Hugging Face <https://huggingface.co/google/gemma-7b-it>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/gemma-7b-it>`__ diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index aabec0054d..100c590569 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -318,9 +318,14 @@ The following is a list of built-in LLM in Xinference: * - :ref:`minicpm-llama3-v-2_5 <models_llm_minicpm-llama3-v-2_5>` - chat, vision - - 2048 + - 8192 - MiniCPM-Llama3-V 2.5 is the latest model in the MiniCPM-V series. The model is built on SigLip-400M and Llama3-8B-Instruct with a total of 8B parameters. + * - :ref:`minicpm-v-2.6 <models_llm_minicpm-v-2.6>` + - chat, vision + - 32768 + - MiniCPM-V 2.6 is the latest model in the MiniCPM-V series. The model is built on SigLip-400M and Qwen2-7B with a total of 8B parameters. + * - :ref:`mistral-instruct-v0.1 <models_llm_mistral-instruct-v0.1>` - chat - 8192 @@ -713,6 +718,8 @@ The following is a list of built-in LLM in Xinference: minicpm-llama3-v-2_5 + minicpm-v-2.6 + mistral-instruct-v0.1 mistral-instruct-v0.2 diff --git a/doc/source/models/builtin/llm/internlm2.5-chat.rst b/doc/source/models/builtin/llm/internlm2.5-chat.rst index 6813f1669a..f2fd7b7bd9 100644 --- a/doc/source/models/builtin/llm/internlm2.5-chat.rst +++ b/doc/source/models/builtin/llm/internlm2.5-chat.rst @@ -14,7 +14,23 @@ Specifications ^^^^^^^^^^^^^^ -Model Spec 1 (pytorch, 7 Billion) +Model Spec 1 (pytorch, 1_8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 1_8 +- **Quantizations:** none +- **Engines**: vLLM, Transformers +- **Model ID:** internlm/internlm2_5-1_8b-chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-1_8b-chat>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 1_8 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch @@ -30,7 +46,23 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format pytorch --quantization ${quantization} -Model Spec 2 (gptq, 7 Billion) +Model Spec 3 (pytorch, 20 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 20 +- **Quantizations:** none +- **Engines**: vLLM, Transformers +- **Model ID:** internlm/internlm2_5-20b-chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-20b-chat>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-20b-chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 20 --model-format pytorch --quantization ${quantization} + + +Model Spec 4 (gptq, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** gptq @@ -46,7 +78,23 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format gptq --quantization ${quantization} -Model Spec 3 (ggufv2, 7 Billion) +Model Spec 5 (ggufv2, 1_8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 1_8 +- **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** internlm/internlm2_5-1_8b-chat-gguf +- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-1_8b-chat-gguf>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 1_8 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 6 (ggufv2, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -54,7 +102,7 @@ Model Spec 3 (ggufv2, 7 Billion) - **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 - **Engines**: llama.cpp - **Model ID:** internlm/internlm2_5-7b-chat-gguf -- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-7b-chat-gguf>`__ +- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-7b-chat-gguf>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2_5-7b-chat-gguf>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: @@ -62,7 +110,23 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} -Model Spec 4 (mlx, 7 Billion) +Model Spec 7 (ggufv2, 20 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** ggufv2 +- **Model Size (in billions):** 20 +- **Quantizations:** q2_k, q3_k_m, q4_0, q4_k_m, q5_0, q5_k_m, q6_k, q8_0, fp16 +- **Engines**: llama.cpp +- **Model ID:** internlm/internlm2_5-20b-chat-gguf +- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm2_5-20b-chat-gguf>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 20 --model-format ggufv2 --quantization ${quantization} + + +Model Spec 8 (mlx, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -78,7 +142,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name internlm2.5-chat --size-in-billions 7 --model-format mlx --quantization ${quantization} -Model Spec 5 (mlx, 7 Billion) +Model Spec 9 (mlx, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx diff --git a/doc/source/models/builtin/llm/llama-2-chat.rst b/doc/source/models/builtin/llm/llama-2-chat.rst index 4669cf0618..552ba6424b 100644 --- a/doc/source/models/builtin/llm/llama-2-chat.rst +++ b/doc/source/models/builtin/llm/llama-2-chat.rst @@ -68,7 +68,7 @@ Model Spec 4 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Llama-2-7b-chat-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-7b-chat-hf>`__, `ModelScope <https://modelscope.cn/models/modelscope/Llama-2-7b-chat-ms>`__ @@ -84,7 +84,7 @@ Model Spec 5 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-7B-Chat-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-Chat-GPTQ>`__ @@ -100,7 +100,7 @@ Model Spec 6 (gptq, 70 Billion) - **Model Format:** gptq - **Model Size (in billions):** 70 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-70B-Chat-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-Chat-GPTQ>`__ @@ -116,7 +116,7 @@ Model Spec 7 (awq, 70 Billion) - **Model Format:** awq - **Model Size (in billions):** 70 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-70B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-Chat-AWQ>`__ @@ -132,7 +132,7 @@ Model Spec 8 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-7B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-Chat-AWQ>`__ @@ -148,7 +148,7 @@ Model Spec 9 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Llama-2-13b-chat-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-13b-chat-hf>`__, `ModelScope <https://modelscope.cn/models/modelscope/Llama-2-13b-chat-ms>`__ @@ -164,7 +164,7 @@ Model Spec 10 (gptq, 13 Billion) - **Model Format:** gptq - **Model Size (in billions):** 13 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-13B-chat-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-chat-GPTQ>`__ @@ -180,7 +180,7 @@ Model Spec 11 (awq, 13 Billion) - **Model Format:** awq - **Model Size (in billions):** 13 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-13B-chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-chat-AWQ>`__ @@ -196,7 +196,7 @@ Model Spec 12 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Llama-2-70b-chat-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-70b-chat-hf>`__, `ModelScope <https://modelscope.cn/models/modelscope/Llama-2-70b-chat-ms>`__ diff --git a/doc/source/models/builtin/llm/llama-2.rst b/doc/source/models/builtin/llm/llama-2.rst index 018212d27b..0f836bd072 100644 --- a/doc/source/models/builtin/llm/llama-2.rst +++ b/doc/source/models/builtin/llm/llama-2.rst @@ -36,7 +36,7 @@ Model Spec 2 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-7B-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-GPTQ>`__ @@ -52,7 +52,7 @@ Model Spec 3 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-7B-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-AWQ>`__ @@ -100,7 +100,7 @@ Model Spec 6 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Llama-2-7b-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-7b-hf>`__ @@ -116,7 +116,7 @@ Model Spec 7 (pytorch, 13 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 13 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Llama-2-13b-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-13b-hf>`__ @@ -132,7 +132,7 @@ Model Spec 8 (gptq, 13 Billion) - **Model Format:** gptq - **Model Size (in billions):** 13 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-13B-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-GPTQ>`__ @@ -148,7 +148,7 @@ Model Spec 9 (awq, 13 Billion) - **Model Format:** awq - **Model Size (in billions):** 13 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-13B-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-AWQ>`__ @@ -164,7 +164,7 @@ Model Spec 10 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Llama-2-70b-hf - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Llama-2-70b-hf>`__ @@ -180,7 +180,7 @@ Model Spec 11 (gptq, 70 Billion) - **Model Format:** gptq - **Model Size (in billions):** 70 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-70B-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-GPTQ>`__ @@ -196,7 +196,7 @@ Model Spec 12 (awq, 70 Billion) - **Model Format:** awq - **Model Size (in billions):** 70 - **Quantizations:** Int4 -- **Engines**: vLLM +- **Engines**: vLLM, SGLang - **Model ID:** TheBloke/Llama-2-70B-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-AWQ>`__ diff --git a/doc/source/models/builtin/llm/llama-3-instruct.rst b/doc/source/models/builtin/llm/llama-3-instruct.rst index bfa0ffdfe8..327be127ab 100644 --- a/doc/source/models/builtin/llm/llama-3-instruct.rst +++ b/doc/source/models/builtin/llm/llama-3-instruct.rst @@ -36,7 +36,7 @@ Model Spec 2 (pytorch, 8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 8 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3-8B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B-Instruct>`__ @@ -68,7 +68,7 @@ Model Spec 4 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3-70B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B-Instruct>`__ @@ -173,3 +173,35 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 70 --model-format mlx --quantization ${quantization} + +Model Spec 11 (gptq, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 8 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers, SGLang +- **Model ID:** TechxGenus/Meta-Llama-3-8B-Instruct-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TechxGenus/Meta-Llama-3-8B-Instruct-GPTQ>`__, `ModelScope <https://modelscope.cn/models/swift/Meta-Llama-3-8B-Instruct-GPTQ-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 8 --model-format gptq --quantization ${quantization} + + +Model Spec 12 (gptq, 70 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 70 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers, SGLang +- **Model ID:** TechxGenus/Meta-Llama-3-70B-Instruct-GPTQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/TechxGenus/Meta-Llama-3-70B-Instruct-GPTQ>`__, `ModelScope <https://modelscope.cn/models/swift/Meta-Llama-3-70B-Instruct-GPTQ-{quantization}>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3-instruct --size-in-billions 70 --model-format gptq --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/llama-3.1-instruct.rst b/doc/source/models/builtin/llm/llama-3.1-instruct.rst index 9460eb7874..350e333bb3 100644 --- a/doc/source/models/builtin/llm/llama-3.1-instruct.rst +++ b/doc/source/models/builtin/llm/llama-3.1-instruct.rst @@ -36,7 +36,7 @@ Model Spec 2 (pytorch, 8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 8 - **Quantizations:** none -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** meta-llama/Meta-Llama-3.1-8B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct>`__ @@ -68,7 +68,7 @@ Model Spec 4 (gptq, 8 Billion) - **Model Format:** gptq - **Model Size (in billions):** 8 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4 - **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4>`__ @@ -84,7 +84,7 @@ Model Spec 5 (awq, 8 Billion) - **Model Format:** awq - **Model Size (in billions):** 8 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4 - **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4>`__ @@ -116,7 +116,7 @@ Model Spec 7 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** none -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** meta-llama/Meta-Llama-3.1-70B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct>`__ @@ -148,7 +148,7 @@ Model Spec 9 (gptq, 70 Billion) - **Model Format:** gptq - **Model Size (in billions):** 70 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4 - **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4>`__ @@ -164,7 +164,7 @@ Model Spec 10 (awq, 70 Billion) - **Model Format:** awq - **Model Size (in billions):** 70 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4 - **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4>`__ @@ -269,3 +269,51 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 70 --model-format mlx --quantization ${quantization} + +Model Spec 17 (pytorch, 405 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 405 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) +- **Model ID:** meta-llama/Meta-Llama-3.1-405B-Instruct +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-405B-Instruct>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 405 --model-format pytorch --quantization ${quantization} + + +Model Spec 18 (gptq, 405 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** gptq +- **Model Size (in billions):** 405 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers, SGLang +- **Model ID:** hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4 +- **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 405 --model-format gptq --quantization ${quantization} + + +Model Spec 19 (awq, 405 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 405 +- **Quantizations:** Int4 +- **Engines**: vLLM, Transformers, SGLang +- **Model ID:** hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4 +- **Model Hubs**: `Hugging Face <https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B-Instruct-AWQ-INT4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1-instruct --size-in-billions 405 --model-format awq --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/llama-3.1.rst b/doc/source/models/builtin/llm/llama-3.1.rst index 8afb580545..bd7218ce66 100644 --- a/doc/source/models/builtin/llm/llama-3.1.rst +++ b/doc/source/models/builtin/llm/llama-3.1.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 8 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3.1-8B - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-8B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B>`__ @@ -52,7 +52,7 @@ Model Spec 3 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3.1-70B - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-70B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B>`__ @@ -61,3 +61,19 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name llama-3.1 --size-in-billions 70 --model-format pytorch --quantization ${quantization} + +Model Spec 4 (pytorch, 405 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 405 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) +- **Model ID:** meta-llama/Meta-Llama-3.1-405B +- **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3.1-405B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-405B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name llama-3.1 --size-in-billions 405 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/llama-3.rst b/doc/source/models/builtin/llm/llama-3.rst index d3d76cada8..9f989afc80 100644 --- a/doc/source/models/builtin/llm/llama-3.rst +++ b/doc/source/models/builtin/llm/llama-3.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 8 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3-8B - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-8B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B>`__ @@ -52,7 +52,7 @@ Model Spec 3 (pytorch, 70 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 70 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** meta-llama/Meta-Llama-3-70B - **Model Hubs**: `Hugging Face <https://huggingface.co/meta-llama/Meta-Llama-3-70B>`__, `ModelScope <https://modelscope.cn/models/LLM-Research/Meta-Llama-3-70B>`__ diff --git a/doc/source/models/builtin/llm/minicpm-llama3-v-2_5.rst b/doc/source/models/builtin/llm/minicpm-llama3-v-2_5.rst index 1d3ff9db78..10ccf85472 100644 --- a/doc/source/models/builtin/llm/minicpm-llama3-v-2_5.rst +++ b/doc/source/models/builtin/llm/minicpm-llama3-v-2_5.rst @@ -4,7 +4,7 @@ MiniCPM-Llama3-V-2_5 ======================================== -- **Context Length:** 2048 +- **Context Length:** 8192 - **Model Name:** MiniCPM-Llama3-V-2_5 - **Languages:** en, zh - **Abilities:** chat, vision diff --git a/doc/source/models/builtin/llm/minicpm-v-2.6.rst b/doc/source/models/builtin/llm/minicpm-v-2.6.rst new file mode 100644 index 0000000000..e91a6b7719 --- /dev/null +++ b/doc/source/models/builtin/llm/minicpm-v-2.6.rst @@ -0,0 +1,47 @@ +.. _models_llm_minicpm-v-2.6: + +======================================== +MiniCPM-V-2.6 +======================================== + +- **Context Length:** 32768 +- **Model Name:** MiniCPM-V-2.6 +- **Languages:** en, zh +- **Abilities:** chat, vision +- **Description:** MiniCPM-V 2.6 is the latest model in the MiniCPM-V series. The model is built on SigLip-400M and Qwen2-7B with a total of 8B parameters. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** none +- **Engines**: Transformers +- **Model ID:** openbmb/MiniCPM-V-2_6 +- **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-V-2_6>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/MiniCPM-V-2_6-int4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name MiniCPM-V-2.6 --size-in-billions 8 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** 4-bit +- **Engines**: Transformers +- **Model ID:** openbmb/MiniCPM-V-2_6-int4 +- **Model Hubs**: `Hugging Face <https://huggingface.co/openbmb/MiniCPM-V-2_6-int4>`__, `ModelScope <https://modelscope.cn/models/OpenBMB/MiniCPM-V-2_6-int4>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name MiniCPM-V-2.6 --size-in-billions 8 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/mistral-instruct-v0.1.rst b/doc/source/models/builtin/llm/mistral-instruct-v0.1.rst index 331b263008..b0ae72b0a9 100644 --- a/doc/source/models/builtin/llm/mistral-instruct-v0.1.rst +++ b/doc/source/models/builtin/llm/mistral-instruct-v0.1.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** mistralai/Mistral-7B-Instruct-v0.1 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Mistral-7B-Instruct-v0.1>`__ @@ -36,7 +36,7 @@ Model Spec 2 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.1-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.1-AWQ>`__ @@ -52,7 +52,7 @@ Model Spec 3 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.1-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.1-GPTQ>`__ diff --git a/doc/source/models/builtin/llm/mistral-instruct-v0.2.rst b/doc/source/models/builtin/llm/mistral-instruct-v0.2.rst index 582a7e975f..ec85c0c61e 100644 --- a/doc/source/models/builtin/llm/mistral-instruct-v0.2.rst +++ b/doc/source/models/builtin/llm/mistral-instruct-v0.2.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** mistralai/Mistral-7B-Instruct-v0.2 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Mistral-7B-Instruct-v0.2>`__ @@ -36,7 +36,7 @@ Model Spec 2 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.2-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GPTQ>`__ @@ -52,7 +52,7 @@ Model Spec 3 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** TheBloke/Mistral-7B-Instruct-v0.2-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-AWQ>`__ diff --git a/doc/source/models/builtin/llm/mistral-v0.1.rst b/doc/source/models/builtin/llm/mistral-v0.1.rst index 28eec28141..0815ef68ca 100644 --- a/doc/source/models/builtin/llm/mistral-v0.1.rst +++ b/doc/source/models/builtin/llm/mistral-v0.1.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** mistralai/Mistral-7B-v0.1 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mistral-7B-v0.1>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Mistral-7B-v0.1>`__ diff --git a/doc/source/models/builtin/llm/mixtral-instruct-v0.1.rst b/doc/source/models/builtin/llm/mixtral-instruct-v0.1.rst index 6dfaf7ef1f..fe7a405107 100644 --- a/doc/source/models/builtin/llm/mixtral-instruct-v0.1.rst +++ b/doc/source/models/builtin/llm/mixtral-instruct-v0.1.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 46_7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 46_7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** mistralai/Mixtral-8x7B-Instruct-v0.1 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7B-Instruct-v0.1>`__ @@ -36,7 +36,7 @@ Model Spec 2 (awq, 46_7 Billion) - **Model Format:** awq - **Model Size (in billions):** 46_7 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** TheBloke/Mixtral-8x7B-Instruct-v0.1-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mixtral-8x7B-Instruct-v0.1-AWQ>`__ @@ -52,7 +52,7 @@ Model Spec 3 (gptq, 46_7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 46_7 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** TheBloke/Mixtral-8x7B-Instruct-v0.1-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mixtral-8x7B-Instruct-v0.1-GPTQ>`__ diff --git a/doc/source/models/builtin/llm/mixtral-v0.1.rst b/doc/source/models/builtin/llm/mixtral-v0.1.rst index 4ce8cd9401..0ceaab1375 100644 --- a/doc/source/models/builtin/llm/mixtral-v0.1.rst +++ b/doc/source/models/builtin/llm/mixtral-v0.1.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 46_7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 46_7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers +- **Engines**: Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** mistralai/Mixtral-8x7B-v0.1 - **Model Hubs**: `Hugging Face <https://huggingface.co/mistralai/Mixtral-8x7B-v0.1>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/Mixtral-8x7B-v0.1>`__ @@ -36,7 +36,7 @@ Model Spec 2 (gptq, 46_7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 46_7 - **Quantizations:** Int4 -- **Engines**: Transformers +- **Engines**: Transformers, SGLang - **Model ID:** TheBloke/Mixtral-8x7B-v0.1-GPTQ - **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Mixtral-8x7B-v0.1-GPTQ>`__ diff --git a/doc/source/models/builtin/llm/qwen-chat.rst b/doc/source/models/builtin/llm/qwen-chat.rst index 149804d04e..d0b6ddcfdc 100644 --- a/doc/source/models/builtin/llm/qwen-chat.rst +++ b/doc/source/models/builtin/llm/qwen-chat.rst @@ -52,7 +52,7 @@ Model Spec 3 (pytorch, 1_8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1_8 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen-1_8B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-1_8B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-1_8B-Chat>`__ @@ -68,7 +68,7 @@ Model Spec 4 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen-7B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-7B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-7B-Chat>`__ @@ -84,7 +84,7 @@ Model Spec 5 (pytorch, 14 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 14 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen-14B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-14B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-14B-Chat>`__ @@ -100,7 +100,7 @@ Model Spec 6 (pytorch, 72 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 72 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen-72B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-72B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-72B-Chat>`__ @@ -116,7 +116,7 @@ Model Spec 7 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen-7B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-7B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-7B-Chat-{quantization}>`__ @@ -132,7 +132,7 @@ Model Spec 8 (gptq, 1_8 Billion) - **Model Format:** gptq - **Model Size (in billions):** 1_8 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen-1_8B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-1_8B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-1_8B-Chat-{quantization}>`__ @@ -148,7 +148,7 @@ Model Spec 9 (gptq, 14 Billion) - **Model Format:** gptq - **Model Size (in billions):** 14 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen-14B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-14B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-14B-Chat-{quantization}>`__ @@ -164,7 +164,7 @@ Model Spec 10 (gptq, 72 Billion) - **Model Format:** gptq - **Model Size (in billions):** 72 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen-72B-Chat-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen-72B-Chat-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen-72B-Chat-{quantization}>`__ diff --git a/doc/source/models/builtin/llm/qwen1.5-chat.rst b/doc/source/models/builtin/llm/qwen1.5-chat.rst index a8ad821809..adbcf75cd4 100644 --- a/doc/source/models/builtin/llm/qwen1.5-chat.rst +++ b/doc/source/models/builtin/llm/qwen1.5-chat.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 0_5 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 0_5 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen1.5-0.5B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat>`__ @@ -36,7 +36,7 @@ Model Spec 2 (pytorch, 1_8 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1_8 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen1.5-1.8B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat>`__ @@ -52,7 +52,7 @@ Model Spec 3 (pytorch, 4 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 4 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen1.5-4B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-4B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat>`__ @@ -68,7 +68,7 @@ Model Spec 4 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen1.5-7B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-7B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat>`__ @@ -84,7 +84,7 @@ Model Spec 5 (pytorch, 14 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 14 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen1.5-14B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-14B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat>`__ @@ -100,7 +100,7 @@ Model Spec 6 (pytorch, 32 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 32 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen1.5-32B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-32B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat>`__ @@ -116,7 +116,7 @@ Model Spec 7 (pytorch, 72 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 72 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen1.5-72B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-72B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat>`__ @@ -132,7 +132,7 @@ Model Spec 8 (pytorch, 110 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 110 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen1.5-110B-Chat - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-110B-Chat>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat>`__ @@ -148,7 +148,7 @@ Model Spec 9 (gptq, 0_5 Billion) - **Model Format:** gptq - **Model Size (in billions):** 0_5 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-0.5B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-GPTQ-{quantization}>`__ @@ -164,7 +164,7 @@ Model Spec 10 (gptq, 1_8 Billion) - **Model Format:** gptq - **Model Size (in billions):** 1_8 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-1.8B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-GPTQ-{quantization}>`__ @@ -180,7 +180,7 @@ Model Spec 11 (gptq, 4 Billion) - **Model Format:** gptq - **Model Size (in billions):** 4 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-4B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-4B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-GPTQ-{quantization}>`__ @@ -196,7 +196,7 @@ Model Spec 12 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-7B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-GPTQ-{quantization}>`__ @@ -212,7 +212,7 @@ Model Spec 13 (gptq, 14 Billion) - **Model Format:** gptq - **Model Size (in billions):** 14 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-14B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-14B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-GPTQ-{quantization}>`__ @@ -228,7 +228,7 @@ Model Spec 14 (gptq, 32 Billion) - **Model Format:** gptq - **Model Size (in billions):** 32 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-32B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-32B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-GPTQ-{quantization}>`__ @@ -244,7 +244,7 @@ Model Spec 15 (gptq, 72 Billion) - **Model Format:** gptq - **Model Size (in billions):** 72 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-72B-Chat-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-72B-Chat-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-GPTQ-{quantization}>`__ @@ -260,7 +260,7 @@ Model Spec 16 (gptq, 110 Billion) - **Model Format:** gptq - **Model Size (in billions):** 110 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-110B-Chat-GPTQ-Int4 - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-110B-Chat-GPTQ-Int4>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-GPTQ-Int4>`__ @@ -276,7 +276,7 @@ Model Spec 17 (awq, 0_5 Billion) - **Model Format:** awq - **Model Size (in billions):** 0_5 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-0.5B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-AWQ>`__ @@ -292,7 +292,7 @@ Model Spec 18 (awq, 1_8 Billion) - **Model Format:** awq - **Model Size (in billions):** 1_8 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-1.8B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat-AWQ>`__ @@ -308,7 +308,7 @@ Model Spec 19 (awq, 4 Billion) - **Model Format:** awq - **Model Size (in billions):** 4 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-4B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-4B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-4B-Chat-AWQ>`__ @@ -324,7 +324,7 @@ Model Spec 20 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-7B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-7B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-7B-Chat-AWQ>`__ @@ -340,7 +340,7 @@ Model Spec 21 (awq, 14 Billion) - **Model Format:** awq - **Model Size (in billions):** 14 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-14B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-14B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-14B-Chat-AWQ>`__ @@ -356,7 +356,7 @@ Model Spec 22 (awq, 32 Billion) - **Model Format:** awq - **Model Size (in billions):** 32 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-32B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-32B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-AWQ>`__ @@ -372,7 +372,7 @@ Model Spec 23 (awq, 72 Billion) - **Model Format:** awq - **Model Size (in billions):** 72 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-72B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-72B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-72B-Chat-AWQ>`__ @@ -388,7 +388,7 @@ Model Spec 24 (awq, 110 Billion) - **Model Format:** awq - **Model Size (in billions):** 110 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen1.5-110B-Chat-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen1.5-110B-Chat-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen1.5-110B-Chat-AWQ>`__ diff --git a/doc/source/models/builtin/llm/qwen2-instruct.rst b/doc/source/models/builtin/llm/qwen2-instruct.rst index 629ce9aefa..b7cd5dab92 100644 --- a/doc/source/models/builtin/llm/qwen2-instruct.rst +++ b/doc/source/models/builtin/llm/qwen2-instruct.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 0_5 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 0_5 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen2-0.5B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-0.5B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct>`__ @@ -36,7 +36,7 @@ Model Spec 2 (pytorch, 1_5 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 1_5 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen2-1.5B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-1.5B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct>`__ @@ -52,7 +52,7 @@ Model Spec 3 (pytorch, 7 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 7 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen2-7B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-7B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-7B-Instruct>`__ @@ -68,7 +68,7 @@ Model Spec 4 (pytorch, 72 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 72 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen2-72B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-72B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-72B-Instruct>`__ @@ -84,7 +84,7 @@ Model Spec 5 (gptq, 0_5 Billion) - **Model Format:** gptq - **Model Size (in billions):** 0_5 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen2-0.5B-Instruct-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-GPTQ-{quantization}>`__ @@ -100,7 +100,7 @@ Model Spec 6 (gptq, 1_5 Billion) - **Model Format:** gptq - **Model Size (in billions):** 1_5 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen2-1.5B-Instruct-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-GPTQ-{quantization}>`__ @@ -116,7 +116,7 @@ Model Spec 7 (gptq, 7 Billion) - **Model Format:** gptq - **Model Size (in billions):** 7 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen2-7B-Instruct-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-7B-Instruct-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-GPTQ-{quantization}>`__ @@ -132,7 +132,7 @@ Model Spec 8 (gptq, 72 Billion) - **Model Format:** gptq - **Model Size (in billions):** 72 - **Quantizations:** Int4, Int8 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen2-72B-Instruct-GPTQ-{quantization} - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-72B-Instruct-GPTQ-{quantization}>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-GPTQ-{quantization}>`__ @@ -148,7 +148,7 @@ Model Spec 9 (awq, 0_5 Billion) - **Model Format:** awq - **Model Size (in billions):** 0_5 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen2-0.5B-Instruct-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-AWQ>`__ @@ -164,7 +164,7 @@ Model Spec 10 (awq, 1_5 Billion) - **Model Format:** awq - **Model Size (in billions):** 1_5 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen2-1.5B-Instruct-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-1.5B-Instruct-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-1.5B-Instruct-AWQ>`__ @@ -180,7 +180,7 @@ Model Spec 11 (awq, 7 Billion) - **Model Format:** awq - **Model Size (in billions):** 7 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen2-7B-Instruct-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-7B-Instruct-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-7B-Instruct-AWQ>`__ @@ -196,7 +196,7 @@ Model Spec 12 (awq, 72 Billion) - **Model Format:** awq - **Model Size (in billions):** 72 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen2-72B-Instruct-AWQ - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-72B-Instruct-AWQ>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-72B-Instruct-AWQ>`__ diff --git a/doc/source/models/builtin/llm/qwen2-moe-instruct.rst b/doc/source/models/builtin/llm/qwen2-moe-instruct.rst index f839d10a1b..040e88049d 100644 --- a/doc/source/models/builtin/llm/qwen2-moe-instruct.rst +++ b/doc/source/models/builtin/llm/qwen2-moe-instruct.rst @@ -20,7 +20,7 @@ Model Spec 1 (pytorch, 14 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 14 - **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Engines**: vLLM, Transformers, SGLang (vLLM and SGLang only available for quantization none) - **Model ID:** Qwen/Qwen2-57B-A14B-Instruct - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-57B-A14B-Instruct>`__ @@ -36,7 +36,7 @@ Model Spec 2 (gptq, 14 Billion) - **Model Format:** gptq - **Model Size (in billions):** 14 - **Quantizations:** Int4 -- **Engines**: vLLM, Transformers +- **Engines**: vLLM, Transformers, SGLang - **Model ID:** Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4 - **Model Hubs**: `Hugging Face <https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4>`__, `ModelScope <https://modelscope.cn/models/qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4>`__ diff --git a/doc/source/models/builtin/video/cogvideox-2b.rst b/doc/source/models/builtin/video/cogvideox-2b.rst new file mode 100644 index 0000000000..bedb6cdab6 --- /dev/null +++ b/doc/source/models/builtin/video/cogvideox-2b.rst @@ -0,0 +1,18 @@ +.. _models_builtin_cogvideox-2b: + +============ +CogVideoX-2b +============ + +- **Model Name:** CogVideoX-2b +- **Model Family:** CogVideoX +- **Abilities:** text2video + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** THUDM/CogVideoX-2b + +Execute the following command to launch the model:: + + xinference launch --model-name CogVideoX-2b --model-type video \ No newline at end of file diff --git a/doc/source/models/builtin/video/index.rst b/doc/source/models/builtin/video/index.rst new file mode 100644 index 0000000000..1484b1e57c --- /dev/null +++ b/doc/source/models/builtin/video/index.rst @@ -0,0 +1,15 @@ +.. _models_video_index: + +================ +Video Models +================ + +The following is a list of built-in video models in Xinference: + + +.. toctree:: + :maxdepth: 1 + + + cogvideox-2b + \ No newline at end of file diff --git a/doc/source/models/index.rst b/doc/source/models/index.rst index 380fcbb7f2..0e54d9fcd4 100644 --- a/doc/source/models/index.rst +++ b/doc/source/models/index.rst @@ -64,6 +64,12 @@ The following ``MODEL_TYPE`` is supported by Xinference: Rerank models + .. grid-item-card:: video + :link: models_video_index + :link-type: ref + + Video models + You can see all the built-in models supported by xinference :ref:`here <models_builtin_index>`. If the model @@ -208,6 +214,12 @@ Model Usage Learn how to turn audio into text or text into audio with Xinference. + .. grid-item-card:: Video + :link: video + :link-type: ref + + Learn how to generate video with Xinference. + .. toctree:: :maxdepth: 2 diff --git a/doc/source/models/model_abilities/image.rst b/doc/source/models/model_abilities/image.rst index e2e65fab3c..7cd42f067c 100644 --- a/doc/source/models/model_abilities/image.rst +++ b/doc/source/models/model_abilities/image.rst @@ -105,7 +105,7 @@ We can try Text-to-image API out either via cURL, OpenAI Client, or Xinference's } -Tips for Large Image models including sd3-medium, FLUX.1 +Tips for Large Image Models including SD3-Medium, FLUX.1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Useful extra parameters can be passed to launch including: diff --git a/doc/source/models/model_abilities/index.rst b/doc/source/models/model_abilities/index.rst index 0253720652..0d9d140863 100644 --- a/doc/source/models/model_abilities/index.rst +++ b/doc/source/models/model_abilities/index.rst @@ -14,4 +14,4 @@ Model Abilities rerank image audio - + video diff --git a/doc/source/models/model_abilities/video.rst b/doc/source/models/model_abilities/video.rst new file mode 100644 index 0000000000..0aaa941d67 --- /dev/null +++ b/doc/source/models/model_abilities/video.rst @@ -0,0 +1,82 @@ +.. _video: + +==================== +Video (Experimental) +==================== + +Learn how to generate videos with Xinference. + + +Introduction +================== + + +The Video API provides the ability to interact with videos: + + +* The text-to-video endpoint create videos from scratch based on a text prompt. + + +.. list-table:: + :widths: 25 50 + :header-rows: 1 + + * - API ENDPOINT + - OpenAI-compatible ENDPOINT + + * - Text-to-Video API + - /v1/video/generations + +Supported models +------------------- + +The Text-to-video API is supported with the following models in Xinference: + +* CogVideoX-2b + + +Quickstart +=================== + +Text-to-video +-------------------- + +You can try Text-to-video API out either via cURL, or Xinference's python client: + +.. tabs:: + + .. code-tab:: bash cURL + + curl -X 'POST' \ + 'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/video/generations' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "model": "<MODEL_UID>", + "prompt": "<your prompt>" + }' + + + .. code-tab:: python Xinference Python Client + + from xinference.client import Client + + client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") + + model = client.get_model("<MODEL_UID>") + input_text = "an apple" + model.text_to_video(input_text) + + +Tips when running on GPU whose memory less than 24GB +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Text-to-video will occupy huge GPU memory, for instance, +running CogVideoX may require up to around 35 GB GPU memory. +When running on GPU whose memory is less than 24 GB, +we recommend to add ``--cpu_offload True`` when launching model. + + +.. code-block:: bash + + xinference launch --model-name CogVideoX-2b --model-type video --cpu_offload True diff --git a/doc/source/reference/index.rst b/doc/source/reference/index.rst index ed382cabe1..c44d629e6e 100644 --- a/doc/source/reference/index.rst +++ b/doc/source/reference/index.rst @@ -78,3 +78,13 @@ AudioModelHandle xinference.client.handlers.AudioModelHandle.transcriptions xinference.client.handlers.AudioModelHandle.translations xinference.client.handlers.AudioModelHandle.speech + + +VideoModelHandle +^^^^^^^^^^^^^^^^ +.. autosummary:: + :toctree: generated/ + + xinference.client.handlers.VideoModelHandle + + xinference.client.handlers.ImageModelHandle.text_to_video diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index ef569084da..8ec1c10181 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -46,7 +46,7 @@ Currently, supported model includes: .. vllm_start -- ``llama-2``, ``llama-3``, ``llama-2-chat``, ``llama-3-instruct``, ``llama-3.1``, ``llama-3.1-instruct`` +- ``llama-2``, ``llama-3``, ``llama-3.1``, ``llama-2-chat``, ``llama-3-instruct``, ``llama-3.1-instruct`` - ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` - ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-instruct`` @@ -65,7 +65,7 @@ Currently, supported model includes: - ``codegeex4`` - ``qwen1.5-chat``, ``qwen1.5-moe-chat`` - ``qwen2-instruct``, ``qwen2-moe-instruct`` -- ``gemma-it`` +- ``gemma-it``, ``gemma-2-it`` - ``orion-chat``, ``orion-chat-rag`` - ``c4ai-command-r-v01`` .. vllm_end diff --git a/doc/templates/llm.rst.jinja b/doc/templates/llm.rst.jinja index 67b0464cfb..ce63f0019f 100644 --- a/doc/templates/llm.rst.jinja +++ b/doc/templates/llm.rst.jinja @@ -20,7 +20,11 @@ Model Spec {{ loop.index }} ({{ spec.model_format }}, {{ spec.model_size_in_bill - **Model Format:** {{ spec.model_format }} - **Model Size (in billions):** {{ spec.model_size_in_billions }} - **Quantizations:** {{ spec.quantizations | join(', ') }} -{% if spec.model_format == 'pytorch' and 'vLLM' in spec.engines and '4-bit' in spec.quantizations %}- **Engines**: {{ spec.engines | join(', ') }} (vLLM only available for quantization none){% else %}- **Engines**: {{ spec.engines | join(', ') }}{% endif %} +{% if spec.model_format == 'pytorch' and ('vLLM' in spec.engines or 'SGLang' in spec.engines) and '4-bit' in spec.quantizations -%} +- **Engines**: {{ spec.engines | join(', ') }} (vLLM {% if 'SGLang' in spec.engines %}and SGLang {% endif %}only available for quantization none) +{%- else -%} +- **Engines**: {{ spec.engines | join(', ') }} +{%- endif %} - **Model ID:** {{ spec.model_id }} - **Model Hubs**: {% for hub in spec.model_hubs -%}`{{ hub.name }} <{{ hub.url }}>`__{% if not loop.last %}, {% endif %} {%- endfor %} diff --git a/doc/templates/video.rst.jinja b/doc/templates/video.rst.jinja new file mode 100644 index 0000000000..68ac23d0d2 --- /dev/null +++ b/doc/templates/video.rst.jinja @@ -0,0 +1,18 @@ +.. _models_builtin_{{ model_name|lower }}: + +{{ "=" * model_name|length }} +{{ model_name }} +{{ "=" * model_name|length }} + +- **Model Name:** {{ model_name }} +- **Model Family:** {{ model_family }} +- **Abilities:** {{ model_ability }} + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** {{ model_id }} + +Execute the following command to launch the model:: + + xinference launch --model-name {{ model_name }} --model-type video \ No newline at end of file diff --git a/doc/templates/video_index.rst.jinja b/doc/templates/video_index.rst.jinja new file mode 100644 index 0000000000..206cd70f38 --- /dev/null +++ b/doc/templates/video_index.rst.jinja @@ -0,0 +1,15 @@ +.. _models_video_index: + +================ +Video Models +================ + +The following is a list of built-in video models in Xinference: + + +.. toctree:: + :maxdepth: 1 + + {% for model in models %} + {{ model.model_name|lower }} + {% endfor %} \ No newline at end of file diff --git a/xinference/locale/__init__.py b/xinference/locale/__init__.py deleted file mode 100644 index 37f6558d95..0000000000 --- a/xinference/locale/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/xinference/locale/utils.py b/xinference/locale/utils.py deleted file mode 100644 index 4a0a1027f8..0000000000 --- a/xinference/locale/utils.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import codecs -import json -import locale -import os -from typing import Optional - - -class Locale: - def __init__(self, language: Optional[str] = None): - self._language = ( - language if language is not None else locale.getdefaultlocale()[0] - ) - json_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), f"{self._language}.json" - ) - if os.path.exists(json_path): - self._mapping = json.load(codecs.open(json_path, "r", encoding="utf-8")) - else: - self._mapping = None - - def __call__(self, content: str): - if self._mapping is None: - return content - else: - return self._mapping.get(content, content) diff --git a/xinference/locale/zh_CN.json b/xinference/locale/zh_CN.json deleted file mode 100644 index 8b8ea103c1..0000000000 --- a/xinference/locale/zh_CN.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "Please create model first": "请先创建模型", - "stop reason": "停止原因", - "Show stop reason": "展示停止原因", - "Max tokens": "最大 token 数量", - "The maximum number of tokens to generate.": "生成 token 数量最大值", - "Temperature": "温度参数", - "The temperature to use for sampling.": "温度参数用于调整输出的多样性,数值越高多样性越高", - "Top P": "Top P", - "The top-p value to use for sampling.": "用于控制生成文本的确定性,数值越低确定性越高", - "Window size": "窗口大小", - "Window size of chat history.": "用于生成回复的聊天历史窗口大小", - "show stop reason": "展示停止原因", - "Downloading": "下载中", - "Download failed, please retry.": "下载失败,请重新下载", - "model name": "模型名", - "model format": "模型格式", - "model size in billions": "模型大小(B)", - "quantization": "模型量化方式", - "Parameters": "参数调整", - "create": "创建", - "select model": "选择模型", - "Arena": "角斗场", - "Chat": "聊天", - "Input": "输入" -} diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 13ebe41585..ef8ee7a8a7 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -6624,6 +6624,15 @@ ], "model_description": "InternLM2.5 series of the InternLM model.", "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "1_8", + "quantizations": [ + "none" + ], + "model_id": "internlm/internlm2_5-1_8b-chat", + "model_revision": "4426f00b854561fa60d555d2b628064b56bcb758" + }, { "model_format": "pytorch", "model_size_in_billions": 7, @@ -6633,6 +6642,15 @@ "model_id": "internlm/internlm2_5-7b-chat", "model_revision": "9dc8536a922ab4954726aad1b37fa199004a291a" }, + { + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "none" + ], + "model_id": "internlm/internlm2_5-20b-chat", + "model_revision": "ef17bde929761255fee76d95e2c25969ccd93b0d" + }, { "model_format": "gptq", "model_size_in_billions": 7, @@ -6642,6 +6660,23 @@ "model_id": "ModelCloud/internlm-2.5-7b-chat-gptq-4bit", "model_revision": "2e2dda735c326544921a4035bbeb6c6e316a8254" }, + { + "model_format": "ggufv2", + "model_size_in_billions": "1_8", + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "internlm/internlm2_5-1_8b-chat-gguf", + "model_file_name_template": "internlm2_5-1_8b-chat-{quantization}.gguf" + }, { "model_format": "ggufv2", "model_size_in_billions": 7, @@ -6659,6 +6694,23 @@ "model_id": "internlm/internlm2_5-7b-chat-gguf", "model_file_name_template": "internlm2_5-7b-chat-{quantization}.gguf" }, + { + "model_format": "ggufv2", + "model_size_in_billions": 20, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "internlm/internlm2_5-20b-chat-gguf", + "model_file_name_template": "internlm2_5-20b-chat-{quantization}.gguf" + }, { "model_format": "mlx", "model_size_in_billions": 7, @@ -7142,6 +7194,16 @@ ], "model_description": "Gemma is a family of lightweight, state-of-the-art open models from Google, built from the same research and technology used to create the Gemini models.", "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 2, + "quantizations": [ + "none", + "4-bit", + "8-bit" + ], + "model_id": "google/gemma-2-2b-it" + }, { "model_format": "pytorch", "model_size_in_billions": 9, @@ -7162,6 +7224,23 @@ ], "model_id": "google/gemma-2-27b-it" }, + { + "model_format": "ggufv2", + "model_size_in_billions": 2, + "quantizations": [ + "Q3_K_L", + "Q4_K_M", + "Q4_K_S", + "Q5_K_M", + "Q5_K_S", + "Q6_K", + "Q6_K_L", + "Q8_0", + "f32" + ], + "model_id": "bartowski/gemma-2-2b-it-GGUF", + "model_file_name_template": "gemma-2-2b-it-{quantization}.gguf" + }, { "model_format": "ggufv2", "model_size_in_billions": 9, @@ -7208,6 +7287,30 @@ "model_id": "bartowski/gemma-2-27b-it-GGUF", "model_file_name_template": "gemma-2-27b-it-{quantization}.gguf" }, + { + "model_format": "mlx", + "model_size_in_billions": 2, + "quantizations": [ + "4-bit" + ], + "model_id": "mlx-community/gemma-2-2b-it-4bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 2, + "quantizations": [ + "8-bit" + ], + "model_id": "mlx-community/gemma-2-2b-it-8bit" + }, + { + "model_format": "mlx", + "model_size_in_billions": 2, + "quantizations": [ + "None" + ], + "model_id": "mlx-community/gemma-2-2b-it" + }, { "model_format": "mlx", "model_size_in_billions": 9, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 91b22ef070..1cbc64bb88 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -1213,6 +1213,15 @@ ], "model_description": "InternLM2.5 series of the InternLM model.", "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": "1_8", + "quantizations": [ + "none" + ], + "model_id": "Shanghai_AI_Laboratory/internlm2_5-1_8b-chat", + "model_hub": "modelscope" + }, { "model_format": "pytorch", "model_size_in_billions": 7, @@ -1221,6 +1230,33 @@ ], "model_id": "Shanghai_AI_Laboratory/internlm2_5-7b-chat", "model_hub": "modelscope" + }, + { + "model_format": "ggufv2", + "model_size_in_billions": 7, + "quantizations": [ + "q2_k", + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" + ], + "model_id": "Shanghai_AI_Laboratory/internlm2_5-7b-chat-gguf", + "model_file_name_template": "internlm2_5-7b-chat-{quantization}.gguf", + "model_hub": "modelscope" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 20, + "quantizations": [ + "none" + ], + "model_id": "Shanghai_AI_Laboratory/internlm2_5-20b-chat", + "model_hub": "modelscope" } ], "prompt_style": { @@ -4245,6 +4281,17 @@ ], "model_description": "Gemma is a family of lightweight, state-of-the-art open models from Google, built from the same research and technology used to create the Gemini models.", "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 2, + "quantizations": [ + "none", + "4-bit", + "8-bit" + ], + "model_id": "LLM-Research/gemma-2-2b-it", + "model_hub": "modelscope" + }, { "model_format": "pytorch", "model_size_in_billions": 9, From 894c9642c61bac04781ceb3379e3da7303e45418 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Thu, 15 Aug 2024 04:31:36 +0200 Subject: [PATCH 258/298] BUG: Fix custom glm4 & remove tool calls of ChatGLM3 (#2081) --- xinference/api/restful_api.py | 4 +- xinference/core/tests/test_restful_api.py | 48 ----------------------- xinference/model/llm/llm_family.json | 4 +- xinference/model/llm/pytorch/chatglm.py | 19 +++------ xinference/model/llm/utils.py | 2 +- 5 files changed, 10 insertions(+), 67 deletions(-) diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 47b4848c80..1f03de316e 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1682,9 +1682,7 @@ async def create_chat_completion(self, request: Request) -> Response: model_family = desc.get("model_family", "") function_call_models = ( - ["chatglm3", "gorilla-openfunctions-v1"] - + QWEN_TOOL_CALL_FAMILY - + GLM4_TOOL_CALL_FAMILY + ["gorilla-openfunctions-v1"] + QWEN_TOOL_CALL_FAMILY + GLM4_TOOL_CALL_FAMILY ) is_qwen = desc.get("model_format") == "ggmlv3" and "qwen-chat" == model_family diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index cec37dd272..5eda8bd27e 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -465,54 +465,6 @@ def test_restful_api_for_tool_calls(setup, model_format, quantization): response_data = response.json() assert len(response_data["data"]) == 1 - # glm4-chat fail response: 好的,请告诉我您希望使用的温度单位是摄氏度还是华氏度? - if "glm4" not in model_name: - tools = [ - { - "type": "function", - "function": { - "name": "get_current_weather", - "description": "获取当前天气", - "parameters": { - "type": "object", - "properties": { - "location": {"type": "string", "description": "城市,例如北京"}, - "format": { - "type": "string", - "enum": ["celsius", "fahrenheit"], - "description": "使用的温度单位。从所在的城市进行推断。", - }, - }, - "required": ["location", "format"], - }, - }, - } - ] - - url = f"{endpoint}/v1/chat/completions" - payload = { - "model": model_uid_res, - "messages": [ - {"role": "system", "content": "你是一个有用的助手。不要对要函数调用的值做出假设。"}, - {"role": "user", "content": "上海现在的天气怎么样?"}, - ], - "temperature": 0.7, - "tools": tools, - "stop": ["\n"], - } - response = requests.post(url, json=payload) - completion = response.json() - - assert ( - "get_current_weather" - == completion["choices"][0]["message"]["tool_calls"][0]["function"]["name"] - ), completion - arguments = completion["choices"][0]["message"]["tool_calls"][0]["function"][ - "arguments" - ] - arg = json.loads(arguments) - assert arg == {"location": "上海", "format": "celsius"} - # tool tools = [ { diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index ef8ee7a8a7..96c0bea315 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -819,7 +819,7 @@ "none" ], "model_id": "THUDM/glm-4-9b-chat", - "model_revision": "76f3474a854145aa4a9ed2612fee9bc8d4a8966b" + "model_revision": "aae8bd74af5c6dff63a49d7fbdcc89349ebf87aa" }, { "model_format": "ggufv2", @@ -890,7 +890,7 @@ "none" ], "model_id": "THUDM/glm-4-9b-chat-1m", - "model_revision": "715ddbe91082f976ff6a4ca06d59e5bbff6c3642" + "model_revision": "0aa722c7e0745dd21453427dd44c257dd253304f" }, { "model_format": "ggufv2", diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/pytorch/chatglm.py index da970c99a9..797402b220 100644 --- a/xinference/model/llm/pytorch/chatglm.py +++ b/xinference/model/llm/pytorch/chatglm.py @@ -344,7 +344,7 @@ def _get_generate_args( return kwargs, tools @torch.inference_mode() - def stream_chat( + def _stream_chat( self, tokenizer, query: str, @@ -399,7 +399,7 @@ def stream_chat( yield new_response, new_history @torch.inference_mode() - def non_stream_chat( + def _non_stream_chat( self, tokenizer, query: str, @@ -475,10 +475,6 @@ def chat( if stream and ( not tools or self.model_family.model_name in GLM4_TOOL_CALL_FAMILY ): - if self.model_family.model_name in GLM4_TOOL_CALL_FAMILY: - stream_chat = self.stream_chat - else: - stream_chat = self._model.stream_chat def _stream_generator(): last_chunk_text_length = 0 @@ -487,7 +483,7 @@ def _stream_generator(): inputs = self._tokenizer([prompt], return_tensors="pt") inputs = inputs.to(self._model.device) prompt_tokens = len(inputs["input_ids"][0]) - for chunk_text, _ in stream_chat( + for chunk_text, _ in self._stream_chat( self._tokenizer, prompt, chat_history, **kwargs ): if tools and isinstance(chunk_text, dict): @@ -548,12 +544,9 @@ def _stream_generator(): return self._to_chat_completion_chunks(_stream_generator()) else: - if self.model_family.model_name in GLM4_TOOL_CALL_FAMILY: - chat = self.non_stream_chat - else: - chat = self._model.chat - - response = chat(self._tokenizer, prompt, chat_history, **kwargs) + response = self._non_stream_chat( + self._tokenizer, prompt, chat_history, **kwargs + ) if tools: return self._tool_calls_completion( self.model_family, self.model_uid, response, tools diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index aadcbf9471..bd7d6cf202 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -706,7 +706,7 @@ def _eval_tool_arguments(cls, model_family, c, tools): family = model_family.model_family or model_family.model_name if family in ["gorilla-openfunctions-v1", "gorilla-openfunctions-v2"]: content, func, args = cls._eval_gorilla_openfunctions_arguments(c, tools) - elif family in ["chatglm3"] + GLM4_TOOL_CALL_FAMILY: + elif family in GLM4_TOOL_CALL_FAMILY: content, func, args = cls._eval_glm_chat_arguments(c, tools) elif family in QWEN_TOOL_CALL_FAMILY: content, func, args = cls._eval_qwen_chat_arguments(c, tools) From 3540f2b896e788a79ba6f26bcda8a6aa183ef128 Mon Sep 17 00:00:00 2001 From: WalkerWang731 <wxy1990731@hotmail.com> Date: Thu, 15 Aug 2024 14:17:37 +0800 Subject: [PATCH 259/298] BUG: [UI] Infinited loop with login (#2039) --- xinference/web/ui/src/App.js | 12 +++++++---- xinference/web/ui/src/components/Title.js | 4 +++- .../web/ui/src/components/authAlertDialog.js | 8 ++++++++ .../web/ui/src/components/fetchWrapper.js | 20 +++++++++++++++---- xinference/web/ui/src/components/fetcher.js | 5 ++++- xinference/web/ui/src/router/index.js | 1 + .../web/ui/src/scenes/cluster_info/index.js | 7 ++++--- .../web/ui/src/scenes/launch_model/index.js | 12 +++++------ .../web/ui/src/scenes/register_model/index.js | 12 +++++------ .../scenes/register_model/registerModel.js | 11 +++++----- .../web/ui/src/scenes/running_models/index.js | 11 +++++----- 11 files changed, 68 insertions(+), 35 deletions(-) diff --git a/xinference/web/ui/src/App.js b/xinference/web/ui/src/App.js index d716f3513a..9ac335eb18 100644 --- a/xinference/web/ui/src/App.js +++ b/xinference/web/ui/src/App.js @@ -36,17 +36,21 @@ function App() { }) } else { res.json().then((data) => { - if (!data.auth && cookie.token !== 'no_auth') { + if (!data.auth) { setCookie('token', 'no_auth', { path: '/' }) - } else if (data.auth && !sessionStorage.getItem('token')) { + sessionStorage.setItem('token', 'no_auth') + } else if ( + data.auth && + sessionStorage.getItem('token') === 'no_auth' + ) { removeCookie('token', { path: '/' }) - } else if (!data.auth && sessionStorage.getItem('token')) { sessionStorage.removeItem('token') } + sessionStorage.setItem('auth', String(data.auth)) // sessionStorage only can set string value }) } }) - }, []) + }, [cookie]) const handleClose = (event, reason) => { if (reason === 'clickaway') { diff --git a/xinference/web/ui/src/components/Title.js b/xinference/web/ui/src/components/Title.js index a1911265fa..77820db4cb 100644 --- a/xinference/web/ui/src/components/Title.js +++ b/xinference/web/ui/src/components/Title.js @@ -13,6 +13,7 @@ const Title = ({ title }) => { const handleLogout = () => { removeCookie('token', { path: '/' }) sessionStorage.removeItem('token') + sessionStorage.removeItem('auth') sessionStorage.removeItem('modelType') sessionStorage.removeItem('lastActiveUrl') sessionStorage.removeItem('runningModelType') @@ -31,7 +32,8 @@ const Title = ({ title }) => { > {title} </Typography> - {isValidBearerToken(cookie.token) && ( + {(isValidBearerToken(cookie.token) || + isValidBearerToken(sessionStorage.getItem('token'))) && ( <Button variant="outlined" size="large" diff --git a/xinference/web/ui/src/components/authAlertDialog.js b/xinference/web/ui/src/components/authAlertDialog.js index e878f2fc93..9b08a5b2b2 100644 --- a/xinference/web/ui/src/components/authAlertDialog.js +++ b/xinference/web/ui/src/components/authAlertDialog.js @@ -18,6 +18,13 @@ export default function AuthAlertDialog() { const handleAuthStatus = () => { const status = localStorage.getItem('authStatus') + if (status === '401') { + removeCookie('token', { path: '/' }) + localStorage.removeItem('authStatus') + sessionStorage.removeItem('token') + navigate('/login', { replace: true }) + return + } if (status) { setAuthStatus(status) } else { @@ -41,6 +48,7 @@ export default function AuthAlertDialog() { setAuthStatus('') if (code === '401') { removeCookie('token', { path: '/' }) + sessionStorage.removeItem('token') navigate('/login', { replace: true }) } } diff --git a/xinference/web/ui/src/components/fetchWrapper.js b/xinference/web/ui/src/components/fetchWrapper.js index ecbd22b389..1182436c1f 100644 --- a/xinference/web/ui/src/components/fetchWrapper.js +++ b/xinference/web/ui/src/components/fetchWrapper.js @@ -22,7 +22,10 @@ const fetchWrapper = { 'Content-Type': 'application/json', ...config.headers, } - if (cookies.get('token') !== 'no_auth') { + if ( + cookies.get('token') !== 'no_auth' && + sessionStorage.getItem('token') !== 'no_auth' + ) { headers.Authorization = 'Bearer ' + sessionStorage.getItem('token') } const response = await fetch(url, { @@ -40,7 +43,10 @@ const fetchWrapper = { 'Content-Type': 'application/json', ...config.headers, } - if (cookies.get('token') !== 'no_auth') { + if ( + cookies.get('token') !== 'no_auth' && + sessionStorage.getItem('token') !== 'no_auth' + ) { headers.Authorization = 'Bearer ' + sessionStorage.getItem('token') } const response = await fetch(url, { @@ -59,7 +65,10 @@ const fetchWrapper = { 'Content-Type': 'application/json', ...config.headers, } - if (cookies.get('token') !== 'no_auth') { + if ( + cookies.get('token') !== 'no_auth' && + sessionStorage.getItem('token') !== 'no_auth' + ) { headers.Authorization = 'Bearer ' + sessionStorage.getItem('token') } const response = await fetch(url, { @@ -78,7 +87,10 @@ const fetchWrapper = { 'Content-Type': 'application/json', ...config.headers, } - if (cookies.get('token') !== 'no_auth') { + if ( + cookies.get('token') !== 'no_auth' && + sessionStorage.getItem('token') !== 'no_auth' + ) { headers.Authorization = 'Bearer ' + sessionStorage.getItem('token') } const response = await fetch(url, { diff --git a/xinference/web/ui/src/components/fetcher.js b/xinference/web/ui/src/components/fetcher.js index 08d0dade98..9dbcf2a5d6 100644 --- a/xinference/web/ui/src/components/fetcher.js +++ b/xinference/web/ui/src/components/fetcher.js @@ -4,7 +4,10 @@ const cookies = new Cookies() const updateOptions = (url, options) => { const update = { ...options } - if (cookies.get('token') !== 'no_auth') { + if ( + cookies.get('token') !== 'no_auth' && + sessionStorage.getItem('token') !== 'no_auth' + ) { update.headers = { ...update.headers, Authorization: 'Bearer ' + sessionStorage.getItem('token'), diff --git a/xinference/web/ui/src/router/index.js b/xinference/web/ui/src/router/index.js index 6088f2ff01..fb7a242b1e 100644 --- a/xinference/web/ui/src/router/index.js +++ b/xinference/web/ui/src/router/index.js @@ -26,6 +26,7 @@ const LoginAuth = () => { if (res.ok) { res.json().then((data) => { setAuthority(data.auth) + sessionStorage.setItem('auth', String(data.auth)) // sessionStorage only can set string value }) } }) diff --git a/xinference/web/ui/src/scenes/cluster_info/index.js b/xinference/web/ui/src/scenes/cluster_info/index.js index 401387eaf2..47274ccfee 100644 --- a/xinference/web/ui/src/scenes/cluster_info/index.js +++ b/xinference/web/ui/src/scenes/cluster_info/index.js @@ -8,6 +8,7 @@ import { useNavigate } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import TableTitle from '../../components/tableTitle' import Title from '../../components/Title' +import { isValidBearerToken } from '../../components/utils' import NodeInfo from './nodeInfo' const ClusterInfo = () => { @@ -17,9 +18,9 @@ const ClusterInfo = () => { useEffect(() => { if ( - cookie.token === '' || - cookie.token === undefined || - (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) + sessionStorage.getItem('auth') === 'true' && + !isValidBearerToken(sessionStorage.getItem('token')) && + !isValidBearerToken(cookie.token) ) { navigate('/login', { replace: true }) } diff --git a/xinference/web/ui/src/scenes/launch_model/index.js b/xinference/web/ui/src/scenes/launch_model/index.js index 55f05747bd..276ca0a4cd 100644 --- a/xinference/web/ui/src/scenes/launch_model/index.js +++ b/xinference/web/ui/src/scenes/launch_model/index.js @@ -8,6 +8,7 @@ import { ApiContext } from '../../components/apiContext' import ErrorMessageSnackBar from '../../components/errorMessageSnackBar' import fetchWrapper from '../../components/fetchWrapper' import Title from '../../components/Title' +import { isValidBearerToken } from '../../components/utils' import LaunchCustom from './launchCustom' import LaunchLLM from './launchLLM' import LaunchModelComponent from './LaunchModelComponent' @@ -34,13 +35,12 @@ const LaunchModel = () => { } useEffect(() => { - if (cookie.token === '' || cookie.token === undefined) { + if ( + sessionStorage.getItem('auth') === 'true' && + !isValidBearerToken(sessionStorage.getItem('token')) && + !isValidBearerToken(cookie.token) + ) { navigate('/login', { replace: true }) - return - } - if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { - navigate('/login', { replace: true }) - return } if (gpuAvailable === -1) { diff --git a/xinference/web/ui/src/scenes/register_model/index.js b/xinference/web/ui/src/scenes/register_model/index.js index cf3c718d36..eb5b0a9e77 100644 --- a/xinference/web/ui/src/scenes/register_model/index.js +++ b/xinference/web/ui/src/scenes/register_model/index.js @@ -6,6 +6,7 @@ import { useNavigate } from 'react-router-dom' import ErrorMessageSnackBar from '../../components/errorMessageSnackBar' import Title from '../../components/Title' +import { isValidBearerToken } from '../../components/utils' import RegisterModelComponent from './registerModel' const RegisterModel = () => { @@ -18,13 +19,12 @@ const RegisterModel = () => { const navigate = useNavigate() useEffect(() => { - if (cookie.token === '' || cookie.token === undefined) { + if ( + sessionStorage.getItem('auth') === 'true' && + !isValidBearerToken(sessionStorage.getItem('token')) && + !isValidBearerToken(cookie.token) + ) { navigate('/login', { replace: true }) - return - } - if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { - navigate('/login', { replace: true }) - return } }, [cookie.token]) diff --git a/xinference/web/ui/src/scenes/register_model/registerModel.js b/xinference/web/ui/src/scenes/register_model/registerModel.js index 2266fbfa3a..06cc582927 100644 --- a/xinference/web/ui/src/scenes/register_model/registerModel.js +++ b/xinference/web/ui/src/scenes/register_model/registerModel.js @@ -28,6 +28,7 @@ import { useNavigate, useParams } from 'react-router-dom' import { ApiContext } from '../../components/apiContext' import CopyComponent from '../../components/copyComponent/copyComponent' import fetchWrapper from '../../components/fetchWrapper' +import { isValidBearerToken } from '../../components/utils' import AddControlnet from './components/addControlnet' import AddModelSpecs from './components/addModelSpecs' import languages from './data/languages' @@ -208,11 +209,11 @@ const RegisterModelComponent = ({ modelType, customData }) => { }, [model_name]) useEffect(() => { - if (cookie.token === '' || cookie.token === undefined) { - navigate('/login', { replace: true }) - return - } - if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { + if ( + sessionStorage.getItem('auth') === 'true' && + !isValidBearerToken(sessionStorage.getItem('token')) && + !isValidBearerToken(cookie.token) + ) { navigate('/login', { replace: true }) return } diff --git a/xinference/web/ui/src/scenes/running_models/index.js b/xinference/web/ui/src/scenes/running_models/index.js index 9f9486651a..4024c8f6d2 100644 --- a/xinference/web/ui/src/scenes/running_models/index.js +++ b/xinference/web/ui/src/scenes/running_models/index.js @@ -12,6 +12,7 @@ import ErrorMessageSnackBar from '../../components/errorMessageSnackBar' import fetcher from '../../components/fetcher' import fetchWrapper from '../../components/fetchWrapper' import Title from '../../components/Title' +import { isValidBearerToken } from '../../components/utils' const RunningModels = () => { const [tabValue, setTabValue] = React.useState( @@ -38,11 +39,11 @@ const RunningModels = () => { } const update = (isCallingApi) => { - if (cookie.token === '' || cookie.token === undefined) { - navigate('/login', { replace: true }) - return - } - if (cookie.token !== 'no_auth' && !sessionStorage.getItem('token')) { + if ( + sessionStorage.getItem('auth') === 'true' && + !isValidBearerToken(sessionStorage.getItem('token')) && + !isValidBearerToken(cookie.token) + ) { navigate('/login', { replace: true }) return } From b6d655e307ea6325471b809edb09f39309e9353b Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 15 Aug 2024 18:55:33 +0800 Subject: [PATCH 260/298] FEAT: support FP8 for vllm & sglang engine (#2069) --- xinference/model/llm/llm_family.json | 40 +++++++++++++++++++ xinference/model/llm/llm_family.py | 12 +++--- .../model/llm/llm_family_modelscope.json | 18 +++++++++ xinference/model/llm/sglang/core.py | 4 +- xinference/model/llm/utils.py | 2 +- xinference/model/llm/vllm/core.py | 4 +- .../components/addModelSpecs.js | 24 ++++++++--- 7 files changed, 88 insertions(+), 16 deletions(-) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 96c0bea315..a87c52b76d 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -2984,6 +2984,46 @@ ], "model_id": "Qwen/Qwen2-72B-Instruct-AWQ" }, + { + "model_format": "fp8", + "model_size_in_billions": "0_5", + "quantizations": [ + "fp8" + ], + "model_id": "neuralmagic/Qwen2-0.5B-Instruct-FP8" + }, + { + "model_format": "fp8", + "model_size_in_billions": "0_5", + "quantizations": [ + "fp8" + ], + "model_id": "neuralmagic/Qwen2-0.5B-Instruct-FP8" + }, + { + "model_format": "fp8", + "model_size_in_billions": "1_5", + "quantizations": [ + "fp8" + ], + "model_id": "neuralmagic/Qwen2-1.5B-Instruct-FP8" + }, + { + "model_format": "fp8", + "model_size_in_billions": 7, + "quantizations": [ + "fp8" + ], + "model_id": "neuralmagic/Qwen2-7B-Instruct-FP8" + }, + { + "model_format": "fp8", + "model_size_in_billions": 72, + "quantizations": [ + "fp8" + ], + "model_id": "neuralmagic/Qwen2-72B-Instruct-FP8" + }, { "model_format": "mlx", "model_size_in_billions": "0_5", diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 406a5e3b58..06e636f89c 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -85,7 +85,7 @@ def validate_model_size_with_radix(cls, v: object) -> object: class PytorchLLMSpecV1(BaseModel): - model_format: Literal["pytorch", "gptq", "awq"] + model_format: Literal["pytorch", "gptq", "awq", "fp8"] # Must in order that `str` first, then `int` model_size_in_billions: Union[str, int] quantizations: List[str] @@ -597,7 +597,7 @@ def _get_meta_path( return os.path.join(cache_dir, "__valid_download") else: return os.path.join(cache_dir, f"__valid_download_{model_hub}") - elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "mlx"]: + elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "fp8", "mlx"]: assert quantization is not None if model_hub == "huggingface": return os.path.join(cache_dir, f"__valid_download_{quantization}") @@ -636,7 +636,7 @@ def _skip_download( logger.warning(f"Cache {cache_dir} exists, but it was from {hub}") return True return False - elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "mlx"]: + elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "fp8", "mlx"]: assert quantization is not None return os.path.exists( _get_meta_path(cache_dir, model_format, model_hub, quantization) @@ -731,7 +731,7 @@ def cache_from_csghub( ): return cache_dir - if llm_spec.model_format in ["pytorch", "gptq", "awq", "mlx"]: + if llm_spec.model_format in ["pytorch", "gptq", "awq", "fp8", "mlx"]: download_dir = retry_download( snapshot_download, llm_family.model_name, @@ -799,7 +799,7 @@ def cache_from_modelscope( ): return cache_dir - if llm_spec.model_format in ["pytorch", "gptq", "awq", "mlx"]: + if llm_spec.model_format in ["pytorch", "gptq", "awq", "fp8", "mlx"]: download_dir = retry_download( snapshot_download, llm_family.model_name, @@ -868,7 +868,7 @@ def cache_from_huggingface( if not IS_NEW_HUGGINGFACE_HUB: use_symlinks = {"local_dir_use_symlinks": True, "local_dir": cache_dir} - if llm_spec.model_format in ["pytorch", "gptq", "awq", "mlx"]: + if llm_spec.model_format in ["pytorch", "gptq", "awq", "fp8", "mlx"]: assert isinstance(llm_spec, (PytorchLLMSpecV1, MLXLLMSpecV1)) download_dir = retry_download( huggingface_hub.snapshot_download, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 1cbc64bb88..5e9a62a8b3 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -3452,6 +3452,24 @@ "model_id": "qwen/Qwen2-72B-Instruct-AWQ", "model_hub": "modelscope" }, + { + "model_format": "fp8", + "model_size_in_billions": 7, + "quantizations": [ + "fp8" + ], + "model_id": "liuzhenghua/Qwen2-7B-FP8-Instruct", + "model_hub": "modelscope" + }, + { + "model_format": "fp8", + "model_size_in_billions": 72, + "quantizations": [ + "fp8" + ], + "model_id": "liuzhenghua/Qwen2-72B-FP8-Instruct", + "model_hub": "modelscope" + }, { "model_format": "mlx", "model_size_in_billions": "0_5", diff --git a/xinference/model/llm/sglang/core.py b/xinference/model/llm/sglang/core.py index 44f71fc59b..3e089b6eb0 100644 --- a/xinference/model/llm/sglang/core.py +++ b/xinference/model/llm/sglang/core.py @@ -189,7 +189,7 @@ def match( return False if not cls._is_linux(): return False - if llm_spec.model_format not in ["pytorch", "gptq", "awq"]: + if llm_spec.model_format not in ["pytorch", "gptq", "awq", "fp8"]: return False if llm_spec.model_format == "pytorch": if quantization != "none" and not (quantization is None): @@ -378,7 +378,7 @@ class SGLANGChatModel(SGLANGModel, ChatModelMixin): def match( cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str ) -> bool: - if llm_spec.model_format not in ["pytorch", "gptq", "awq"]: + if llm_spec.model_format not in ["pytorch", "gptq", "awq", "fp8"]: return False if llm_spec.model_format == "pytorch": if quantization != "none" and not (quantization is None): diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index bd7d6cf202..356a67248d 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -870,7 +870,7 @@ def get_file_location( is_cached = cache_status assert isinstance(is_cached, bool) - if spec.model_format in ["pytorch", "gptq", "awq", "mlx"]: + if spec.model_format in ["pytorch", "gptq", "awq", "fp8", "mlx"]: return cache_dir, is_cached elif spec.model_format in ["ggmlv3", "ggufv2"]: assert isinstance(spec, GgmlLLMSpecV1) diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 0f1ce1ee4e..d4b11689aa 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -338,7 +338,7 @@ def match( return False if not cls._is_linux(): return False - if llm_spec.model_format not in ["pytorch", "gptq", "awq"]: + if llm_spec.model_format not in ["pytorch", "gptq", "awq", "fp8"]: return False if llm_spec.model_format == "pytorch": if quantization != "none" and not (quantization is None): @@ -558,7 +558,7 @@ class VLLMChatModel(VLLMModel, ChatModelMixin): def match( cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str ) -> bool: - if llm_spec.model_format not in ["pytorch", "gptq", "awq"]: + if llm_spec.model_format not in ["pytorch", "gptq", "awq", "fp8"]: return False if llm_spec.model_format == "pytorch": if quantization != "none" and not (quantization is None): diff --git a/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js b/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js index 9d6f8397fd..6c769c6e1f 100644 --- a/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js +++ b/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js @@ -18,6 +18,7 @@ const modelFormatArr = [ { value: 'ggufv2', label: 'GGUF' }, { value: 'gptq', label: 'GPTQ' }, { value: 'awq', label: 'AWQ' }, + { value: 'fp8', label: 'FP8' }, ] const AddModelSpecs = ({ @@ -232,7 +233,12 @@ const AddModelSpecs = ({ const handleQuantization = (model_format, index, value, id) => { setQuantizationAlertId(quantizationAlertId.filter((item) => item !== id)) handleUpdateSpecsArr(index, 'quantizations', value) - if ((model_format === 'gptq' || model_format === 'awq') && value === '') { + if ( + (model_format === 'gptq' || + model_format === 'awq' || + model_format === 'fp8') && + value === '' + ) { const quantizationAlertIdArr = Array.from( new Set([...quantizationAlertId, id]) ) @@ -275,7 +281,11 @@ const AddModelSpecs = ({ value={item.model_format} onChange={(e) => { handleUpdateSpecsArr(index, 'model_format', e.target.value) - if (e.target.value === 'gptq' || e.target.value === 'awq') { + if ( + e.target.value === 'gptq' || + e.target.value === 'awq' || + e.target.value === 'fp8' + ) { const quantizationAlertIdArr = Array.from( new Set([...quantizationAlertId, item.id]) ) @@ -335,7 +345,9 @@ const AddModelSpecs = ({ <TextField style={{ minWidth: '60%' }} label={ - item.model_format === 'gptq' || item.model_format === 'awq' + item.model_format === 'gptq' || + item.model_format === 'awq' || + item.model_format === 'fp8' ? 'Quantization' : 'Quantization (Optional)' } @@ -350,8 +362,10 @@ const AddModelSpecs = ({ ) }} helperText={ - item.model_format === 'gptq' || item.model_format === 'awq' - ? 'For GPTQ/AWQ models, please be careful to fill in the quantization corresponding to the model you want to register.' + item.model_format === 'gptq' || + item.model_format === 'awq' || + item.model_format === 'fp8' + ? 'For GPTQ/AWQ/FP8 models, please be careful to fill in the quantization corresponding to the model you want to register.' : '' } /> From e04eb43a2bd62ccdc782ec4b6a7844a6594f89ae Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Fri, 16 Aug 2024 14:01:20 +0800 Subject: [PATCH 261/298] ENH: make MiniCPM v2.6 support video (#2068) --- .github/workflows/python.yaml | 1 + setup.cfg | 2 + xinference/core/chat_interface.py | 53 +++++++++-- xinference/deploy/docker/requirements.txt | 1 + xinference/deploy/docker/requirements_cpu.txt | 1 + xinference/model/llm/pytorch/minicpmv26.py | 89 ++++++++++++++----- 6 files changed, 116 insertions(+), 31 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index fd818244cc..583ad7bf76 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -134,6 +134,7 @@ jobs: pip install -e ".[dev]" pip install "jinja2==3.1.2" pip install tensorizer + pip install eva-decord working-directory: . - name: Test with pytest diff --git a/setup.cfg b/setup.cfg index 3a2f026f0c..1d57e708b7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -122,6 +122,7 @@ all = openai-whisper # For CosyVoice boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 + eva-decord # For video in VL intel = torch==2.1.0a0 intel_extension_for_pytorch==2.1.10+xpu @@ -144,6 +145,7 @@ transformers = timm>=0.9.16 # For deepseek VL torchvision # For deepseek VL peft + eva-decord # For video in VL vllm = vllm>=0.2.6 sglang = diff --git a/xinference/core/chat_interface.py b/xinference/core/chat_interface.py index c8c647f3a9..0264c94c36 100644 --- a/xinference/core/chat_interface.py +++ b/xinference/core/chat_interface.py @@ -236,8 +236,8 @@ def predict(history, bot, max_tokens, temperature, stream): bot[-1][1] = history[-1]["content"] yield history, bot - def add_text(history, bot, text, image): - logger.debug("Add text, text: %s, image: %s", text, image) + def add_text(history, bot, text, image, video): + logger.debug("Add text, text: %s, image: %s, video: %s", text, image, video) if image: buffered = BytesIO() with PIL.Image.open(image) as img: @@ -257,16 +257,47 @@ def add_text(history, bot, text, image): }, ], } + elif video: + + def video_to_base64(video_path): + with open(video_path, "rb") as video_file: + encoded_string = base64.b64encode(video_file.read()).decode( + "utf-8" + ) + return encoded_string + + def generate_html_video(video_path): + base64_video = video_to_base64(video_path) + video_format = video_path.split(".")[-1] + html_code = f""" + <video controls> + <source src="data:video/{video_format};base64,{base64_video}" type="video/{video_format}"> + Your browser does not support the video tag. + </video> + """ + return html_code + + display_content = f"{generate_html_video(video)}\n{text}" + message = { + "role": "user", + "content": [ + {"type": "text", "text": text}, + { + "type": "video_url", + "video_url": {"url": video}, + }, + ], + } else: display_content = text message = {"role": "user", "content": text} history = history + [message] bot = bot + [[display_content, None]] - return history, bot, "", None + return history, bot, "", None, None def clear_history(): logger.debug("Clear history.") - return [], None, "", None + return [], None, "", None, None def update_button(text): return gr.update(interactive=bool(text)) @@ -313,6 +344,7 @@ def update_button(text): ) with gr.Column(scale=3): imagebox = gr.Image(type="filepath") + videobox = gr.Video() textbox = gr.Textbox( show_label=False, placeholder="Enter text and press ENTER", @@ -340,8 +372,8 @@ def update_button(text): textbox.submit( add_text, - [state, chatbot, textbox, imagebox], - [state, chatbot, textbox, imagebox], + [state, chatbot, textbox, imagebox, videobox], + [state, chatbot, textbox, imagebox, videobox], queue=False, ).then( predict, @@ -351,8 +383,8 @@ def update_button(text): submit_btn.click( add_text, - [state, chatbot, textbox, imagebox], - [state, chatbot, textbox, imagebox], + [state, chatbot, textbox, imagebox, videobox], + [state, chatbot, textbox, imagebox, videobox], queue=False, ).then( predict, @@ -361,7 +393,10 @@ def update_button(text): ) clear_btn.click( - clear_history, None, [state, chatbot, textbox, imagebox], queue=False + clear_history, + None, + [state, chatbot, textbox, imagebox, videobox], + queue=False, ) return chat_vl_interface diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 50cae984f8..6fea2f6f4d 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -61,6 +61,7 @@ openai-whisper # For CosyVoice boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 imageio-ffmpeg # For video +eva-decord # For video in VL # sglang outlines>=0.0.44 diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index ffc266e315..a838e614dd 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -56,3 +56,4 @@ onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice openai-whisper # For CosyVoice imageio-ffmpeg # For video +eva-decord # For video in VL \ No newline at end of file diff --git a/xinference/model/llm/pytorch/minicpmv26.py b/xinference/model/llm/pytorch/minicpmv26.py index 4a5b88584f..25b8e874ef 100644 --- a/xinference/model/llm/pytorch/minicpmv26.py +++ b/xinference/model/llm/pytorch/minicpmv26.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. import base64 -import json import logging import time import uuid @@ -124,29 +123,60 @@ def _load_image(_url): else: return Image.open(BytesIO(response.content)).convert("RGB") + MAX_NUM_FRAMES = 64 + + def encode_video(video_path): + from decord import VideoReader, cpu + + def uniform_sample(l, n): + gap = len(l) / n + idxs = [int(i * gap + gap / 2) for i in range(n)] + return [l[i] for i in idxs] + + vr = VideoReader(video_path, ctx=cpu(0)) + sample_fps = round(vr.get_avg_fps() / 1) # FPS + frame_idx = [i for i in range(0, len(vr), sample_fps)] + if len(frame_idx) > MAX_NUM_FRAMES: + frame_idx = uniform_sample(frame_idx, MAX_NUM_FRAMES) + frames = vr.get_batch(frame_idx).asnumpy() + frames = [Image.fromarray(v.astype("uint8")) for v in frames] + print("num frames:", len(frames)) + return frames + + def _load_video(_url): + frames = None + if _url.startswith("data:"): + raise RuntimeError("Only video url format is supported") + else: + frames = encode_video(_url) + return frames + if not isinstance(content, str): texts = [] image_urls = [] + video_urls = [] for c in content: c_type = c.get("type") if c_type == "text": texts.append(c["text"]) elif c_type == "image_url": image_urls.append(c["image_url"]["url"]) + elif c_type == "video_url": + video_urls.append(c["video_url"]["url"]) image_futures = [] with ThreadPoolExecutor() as executor: for image_url in image_urls: fut = executor.submit(_load_image, image_url) image_futures.append(fut) images = [fut.result() for fut in image_futures] + frames = [] + if len(video_urls) > 1: + raise RuntimeError("Only one video per message is supported") + for v in video_urls: + frames = _load_video(v) text = " ".join(texts) - if len(images) == 0: - return text, [] - elif len(images) == 1: - return text, images - else: - raise RuntimeError("Only one image per message is supported") - return content, [] + return text, images, frames + return content, [], [] def chat( self, @@ -156,36 +186,51 @@ def chat( generate_config: Optional[PytorchGenerateConfig] = None, ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: stream = generate_config.get("stream", False) if generate_config else False - content, images_chat = self._message_content_to_chat(prompt) + videoExisted = False + + content, images_chat, video_frames = self._message_content_to_chat(prompt) + if len(video_frames) > 0: + videoExisted = True + images_chat = video_frames msgs = [] query_to_response: List[Dict] = [] - images_history = [] for h in chat_history or []: + images_history = [] role = h["role"] - content_h, images_tmp = self._message_content_to_chat(h["content"]) + content_h, images_tmp, video_frames_h = self._message_content_to_chat( + h["content"] + ) if images_tmp != []: images_history = images_tmp + if len(video_frames_h) > 0: + videoExisted = True + images_history = video_frames_h if len(query_to_response) == 0 and role == "user": - query_to_response.append({"role": "user", "content": content_h}) + query_to_response.append( + {"role": "user", "content": images_history + [content_h]} + ) if len(query_to_response) == 1 and role == "assistant": - query_to_response.append({"role": "assistant", "content": content_h}) + query_to_response.append( + {"role": "assistant", "content": images_history + [content_h]} + ) if len(query_to_response) == 2: msgs.extend(query_to_response) query_to_response = [] - image = None - if len(images_chat) > 0: - image = images_chat[0] - elif len(images_history) > 0: - image = images_history[0] - msgs.append({"role": "user", "content": content}) + msgs.append({"role": "user", "content": images_chat + [content]}) + + # Set decode params for video + params = {} + if videoExisted: + params = {"use_image_id": False, "max_slice_nums": 1} chat = self._model.chat( - image=image, - msgs=json.dumps(msgs, ensure_ascii=True), + image=None, + msgs=msgs, tokenizer=self._tokenizer, sampling=True, - **generate_config + **generate_config, + **params, ) if stream: it = self.chat_stream(chat) From f5229a2354cd1592abdd8f3c757fc02be90a744c Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Fri, 16 Aug 2024 14:54:31 +0800 Subject: [PATCH 262/298] REF: Remove some builtin old models and `ggmlv3` model format (#2086) --- .github/workflows/python.yaml | 1 - doc/Makefile | 5 +- doc/source/getting_started/installation.rst | 6 +- .../ja_JP/LC_MESSAGES/examples/ai_podcast.po | 180 -- .../ja_JP/LC_MESSAGES/examples/chatbot.po | 107 -- .../examples/gradio_chatinterface.po | 96 -- .../ja_JP/LC_MESSAGES/examples/index.po | 161 -- .../ja_JP/LC_MESSAGES/examples/pdf_chatbot.po | 95 -- .../getting_started/accessing_models.po | 80 - .../LC_MESSAGES/getting_started/index.po | 25 - .../getting_started/installation.po | 163 -- .../getting_started/launching_models.po | 63 - .../LC_MESSAGES/getting_started/logging.po | 104 -- .../getting_started/troubleshooting.po | 118 -- .../getting_started/using_xinference.po | 451 ----- doc/source/locale/ja_JP/LC_MESSAGES/index.po | 113 -- .../LC_MESSAGES/models/builtin/Yi-200k.po | 100 -- .../ja_JP/LC_MESSAGES/models/builtin/Yi.po | 97 -- .../models/builtin/baichuan-2-chat.po | 114 -- .../LC_MESSAGES/models/builtin/baichuan-2.po | 106 -- .../models/builtin/baichuan-chat.po | 76 - .../LC_MESSAGES/models/builtin/baichuan.po | 122 -- .../models/builtin/bge-base-en-v1.5.po | 57 - .../LC_MESSAGES/models/builtin/bge-base-en.po | 57 - .../models/builtin/bge-base-zh-v1.5.po | 57 - .../LC_MESSAGES/models/builtin/bge-base-zh.po | 57 - .../models/builtin/bge-large-en-v1.5.po | 57 - .../models/builtin/bge-large-en.po | 57 - .../models/builtin/bge-large-zh-noinstruct.po | 57 - .../models/builtin/bge-large-zh-v1.5.po | 57 - .../models/builtin/bge-large-zh.po | 57 - .../models/builtin/bge-small-en-v1.5.po | 57 - .../models/builtin/bge-small-zh-v1.5.po | 57 - .../models/builtin/bge-small-zh.po | 57 - .../LC_MESSAGES/models/builtin/chatglm.po | 98 -- .../models/builtin/chatglm2-32k.po | 80 - .../LC_MESSAGES/models/builtin/chatglm2.po | 98 -- .../models/builtin/chatglm3-32k.po | 82 - .../LC_MESSAGES/models/builtin/chatglm3.po | 82 - .../models/builtin/code-llama-instruct.po | 116 -- .../models/builtin/code-llama-python.po | 116 -- .../LC_MESSAGES/models/builtin/code-llama.po | 116 -- .../LC_MESSAGES/models/builtin/e5-large-v2.po | 57 - .../models/builtin/falcon-instruct.po | 96 -- .../LC_MESSAGES/models/builtin/falcon.po | 96 -- .../LC_MESSAGES/models/builtin/gte-base.po | 57 - .../LC_MESSAGES/models/builtin/gte-large.po | 57 - .../ja_JP/LC_MESSAGES/models/builtin/index.po | 214 --- .../models/builtin/internlm-20b.po | 75 - .../models/builtin/internlm-chat-20b.po | 72 - .../models/builtin/internlm-chat-8k.po | 80 - .../models/builtin/internlm-chat.po | 80 - .../LC_MESSAGES/models/builtin/internlm.po | 80 - .../models/builtin/llama-2-chat.po | 156 -- .../LC_MESSAGES/models/builtin/llama-2.po | 156 -- .../models/builtin/multilingual-e5-large.po | 57 - .../LC_MESSAGES/models/builtin/openbuddy.po | 82 - .../ja_JP/LC_MESSAGES/models/builtin/opt.po | 80 - .../LC_MESSAGES/models/builtin/orca_mini.po | 106 -- .../LC_MESSAGES/models/builtin/qwen-chat.po | 102 -- .../models/builtin/starchat-beta.po | 80 - .../LC_MESSAGES/models/builtin/starcoder.po | 61 - .../models/builtin/starcoderplus.po | 80 - .../LC_MESSAGES/models/builtin/vicuna-v1.3.po | 168 -- .../models/builtin/vicuna-v1.5-16k.po | 96 -- .../LC_MESSAGES/models/builtin/vicuna-v1.5.po | 96 -- .../models/builtin/wizardcoder-python-v1.0.po | 160 -- .../models/builtin/wizardlm-v1.0.po | 93 -- .../models/builtin/wizardmath-v1.0.po | 112 -- .../models/builtin/zephyr-7b-alpha.po | 82 - .../models/builtin/zephyr-7b-beta.po | 86 - .../locale/ja_JP/LC_MESSAGES/models/custom.po | 357 ---- .../locale/ja_JP/LC_MESSAGES/models/index.po | 25 - .../LC_MESSAGES/models/sources/sources.po | 71 - .../ja_JP/LC_MESSAGES/reference/index.po | 289 ---- .../ja_JP/LC_MESSAGES/user_guide/backends.po | 140 -- .../user_guide/cache_management.po | 25 - .../LC_MESSAGES/user_guide/client_api.po | 98 -- .../user_guide/examples/AI_Podcast.po | 168 -- .../LC_MESSAGES/user_guide/examples/chat.po | 98 -- .../ja_JP/LC_MESSAGES/user_guide/faq.po | 25 - .../ja_JP/LC_MESSAGES/user_guide/index.po | 24 - .../getting_started/installation.po | 27 +- .../locale/zh_CN/LC_MESSAGES/models/custom.po | 47 +- doc/source/models/custom.rst | 16 +- doc/source/user_guide/client_api.rst | 8 +- setup.cfg | 7 +- xinference/api/restful_api.py | 45 +- xinference/client/restful/restful_client.py | 4 +- xinference/client/tests/test_client.py | 62 +- xinference/core/model.py | 8 +- xinference/core/scheduler.py | 3 +- xinference/core/tests/test_metrics.py | 20 +- xinference/core/tests/test_restful_api.py | 57 +- xinference/core/worker.py | 2 +- xinference/deploy/cmdline.py | 4 +- xinference/deploy/docker/requirements.txt | 2 - xinference/deploy/docker/requirements_cpu.txt | 2 - xinference/deploy/test/test_cmdline.py | 14 +- xinference/model/llm/__init__.py | 43 +- xinference/model/llm/ggml/tools/__init__.py | 15 - .../llm/ggml/tools/convert_ggml_to_gguf.py | 498 ------ xinference/model/llm/ggml/tools/gguf.py | 884 ---------- .../model/llm/{ggml => llama_cpp}/__init__.py | 0 .../{ggml/llamacpp.py => llama_cpp/core.py} | 37 +- .../llm/{ggml => llama_cpp}/tests/__init__.py | 0 .../{ggml => llama_cpp}/tests/test_gguf.py | 34 - xinference/model/llm/llm_family.json | 1481 +++-------------- xinference/model/llm/llm_family.py | 145 +- .../model/llm/llm_family_modelscope.json | 314 ---- xinference/model/llm/memory.py | 18 +- xinference/model/llm/pytorch/baichuan.py | 81 - xinference/model/llm/pytorch/falcon.py | 138 -- xinference/model/llm/pytorch/vicuna.py | 69 - xinference/model/llm/tests/test_llm_family.py | 388 +---- .../model/llm/tests/test_stream_options.py | 7 +- xinference/model/llm/tests/test_utils.py | 133 -- .../llm/{pytorch => transformers}/__init__.py | 0 .../llm/{pytorch => transformers}/chatglm.py | 0 .../llm/{pytorch => transformers}/cogvlm2.py | 0 .../{pytorch => transformers}/compression.py | 0 .../llm/{pytorch => transformers}/core.py | 10 +- .../{pytorch => transformers}/deepseek_vl.py | 0 .../llm/{pytorch => transformers}/glm4v.py | 0 .../{pytorch => transformers}/intern_vl.py | 0 .../{pytorch => transformers}/internlm2.py | 12 +- .../llm/{pytorch => transformers}/llama_2.py | 0 .../{pytorch => transformers}/minicpmv25.py | 0 .../{pytorch => transformers}/minicpmv26.py | 0 .../llm/{pytorch => transformers}/omnilmm.py | 0 .../llm/{pytorch => transformers}/qwen_vl.py | 0 .../tensorizer_utils.py | 0 .../tests/__init__.py | 0 .../tests/test_opt.py | 0 .../tests/test_tensorizer.py | 4 +- .../llm/{pytorch => transformers}/utils.py | 2 +- .../llm/{pytorch => transformers}/yi_vl.py | 0 xinference/model/llm/utils.py | 70 +- xinference/model/llm/vllm/core.py | 8 - xinference/model/utils.py | 96 +- xinference/thirdparty/omnilmm/model/utils.py | 17 +- .../components/addModelSpecs.js | 27 +- 142 files changed, 531 insertions(+), 12320 deletions(-) delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/examples/ai_podcast.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/examples/chatbot.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/examples/gradio_chatinterface.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/examples/index.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/examples/pdf_chatbot.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/getting_started/accessing_models.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/getting_started/index.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/getting_started/installation.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/getting_started/launching_models.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/getting_started/logging.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/getting_started/troubleshooting.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/index.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/Yi-200k.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/Yi.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-2-chat.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-2.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-chat.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-en-v1.5.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-en.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-zh-v1.5.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-zh.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-en-v1.5.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-en.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh-noinstruct.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh-v1.5.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-en-v1.5.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-zh-v1.5.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-zh.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm2-32k.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm2.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm3-32k.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm3.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama-instruct.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama-python.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/e5-large-v2.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/falcon-instruct.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/falcon.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/gte-base.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/gte-large.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/index.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-20b.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat-20b.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat-8k.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/llama-2-chat.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/llama-2.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/multilingual-e5-large.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/openbuddy.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/opt.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/orca_mini.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/qwen-chat.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starchat-beta.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starcoder.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starcoderplus.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.3.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.5-16k.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.5.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardcoder-python-v1.0.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardlm-v1.0.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardmath-v1.0.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/zephyr-7b-alpha.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/zephyr-7b-beta.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/custom.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/index.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/models/sources/sources.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/reference/index.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/user_guide/backends.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/user_guide/cache_management.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/user_guide/client_api.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/user_guide/examples/AI_Podcast.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/user_guide/examples/chat.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/user_guide/faq.po delete mode 100644 doc/source/locale/ja_JP/LC_MESSAGES/user_guide/index.po delete mode 100644 xinference/model/llm/ggml/tools/__init__.py delete mode 100644 xinference/model/llm/ggml/tools/convert_ggml_to_gguf.py delete mode 100644 xinference/model/llm/ggml/tools/gguf.py rename xinference/model/llm/{ggml => llama_cpp}/__init__.py (100%) rename xinference/model/llm/{ggml/llamacpp.py => llama_cpp/core.py} (89%) rename xinference/model/llm/{ggml => llama_cpp}/tests/__init__.py (100%) rename xinference/model/llm/{ggml => llama_cpp}/tests/test_gguf.py (55%) delete mode 100644 xinference/model/llm/pytorch/baichuan.py delete mode 100644 xinference/model/llm/pytorch/falcon.py delete mode 100644 xinference/model/llm/pytorch/vicuna.py rename xinference/model/llm/{pytorch => transformers}/__init__.py (100%) rename xinference/model/llm/{pytorch => transformers}/chatglm.py (100%) rename xinference/model/llm/{pytorch => transformers}/cogvlm2.py (100%) rename xinference/model/llm/{pytorch => transformers}/compression.py (100%) rename xinference/model/llm/{pytorch => transformers}/core.py (99%) rename xinference/model/llm/{pytorch => transformers}/deepseek_vl.py (100%) rename xinference/model/llm/{pytorch => transformers}/glm4v.py (100%) rename xinference/model/llm/{pytorch => transformers}/intern_vl.py (100%) rename xinference/model/llm/{pytorch => transformers}/internlm2.py (96%) rename xinference/model/llm/{pytorch => transformers}/llama_2.py (100%) rename xinference/model/llm/{pytorch => transformers}/minicpmv25.py (100%) rename xinference/model/llm/{pytorch => transformers}/minicpmv26.py (100%) rename xinference/model/llm/{pytorch => transformers}/omnilmm.py (100%) rename xinference/model/llm/{pytorch => transformers}/qwen_vl.py (100%) rename xinference/model/llm/{pytorch => transformers}/tensorizer_utils.py (100%) rename xinference/model/llm/{pytorch => transformers}/tests/__init__.py (100%) rename xinference/model/llm/{pytorch => transformers}/tests/test_opt.py (100%) rename xinference/model/llm/{pytorch => transformers}/tests/test_tensorizer.py (96%) rename xinference/model/llm/{pytorch => transformers}/utils.py (99%) rename xinference/model/llm/{pytorch => transformers}/yi_vl.py (100%) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 583ad7bf76..4836de3cd0 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -125,7 +125,6 @@ jobs: pip install transformers_stream_generator pip install bitsandbytes pip install "sentence-transformers>=2.3.1" - pip install s3fs pip install modelscope pip install diffusers pip install protobuf diff --git a/doc/Makefile b/doc/Makefile index 32655ef182..e2700039c5 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -11,7 +11,7 @@ BUILDDIR = build # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SOURCEDIR) -I18NSPHINXLANGS = -l zh_CN -l ja_JP +I18NSPHINXLANGS = -l zh_CN # Put it first so that "make" without argument is like "make help". help: @@ -22,9 +22,6 @@ help: html_zh_cn: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) -t zh_cn -D language='zh_CN' "$(SOURCEDIR)" $(BUILDDIR)/html_zh_cn -html_ja_jp: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) -t ja_jp -D language='ja_JP' "$(SOURCEDIR)" $(BUILDDIR)/html_ja_jp - gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale $(SPHINXINTL) update -p $(BUILDDIR)/locale $(I18NSPHINXLANGS) diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index 0ddbfd58b1..e72552319e 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -10,7 +10,7 @@ If you aim to serve all supported models, you can install all the necessary depe pip install "xinference[all]" .. note:: - If you want to serve models in GGML format, it's advised to install the GGML dependencies manually based on your hardware specifications to enable acceleration. For more details, see the :ref:`installation_ggml` section. + If you want to serve models in GGUF format, it's advised to install the ``llama-cpp-python`` dependency manually based on your hardware specifications to enable acceleration. For more details, see the :ref:`installation_gguf` section. If you want to install only the necessary backends, here's a breakdown of how to do it. @@ -73,11 +73,11 @@ To install Xinference and vLLM:: # For other CUDA & torch versions, please check https://docs.flashinfer.ai/installation.html -.. _installation_ggml: +.. _installation_gguf: Llama.cpp Backend ~~~~~~~~~~~~~~~~~ -Xinference supports models in ``gguf`` and ``ggml`` format via ``llama-cpp-python``. It's advised to install the llama.cpp-related dependencies manually based on your hardware specifications to enable acceleration. +Xinference supports models in ``gguf`` format via ``llama-cpp-python``. It's advised to install the llama.cpp-related dependencies manually based on your hardware specifications to enable acceleration. Initial setup:: diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/examples/ai_podcast.po b/doc/source/locale/ja_JP/LC_MESSAGES/examples/ai_podcast.po deleted file mode 100644 index 3289645cc7..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/examples/ai_podcast.po +++ /dev/null @@ -1,180 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-27 15:43+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/examples/ai_podcast.rst:5 -msgid "Example: AI Podcast 🎙" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:7 -msgid "**Description**:" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:9 -msgid "🎙️AI Podcast - Voice Conversations with Multiple Agents on M2 Max 💻" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:11 -msgid "**Support Language** :" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:13 -msgid "English (AI_Podcast.py)" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:15 -msgid "Chinese (AI_Podcast_ZH.py)" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:17 -msgid "**Used Technology (EN version)** :" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:19 -msgid "" -"@ `OpenAI <https://twitter.com/OpenAI>`_ 's `whisper " -"<https://pypi.org/project/openai-whisper/>`_" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:21 -msgid "" -"@ `ggerganov <https://twitter.com/ggerganov>`_ 's `ggml " -"<https://github.com/ggerganov/ggml>`_" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:23 -msgid "" -"@ `WizardLM_AI <https://twitter.com/WizardLM_AI>`_ 's `wizardlm v1.0 " -"<https://huggingface.co/WizardLM>`_" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:25 -msgid "" -"@ `lmsysorg <https://twitter.com/lmsysorg>`_ 's `vicuna v1.3 " -"<https://huggingface.co/lmsys/vicuna-7b-v1.3>`_" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:27 -msgid "@ `Xinference <https://github.com/xorbitsai/inference>`_ as a launcher" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:29 -msgid "**Detailed Explanation on the Demo Functionality** :" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:31 -msgid "" -"Generate the Wizardlm Model and Vicuna Model when the program is " -"launching with Xorbits Inference. Initiate the Chatroom by giving the two" -" chatbot their names and telling them that there is a human user called " -"\"username\", where \"username\" is given by user's input. Initialize a " -"empty chat history for the chatroom." -msgstr "" - -#: ../../source/examples/ai_podcast.rst:35 -msgid "" -"Use Audio device to store recording into file, and transcribe the file " -"using OpenAI's Whisper to receive a human readable text as string." -msgstr "" - -#: ../../source/examples/ai_podcast.rst:37 -msgid "" -"Based on the input message string, determine which agents the user want " -"to talk to. Call the target agents and parse in the input string and chat" -" history for the model to generate." -msgstr "" - -#: ../../source/examples/ai_podcast.rst:40 -msgid "" -"When the responses are ready, use Macos's \"Say\" Command to produce " -"audio through speaker. Each agents have their own voice while speaking." -msgstr "" - -#: ../../source/examples/ai_podcast.rst:43 -msgid "" -"Store the user input and the agent response into chat history, and " -"recursively looping the program until user explicitly says words like " -"\"see you\" in their responses." -msgstr "" - -#: ../../source/examples/ai_podcast.rst:46 -msgid "**Highlight Features with Xinference** :" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:48 -msgid "" -"With Xinference's distributed system, we can easily deploy two different " -"models in the same session and in the same \"chatroom\". With enough " -"resources, the framework can deploy any amount of models you like at the " -"same time." -msgstr "" - -#: ../../source/examples/ai_podcast.rst:51 -msgid "" -"With Xinference, you can deploy the model easily by just adding a few " -"lines of code. For examples, for launching the vicuna model in the demo, " -"just by::" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:68 -msgid "" -"Then, the Xinference client will handle \"target model downloading and " -"caching\", \"set up environment and process for the model\", and \"run " -"the service at selected endpoint. \" You are now ready to play with your " -"llm model." -msgstr "" - -#: ../../source/examples/ai_podcast.rst:71 -msgid "**Original Demo Video** :" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:73 -msgid "" -"`🎙️AI Podcast - Voice Conversations with Multiple Agents on M2 Max💻🔥🤖 " -"<https://twitter.com/yichaocheng/status/1679129417778442240>`_" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:75 -msgid "**Source Code** :" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:77 -msgid "" -"`AI_Podcast " -"<https://github.com/xorbitsai/inference/blob/main/examples/AI_podcast.py>`_" -" (English Version)" -msgstr "" - -#: ../../source/examples/ai_podcast.rst:79 -msgid "" -"`AI_Podcast_ZH " -"<https://github.com/xorbitsai/inference/blob/main/examples/AI_podcast_ZH.py>`_" -" (Chinese Version)" -msgstr "" - -#~ msgid "AI_Podcast_ZH (Chinese Version)" -#~ msgstr "" - -#~ msgid "" -#~ "`AI_Podcast_ZH " -#~ "<https://github.com/xorbitsai/inference/blob/main/examples/AI_podcast_ZH.py>`" -#~ " (Chinese Version)" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/examples/chatbot.po b/doc/source/locale/ja_JP/LC_MESSAGES/examples/chatbot.po deleted file mode 100644 index ff102fb760..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/examples/chatbot.po +++ /dev/null @@ -1,107 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/examples/chatbot.rst:5 -msgid "Example: CLI chatbot 🤖️" -msgstr "" - -#: ../../source/examples/chatbot.rst:7 -msgid "**Description**:" -msgstr "" - -#: ../../source/examples/chatbot.rst:9 -msgid "" -"Demonstrate how to interact with Xinference to play with LLM chat " -"functionality with an AI agent in command line💻" -msgstr "" - -#: ../../source/examples/chatbot.rst:11 -msgid "**Used Technology**:" -msgstr "" - -#: ../../source/examples/chatbot.rst:13 -msgid "" -"@ `ggerganov <https://twitter.com/ggerganov>`_ 's `ggml " -"<https://github.com/ggerganov/ggml>`_" -msgstr "" - -#: ../../source/examples/chatbot.rst:15 -msgid "@ `Xinference <https://github.com/xorbitsai/inference>`_ as a launcher" -msgstr "" - -#: ../../source/examples/chatbot.rst:17 -msgid "" -"@ All LLaMA and Chatglm models supported by `Xorbitsio inference " -"<https://github.com/xorbitsai/inference>`_" -msgstr "" - -#: ../../source/examples/chatbot.rst:19 -msgid "**Detailed Explanation on the Demo Functionality** :" -msgstr "" - -#: ../../source/examples/chatbot.rst:21 -msgid "" -"Take the user command line input in the terminal and grab the required " -"parameters for model launching." -msgstr "" - -#: ../../source/examples/chatbot.rst:23 -msgid "" -"Launch the Xinference frameworks and automatically deploy the model user " -"demanded into the cluster." -msgstr "" - -#: ../../source/examples/chatbot.rst:25 -msgid "Initialize an empty chat history to store all the context in the chatroom." -msgstr "" - -#: ../../source/examples/chatbot.rst:27 -msgid "" -"Recursively ask for user's input as prompt and let the model to generate " -"response based on the prompt and the chat history. Show the Output of the" -" response in the terminal." -msgstr "" - -#: ../../source/examples/chatbot.rst:30 -msgid "" -"Store the user's input and agent's response into the chat history as " -"context for the upcoming rounds." -msgstr "" - -#: ../../source/examples/chatbot.rst:32 -msgid "**Source Code** :" -msgstr "" - -#: ../../source/examples/chatbot.rst:33 -msgid "" -"`chat " -"<https://github.com/RayJi01/Xprobe_inference/blob/main/examples/chat.py>`_" -msgstr "" - -#~ msgid "Example: chatbot 🤖️" -#~ msgstr "" - -#~ msgid "" -#~ "Demonstrate how to interact with " -#~ "Xinference to play with LLM chat " -#~ "functionality with an AI agent 💻" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/examples/gradio_chatinterface.po b/doc/source/locale/ja_JP/LC_MESSAGES/examples/gradio_chatinterface.po deleted file mode 100644 index 46def45fbc..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/examples/gradio_chatinterface.po +++ /dev/null @@ -1,96 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/examples/gradio_chatinterface.rst:5 -msgid "Example: Gradio ChatInterface🤗" -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:7 -msgid "**Description**:" -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:9 -msgid "" -"This example showcases how to build a chatbot with 120 lines of code with" -" Gradio ChatInterface and Xinference local LLM" -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:11 -msgid "**Used Technology**:" -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:13 -msgid "" -"@ `Xinference <https://github.com/xorbitsai/inference>`_ as a LLM model " -"hosting service" -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:15 -msgid "" -"@ `Gradio <https://github.com/gradio-app/gradio>`_ as a web interface for" -" the chatbot" -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:17 -msgid "**Detailed Explanation on the Demo Functionality** :" -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:19 -msgid "" -"Parse user-provided command line arguments to capture essential model " -"parameters such as model name, size, format, and quantization." -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:21 -msgid "" -"Establish a connection to the Xinference framework and deploy the " -"specified model, ensuring it's ready for real-time interactions." -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:23 -msgid "" -"Implement helper functions (flatten and to_chat) to efficiently handle " -"and store chat interactions, ensuring the model has context for " -"generating relevant responses." -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:25 -msgid "" -"Set up an interactive chat interface using Gradio, allowing users to " -"communicate with the model in a user-friendly environment." -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:27 -msgid "" -"Activate the Gradio web interface, enabling users to start their chat " -"sessions and receive model-generated responses based on their queries." -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:29 -msgid "**Source Code** :" -msgstr "" - -#: ../../source/examples/gradio_chatinterface.rst:30 -msgid "" -"`Gradio ChatInterface " -"<https://github.com/xorbitsai/inference/blob/main/examples/gradio_chatinterface.py>`_" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/examples/index.po b/doc/source/locale/ja_JP/LC_MESSAGES/examples/index.po deleted file mode 100644 index e112d11bb6..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/examples/index.po +++ /dev/null @@ -1,161 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-27 15:43+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/examples/index.rst:5 -msgid "Examples" -msgstr "" - -#: ../../source/examples/index.rst:17 -msgid "" -"Here you can find examples and resources to learn about how to use " -"Xinference." -msgstr "" - -#: ../../source/examples/index.rst:20 -msgid "Demos" -msgstr "" - -#: ../../source/examples/index.rst:22 -msgid "End-to-end applications of using Xinference:" -msgstr "" - -#: ../../source/examples/index.rst:24 -msgid "`Voice Conversations with AI Agents on M2 Max <ai_podcast.html>`_" -msgstr "" - -#: ../../source/examples/index.rst:26 -msgid "`Interacting with LLM Models: A Command-Line Example <chatbot.html>`_" -msgstr "" - -#: ../../source/examples/index.rst:28 -msgid "" -"`Interacting with LLM Models: A Gradio ChatInterface Example " -"<gradio_chatinterface.html>`_" -msgstr "" - -#: ../../source/examples/index.rst:30 -msgid "`PDF Chatbot with Local LLM and Embeddings <pdf_chatbot.html>`_" -msgstr "" - -#: ../../source/examples/index.rst:32 -msgid "" -"`Local Doc Conversations with LangChain and Streamlit " -"<langchain_streamlit_doc_chat.html>`_" -msgstr "" - -#: ../../source/examples/index.rst:34 -msgid "" -"If you come across other examples in your own workflows we encourage you " -"to contribute a `PR <https://github.com/xorbitsai/inference/pulls>`_!" -msgstr "" - -#: ../../source/examples/index.rst:38 -msgid "Tutorials" -msgstr "" - -#: ../../source/examples/index.rst:40 -msgid "" -"The following tutorials cover the basics of using Xinference in different" -" scenarios:" -msgstr "" - -#: ../../source/examples/index.rst:42 -msgid "" -"`[Notebook] Question-answering(QA) Application with Xinference, Milvus " -"and LangChain " -"<https://github.com/RayJi01/Xprobe_inference/blob/main/examples/LangChain_QA.ipynb>`_" -msgstr "" - -#: ../../source/examples/index.rst:44 -msgid "" -"`Using Xinference local LLMs within LlamaIndex " -"<https://docs.llamaindex.ai/en/stable/examples/llm/xinference_local_deployment.html>`_" -msgstr "" - -#: ../../source/examples/index.rst:46 -msgid "" -"`[Chinese] 如何让 Chatbox 接入开源大模型,实现免费聊天 " -"<https://zhuanlan.zhihu.com/p/655765551>`_" -msgstr "" - -#: ../../source/examples/index.rst:48 -msgid "" -"`[Chinese] 摆脱 OpenAI 依赖,8 分钟教你用开源生态构建全栈 AI 应用 " -"<https://mp.weixin.qq.com/s/cXBC0dikldNiGwOwPuJfUQ>`_" -msgstr "" - -#: ../../source/examples/index.rst:50 -msgid "" -"`[Chinese] 使用全套开源工具构建 LLM 应用实战: 在 Dify 调用 Baichuan 开源模型能力 " -"<https://mp.weixin.qq.com/s/JWYWyJxS3ludMpMDZKw_Dw>`_" -msgstr "" - -#: ../../source/examples/index.rst:54 -msgid "Third-Party Library Integrations" -msgstr "" - -#: ../../source/examples/index.rst:56 -msgid "" -"Xinference is designed to seamlessly integrate and deploy open-sourced AI" -" models, so we want to incorporate support for mainstream toolkits in the" -" AI landscape. Xinference can be used with the following third-party " -"libraries:" -msgstr "" - -#: ../../source/examples/index.rst:59 -msgid "" -"LangChain `Text Embedding Models " -"<https://python.langchain.com/docs/integrations/text_embedding/xinference>`_" -" and `LLMs " -"<https://python.langchain.com/docs/integrations/llms/xinference>`_" -msgstr "" - -#: ../../source/examples/index.rst:61 -msgid "" -"`LlamaIndex Xinference LLM " -"<https://docs.llamaindex.ai/en/stable/api_reference/llms/xinference.html>`_" -msgstr "" - -#~ msgid "" -#~ "`Using Xinference local LLMs within " -#~ "LlamaIndex <https://gpt-" -#~ "index.readthedocs.io/en/stable/examples/llm/XinferenceLocalDeployment.html>`_" -#~ msgstr "" - -#~ msgid "" -#~ "`[Chinese] 如何让 Chatbox 接入开源大模型,实现免费聊天 " -#~ "<https://twitter.com/benn_huang/status/1701420060240490785>`_" -#~ msgstr "" - -#~ msgid "" -#~ "`[Chinese] 使用全套开源工具构建 LLM 应用实战 " -#~ "<https://mp.weixin.qq.com/s/regqYkF0cNDQIdOkOeyeXQ>`_" -#~ msgstr "" - -#~ msgid "End-to-end examples of using Xinference for various tasks:" -#~ msgstr "" - -#~ msgid "" -#~ "`Build a QA Application with Xinference" -#~ " and LangChain " -#~ "<https://github.com/RayJi01/Xprobe_inference/blob/main/examples/LangChain_QA.ipynb>`_" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/examples/pdf_chatbot.po b/doc/source/locale/ja_JP/LC_MESSAGES/examples/pdf_chatbot.po deleted file mode 100644 index 3580e07072..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/examples/pdf_chatbot.po +++ /dev/null @@ -1,95 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/examples/pdf_chatbot.rst:5 -msgid "Example: PDF Chatbot📚" -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:7 -msgid "**Description**:" -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:9 -msgid "" -"This example showcases how to build a PDF chatbot with local LLM and " -"Embedding models" -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:11 -msgid "**Used Technology**:" -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:13 -msgid "" -"@ `Xinference <https://github.com/xorbitsai/inference>`_ as a LLM model " -"hosting service" -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:15 -msgid "" -"@ `LlamaIndex <https://github.com/run-llama/llama_index>`_ for " -"orchestrating the entire RAG pipeline" -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:17 -msgid "@ `Streamlit <https://streamlit.io/>`_ for interactive UI" -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:19 -msgid "**Detailed Explanation on the Demo Functionality** :" -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:21 -msgid "" -"Crafted a Dockerfile to simplify the process and ensure easy " -"reproducibility." -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:23 -msgid "Set up models with Xinference and expose two ports for accessing them." -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:25 -msgid "" -"Leverage Streamlit for seamless file uploads and interactive " -"communication with the chat engine." -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:27 -msgid "5x faster doc embedding than OpenAI's API." -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:29 -msgid "" -"Leveraging the power of GGML to offload models to the GPU, ensuring swift" -" acceleration. Less long waits for returns." -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:31 -msgid "**Source Code** :" -msgstr "" - -#: ../../source/examples/pdf_chatbot.rst:32 -msgid "" -"`PDF Chatbot <https://github.com/onesuper/PDF-Chatbot-Local-LLM-" -"Embeddings>`_" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/accessing_models.po b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/accessing_models.po deleted file mode 100644 index 7c7d87ed1a..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/accessing_models.po +++ /dev/null @@ -1,80 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/getting_started/accessing_models.rst:5 -msgid "Accessing Models" -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:8 -msgid "" -"Suppose you have started the Xinference server endpoint at " -"``http://127.0.0.1:9997``." -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:10 -msgid "" -"Please refer to :ref:`Launching Models <launching_models>` guide to get " -"your model running." -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:13 -msgid "Using Xinference Client" -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:17 -msgid "Large Language Model" -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:18 -msgid "" -"When the abilities of the LLM include \"chat,\" we can converse with it " -"using the model's chat interface:" -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:34 -msgid "The response will look like:" -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:61 -msgid "Embedding Model" -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:63 -msgid "" -"To interact with Xinference's embedding model, i.e., inputting a text and" -" getting an embedding from ``RESTfulClient``:" -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:72 -msgid "The response will be:" -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:93 -msgid "Using OpenAI Python SDK" -msgstr "" - -#: ../../source/getting_started/accessing_models.rst:95 -msgid "" -"Xinference provides an OpenAI-compatible RESTful interface. Thus, you can" -" also use the OpenAI Python SDK to chat with the model via the service's " -"endpoint:" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/index.po b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/index.po deleted file mode 100644 index ceb70ed3ef..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/index.po +++ /dev/null @@ -1,25 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/getting_started/index.rst:5 -msgid "Getting Started" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/installation.po b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/installation.po deleted file mode 100644 index 202a5abb70..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/installation.po +++ /dev/null @@ -1,163 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-29 11:05+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.0\n" - -#: ../../source/getting_started/installation.rst:5 -msgid "Installation" -msgstr "" - -#: ../../source/getting_started/installation.rst:6 -msgid "" -"Xinference can be installed with ``pip`` on Linux, Windows, and macOS. To" -" run models using Xinference, you will need to install the backend " -"corresponding to the type of model you intend to serve." -msgstr "" - -#: ../../source/getting_started/installation.rst:8 -msgid "" -"If you aim to serve all supported models, you can install all the " -"necessary dependencies with a single command::" -msgstr "" - -#: ../../source/getting_started/installation.rst:13 -msgid "" -"If you want to serve models in GGML format, it's advised to install the " -"GGML dependencies manually based on your hardware specifications to " -"enable acceleration. For more details, see the :ref:`installation_ggml` " -"section." -msgstr "" - -#: ../../source/getting_started/installation.rst:16 -msgid "" -"If you want to install only the necessary backends, here's a breakdown of" -" how to do it." -msgstr "" - -#: ../../source/getting_started/installation.rst:19 -msgid "Transformers Backend" -msgstr "" - -#: ../../source/getting_started/installation.rst:20 -msgid "" -"PyTorch (transformers) supports the inference of most state-of-art " -"models. It is the default backend for models in PyTorch format::" -msgstr "" - -#: ../../source/getting_started/installation.rst:26 -msgid "vLLM Backend" -msgstr "" - -#: ../../source/getting_started/installation.rst:27 -msgid "" -"vLLM is a fast and easy-to-use library for LLM inference and serving. " -"Xinference will choose vLLM as the backend to achieve better throughput " -"when the following conditions are met:" -msgstr "" - -#: ../../source/getting_started/installation.rst:29 -msgid "The model format is PyTorch or GPTQ" -msgstr "" - -#: ../../source/getting_started/installation.rst:30 -msgid "The quantization method is GPTQ 4 bit or none" -msgstr "" - -#: ../../source/getting_started/installation.rst:31 -msgid "The system is Linux and has at least one CUDA device" -msgstr "" - -#: ../../source/getting_started/installation.rst:32 -msgid "The model is within the list of models supported by vLLM." -msgstr "" - -#: ../../source/getting_started/installation.rst:34 -msgid "Currently, supported models include:" -msgstr "" - -#: ../../source/getting_started/installation.rst:36 -msgid "``llama-2``, ``llama-2-chat``" -msgstr "" - -#: ../../source/getting_started/installation.rst:37 -msgid "``baichuan``, ``baichuan-chat``" -msgstr "" - -#: ../../source/getting_started/installation.rst:38 -msgid "``internlm``, ``internlm-20b``, ``internlm-chat``, ``internlm-chat-20b``" -msgstr "" - -#: ../../source/getting_started/installation.rst:39 -msgid "``vicuna-v1.3``, ``vicuna-v1.5``" -msgstr "" - -#: ../../source/getting_started/installation.rst:40 -msgid "``Yi``, ``Yi-chat``" -msgstr "" - -#: ../../source/getting_started/installation.rst:41 -msgid "``qwen-chat``" -msgstr "" - -#: ../../source/getting_started/installation.rst:42 -msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" -msgstr "" - -#: ../../source/getting_started/installation.rst:43 -msgid "``mistral-instruct-v0.1``" -msgstr "" - -#: ../../source/getting_started/installation.rst:44 -msgid "``chatglm3``" -msgstr "" - -#: ../../source/getting_started/installation.rst:46 -msgid "To install Xinference and vLLM::" -msgstr "" - -#: ../../source/getting_started/installation.rst:53 -msgid "GGML Backend" -msgstr "" - -#: ../../source/getting_started/installation.rst:54 -msgid "" -"It's advised to install the GGML dependencies manually based on your " -"hardware specifications to enable acceleration." -msgstr "" - -#: ../../source/getting_started/installation.rst:56 -msgid "Initial setup::" -msgstr "" - -#: ../../source/getting_started/installation.rst:61 -msgid "Hardware-Specific installations:" -msgstr "" - -#: ../../source/getting_started/installation.rst:63 -msgid "Apple Silicon::" -msgstr "" - -#: ../../source/getting_started/installation.rst:67 -msgid "Nvidia cards::" -msgstr "" - -#: ../../source/getting_started/installation.rst:71 -msgid "AMD cards::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/launching_models.po b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/launching_models.po deleted file mode 100644 index dd91f43cc2..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/launching_models.po +++ /dev/null @@ -1,63 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/getting_started/launching_models.rst:5 -msgid "Launching Models" -msgstr "" - -#: ../../source/getting_started/launching_models.rst:7 -msgid "You can launch models using Xinference's command line tool or client." -msgstr "" - -#: ../../source/getting_started/launching_models.rst:9 -msgid "First, make sure you have installed the Xinference SDK:" -msgstr "" - -#: ../../source/getting_started/launching_models.rst:16 -msgid "Launching models with CLI" -msgstr "" - -#: ../../source/getting_started/launching_models.rst:18 -msgid "" -"Suppose you have started the Xinference server endpoint at " -"``http://127.0.0.1:9997``." -msgstr "" - -#: ../../source/getting_started/launching_models.rst:21 -msgid "To launch an instance of Llama2 chat model:" -msgstr "" - -#: ../../source/getting_started/launching_models.rst:30 -msgid "To launch an instance of General Text Embeddings (GTE) model:" -msgstr "" - -#: ../../source/getting_started/launching_models.rst:40 -msgid "Launching models with client" -msgstr "" - -#: ../../source/getting_started/launching_models.rst:49 -msgid "" -"Once the model instance is launched, the system will return the model's " -"UID. You will need to use this model's UID as a handle to interact with " -"the model using the client. You can also list the running models using " -"the ``list_models`` method:" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/logging.po b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/logging.po deleted file mode 100644 index 081ee531ad..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/logging.po +++ /dev/null @@ -1,104 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-27 15:43+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/getting_started/logging.rst:5 -msgid "Logging in Xinference" -msgstr "" - -#: ../../source/getting_started/logging.rst:8 -msgid "Configure Log Level" -msgstr "" - -#: ../../source/getting_started/logging.rst:9 -msgid "" -"You can configure the log level with the ``--log-level`` option. For " -"example, starting a local cluster with ``DEBUG`` log level:" -msgstr "" - -#: ../../source/getting_started/logging.rst:18 -msgid "Log Files" -msgstr "" - -#: ../../source/getting_started/logging.rst:19 -msgid "" -"Xinference supports log rotation of log files. By default, logs rotate " -"when they reach 100MB (maxBytes), and up to 30 backup files (backupCount)" -" are kept. Note that the log level configured above takes effect in both " -"the command line logs and the log files." -msgstr "" - -#: ../../source/getting_started/logging.rst:24 -msgid "Log Directory Structure" -msgstr "" - -#: ../../source/getting_started/logging.rst:25 -msgid "" -"All the logs are stored in the ``<XINFERENCE_HOME>/logs`` directory, " -"where ``<XINFERENCE_HOME>`` can be configured as mentioned in " -":ref:`using_xinference`." -msgstr "" - -#: ../../source/getting_started/logging.rst:27 -msgid "" -"Xinference creates a subdirectory under the log directory " -"``<XINFERENCE_HOME>/logs``. The name of the subdirectory corresponds to " -"the Xinference cluster startup time in milliseconds." -msgstr "" - -#: ../../source/getting_started/logging.rst:31 -msgid "Local deployment" -msgstr "" - -#: ../../source/getting_started/logging.rst:32 -msgid "" -"In a local deployment, the logs of Xinference supervisor and Xinference " -"workers are combined into a single file. An example of the log directory " -"structure is shown below::" -msgstr "" - -#: ../../source/getting_started/logging.rst:38 -msgid "" -"where ``1699503558105`` is the timestamp when the Xinference cluster was " -"created. Therefore, when you create a cluster locally multiple times, you" -" can look for the corresponding logs based on this timestamp." -msgstr "" - -#: ../../source/getting_started/logging.rst:42 -msgid "Distributed deployment" -msgstr "" - -#: ../../source/getting_started/logging.rst:43 -msgid "" -"In a distributed deployment, Xinference supervisor and Xinference workers" -" each create their own subdirectory under the log directory. The name of " -"the subdirectory starts with the role name, followed by the role startup " -"time in milliseconds. An example of the log directory structure is shown " -"below::" -msgstr "" - -#~ msgid "" -#~ "In a local deployment, the logs of" -#~ " Xinference supervisor and Xorbits workers" -#~ " are combined into a single file. " -#~ "An example of the log directory " -#~ "structure is shown below::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/troubleshooting.po b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/troubleshooting.po deleted file mode 100644 index e716c44118..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/troubleshooting.po +++ /dev/null @@ -1,118 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 17:07+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/getting_started/troubleshooting.rst:5 -msgid "Troubleshooting" -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:9 -msgid "No huggingface repo access" -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:11 -msgid "" -"Sometimes, you may face errors accessing huggingface models, such as the " -"following message when accessing `llama2`:" -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:18 -msgid "" -"This typically indicates either a lack of access rights to the repository" -" or missing huggingface access tokens. The following sections provide " -"guidance on addressing these issues." -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:22 -msgid "Get access to the huggingface repo" -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:24 -msgid "" -"To obtain access, navigate to the desired huggingface repository and " -"agree to its terms and conditions. As an illustration, for the `llama2` " -"model, you can use this link: `https://huggingface.co/meta-llama/Llama-2" -"-7b-hf <https://huggingface.co/meta-llama/Llama-2-7b-hf>`_." -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:29 -msgid "Set up credentials to access huggingface" -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:31 -msgid "" -"Your credential to access huggingface can be found online at " -"`https://huggingface.co/settings/tokens " -"<https://huggingface.co/settings/tokens>`_." -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:33 -msgid "" -"You can set the token as an environmental variable, with ``export " -"HUGGING_FACE_HUB_TOKEN=your_token_here``." -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:36 -msgid "Download models from ModelScope" -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:38 -msgid "" -"When the network connection to HuggingFace is blocked, you can also " -"choose to download models from ModelScope, especially for Chinese users. " -"For a detailed list of supported models and settings, please refer to " -":ref:`models_download`." -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:43 -msgid "Incompatibility Between NVIDIA Driver and PyTorch Version" -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:45 -msgid "If you are using a NVIDIA GPU, you may face the following error:" -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:56 -msgid "" -"This typically indicates that your CUDA driver version is not compatible " -"with the PyTorch version you are using." -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:58 -msgid "" -"Go to `https://pytorch.org <https://pytorch.org>`_ to install a PyTorch " -"version that has been compiled with your version of the CUDA driver. **Do" -" not install a cuda version smaller than 11.8, preferably between 11.8 " -"and 12.1.**" -msgstr "" - -#: ../../source/getting_started/troubleshooting.rst:61 -msgid "" -"Say if your CUDA driver version is 11.8, then you can install PyTorch " -"with the following command:" -msgstr "" - -#~ msgid "" -#~ "Go to `https://pytorch.org <https://pytorch.org>`_" -#~ " to install a PyTorch version that" -#~ " has been compiled with your version" -#~ " of the CUDA driver." -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po b/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po deleted file mode 100644 index 3e1b5f8847..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/getting_started/using_xinference.po +++ /dev/null @@ -1,451 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-30 13:23+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.14.0\n" - -#: ../../source/getting_started/using_xinference.rst:5 -msgid "Using Xinference" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:9 -msgid "Run Xinference Locally" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:11 -msgid "" -"Let's start by running Xinference on a local machine and running a " -"classic LLM model: ``llama-2-chat``." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:13 -msgid "" -"After this quickstart, you will move on to learning how to deploy " -"Xinference in a cluster environment." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:16 -msgid "Start Local Server" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:18 -msgid "" -"First, please ensure that you have installed Xinference according to the " -"instructions provided :ref:`here <installation>`. To start a local " -"instance of Xinference, run the following command:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:23 -#: ../../source/getting_started/using_xinference.rst:65 -msgid "shell" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:29 -#: ../../source/getting_started/using_xinference.rst:71 -msgid "output" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:39 -msgid "" -"By default, Xinference uses ``<HOME>/.xinference`` as home path to store " -"necessary files such as logs and models, where ``<HOME>`` is the home " -"path of current user." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:42 -msgid "" -"You can change this directory by configuring the environment variable " -"``XINFERENCE_HOME``. For example:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:49 -msgid "" -"Congrats! You now have Xinference running on your local machine. Once " -"Xinference is running, there are multiple ways we can try it: via the web" -" UI, via cURL, via the command line, or via the Xinference's python " -"client." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:52 -msgid "" -"You can visit the web UI at `http://127.0.0.1:9997/ui " -"<http://127.0.0.1:9997/ui>`_ and visit `http://127.0.0.1:9997/docs " -"<http://127.0.0.1:9997/docs>`_ to inspect the API docs." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:55 -msgid "" -"You can install the Xinference command line tool and Python client using " -"the following command:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:61 -msgid "" -"The command line tool is ``xinference``. You can list the commands that " -"can be used by running:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:95 -msgid "" -"You can install the Xinference Python client with minimal dependencies " -"using the following command. Please ensure that the version of the client" -" matches the version of the Xinference server." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:103 -msgid "Run Llama-2" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:105 -msgid "" -"Let's start by running a built-in model: ``llama-2-chat``. When you start" -" a model for the first time, Xinference will download the model " -"parameters from HuggingFace, which might take a few minutes depending on " -"the size of the model weights. We cache the model files locally, so " -"there's no need to redownload them for subsequent starts." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:110 -msgid "" -"Xinference also allows you to download models from other sites. You can " -"do this by setting an environment variable when launching Xinference. For" -" example, if you want to download models from `modelscope " -"<https://modelscope.cn>`_, do the following:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:118 -msgid "" -"We can specify the model's UID using the ``--model-uid`` or ``-u`` flag. " -"If not specified, Xinference will generate a unique ID. This create a new" -" model instance with unique ID ``my-llama-2``:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:157 -msgid "" -"For some engines, such as vllm, users need to specify the engine-related " -"parameters when running models. In this case, you can directly specify " -"the parameter name and value in the command line, for example:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:165 -msgid "`gpu_memory_utilization=0.9` will pass to vllm when launching model." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:167 -msgid "" -"Congrats! You now have ``llama-2-chat`` running by Xinference. Once the " -"model is running, we can try it out either via cURL, or via Xinference's " -"python client:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:227 -msgid "" -"Xinference provides OpenAI-compatible APIs for its supported models, so " -"you can use Xinference as a local drop-in replacement for OpenAI APIs. " -"For example:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:243 -msgid "The following OpenAI APIs are supported:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:245 -msgid "" -"Chat Completions: `https://platform.openai.com/docs/api-reference/chat " -"<https://platform.openai.com/docs/api-reference/chat>`_" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:247 -msgid "" -"Completions: `https://platform.openai.com/docs/api-reference/completions " -"<https://platform.openai.com/docs/api-reference/completions>`_" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:249 -msgid "" -"Embeddings: `https://platform.openai.com/docs/api-reference/embeddings " -"<https://platform.openai.com/docs/api-reference/embeddings>`_" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:252 -msgid "Manage Models" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:254 -msgid "" -"In addition to launching models, Xinference offers various ways to manage" -" the entire lifecycle of models. You can manage models in Xinference " -"through the command line, cURL, or Xinference's python client." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:257 -msgid "" -"You can list all models of a certain type that are available to launch in" -" Xinference:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:275 -msgid "" -"The following command gives you the currently running models in " -"Xinference:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:293 -msgid "" -"When you no longer need a model that is currently running, you can remove" -" it in the following way to free up the resources it occupies:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:312 -msgid "Deploy Xinference In a Cluster" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:314 -msgid "" -"To deploy Xinference in a cluster, you need to start a Xinference " -"supervisor on one server and Xinference workers on the other servers." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:317 -msgid "" -"First, make sure you have already installed Xinference on each of the " -"servers according to the instructions provided :ref:`here " -"<installation>`. Then follow the steps below:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:321 -msgid "Start the Supervisor" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:322 -msgid "" -"On the server where you want to run the Xinference supervisor, run the " -"following command:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:328 -msgid "" -"Replace ``${supervisor_host}`` with the actual host of your supervisor " -"server." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:331 -msgid "" -"You can the supervisor's web UI at `http://${supervisor_host}:9997/ui " -"<http://${supervisor_host}:9997/ui>`_ and visit " -"`http://${supervisor_host}:9997/docs " -"<http://${supervisor_host}:9997/docs>`_ to inspect the API docs." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:335 -msgid "Start the Workers" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:337 -msgid "" -"On each of the other servers where you want to run Xinference workers, " -"run the following command:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:344 -msgid "" -"Note that you must replace ``${worker_host}`` with the actual host of " -"your worker server." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:347 -msgid "" -"Note that if you need to interact with the Xinference in a cluster via " -"the command line, you should include the ``-e`` or ``--endpoint`` flag to" -" specify the supervisor server's endpoint. For example:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:355 -msgid "Using Xinference With Docker" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:357 -msgid "To start Xinference in a Docker container, run the following command:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:360 -msgid "Run On Nvidia GPU Host" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:367 -msgid "Run On CPU Only Host" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:373 -msgid "" -"Replace ``<your_version>`` with Xinference versions, e.g. ``v0.10.3``, " -"``latest`` can be used for the latest version." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:375 -msgid "" -"For more docker usage, refer to :ref:`Using Docker Image " -"<using_docker_image>`." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:379 -msgid "Using Xinference On Kubernetes" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:381 -msgid "" -"To use Xinference on Kubernetes, `KubeBlocks <https://kubeblocks.io/>`_ " -"is required to help the installation." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:383 -msgid "The following steps assume Kubernetes is already installed." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:385 -msgid "" -"Download cli tool kbcli for KubeBlocks, see `install kbcli " -"<https://kubeblocks.io/docs/preview/user_docs/installation/install-with-" -"kbcli/install-kbcli/>`_." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:387 -msgid "Make sure kbcli version is at least v0.7.1." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:389 -msgid "" -"Install KubeBlocks using kbcli command, see `install KubeBlocks with " -"kbcli <https://kubeblocks.io/docs/preview/user_docs/installation/install-" -"with-kbcli/install-kubeblocks-with-kbcli/>`_." -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:391 -msgid "Enable Xinference addon, run the following command:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:397 -msgid "Use kbcli to start Xinference cluster, run the following command:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:403 -msgid "" -"If the Kubernetes node doesn't have GPU on it, run the command with extra" -" flag:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:409 -msgid "Use -h to read the help documentation for more options:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:416 -msgid "What's Next?" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:418 -msgid "" -"Congratulations on getting started with Xinference! To help you navigate " -"and make the most out of this powerful tool, here are some resources and " -"guides:" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:421 -msgid "" -":ref:`How to Use Client APIs for Different Types of Models " -"<user_guide_client_api>`" -msgstr "" - -#: ../../source/getting_started/using_xinference.rst:423 -msgid ":ref:`Choosing the Right Backends for Your Needs <user_guide_backends>`" -msgstr "" - -#~ msgid "Configure Xinference Home Path" -#~ msgstr "" - -#~ msgid "Using Xinference Locally" -#~ msgstr "" - -#~ msgid "To start a local instance of Xinference, run the following command:" -#~ msgstr "" - -#~ msgid "Using Xinference In a Cluster" -#~ msgstr "" - -#~ msgid "" -#~ "To deploy Xinference in a cluster, " -#~ "you need to start a Xinference " -#~ "supervisor on one server and Xinference" -#~ " workers on the other servers. Follow" -#~ " the steps below:" -#~ msgstr "" - -#~ msgid "Starting the Supervisor" -#~ msgstr "" - -#~ msgid "" -#~ "Replace ${supervisor_host} with the actual " -#~ "host of your supervisor server." -#~ msgstr "" - -#~ msgid "Starting the Workers" -#~ msgstr "" - -#~ msgid "" -#~ "Once Xinference is running, an endpoint" -#~ " will be accessible for model " -#~ "management via CLI or Xinference client." -#~ msgstr "" - -#~ msgid "" -#~ "We can specify the model's UID " -#~ "using the ``--model-uid`` or ``-u`` " -#~ "flag. If not specified, Xinference will" -#~ " generate a random ID. This create" -#~ " a new model instance with unique " -#~ "ID ``my-llama-2``:" -#~ msgstr "" - -#~ msgid "" -#~ "Congrats! You now have ``llama-2-chat`` " -#~ "running by Xinference. Once the model" -#~ " is running, we can try it out" -#~ " either command line, via cURL, or" -#~ " via Xinference's python client:" -#~ msgstr "" - -#~ msgid "" -#~ "On each of the other servers where" -#~ " you want to run Xinference workers," -#~ " run the following command:" -#~ msgstr "" - -#~ msgid "" -#~ "On each of the other servers where" -#~ " you want to run Xinference workers," -#~ " run the following command: .. note::" -#~ msgstr "" - -#~ msgid "" -#~ "Note that you must to replace " -#~ "``${worker_host}`` with the actual host " -#~ "of your supervisor server." -#~ msgstr "" - -#~ msgid "" -#~ "Note that you must to replace " -#~ "``${worker_host}`` with the actual host " -#~ "of your worker server." -#~ msgstr "" diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/index.po b/doc/source/locale/ja_JP/LC_MESSAGES/index.po deleted file mode 100644 index 0c37d06c70..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/index.po +++ /dev/null @@ -1,113 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-29 16:06+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" - -#: ../../source/index.rst:5 -msgid "Welcome to Xinference!" -msgstr "" - -#: ../../source/index.rst:18 -msgid "" -"Xorbits Inference (Xinference) is an open-source platform to streamline " -"the operation and integration of a wide array of AI models. With " -"Xinference, you're empowered to run inference using any open-source LLMs," -" embedding models, and multimodal models either in the cloud or on your " -"own premises, and create robust AI-driven applications." -msgstr "" - -#: ../../source/index.rst:24 -msgid "Developing Real-world AI Applications with Xinference" -msgstr "" - -#: ../../source/index.rst:80 -msgid "Getting Started" -msgstr "" - -#: ../../source/index.rst:84 -msgid "Install Xinference" -msgstr "" - -#: ../../source/index.rst:88 -msgid "Install Xinference on Linux, Windows, and macOS." -msgstr "" - -#: ../../source/index.rst:90 -msgid "Try it out!" -msgstr "" - -#: ../../source/index.rst:94 -msgid "Start by running Xinference on a local machine." -msgstr "" - -#: ../../source/index.rst:99 -msgid "Explore models" -msgstr "" - -#: ../../source/index.rst:103 -msgid "Explore a wide range of models supported by Xinference." -msgstr "" - -#: ../../source/index.rst:105 -msgid "Register your own model" -msgstr "" - -#: ../../source/index.rst:109 -msgid "Register model weights and turn it into an API." -msgstr "" - -#: ../../source/index.rst:113 -msgid "Getting Involved" -msgstr "" - -#: ../../source/index.rst:122 -msgid "Get Latest News" -msgstr "" - -#: ../../source/index.rst:130 -msgid ":fab:`twitter` Follow us on Twitter" -msgstr "" - -#: ../../source/index.rst:135 -msgid ":fab:`zhihu` Read our blogs" -msgstr "" - -#: ../../source/index.rst:142 -msgid "Get Support" -msgstr "" - -#: ../../source/index.rst:150 -msgid ":fab:`weixin` Find community on WeChat" -msgstr "" - -#: ../../source/index.rst:155 -msgid ":fab:`slack` Find community on Slack" -msgstr "" - -#: ../../source/index.rst:160 -msgid ":fab:`github` Open an issue" -msgstr "" - -#: ../../source/index.rst:167 -msgid "Contribute to Xinference" -msgstr "" - -#: ../../source/index.rst:175 -msgid ":fab:`github` Create a pull request" -msgstr "" diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/Yi-200k.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/Yi-200k.po deleted file mode 100644 index 3988dde6d4..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/Yi-200k.po +++ /dev/null @@ -1,100 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-13 12:00+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/Yi-200k.rst:6 -msgid "Yi-200k" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:8 -msgid "**Context Length:** 204800" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:9 -msgid "**Model Name:** Yi-200k" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:10 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:11 -msgid "**Abilities:** generate" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:12 -msgid "" -"**Description:** The Yi series models are large language models trained " -"from scratch by developers at 01.AI. The first public release contains " -"two bilingual (English/Chinese) base models with the parameter sizes of " -"6B and 34B. Both of them are trained with 4K sequence length and can be " -"extended to 32K during inference time." -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:15 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:18 -msgid "Model Spec 1 (pytorch, 6 Billion)" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:20 -#: ../../source/models/builtin/Yi-200k.rst:34 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:21 -msgid "**Model Size (in billions):** 6" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:22 -#: ../../source/models/builtin/Yi-200k.rst:36 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:23 -msgid "**Model ID:** 01-ai/Yi-6B-200K" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:25 -#: ../../source/models/builtin/Yi-200k.rst:39 -msgid "" -"Execute the following command to launch the model, remember to replace " -"`${quantization}` with your chosen quantization method from the options " -"listed above::" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:32 -msgid "Model Spec 2 (pytorch, 34 Billion)" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:35 -msgid "**Model Size (in billions):** 34" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:37 -msgid "**Model ID:** 01-ai/Yi-34B-200K" -msgstr "" - -#: ../../source/models/builtin/Yi-200k.rst:47 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/Yi.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/Yi.po deleted file mode 100644 index 0bde01b05f..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/Yi.po +++ /dev/null @@ -1,97 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-13 12:00+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/Yi.rst:6 -msgid "Yi" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:8 -msgid "**Context Length:** 4096" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:9 -msgid "**Model Name:** Yi" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:10 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:11 -msgid "**Abilities:** generate" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:12 -msgid "" -"**Description:** The Yi series models are large language models trained " -"from scratch by developers at 01.AI. The first public release contains " -"two bilingual (English/Chinese) base models with the parameter sizes of " -"6B and 34B. Both of them are trained with 4K sequence length and can be " -"extended to 32K during inference time." -msgstr "" - -#: ../../source/models/builtin/Yi.rst:15 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:18 -msgid "Model Spec 1 (pytorch, 6 Billion)" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:20 ../../source/models/builtin/Yi.rst:34 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:21 -msgid "**Model Size (in billions):** 6" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:22 ../../source/models/builtin/Yi.rst:36 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:23 -msgid "**Model ID:** 01-ai/Yi-6B" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:25 ../../source/models/builtin/Yi.rst:39 -msgid "" -"Execute the following command to launch the model, remember to replace " -"`${quantization}` with your chosen quantization method from the options " -"listed above::" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:32 -msgid "Model Spec 2 (pytorch, 34 Billion)" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:35 -msgid "**Model Size (in billions):** 34" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:37 -msgid "**Model ID:** 01-ai/Yi-34B" -msgstr "" - -#: ../../source/models/builtin/Yi.rst:47 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-2-chat.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-2-chat.po deleted file mode 100644 index c1377aae85..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-2-chat.po +++ /dev/null @@ -1,114 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/baichuan-2-chat.rst:5 -msgid "Baichuan-2-Chat" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:7 -msgid "**Context Length:** 4096" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:8 -msgid "**Model Name:** baichuan-2-chat" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:9 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:10 -msgid "**Abilities:** embed, generate, chat" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:11 -msgid "" -"**Description:** Baichuan2-chat is a fine-tuned version of the Baichuan " -"LLM, specializing in chatting." -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:14 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:17 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:19 -#: ../../source/models/builtin/baichuan-2-chat.rst:38 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:20 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:21 -#: ../../source/models/builtin/baichuan-2-chat.rst:40 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:22 -msgid "**Model ID:** baichuan-inc/Baichuan2-7B-Chat" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:23 -msgid "**Model Revision:** 2ce891951e000c36c65442608a0b95fd09b405dc" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:25 -#: ../../source/models/builtin/baichuan-2-chat.rst:44 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:32 -#: ../../source/models/builtin/baichuan-2-chat.rst:51 -msgid "Not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:36 -msgid "Model Spec 2 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:39 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:41 -msgid "**Model ID:** baichuan-inc/Baichuan2-13B-Chat" -msgstr "" - -#: ../../source/models/builtin/baichuan-2-chat.rst:42 -msgid "**Model Revision:** a56c793eb7a721ab6c270f779024e0375e8afd4a" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-2.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-2.po deleted file mode 100644 index 79ccb3a355..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-2.po +++ /dev/null @@ -1,106 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/baichuan-2.rst:5 -msgid "Baichuan-2" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:7 -msgid "**Context Length:** 4096" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:8 -msgid "**Model Name:** baichuan-2" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:9 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:10 -msgid "**Abilities:** embed, generate" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:11 -msgid "" -"**Description:** Baichuan2 is an open-source Transformer based LLM that " -"is trained on both Chinese and English data." -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:14 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:17 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:19 -#: ../../source/models/builtin/baichuan-2.rst:36 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:20 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:21 -#: ../../source/models/builtin/baichuan-2.rst:38 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:22 -msgid "**Model ID:** baichuan-inc/Baichuan2-7B-Base" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:24 -#: ../../source/models/builtin/baichuan-2.rst:41 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:31 -#: ../../source/models/builtin/baichuan-2.rst:48 -msgid "Not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:34 -msgid "Model Spec 2 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:37 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/baichuan-2.rst:39 -msgid "**Model ID:** baichuan-inc/Baichuan2-13B-Base" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-chat.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-chat.po deleted file mode 100644 index f267d13ba1..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan-chat.po +++ /dev/null @@ -1,76 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/baichuan-chat.rst:5 -msgid "Baichuan Chat" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:7 -msgid "**Model Name:** baichuan-chat" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:8 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:14 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:15 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:16 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:17 -msgid "**Model ID:** baichuan-inc/Baichuan-13B-Chat" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:19 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/baichuan-chat.rst:26 -msgid "Not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan.po deleted file mode 100644 index 94e88f6c31..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/baichuan.po +++ /dev/null @@ -1,122 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/baichuan.rst:5 -msgid "Baichuan" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:7 -msgid "**Model Name:** baichuan" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:8 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:9 -msgid "**Abilities:** embed, generate" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:15 -msgid "Model Spec 1 (ggmlv3)" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:17 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:18 -#: ../../source/models/builtin/baichuan.rst:35 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:19 -msgid "" -"**Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, " -"q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:20 -msgid "**Model ID:** TheBloke/baichuan-llama-7B-GGML" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:22 -#: ../../source/models/builtin/baichuan.rst:39 -#: ../../source/models/builtin/baichuan.rst:56 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:29 -msgid "" -"For utilizing the Apple Metal GPU for acceleration, select the q4_0 and " -"q4_1 quantizations." -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:32 -msgid "Model Spec 2 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:34 -#: ../../source/models/builtin/baichuan.rst:51 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:36 -#: ../../source/models/builtin/baichuan.rst:53 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:37 -msgid "**Model ID:** baichuan-inc/Baichuan-7B" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:46 -#: ../../source/models/builtin/baichuan.rst:63 -msgid "Not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:49 -msgid "Model Spec 3 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:52 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/baichuan.rst:54 -msgid "**Model ID:** baichuan-inc/Baichuan-13B-Base" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-en-v1.5.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-en-v1.5.po deleted file mode 100644 index ca8da624b8..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-en-v1.5.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-base-en-v1.5.rst:5 -msgid "bge-base-en-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-base-en-v1.5.rst:7 -msgid "**Model Name:** bge-base-en-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-base-en-v1.5.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/bge-base-en-v1.5.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-base-en-v1.5.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-base-en-v1.5.rst:14 -msgid "**Dimensions:** 768" -msgstr "" - -#: ../../source/models/builtin/bge-base-en-v1.5.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-base-en-v1.5.rst:16 -msgid "**Model ID:** BAAI/bge-base-en-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-base-en-v1.5.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-en.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-en.po deleted file mode 100644 index 417b82647c..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-en.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-base-en.rst:5 -msgid "bge-base-en" -msgstr "" - -#: ../../source/models/builtin/bge-base-en.rst:7 -msgid "**Model Name:** bge-base-en" -msgstr "" - -#: ../../source/models/builtin/bge-base-en.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/bge-base-en.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-base-en.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-base-en.rst:14 -msgid "**Dimensions:** 768" -msgstr "" - -#: ../../source/models/builtin/bge-base-en.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-base-en.rst:16 -msgid "**Model ID:** BAAI/bge-base-en" -msgstr "" - -#: ../../source/models/builtin/bge-base-en.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-zh-v1.5.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-zh-v1.5.po deleted file mode 100644 index f45b1ac480..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-zh-v1.5.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-base-zh-v1.5.rst:5 -msgid "bge-base-zh-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh-v1.5.rst:7 -msgid "**Model Name:** bge-base-zh-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh-v1.5.rst:8 -msgid "**Languages:** zh" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh-v1.5.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh-v1.5.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh-v1.5.rst:14 -msgid "**Dimensions:** 768" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh-v1.5.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh-v1.5.rst:16 -msgid "**Model ID:** BAAI/bge-base-zh-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh-v1.5.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-zh.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-zh.po deleted file mode 100644 index 97f49c6f59..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-base-zh.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-base-zh.rst:5 -msgid "bge-base-zh" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh.rst:7 -msgid "**Model Name:** bge-base-zh" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh.rst:8 -msgid "**Languages:** zh" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh.rst:14 -msgid "**Dimensions:** 1024" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh.rst:16 -msgid "**Model ID:** BAAI/bge-base-zh" -msgstr "" - -#: ../../source/models/builtin/bge-base-zh.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-en-v1.5.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-en-v1.5.po deleted file mode 100644 index 922242c375..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-en-v1.5.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-large-en-v1.5.rst:5 -msgid "bge-large-en-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-large-en-v1.5.rst:7 -msgid "**Model Name:** bge-large-en-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-large-en-v1.5.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/bge-large-en-v1.5.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-large-en-v1.5.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-large-en-v1.5.rst:14 -msgid "**Dimensions:** 1024" -msgstr "" - -#: ../../source/models/builtin/bge-large-en-v1.5.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-large-en-v1.5.rst:16 -msgid "**Model ID:** BAAI/bge-large-en-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-large-en-v1.5.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-en.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-en.po deleted file mode 100644 index fd7d9d4fd6..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-en.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-large-en.rst:5 -msgid "bge-large-en" -msgstr "" - -#: ../../source/models/builtin/bge-large-en.rst:7 -msgid "**Model Name:** bge-large-en" -msgstr "" - -#: ../../source/models/builtin/bge-large-en.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/bge-large-en.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-large-en.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-large-en.rst:14 -msgid "**Dimensions:** 1024" -msgstr "" - -#: ../../source/models/builtin/bge-large-en.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-large-en.rst:16 -msgid "**Model ID:** BAAI/bge-large-en" -msgstr "" - -#: ../../source/models/builtin/bge-large-en.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh-noinstruct.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh-noinstruct.po deleted file mode 100644 index 68e7b1c958..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh-noinstruct.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-large-zh-noinstruct.rst:5 -msgid "bge-large-zh-noinstruct" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-noinstruct.rst:7 -msgid "**Model Name:** bge-large-zh-noinstruct" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-noinstruct.rst:8 -msgid "**Languages:** zh" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-noinstruct.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-noinstruct.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-noinstruct.rst:14 -msgid "**Dimensions:** 1024" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-noinstruct.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-noinstruct.rst:16 -msgid "**Model ID:** BAAI/bge-large-zh-noinstruct" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-noinstruct.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh-v1.5.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh-v1.5.po deleted file mode 100644 index a5138e9302..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh-v1.5.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-large-zh-v1.5.rst:5 -msgid "bge-large-zh-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-v1.5.rst:7 -msgid "**Model Name:** bge-large-zh-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-v1.5.rst:8 -msgid "**Languages:** zh" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-v1.5.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-v1.5.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-v1.5.rst:14 -msgid "**Dimensions:** 1024" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-v1.5.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-v1.5.rst:16 -msgid "**Model ID:** BAAI/bge-large-zh-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh-v1.5.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh.po deleted file mode 100644 index 2096059464..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-large-zh.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-large-zh.rst:5 -msgid "bge-large-en" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh.rst:7 -msgid "**Model Name:** bge-large-zh" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh.rst:8 -msgid "**Languages:** zh" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh.rst:14 -msgid "**Dimensions:** 1024" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh.rst:16 -msgid "**Model ID:** BAAI/bge-large-zh" -msgstr "" - -#: ../../source/models/builtin/bge-large-zh.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-en-v1.5.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-en-v1.5.po deleted file mode 100644 index 88e42c35f9..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-en-v1.5.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-small-en-v1.5.rst:5 -msgid "bge-small-en-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-small-en-v1.5.rst:7 -msgid "**Model Name:** bge-small-en-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-small-en-v1.5.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/bge-small-en-v1.5.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-small-en-v1.5.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-small-en-v1.5.rst:14 -msgid "**Dimensions:** 384" -msgstr "" - -#: ../../source/models/builtin/bge-small-en-v1.5.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-small-en-v1.5.rst:16 -msgid "**Model ID:** BAAI/bge-small-en-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-small-en-v1.5.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-zh-v1.5.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-zh-v1.5.po deleted file mode 100644 index e05784936f..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-zh-v1.5.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-small-zh-v1.5.rst:5 -msgid "bge-small-zh-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh-v1.5.rst:7 -msgid "**Model Name:** bge-small-zh-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh-v1.5.rst:8 -msgid "**Languages:** zh" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh-v1.5.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh-v1.5.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh-v1.5.rst:14 -msgid "**Dimensions:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh-v1.5.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh-v1.5.rst:16 -msgid "**Model ID:** BAAI/bge-small-zh-v1.5" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh-v1.5.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-zh.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-zh.po deleted file mode 100644 index a181a676ff..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/bge-small-zh.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/bge-small-zh.rst:5 -msgid "bge-large-en" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh.rst:7 -msgid "**Model Name:** bge_small_zh" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh.rst:8 -msgid "**Languages:** zh" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh.rst:14 -msgid "**Dimensions:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh.rst:16 -msgid "**Model ID:** BAAI/bge_small_zh" -msgstr "" - -#: ../../source/models/builtin/bge-small-zh.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm.po deleted file mode 100644 index b8ad527901..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm.po +++ /dev/null @@ -1,98 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/chatglm.rst:5 -msgid "ChatGLM" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:7 -msgid "**Model Name:** chatglm" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:8 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:15 -msgid "Model Spec 1 (ggmlv3, 6 Billion)" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:17 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:18 -#: ../../source/models/builtin/chatglm.rst:31 -msgid "**Model Size (in billions):** 6" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:19 -msgid "**Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:20 -msgid "**Model ID:** Xorbits/chatglm-6B-GGML" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:22 -#: ../../source/models/builtin/chatglm.rst:35 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:28 -msgid "Model Spec 2 (pytorch, 6 Billion)" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:30 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:32 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:33 -msgid "**Model ID:** THUDM/chatglm-6b" -msgstr "" - -#: ../../source/models/builtin/chatglm.rst:42 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm2-32k.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm2-32k.po deleted file mode 100644 index 7835ae324f..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm2-32k.po +++ /dev/null @@ -1,80 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/chatglm2-32k.rst:5 -msgid "ChatGLM2 32k" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:7 -msgid "**Model Name:** chatglm2-32k" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:8 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:15 -msgid "Model Spec 1 (pytorch, 6 Billion)" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:17 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:18 -msgid "**Model Size (in billions):** 6" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:19 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:20 -msgid "**Model ID:** THUDM/chatglm2-6b-32k" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:22 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/chatglm2-32k.rst:29 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm2.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm2.po deleted file mode 100644 index e96f2026b5..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm2.po +++ /dev/null @@ -1,98 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/chatglm2.rst:5 -msgid "ChatGLM2" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:7 -msgid "**Model Name:** chatglm2" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:8 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:15 -msgid "Model Spec 1 (ggmlv3, 6 Billion)" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:17 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:18 -#: ../../source/models/builtin/chatglm2.rst:31 -msgid "**Model Size (in billions):** 6" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:19 -msgid "**Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:20 -msgid "**Model ID:** Xorbits/chatglm2-6B-GGML" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:22 -#: ../../source/models/builtin/chatglm2.rst:35 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:28 -msgid "Model Spec 2 (pytorch, 6 Billion)" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:30 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:32 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:33 -msgid "**Model ID:** THUDM/chatglm2-6b" -msgstr "" - -#: ../../source/models/builtin/chatglm2.rst:42 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm3-32k.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm3-32k.po deleted file mode 100644 index cbf6983fb9..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm3-32k.po +++ /dev/null @@ -1,82 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/chatglm3-32k.rst:6 -msgid "ChatGLM3-32K" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:8 -msgid "**Context Length:** 32768" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:9 -msgid "**Model Name:** chatglm3-32k" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:10 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:11 -msgid "**Abilities:** chat" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:12 -msgid "" -"**Description:** ChatGLM3 is the third generation of ChatGLM, still open-" -"source and trained on Chinese and English data." -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:15 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:18 -msgid "Model Spec (pytorch, 6 Billion)" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:20 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:21 -msgid "**Model Size (in billions):** 6" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:22 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:23 -msgid "**Model ID:** THUDM/chatglm3-6b-32k" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:25 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/chatglm3-32k.rst:32 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm3.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm3.po deleted file mode 100644 index b915c3932e..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/chatglm3.po +++ /dev/null @@ -1,82 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/chatglm3.rst:6 -msgid "ChatGLM3" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:8 -msgid "**Context Length:** 8192" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:9 -msgid "**Model Name:** chatglm3" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:10 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:11 -msgid "**Abilities:** chat" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:12 -msgid "" -"**Description:** ChatGLM3 is the third generation of ChatGLM, still open-" -"source and trained on Chinese and English data." -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:15 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:18 -msgid "Model Spec (pytorch, 6 Billion)" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:20 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:21 -msgid "**Model Size (in billions):** 6" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:22 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:23 -msgid "**Model ID:** THUDM/chatglm3-6b" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:25 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/chatglm3.rst:32 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama-instruct.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama-instruct.po deleted file mode 100644 index 74e20905fa..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama-instruct.po +++ /dev/null @@ -1,116 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/code-llama-instruct.rst:6 -msgid "Code-Llama-Instruct" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:8 -msgid "**Context Length:** 100000" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:9 -msgid "**Model Name:** code-llama-instruct" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:10 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:11 -msgid "**Abilities:** chat" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:14 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:17 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:19 -#: ../../source/models/builtin/code-llama-instruct.rst:36 -#: ../../source/models/builtin/code-llama-instruct.rst:54 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:20 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:21 -#: ../../source/models/builtin/code-llama-instruct.rst:38 -#: ../../source/models/builtin/code-llama-instruct.rst:56 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:22 -msgid "**Model ID:** codellama/CodeLlama-7b-Instruct-hf" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:24 -#: ../../source/models/builtin/code-llama-instruct.rst:41 -#: ../../source/models/builtin/code-llama-instruct.rst:59 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:31 -#: ../../source/models/builtin/code-llama-instruct.rst:49 -#: ../../source/models/builtin/code-llama-instruct.rst:67 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:34 -msgid "Model Spec 2 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:37 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:39 -msgid "**Model ID:** codellama/CodeLlama-13b-Instruct-hf" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:52 -msgid "Model Spec 3 (pytorch, 34 Billion)" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:55 -msgid "**Model Size (in billions):** 34" -msgstr "" - -#: ../../source/models/builtin/code-llama-instruct.rst:57 -msgid "**Model ID:** codellama/CodeLlama-34b-Instruct-hf" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama-python.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama-python.po deleted file mode 100644 index cd3faea25e..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama-python.po +++ /dev/null @@ -1,116 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/code-llama-python.rst:6 -msgid "Code-Llama-Python" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:8 -msgid "**Context Length:** 100000" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:9 -msgid "**Model Name:** code-llama-python" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:10 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:11 -msgid "**Abilities:** generate" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:14 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:17 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:19 -#: ../../source/models/builtin/code-llama-python.rst:36 -#: ../../source/models/builtin/code-llama-python.rst:53 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:20 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:21 -#: ../../source/models/builtin/code-llama-python.rst:38 -#: ../../source/models/builtin/code-llama-python.rst:55 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:22 -msgid "**Model ID:** TheBloke/CodeLlama-7B-Python-fp16" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:24 -#: ../../source/models/builtin/code-llama-python.rst:41 -#: ../../source/models/builtin/code-llama-python.rst:58 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:31 -#: ../../source/models/builtin/code-llama-python.rst:48 -#: ../../source/models/builtin/code-llama-python.rst:65 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:34 -msgid "Model Spec 2 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:37 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:39 -msgid "**Model ID:** TheBloke/CodeLlama-13B-Python-fp16" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:51 -msgid "Model Spec 3 (pytorch, 34 Billion)" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:54 -msgid "**Model Size (in billions):** 34" -msgstr "" - -#: ../../source/models/builtin/code-llama-python.rst:56 -msgid "**Model ID:** TheBloke/CodeLlama-34B-Python-fp16" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama.po deleted file mode 100644 index 7f10c1b7e7..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/code-llama.po +++ /dev/null @@ -1,116 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/code-llama.rst:5 -msgid "Code-Llama" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:7 -msgid "**Context Length:** 100000" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:8 -msgid "**Model Name:** code-llama" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:9 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:10 -msgid "**Abilities:** generate" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:13 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:16 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:18 -#: ../../source/models/builtin/code-llama.rst:35 -#: ../../source/models/builtin/code-llama.rst:52 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:19 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:20 -#: ../../source/models/builtin/code-llama.rst:37 -#: ../../source/models/builtin/code-llama.rst:54 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:21 -msgid "**Model ID:** TheBloke/CodeLlama-7B-fp16" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:23 -#: ../../source/models/builtin/code-llama.rst:40 -#: ../../source/models/builtin/code-llama.rst:57 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:30 -#: ../../source/models/builtin/code-llama.rst:47 -#: ../../source/models/builtin/code-llama.rst:64 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:33 -msgid "Model Spec 2 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:36 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:38 -msgid "**Model ID:** TheBloke/CodeLlama-13B-fp16" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:50 -msgid "Model Spec 3 (pytorch, 34 Billion)" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:53 -msgid "**Model Size (in billions):** 34" -msgstr "" - -#: ../../source/models/builtin/code-llama.rst:55 -msgid "**Model ID:** TheBloke/CodeLlama-34B-fp16" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/e5-large-v2.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/e5-large-v2.po deleted file mode 100644 index 5df20a610a..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/e5-large-v2.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/e5-large-v2.rst:5 -msgid "gte-large" -msgstr "" - -#: ../../source/models/builtin/e5-large-v2.rst:7 -msgid "**Model Name:** e5-large-v2" -msgstr "" - -#: ../../source/models/builtin/e5-large-v2.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/e5-large-v2.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/e5-large-v2.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/e5-large-v2.rst:14 -msgid "**Dimensions:** 1024" -msgstr "" - -#: ../../source/models/builtin/e5-large-v2.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/e5-large-v2.rst:16 -msgid "**Model ID:** intfloat/e5-large-v2" -msgstr "" - -#: ../../source/models/builtin/e5-large-v2.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/falcon-instruct.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/falcon-instruct.po deleted file mode 100644 index a75cc2cb38..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/falcon-instruct.po +++ /dev/null @@ -1,96 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/falcon-instruct.rst:5 -msgid "Falcon Instruct" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:7 -msgid "**Model Name:** falcon-instruct" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:15 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:17 -#: ../../source/models/builtin/falcon-instruct.rst:34 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:18 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:19 -#: ../../source/models/builtin/falcon-instruct.rst:36 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:20 -msgid "**Model ID:** tiiuae/falcon-7b-instruct" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:22 -#: ../../source/models/builtin/falcon-instruct.rst:39 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:29 -#: ../../source/models/builtin/falcon-instruct.rst:46 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:32 -msgid "Model Spec 2 (pytorch, 40 Billion)" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:35 -msgid "**Model Size (in billions):** 40" -msgstr "" - -#: ../../source/models/builtin/falcon-instruct.rst:37 -msgid "**Model ID:** tiiuae/falcon-40b-instruct" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/falcon.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/falcon.po deleted file mode 100644 index 085bdab8da..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/falcon.po +++ /dev/null @@ -1,96 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/falcon.rst:5 -msgid "Falcon" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:7 -msgid "**Model Name:** falcon" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:9 -msgid "**Abilities:** embed, generate" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:15 -msgid "Model Spec 2 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:17 -#: ../../source/models/builtin/falcon.rst:34 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:18 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:19 -#: ../../source/models/builtin/falcon.rst:36 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:20 -msgid "**Model ID:** tiiuae/falcon-7b" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:22 -#: ../../source/models/builtin/falcon.rst:39 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:29 -#: ../../source/models/builtin/falcon.rst:46 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/falcon.rst:32 -msgid "Model Spec 1 (pytorch, 40 Billion)" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:35 -msgid "**Model Size (in billions):** 40" -msgstr "" - -#: ../../source/models/builtin/falcon.rst:37 -msgid "**Model ID:** tiiuae/falcon-40b" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/gte-base.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/gte-base.po deleted file mode 100644 index 79e1a7a3a2..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/gte-base.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/gte-base.rst:5 -msgid "gte-base" -msgstr "" - -#: ../../source/models/builtin/gte-base.rst:7 -msgid "**Model Name:** gte-base" -msgstr "" - -#: ../../source/models/builtin/gte-base.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/gte-base.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/gte-base.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/gte-base.rst:14 -msgid "**Dimensions:** 768" -msgstr "" - -#: ../../source/models/builtin/gte-base.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/gte-base.rst:16 -msgid "**Model ID:** thenlper/gte-large" -msgstr "" - -#: ../../source/models/builtin/gte-base.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/gte-large.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/gte-large.po deleted file mode 100644 index 267ad355d1..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/gte-large.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/gte-large.rst:5 -msgid "gte-large" -msgstr "" - -#: ../../source/models/builtin/gte-large.rst:7 -msgid "**Model Name:** gte-large" -msgstr "" - -#: ../../source/models/builtin/gte-large.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/gte-large.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/gte-large.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/gte-large.rst:14 -msgid "**Dimensions:** 1024" -msgstr "" - -#: ../../source/models/builtin/gte-large.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/gte-large.rst:16 -msgid "**Model ID:** thenlper/gte-large" -msgstr "" - -#: ../../source/models/builtin/gte-large.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/index.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/index.po deleted file mode 100644 index 523e761bfd..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/index.po +++ /dev/null @@ -1,214 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-27 15:43+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/index.rst:5 -msgid "Builtin Models" -msgstr "" - -#~ msgid "Built-in Models" -#~ msgstr "" - -#~ msgid "Large Language Models" -#~ msgstr "" - -#~ msgid "Text Generation Models" -#~ msgstr "" - -#~ msgid ":ref:`Baichuan <models_builtin_baichuan>`" -#~ msgstr "" - -#~ msgid ":ref:`Baichuan-2 <models_builtin_baichuan_2>`" -#~ msgstr "" - -#~ msgid ":ref:`Falcon <models_builtin_falcon>`" -#~ msgstr "" - -#~ msgid ":ref:`InternLM <models_builtin_internlm>`" -#~ msgstr "" - -#~ msgid ":ref:`InternLM 20B <models_builtin_internlm_20b>`" -#~ msgstr "" - -#~ msgid ":ref:`Llama-2 <models_builtin_llama_2>`" -#~ msgstr "" - -#~ msgid ":ref:`OPT <models_builtin_opt>`" -#~ msgstr "" - -#~ msgid ":ref:`Yi <models_builtin_Yi>`" -#~ msgstr "" - -#~ msgid ":ref:`Yi-200k <models_builtin_Yi_200k>`" -#~ msgstr "" - -#~ msgid "Chat & Instruction-following Models" -#~ msgstr "" - -#~ msgid ":ref:`Baichuan Chat <models_builtin_baichuan_chat>`" -#~ msgstr "" - -#~ msgid ":ref:`Baichuan-2 Chat <models_builtin_baichuan_2_chat>`" -#~ msgstr "" - -#~ msgid ":ref:`ChatGLM <models_builtin_chatglm>`" -#~ msgstr "" - -#~ msgid ":ref:`ChatGLM2 <models_builtin_chatglm2>`" -#~ msgstr "" - -#~ msgid ":ref:`ChatGLM2-32k <models_builtin_chatglm2_32k>`" -#~ msgstr "" - -#~ msgid ":ref:`ChatGLM3 <models_builtin_chatglm3>`" -#~ msgstr "" - -#~ msgid ":ref:`ChatGLM3-32k <models_builtin_chatglm3_32k>`" -#~ msgstr "" - -#~ msgid ":ref:`CodeLlama-Instruct <models_builtin_code_llama_instruct>`" -#~ msgstr "" - -#~ msgid ":ref:`Falcon Instruct <models_builtin_falcon_instruct>`" -#~ msgstr "" - -#~ msgid ":ref:`InternLM Chat <models_builtin_internlm_chat>`" -#~ msgstr "" - -#~ msgid ":ref:`InternLM Chat 20B <models_builtin_internlm_chat_20b>`" -#~ msgstr "" - -#~ msgid ":ref:`InternLM Chat 8K <models_builtin_internlm_chat_8k>`" -#~ msgstr "" - -#~ msgid ":ref:`Llama-2 Chat <models_builtin_llama_2_chat>`" -#~ msgstr "" - -#~ msgid ":ref:`OpenBuddy v11.1 <models_builtin_openbuddy_v11.1>`" -#~ msgstr "" - -#~ msgid ":ref:`Orca Mini <models_builtin_orca_mini>`" -#~ msgstr "" - -#~ msgid ":ref:`Qwen Chat <models_builtin_qwen_chat>`" -#~ msgstr "" - -#~ msgid ":ref:`Vicuna v1.3 <models_builtin_vicuna_v1_3>`" -#~ msgstr "" - -#~ msgid ":ref:`Vicuna v1.5 <models_builtin_vicuna_v1_5>`" -#~ msgstr "" - -#~ msgid ":ref:`Vicuna v1.5 16k <models_builtin_vicuna_v1_5_16k>`" -#~ msgstr "" - -#~ msgid ":ref:`WizardLM v1.0 <models_builtin_wizardlm_v1_0>`" -#~ msgstr "" - -#~ msgid ":ref:`WizardMath v1.0 <models_builtin_wizardmath_v1_0>`" -#~ msgstr "" - -#~ msgid ":ref:`Zephyr-7B-α <models_builtin_zephyr_7b_alpha>`" -#~ msgstr "" - -#~ msgid ":ref:`Zephyr-7B-β <models_builtin_zephyr_7b_beta>`" -#~ msgstr "" - -#~ msgid "Code Generation Models" -#~ msgstr "" - -#~ msgid ":ref:`Starcoder <models_builtin_starcoder>`" -#~ msgstr "" - -#~ msgid ":ref:`StarCoderPlus <models_builtin_starcoderplus>`" -#~ msgstr "" - -#~ msgid ":ref:`Code-Llama <models_builtin_code_llama>`" -#~ msgstr "" - -#~ msgid ":ref:`Code-Llama-Python <models_builtin_code_llama_python>`" -#~ msgstr "" - -#~ msgid ":ref:`WizardCoder-Python-v1.0 <models_builtin_wizardcoder_python_v1_0>`" -#~ msgstr "" - -#~ msgid "Code Assistant Models" -#~ msgstr "" - -#~ msgid ":ref:`Starchat-beta <models_builtin_starchat_beta>`" -#~ msgstr "" - -#~ msgid "Embedding Models" -#~ msgstr "" - -#~ msgid "Language: English" -#~ msgstr "" - -#~ msgid ":ref:`bge-large-en <models_builtin_bge_large_en>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-large-en-v1.5 <models_builtin_bge_large_en_v1.5>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-base-en <models_builtin_bge_base_en>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-base-en-v1.5 <models_builtin_bge_base_en_v1.5>`" -#~ msgstr "" - -#~ msgid ":ref:`gte-large <models_builtin_gte_large>`" -#~ msgstr "" - -#~ msgid ":ref:`gte-base <models_builtin_gte_base>`" -#~ msgstr "" - -#~ msgid ":ref:`e5-large-v2 <models_builtin_e5_large_v2>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-small-en-v1.5 <models_builtin_bge_small_en_v1.5>`" -#~ msgstr "" - -#~ msgid "Language: Chinese" -#~ msgstr "" - -#~ msgid ":ref:`bge-large-zh <models_builtin_bge_large_zh>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-large-zh-noinstruct <models_builtin_bge_large_zh_noinstruct>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-large-zh-v1.5 <models_builtin_bge_large_zh_v1.5>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-base-zh <models_builtin_bge_base_zh>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-base-zh-v1.5 <models_builtin_bge_base_zh_v1.5>`" -#~ msgstr "" - -#~ msgid ":ref:`multilingual-e5-large <models_builtin_multilingual_e5_large>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-small-zh <models_builtin_bge_small_zh>`" -#~ msgstr "" - -#~ msgid ":ref:`bge-small-zh-v1.5 <models_builtin_bge_small_zh_v1.5>`" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-20b.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-20b.po deleted file mode 100644 index a0ed3b4914..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-20b.po +++ /dev/null @@ -1,75 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/internlm-20b.rst:5 -msgid "InternLM-20B Model" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:7 -msgid "**Context Length:** 16384" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:8 -msgid "**Model Name:** internlm-20b" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:9 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:10 -msgid "**Abilities:** generate" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:11 -msgid "" -"**Description:** Pre-trained on over 2.3T Tokens containing high-quality " -"English, Chinese, and code data." -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:14 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:17 -msgid "Model Spec (pytorch, 20 Billion)" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:19 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:20 -msgid "**Model Size (in billions):** 20" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:21 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:22 -msgid "**Model ID:** internlm/internlm-20b" -msgstr "" - -#: ../../source/models/builtin/internlm-20b.rst:23 -msgid "**Model Revision:** f0433b0db933a9adfa169f756ab8547f67ccef1d" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat-20b.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat-20b.po deleted file mode 100644 index ed34f0a948..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat-20b.po +++ /dev/null @@ -1,72 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/internlm-chat-20b.rst:5 -msgid "InternLM-Chat-20B" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:7 -msgid "**Context Length:** 16384" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:8 -msgid "**Model Name:** internlm-chat-20b" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:9 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:10 -msgid "**Abilities:** chat" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:11 -msgid "" -"**Description:** Pre-trained on over 2.3T Tokens containing high-quality " -"English, Chinese, and code data. The Chat version has undergone SFT and " -"RLHF training." -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:14 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:17 -msgid "Model Spec (pytorch, 20 Billion)" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:19 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:20 -msgid "**Model Size (in billions):** 20" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:21 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-20b.rst:22 -msgid "**Model ID:** internlm/internlm-chat-20b" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat-8k.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat-8k.po deleted file mode 100644 index f7a27b423a..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat-8k.po +++ /dev/null @@ -1,80 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/internlm-chat-8k.rst:6 -msgid "InternLM Chat 8K" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:8 -msgid "**Model Name:** internlm-chat-8k" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:9 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:10 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:13 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:16 -msgid "Model Spec (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:18 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:19 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:20 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:21 -msgid "**Model ID:** internlm/internlm-chat-7b-8k" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:23 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/internlm-chat-8k.rst:29 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat.po deleted file mode 100644 index 504d48e012..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm-chat.po +++ /dev/null @@ -1,80 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/internlm-chat.rst:5 -msgid "InternLM Chat" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:7 -msgid "**Model Name:** internlm-chat" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:8 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:15 -msgid "Model Spec (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:17 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:18 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:19 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:20 -msgid "**Model ID:** internlm/internlm-chat-7b" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:22 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/internlm-chat.rst:28 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm.po deleted file mode 100644 index 51c2b94952..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/internlm.po +++ /dev/null @@ -1,80 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/internlm.rst:5 -msgid "InternLM" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:7 -msgid "**Model Name:** internlm" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:8 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:9 -msgid "**Abilities:** embed, generate" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:15 -msgid "Model Spec (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:17 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:18 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:19 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:20 -msgid "**Model ID:** internlm/internlm-7b" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:22 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/internlm.rst:28 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/llama-2-chat.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/llama-2-chat.po deleted file mode 100644 index c458ef02b6..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/llama-2-chat.po +++ /dev/null @@ -1,156 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/llama-2-chat.rst:5 -msgid "Llama-2 Chat" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:7 -msgid "**Model Name:** llama-2-chat" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:15 -msgid "Model Spec 1 (ggmlv3, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:17 -#: ../../source/models/builtin/llama-2-chat.rst:30 -#: ../../source/models/builtin/llama-2-chat.rst:44 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:18 -#: ../../source/models/builtin/llama-2-chat.rst:58 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:19 -#: ../../source/models/builtin/llama-2-chat.rst:32 -#: ../../source/models/builtin/llama-2-chat.rst:46 -msgid "" -"**Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, " -"q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:20 -msgid "**Model ID:** TheBloke/Llama-2-7B-Chat-GGML" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:22 -#: ../../source/models/builtin/llama-2-chat.rst:35 -#: ../../source/models/builtin/llama-2-chat.rst:49 -#: ../../source/models/builtin/llama-2-chat.rst:62 -#: ../../source/models/builtin/llama-2-chat.rst:80 -#: ../../source/models/builtin/llama-2-chat.rst:97 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:28 -msgid "Model Spec 2 (ggmlv3, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:31 -#: ../../source/models/builtin/llama-2-chat.rst:76 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:33 -msgid "**Model ID:** TheBloke/Llama-2-13B-chat-GGML" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:42 -msgid "Model Spec 3 (ggmlv3, 70 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:45 -#: ../../source/models/builtin/llama-2-chat.rst:93 -msgid "**Model Size (in billions):** 70" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:47 -msgid "**Model ID:** TheBloke/Llama-2-70B-Chat-GGML" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:55 -msgid "Model Spec 4 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:57 -#: ../../source/models/builtin/llama-2-chat.rst:75 -#: ../../source/models/builtin/llama-2-chat.rst:92 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:59 -#: ../../source/models/builtin/llama-2-chat.rst:77 -#: ../../source/models/builtin/llama-2-chat.rst:94 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:60 -msgid "**Model ID:** meta-llama/Llama-2-7b-chat-hf" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:69 -#: ../../source/models/builtin/llama-2-chat.rst:87 -#: ../../source/models/builtin/llama-2-chat.rst:104 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:73 -msgid "Model Spec 5 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:78 -msgid "**Model ID:** meta-llama/Llama-2-13b-chat-hf" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:90 -msgid "Model Spec 6 (pytorch, 70 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2-chat.rst:95 -msgid "**Model ID:** meta-llama/Llama-2-70b-chat-hf" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/llama-2.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/llama-2.po deleted file mode 100644 index 39db6f5c22..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/llama-2.po +++ /dev/null @@ -1,156 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/llama-2.rst:5 -msgid "Llama-2" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:7 -msgid "**Model Name:** llama-2" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:9 -msgid "**Abilities:** embed, generate" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:15 -msgid "Model Spec 1 (ggmlv3, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:17 -#: ../../source/models/builtin/llama-2.rst:30 -#: ../../source/models/builtin/llama-2.rst:43 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:18 -#: ../../source/models/builtin/llama-2.rst:57 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:19 -#: ../../source/models/builtin/llama-2.rst:32 -#: ../../source/models/builtin/llama-2.rst:45 -msgid "" -"**Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, " -"q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:20 -msgid "**Model ID:** TheBloke/Llama-2-7B-GGML" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:22 -#: ../../source/models/builtin/llama-2.rst:35 -#: ../../source/models/builtin/llama-2.rst:48 -#: ../../source/models/builtin/llama-2.rst:61 -#: ../../source/models/builtin/llama-2.rst:78 -#: ../../source/models/builtin/llama-2.rst:95 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:28 -msgid "Model Spec 2 (ggmlv3, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:31 -#: ../../source/models/builtin/llama-2.rst:74 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:33 -msgid "**Model ID:** TheBloke/Llama-2-13B-GGML" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:41 -msgid "Model Spec 3 (ggmlv3, 70 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:44 -#: ../../source/models/builtin/llama-2.rst:91 -msgid "**Model Size (in billions):** 70" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:46 -msgid "**Model ID:** TheBloke/Llama-2-70B-GGML" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:54 -msgid "Model Spec 4 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:56 -#: ../../source/models/builtin/llama-2.rst:73 -#: ../../source/models/builtin/llama-2.rst:90 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:58 -#: ../../source/models/builtin/llama-2.rst:75 -#: ../../source/models/builtin/llama-2.rst:92 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:59 -msgid "**Model ID:** meta-llama/Llama-2-7b-hf" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:68 -#: ../../source/models/builtin/llama-2.rst:85 -#: ../../source/models/builtin/llama-2.rst:102 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:71 -msgid "Model Spec 5 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:76 -msgid "**Model ID:** meta-llama/Llama-2-13b-hf" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:88 -msgid "Model Spec 6 (pytorch, 70 Billion)" -msgstr "" - -#: ../../source/models/builtin/llama-2.rst:93 -msgid "**Model ID:** meta-llama/Llama-2-70b-hf" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/multilingual-e5-large.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/multilingual-e5-large.po deleted file mode 100644 index 5bf6fed901..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/multilingual-e5-large.po +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/multilingual-e5-large.rst:5 -msgid "bge-base-zh" -msgstr "" - -#: ../../source/models/builtin/multilingual-e5-large.rst:7 -msgid "**Model Name:** multilingual-e5-large" -msgstr "" - -#: ../../source/models/builtin/multilingual-e5-large.rst:8 -msgid "**Languages:** zh" -msgstr "" - -#: ../../source/models/builtin/multilingual-e5-large.rst:9 -msgid "**Abilities:** embed" -msgstr "" - -#: ../../source/models/builtin/multilingual-e5-large.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/multilingual-e5-large.rst:14 -msgid "**Dimensions:** 1024" -msgstr "" - -#: ../../source/models/builtin/multilingual-e5-large.rst:15 -msgid "**Max Tokens:** 512" -msgstr "" - -#: ../../source/models/builtin/multilingual-e5-large.rst:16 -msgid "**Model ID:** intfloat/multilingual-e5-large" -msgstr "" - -#: ../../source/models/builtin/multilingual-e5-large.rst:18 -msgid "Execute the following command to launch the model::" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/openbuddy.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/openbuddy.po deleted file mode 100644 index 66c861628d..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/openbuddy.po +++ /dev/null @@ -1,82 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/openbuddy.rst:5 -msgid "OpenBuddy" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:7 -msgid "**Model Name:** OpenBuddy" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:8 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:15 -msgid "Model Spec 1 (ggmlv3, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:17 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:18 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:19 -msgid "" -"**Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_1, Q4_K_S, " -"Q4_K_M, Q5_0, Q5_1, Q5_K_S, Q5_K_M, Q6_K, Q8_0" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:20 -msgid "**Model ID:** TheBloke/OpenBuddy-Llama2-13B-v11.1-GGML" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:22 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/openbuddy.rst:29 -msgid "Multiple rounds chat is disabled for better translation." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/opt.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/opt.po deleted file mode 100644 index 44651fc155..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/opt.po +++ /dev/null @@ -1,80 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/opt.rst:5 -msgid "OPT" -msgstr "" - -#: ../../source/models/builtin/opt.rst:7 -msgid "**Model Name:** opt" -msgstr "" - -#: ../../source/models/builtin/opt.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/opt.rst:9 -msgid "**Abilities:** embed, generate" -msgstr "" - -#: ../../source/models/builtin/opt.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/opt.rst:15 -msgid "Model Spec 1 (pytorch, 1 Billion)" -msgstr "" - -#: ../../source/models/builtin/opt.rst:17 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/opt.rst:18 -msgid "**Model Size (in billions):** 1" -msgstr "" - -#: ../../source/models/builtin/opt.rst:19 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/opt.rst:20 -msgid "**Model ID:** facebook/opt-125m" -msgstr "" - -#: ../../source/models/builtin/opt.rst:22 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/opt.rst:29 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/orca_mini.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/orca_mini.po deleted file mode 100644 index f0c83a9f86..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/orca_mini.po +++ /dev/null @@ -1,106 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/orca_mini.rst:5 -msgid "Orca Mini" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:7 -msgid "**Model Name:** orca" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:15 -msgid "Model Spec 1 (ggmlv3, 3 Billion)" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:17 -#: ../../source/models/builtin/orca_mini.rst:30 -#: ../../source/models/builtin/orca_mini.rst:43 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:18 -msgid "**Model Size (in billions):** 3" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:19 -#: ../../source/models/builtin/orca_mini.rst:32 -#: ../../source/models/builtin/orca_mini.rst:45 -msgid "**Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:20 -msgid "**Model ID:** TheBloke/orca_mini_3B-GGML" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:22 -#: ../../source/models/builtin/orca_mini.rst:35 -#: ../../source/models/builtin/orca_mini.rst:48 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:28 -msgid "Model Spec 2 (ggmlv3, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:31 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:33 -msgid "**Model ID:** TheBloke/orca_mini_7B-GGML" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:41 -msgid "Model Spec 3 (ggmlv3, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:44 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/orca_mini.rst:46 -msgid "**Model ID:** TheBloke/orca_mini_13B-GGML" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/qwen-chat.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/qwen-chat.po deleted file mode 100644 index 352d34849f..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/qwen-chat.po +++ /dev/null @@ -1,102 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-16 11:22+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/qwen-chat.rst:5 -msgid "Qwen Chat" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:7 -msgid "**Model Name:** qwen-chat" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:8 -msgid "**Languages:** en, zh" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:15 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:17 -#: ../../source/models/builtin/qwen-chat.rst:34 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:18 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:19 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:20 -msgid "**Model ID:** Qwen/Qwen-7B-Chat" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:22 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:29 -#: ../../source/models/builtin/qwen-chat.rst:45 -msgid "4-bit and 8-bit quantization are not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:32 -msgid "Model Spec 2 (pytorch, 14 Billion)" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:35 -msgid "**Model Size (in billions):** 14" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:36 -msgid "**Quantizations:** none" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:37 -msgid "**Model ID:** Qwen/Qwen-14B-Chat" -msgstr "" - -#: ../../source/models/builtin/qwen-chat.rst:39 -msgid "Execute the following command to launch the model::" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starchat-beta.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starchat-beta.po deleted file mode 100644 index be581abc38..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starchat-beta.po +++ /dev/null @@ -1,80 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/starchat-beta.rst:5 -msgid "Starchat-beta" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:7 -msgid "**Model Name:** starchat-beta" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:15 -msgid "Model Spec (pytorch, 16 Billion)" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:17 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:18 -msgid "**Model Size (in billions):** 16" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:19 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:20 -msgid "**Model ID:** HuggingFaceH4/starchat-beta" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:22 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/starchat-beta.rst:29 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starcoder.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starcoder.po deleted file mode 100644 index a842f7aae5..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starcoder.po +++ /dev/null @@ -1,61 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/starcoder.rst:5 -msgid "StarCoder" -msgstr "" - -#: ../../source/models/builtin/starcoder.rst:7 -msgid "**Model Name:** starcoder" -msgstr "" - -#: ../../source/models/builtin/starcoder.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/starcoder.rst:9 -msgid "**Abilities:** generate" -msgstr "" - -#: ../../source/models/builtin/starcoder.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/starcoder.rst:15 -msgid "Model Spec (ggmlv3, 16 Billion)" -msgstr "" - -#: ../../source/models/builtin/starcoder.rst:17 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/starcoder.rst:18 -msgid "**Model Size (in billions):** 16" -msgstr "" - -#: ../../source/models/builtin/starcoder.rst:19 -msgid "**Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0" -msgstr "" - -#: ../../source/models/builtin/starcoder.rst:20 -msgid "**Model ID:** TheBloke/starcoder-GGML" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starcoderplus.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starcoderplus.po deleted file mode 100644 index 7fa413967a..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/starcoderplus.po +++ /dev/null @@ -1,80 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/starcoderplus.rst:5 -msgid "StarCoderPlus" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:7 -msgid "**Model Name:** starcoderplus" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:9 -msgid "**Abilities:** embed, generate" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:15 -msgid "Model Spec (pytorch, 16 Billion)" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:17 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:18 -msgid "**Model Size (in billions):** 16" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:19 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:20 -msgid "**Model ID:** bigcode/starcoderplus" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:22 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/starcoderplus.rst:29 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.3.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.3.po deleted file mode 100644 index df86672410..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.3.po +++ /dev/null @@ -1,168 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/vicuna-v1.3.rst:5 -msgid "Vicuna v1.3" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:7 -msgid "**Model Name:** vicuna-v1.3" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:15 -msgid "Model Spec 1 (ggmlv3, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:17 -#: ../../source/models/builtin/vicuna-v1.3.rst:31 -#: ../../source/models/builtin/vicuna-v1.3.rst:45 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:18 -#: ../../source/models/builtin/vicuna-v1.3.rst:60 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:19 -#: ../../source/models/builtin/vicuna-v1.3.rst:33 -#: ../../source/models/builtin/vicuna-v1.3.rst:47 -msgid "" -"**Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, " -"q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:20 -msgid "**Model ID:** TheBloke/vicuna-7B-v1.3-GGML" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:21 -msgid "**File Name Template:** vicuna-7b-v1.3.ggmlv3.{quantization}.bin" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:23 -#: ../../source/models/builtin/vicuna-v1.3.rst:37 -#: ../../source/models/builtin/vicuna-v1.3.rst:51 -#: ../../source/models/builtin/vicuna-v1.3.rst:64 -#: ../../source/models/builtin/vicuna-v1.3.rst:81 -#: ../../source/models/builtin/vicuna-v1.3.rst:98 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:29 -msgid "Model Spec 2 (ggmlv3, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:32 -#: ../../source/models/builtin/vicuna-v1.3.rst:77 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:34 -msgid "**Model ID:** TheBloke/vicuna-13b-v1.3.0-GGML" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:35 -msgid "**File Name Template:** vicuna-13b-v1.3.0.ggmlv3.{quantization}.bin" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:43 -msgid "Model Spec 3 (ggmlv3, 33 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:46 -#: ../../source/models/builtin/vicuna-v1.3.rst:94 -msgid "**Model Size (in billions):** 33" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:48 -msgid "**Model ID:** TheBloke/vicuna-33B-GGML" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:49 -msgid "**File Name Template:** vicuna-33b.ggmlv3.{quantization}.bin" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:57 -msgid "Model Spec 6 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:59 -#: ../../source/models/builtin/vicuna-v1.3.rst:76 -#: ../../source/models/builtin/vicuna-v1.3.rst:93 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:61 -#: ../../source/models/builtin/vicuna-v1.3.rst:78 -#: ../../source/models/builtin/vicuna-v1.3.rst:95 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:62 -msgid "**Model ID:** lmsys/vicuna-7b-v1.3" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:71 -#: ../../source/models/builtin/vicuna-v1.3.rst:88 -#: ../../source/models/builtin/vicuna-v1.3.rst:105 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:74 -msgid "Model Spec 5 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:79 -msgid "**Model ID:** lmsys/vicuna-13b-v1.3" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:91 -msgid "Model Spec 4 (pytorch, 33 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.3.rst:96 -msgid "**Model ID:** lmsys/vicuna-33b-v1.3" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.5-16k.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.5-16k.po deleted file mode 100644 index b60beb75e6..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.5-16k.po +++ /dev/null @@ -1,96 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:5 -msgid "Vicuna v1.5-16k" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:7 -msgid "**Model Name:** vicuna-v1.5-16k" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:15 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:17 -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:34 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:18 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:19 -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:36 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:20 -msgid "**Model ID:** lmsys/vicuna-7b-v1.5-16k" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:22 -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:39 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:29 -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:46 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:32 -msgid "Model Spec 2 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:35 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5-16k.rst:37 -msgid "**Model ID:** lmsys/vicuna-13b-v1.5-16k" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.5.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.5.po deleted file mode 100644 index 8b2df625e8..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/vicuna-v1.5.po +++ /dev/null @@ -1,96 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/vicuna-v1.5.rst:5 -msgid "Vicuna v1.5" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:7 -msgid "**Model Name:** vicuna-v1.5" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:15 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:17 -#: ../../source/models/builtin/vicuna-v1.5.rst:34 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:18 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:19 -#: ../../source/models/builtin/vicuna-v1.5.rst:36 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:20 -msgid "**Model ID:** lmsys/vicuna-7b-v1.5" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:22 -#: ../../source/models/builtin/vicuna-v1.5.rst:39 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:29 -#: ../../source/models/builtin/vicuna-v1.5.rst:46 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:32 -msgid "Model Spec 2 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:35 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/vicuna-v1.5.rst:37 -msgid "**Model ID:** lmsys/vicuna-13b-v1.5" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardcoder-python-v1.0.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardcoder-python-v1.0.po deleted file mode 100644 index 48d6ed4369..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardcoder-python-v1.0.po +++ /dev/null @@ -1,160 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:5 -msgid "WizardCoder-Python-v1.0" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:7 -msgid "**Context Length:** 100000" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:8 -msgid "**Model Name:** wizardcoder-python-v1.0" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:9 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:10 -msgid "**Abilities:** generate, chat" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:13 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:16 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:18 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:36 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:53 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:19 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:71 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:20 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:38 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:55 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:21 -msgid "**Model ID:** WizardLM/WizardCoder-Python-7B-V1.0" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:23 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:41 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:58 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:75 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:89 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:103 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:30 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:48 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:65 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:34 -msgid "Model Spec 2 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:37 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:84 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:39 -msgid "**Model ID:** WizardLM/WizardCoder-Python-13B-V1.0" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:51 -msgid "Model Spec 3 (pytorch, 34 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:54 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:98 -msgid "**Model Size (in billions):** 34" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:56 -msgid "**Model ID:** WizardLM/WizardCoder-Python-34B-V1.0" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:68 -msgid "Model Spec 4 (ggufv2, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:70 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:83 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:97 -msgid "**Model Format:** ggufv2" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:72 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:85 -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:99 -msgid "" -"**Quantizations:** Q2_K, Q3_K_L, Q3_K_M, Q3_K_S, Q4_0, Q4_K_M, Q4_K_S, " -"Q5_0, Q5_K_M, Q5_K_S, Q6_K, Q8_0" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:73 -msgid "**Model ID:** TheBloke/WizardCoder-Python-7B-V1.0-GGUF" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:81 -msgid "Model Spec 5 (ggufv2, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:86 -msgid "**Model ID:** TheBloke/WizardCoder-Python-13B-V1.0-GGUF" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:87 -msgid "**File Name Template:** wizardcoder-python-13b-v1.0.{quantization}.gguf" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:95 -msgid "Model Spec 6 (ggufv2, 34 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:100 -msgid "**Model ID:** TheBloke/WizardCoder-Python-34B-V1.0-GGUF" -msgstr "" - -#: ../../source/models/builtin/wizardcoder-python-v1.0.rst:101 -msgid "**File Name Template:** wizardcoder-python-34b-v1.0.{quantization}.gguf" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardlm-v1.0.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardlm-v1.0.po deleted file mode 100644 index 1f67c8ba0e..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardlm-v1.0.po +++ /dev/null @@ -1,93 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:5 -msgid "WizardLM v1.0" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:7 -msgid "**Model Name:** wizardlm-v1.0" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:15 -msgid "Model Spec 1 (ggmlv3, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:17 -#: ../../source/models/builtin/wizardlm-v1.0.rst:30 -msgid "**Model Format:** ggmlv3" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:18 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:19 -#: ../../source/models/builtin/wizardlm-v1.0.rst:32 -msgid "" -"**Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, " -"q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:20 -msgid "**Model ID:** TheBloke/WizardLM-7B-V1.0-Uncensored-GGML" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:22 -#: ../../source/models/builtin/wizardlm-v1.0.rst:35 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:28 -msgid "Model Spec 2 (ggmlv3, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:31 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/wizardlm-v1.0.rst:33 -msgid "**Model ID:** TheBloke/WizardLM-13B-V1.0-Uncensored-GGML" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardmath-v1.0.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardmath-v1.0.po deleted file mode 100644 index af7a6be974..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/wizardmath-v1.0.po +++ /dev/null @@ -1,112 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:5 -msgid "WizardMath v1.0" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:7 -msgid "**Model Name:** wizardmath-v1.0" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:8 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:9 -msgid "**Abilities:** embed, chat" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:12 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:15 -msgid "Model Spec 1 (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:17 -#: ../../source/models/builtin/wizardmath-v1.0.rst:34 -#: ../../source/models/builtin/wizardmath-v1.0.rst:51 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:18 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:19 -#: ../../source/models/builtin/wizardmath-v1.0.rst:36 -#: ../../source/models/builtin/wizardmath-v1.0.rst:53 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:20 -msgid "**Model ID:** WizardLM/WizardMath-7B-V1.0" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:22 -#: ../../source/models/builtin/wizardmath-v1.0.rst:39 -#: ../../source/models/builtin/wizardmath-v1.0.rst:56 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:29 -#: ../../source/models/builtin/wizardmath-v1.0.rst:46 -#: ../../source/models/builtin/wizardmath-v1.0.rst:63 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:32 -msgid "Model Spec 2 (pytorch, 13 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:35 -msgid "**Model Size (in billions):** 13" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:37 -msgid "**Model ID:** WizardLM/WizardMath-13B-V1.0" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:49 -msgid "Model Spec 3 (pytorch, 70 Billion)" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:52 -msgid "**Model Size (in billions):** 70" -msgstr "" - -#: ../../source/models/builtin/wizardmath-v1.0.rst:54 -msgid "**Model ID:** WizardLM/WizardMath-70B-V1.0" -msgstr "" - -#~ msgid "" -#~ "Execute the following command to launch" -#~ " the model, remember to replace " -#~ "`${quantization}` with your chosen " -#~ "quantization method from the options " -#~ "listed above::" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/zephyr-7b-alpha.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/zephyr-7b-alpha.po deleted file mode 100644 index 600835c685..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/zephyr-7b-alpha.po +++ /dev/null @@ -1,82 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:5 -msgid "Zephyr-7B-alpha" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:7 -msgid "**Context Length:** 8192" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:8 -msgid "**Model Name:** zephyr-7b-alpha" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:9 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:10 -msgid "**Abilities:** chat" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:11 -msgid "" -"**Description:** Zephyr-7B-α is the first model in the series, and is a " -"fine-tuned version of mistralai/Mistral-7B-v0.1." -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:14 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:17 -msgid "Model Spec (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:19 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:20 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:21 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:22 -msgid "**Model ID:** HuggingFaceH4/zephyr-7b-alpha" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:24 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-alpha.rst:31 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/zephyr-7b-beta.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/zephyr-7b-beta.po deleted file mode 100644 index 8769041e78..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/builtin/zephyr-7b-beta.po +++ /dev/null @@ -1,86 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-01 10:48+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:5 -msgid "Zephyr-7B-beta" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:7 -msgid "**Context Length:** 8192" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:8 -msgid "**Model Name:** zephyr-7b-beta" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:9 -msgid "**Languages:** en" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:10 -msgid "**Abilities:** chat" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:11 -msgid "" -"**Description:** Zephyr-7B-β is the second model in the series, and is a " -"fine-tuned version of mistralai/Mistral-7B-v0.1." -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:14 -msgid "Specifications" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:17 -msgid "Model Spec (pytorch, 7 Billion)" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:19 -msgid "**Model Format:** pytorch" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:20 -msgid "**Model Size (in billions):** 7" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:21 -msgid "**Quantizations:** 4-bit, 8-bit, none" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:22 -msgid "**Model ID:** HuggingFaceH4/zephyr-7b-beta" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:23 -msgid "**Model Revision:** 3bac358730f8806e5c3dc7c7e19eb36e045bf720" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:25 -msgid "" -"Execute the following command to launch the model, remember to replace " -"``${quantization}`` with your chosen quantization method from the options" -" listed above::" -msgstr "" - -#: ../../source/models/builtin/zephyr-7b-beta.rst:32 -msgid "4-bit quantization is not supported on macOS." -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/custom.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/custom.po deleted file mode 100644 index 0643ce8afa..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/custom.po +++ /dev/null @@ -1,357 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-09 14:56+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.15.0\n" - -#: ../../source/models/custom.rst:5 -msgid "Custom Models" -msgstr "" - -#: ../../source/models/custom.rst:6 -msgid "" -"Xinference provides a flexible and comprehensive way to integrate, " -"manage, and utilize custom models." -msgstr "" - -#: ../../source/models/custom.rst:9 -msgid "Define a custom LLM model" -msgstr "" - -#: ../../source/models/custom.rst:11 -msgid "Define a custom LLM model based on the following template:" -msgstr "" - -#: ../../source/models/custom.rst:52 ../../source/models/custom.rst:181 -#: ../../source/models/custom.rst:204 -msgid "" -"model_name: A string defining the name of the model. The name must start " -"with a letter or a digit and can only contain letters, digits, " -"underscores, or dashes." -msgstr "" - -#: ../../source/models/custom.rst:53 -msgid "" -"context_length: context_length: An optional integer that specifies the " -"maximum context size the model was trained to accommodate, encompassing " -"both the input and output lengths. If not defined, the default value is " -"2048 tokens (~1,500 words)." -msgstr "" - -#: ../../source/models/custom.rst:54 -msgid "" -"model_lang: A list of strings representing the supported languages for " -"the model. Example: [\"en\"], which means that the model supports " -"English." -msgstr "" - -#: ../../source/models/custom.rst:55 -msgid "" -"model_ability: A list of strings defining the abilities of the model. It " -"could include options like \"embed\", \"generate\", and \"chat\". In this" -" case, the model has the ability to \"generate\"." -msgstr "" - -#: ../../source/models/custom.rst:56 -msgid "" -"model_family: A required string representing the family of the model you " -"want to register. The optional values are the model names of all :ref" -":`built-in models <models_llm_index>`. If the model family you register " -"is not among the built-in models in Xinference, please fill in ``other``." -" Note that you should choose the model family based on the ability of the" -" model you want to register. For example, if you want to register the " -"``llama-2`` model, do not fill in ``llama-2-chat`` as the model family." -msgstr "" - -#: ../../source/models/custom.rst:62 -msgid "" -"model_specs: An array of objects defining the specifications of the " -"model. These include:" -msgstr "" - -#: ../../source/models/custom.rst:58 -msgid "" -"model_format: A string that defines the model format, could be " -"\"pytorch\" or \"ggmlv3\"." -msgstr "" - -#: ../../source/models/custom.rst:59 -msgid "" -"model_size_in_billions: An integer defining the size of the model in " -"billions of parameters." -msgstr "" - -#: ../../source/models/custom.rst:60 -msgid "" -"quantizations: A list of strings defining the available quantizations for" -" the model. For PyTorch models, it could be \"4-bit\", \"8-bit\", or " -"\"none\". For ggmlv3 models, the quantizations should correspond to " -"values that work with the ``model_file_name_template``." -msgstr "" - -#: ../../source/models/custom.rst:61 -msgid "" -"model_id: A string representing the model ID, possibly referring to an " -"identifier used by Hugging Face. **If model_uri is missing, Xinference " -"will try to download the model from the huggingface repository specified " -"here.**." -msgstr "" - -#: ../../source/models/custom.rst:62 -msgid "" -"model_uri: A string representing the URI where the model can be loaded " -"from, such as \"file:///path/to/llama-2-7b\". **When the model format is " -"ggmlv3 or ggufv2, model_uri must be the specific file path. When the " -"model format is pytorch, model_uri must be the path to the directory " -"containing the model files.** If model URI is absent, Xinference will try" -" to download the model from Hugging Face with the model ID." -msgstr "" - -#: ../../source/models/custom.rst:63 -msgid "" -"model_file_name_template: Required by ggml/gguf models. An f-string " -"template used for defining the model file name based on the quantization." -" **Note that this field is just a template for the format of the " -"ggmlv3/ggufv2 model file, do not fill in the specific path of the model " -"file.**" -msgstr "" - -#: ../../source/models/custom.rst:64 -msgid "" -"prompt_style: If the ``model_family`` field is not ``other``, this field " -"does not need to be filled in. ``prompt_style`` is an optional field that" -" could be required by ``chat`` models to define the style of prompts. The" -" given example has this set to None, but additional details could be " -"found in a referenced file xinference/model/llm/tests/test_utils.py. You " -"can also specify this field as a string, which will use the builtin " -"prompt style in Xinference. For example:" -msgstr "" - -#: ../../source/models/custom.rst:73 -msgid "Xinference supports these builtin prompt styles in common usage:" -msgstr "" - -#: ../../source/models/custom.rst:77 -msgid "baichuan-chat" -msgstr "" - -#: ../../source/models/custom.rst:96 -msgid "chatglm3" -msgstr "" - -#: ../../source/models/custom.rst:109 -msgid "qwen-chat" -msgstr "" - -#: ../../source/models/custom.rst:126 -msgid "llama-2-chat" -msgstr "" - -#: ../../source/models/custom.rst:147 -msgid "vicuna-v1.5" -msgstr "" - -#: ../../source/models/custom.rst:162 -msgid "" -"The above lists some commonly used built-in prompt styles. The full list " -"of supported prompt styles can be found on the Xinference web UI." -msgstr "" - -#: ../../source/models/custom.rst:166 -msgid "Define a custom embedding model" -msgstr "" - -#: ../../source/models/custom.rst:168 -msgid "Define a custom embedding model based on the following template:" -msgstr "" - -#: ../../source/models/custom.rst:182 -msgid "dimensions: A integer that specifies the embedding dimensions." -msgstr "" - -#: ../../source/models/custom.rst:183 -msgid "" -"max_tokens: A integer that represents the max sequence length that the " -"embedding model supports." -msgstr "" - -#: ../../source/models/custom.rst:184 ../../source/models/custom.rst:206 -msgid "" -"language: A list of strings representing the supported languages for the " -"model. Example: [\"en\"], which means that the model supports English." -msgstr "" - -#: ../../source/models/custom.rst:185 ../../source/models/custom.rst:207 -msgid "" -"model_id: A string representing the model ID, possibly referring to an " -"identifier used by Hugging Face." -msgstr "" - -#: ../../source/models/custom.rst:186 ../../source/models/custom.rst:208 -msgid "" -"model_uri: A string representing the URI where the model can be loaded " -"from, such as \"file:///path/to/your_model\". If model URI is absent, " -"Xinference will try to download the model from Hugging Face with the " -"model ID." -msgstr "" - -#: ../../source/models/custom.rst:190 -msgid "Define a custom Rerank model" -msgstr "" - -#: ../../source/models/custom.rst:192 -msgid "Define a custom rerank model based on the following template:" -msgstr "" - -#: ../../source/models/custom.rst:205 -msgid "" -"type: A string defining the type of the model, including ``normal``, " -"``LLM-based`` and ``LLM-based layerwise``." -msgstr "" - -#: ../../source/models/custom.rst:212 -msgid "Register a Custom Model" -msgstr "" - -#: ../../source/models/custom.rst:214 -msgid "Register a custom model programmatically:" -msgstr "" - -#: ../../source/models/custom.rst:229 ../../source/models/custom.rst:247 -#: ../../source/models/custom.rst:262 ../../source/models/custom.rst:317 -msgid "Or via CLI:" -msgstr "" - -#: ../../source/models/custom.rst:235 -msgid "" -"Note that replace the ``<model_type>`` above with ``LLM``, ``embedding`` " -"or ``rerank``. The same as below." -msgstr "" - -#: ../../source/models/custom.rst:239 -msgid "List the Built-in and Custom Models" -msgstr "" - -#: ../../source/models/custom.rst:241 -msgid "List built-in and custom models programmatically:" -msgstr "" - -#: ../../source/models/custom.rst:254 -msgid "Launch the Custom Model" -msgstr "" - -#: ../../source/models/custom.rst:256 -msgid "Launch the custom model programmatically:" -msgstr "" - -#: ../../source/models/custom.rst:269 -msgid "Interact with the Custom Model" -msgstr "" - -#: ../../source/models/custom.rst:271 -msgid "Invoke the model programmatically:" -msgstr "" - -#: ../../source/models/custom.rst:278 -msgid "Result:" -msgstr "" - -#: ../../source/models/custom.rst:302 -msgid "Or via CLI, replace ``${UID}`` with real model UID:" -msgstr "" - -#: ../../source/models/custom.rst:309 -msgid "Unregister the Custom Model" -msgstr "" - -#: ../../source/models/custom.rst:311 -msgid "Unregister the custom model programmatically:" -msgstr "" - -#~ msgid "Define a custom model" -#~ msgstr "" - -#~ msgid "Define a custom model based on the following template:" -#~ msgstr "" - -#~ msgid "" -#~ "model_uri: A string representing the URI" -#~ " where the model can be loaded " -#~ "from, such as \"file:///path/to/llama-2-7b\". " -#~ "If model URI is absent, Xinference " -#~ "will try to download the model " -#~ "from Hugging Face with the model " -#~ "ID." -#~ msgstr "" - -#~ msgid "" -#~ "model_file_name_template: Required by ggml " -#~ "models. An f-string template used for" -#~ " defining the model file name based" -#~ " on the quantization." -#~ msgstr "" - -#~ msgid "" -#~ "prompt_style: An optional field that " -#~ "could be required by chat models " -#~ "to define the style of prompts. " -#~ "The given example has this set to" -#~ " None, but additional details could " -#~ "be found in a referenced file " -#~ "xinference/model/llm/tests/test_utils.py." -#~ msgstr "" - -#~ msgid "" -#~ "prompt_style: An optional field that " -#~ "could be required by chat models " -#~ "to define the style of prompts. " -#~ "The given example has this set to" -#~ " None, but additional details could " -#~ "be found in a referenced file " -#~ "xinference/model/llm/tests/test_utils.py. You can " -#~ "also specify this field as a " -#~ "string, which will use the builtin " -#~ "prompt style in Xinference. For example:" -#~ msgstr "" - -#~ msgid "" -#~ "Note that replace the ``<model_type>`` " -#~ "above with ``LLM`` or ``embedding``. The" -#~ " same as below." -#~ msgstr "" - -#~ msgid "" -#~ "Define a custom rerank model based " -#~ "on the following template: .. code-" -#~ "block:: json" -#~ msgstr "" - -#~ msgid "{" -#~ msgstr "" - -#~ msgid "" -#~ "\"model_name\": \"custom-bge-reranker-v2-m3\", " -#~ "\"type\": \"normal\", \"language\": [\"en\", " -#~ "\"zh\", \"multilingual\"], \"model_id\": \"BAAI" -#~ "/bge-reranker-v2-m3\", \"model_uri\": \"file:///path/to" -#~ "/bge-reranker-v2-m3\"" -#~ msgstr "" - -#~ msgid "}" -#~ msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/index.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/index.po deleted file mode 100644 index 44d2fbd121..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/index.po +++ /dev/null @@ -1,25 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/models/index.rst:5 -msgid "Models" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/models/sources/sources.po b/doc/source/locale/ja_JP/LC_MESSAGES/models/sources/sources.po deleted file mode 100644 index f137613f8c..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/models/sources/sources.po +++ /dev/null @@ -1,71 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 16:27+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" - -#: ../../source/models/sources/sources.rst:5 -msgid "Download Sources" -msgstr "" - -#: ../../source/models/sources/sources.rst:7 -msgid "Xinference supports downloading various models from different sources." -msgstr "" - -#: ../../source/models/sources/sources.rst:10 -msgid "HuggingFace" -msgstr "" - -#: ../../source/models/sources/sources.rst:11 -msgid "" -"Xinference directly downloads the required models from the official " -"`Hugging Face model repository <https://huggingface.co/models>`_ by " -"default." -msgstr "" - -#: ../../source/models/sources/sources.rst:14 -msgid "" -"If you have trouble connecting to Huggingface, you can use a mirror " -"website to download with setting the environment variable " -"``HF_ENDPOINT=https://hf-mirror.com``." -msgstr "" - -#: ../../source/models/sources/sources.rst:18 -msgid "ModelScope" -msgstr "" - -#: ../../source/models/sources/sources.rst:20 -msgid "" -"When Xinference detects that the system's language is set to Simplified " -"Chinese, it will automatically set the model download source to " -"`ModelScope <https://modelscope.cn/models>`_." -msgstr "" - -#: ../../source/models/sources/sources.rst:23 -msgid "" -"You can also achieve this by manually setting an environment variable " -"``XINFERENCE_MODEL_SRC=modelscope``." -msgstr "" - -#: ../../source/models/sources/sources.rst:25 -msgid "" -"Please check the detail page of a model to confirm whether the model " -"supports downloading from ModelScope. If a model spec supports " -"downloading from ModelScope, the \"Model Hubs\" section in the spec " -"information will include \"ModelScope\"." -msgstr "" diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/reference/index.po b/doc/source/locale/ja_JP/LC_MESSAGES/reference/index.po deleted file mode 100644 index 769c066c58..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/reference/index.po +++ /dev/null @@ -1,289 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-08 14:38+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.11.0\n" - -#: ../../source/reference/index.rst:5 -msgid "API Reference" -msgstr "" - -#: ../../source/reference/index.rst:9 -msgid "Client" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client <xinference.client.Client>`\\ " -"\\(base\\_url\\[\\, api\\_key\\]\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client.describe_model " -"<xinference.client.Client.describe_model>`\\ \\(...\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "Get model information via RESTful APIs." -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client.get_model " -"<xinference.client.Client.get_model>`\\ \\(model\\_uid\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "Launch the model based on the parameters on the server via RESTful APIs." -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client.get_model_registration " -"<xinference.client.Client.get_model_registration>`\\ \\(...\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "Get the model with the model type and model name registered on the server." -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client.launch_model " -"<xinference.client.Client.launch_model>`\\ \\(model\\_name\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client.list_model_registrations " -"<xinference.client.Client.list_model_registrations>`\\ \\(...\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "List models registered on the server." -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client.list_models " -"<xinference.client.Client.list_models>`\\ \\(\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "Retrieve the model specifications from the Server." -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client.register_model " -"<xinference.client.Client.register_model>`\\ \\(...\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "Register a custom model." -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client.terminate_model " -"<xinference.client.Client.terminate_model>`\\ \\(...\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "Terminate the specific model running on the server." -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.Client.unregister_model " -"<xinference.client.Client.unregister_model>`\\ \\(...\\)" -msgstr "" - -#: ../../source/reference/index.rst:25:<autosummary>:1 -msgid "Unregister a custom model." -msgstr "" - -#: ../../source/reference/index.rst:27 -msgid "Model Handles" -msgstr "" - -#: ../../source/reference/index.rst:31 -msgid "ChatModelHandle" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatModelHandle " -"<xinference.client.handlers.ChatModelHandle>`\\" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -"alias of " -":py:class:`~xinference.client.restful.restful_client.RESTfulChatModelHandle`" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatModelHandle.chat " -"<xinference.client.handlers.ChatModelHandle.chat>`\\ \\(prompt\\)" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -"Given a list of messages comprising a conversation, the model will return" -" a response via RESTful APIs." -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ChatModelHandle.generate " -"<xinference.client.handlers.ChatModelHandle.generate>`\\ \\(prompt\\)" -msgstr "" - -#: ../../source/reference/index.rst:40:<autosummary>:1 -#: ../../source/reference/index.rst:60:<autosummary>:1 -msgid "" -"Creates a completion for the provided prompt and parameters via RESTful " -"APIs." -msgstr "" - -#: ../../source/reference/index.rst:42 -msgid "EmbeddingModelHandle" -msgstr "" - -#: ../../source/reference/index.rst:50:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.EmbeddingModelHandle " -"<xinference.client.handlers.EmbeddingModelHandle>`\\" -msgstr "" - -#: ../../source/reference/index.rst:50:<autosummary>:1 -msgid "" -"alias of " -":py:class:`~xinference.client.restful.restful_client.RESTfulEmbeddingModelHandle`" -msgstr "" - -#: ../../source/reference/index.rst:50:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.EmbeddingModelHandle.create_embedding" -" <xinference.client.handlers.EmbeddingModelHandle.create_embedding>`\\ " -"\\(...\\)" -msgstr "" - -#: ../../source/reference/index.rst:50:<autosummary>:1 -msgid "Create an Embedding from user input via RESTful APIs." -msgstr "" - -#: ../../source/reference/index.rst:52 -msgid "GenerateModelHandle" -msgstr "" - -#: ../../source/reference/index.rst:60:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.GenerateModelHandle " -"<xinference.client.handlers.GenerateModelHandle>`\\" -msgstr "" - -#: ../../source/reference/index.rst:60:<autosummary>:1 -msgid "" -"alias of " -":py:class:`~xinference.client.restful.restful_client.RESTfulGenerateModelHandle`" -msgstr "" - -#: ../../source/reference/index.rst:60:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.GenerateModelHandle.generate " -"<xinference.client.handlers.GenerateModelHandle.generate>`\\ \\(prompt\\)" -msgstr "" - -#: ../../source/reference/index.rst:62 -msgid "ImageModelHandle" -msgstr "" - -#: ../../source/reference/index.rst:70:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ImageModelHandle " -"<xinference.client.handlers.ImageModelHandle>`\\" -msgstr "" - -#: ../../source/reference/index.rst:70:<autosummary>:1 -msgid "" -"alias of " -":py:class:`~xinference.client.restful.restful_client.RESTfulImageModelHandle`" -msgstr "" - -#: ../../source/reference/index.rst:70:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.ImageModelHandle.text_to_image " -"<xinference.client.handlers.ImageModelHandle.text_to_image>`\\ " -"\\(prompt\\)" -msgstr "" - -#: ../../source/reference/index.rst:70:<autosummary>:1 -msgid "Creates an image by the input text." -msgstr "" - -#: ../../source/reference/index.rst:72 -msgid "AudioModelHandle" -msgstr "" - -#: ../../source/reference/index.rst:80:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.AudioModelHandle " -"<xinference.client.handlers.AudioModelHandle>`\\" -msgstr "" - -#: ../../source/reference/index.rst:80:<autosummary>:1 -msgid "" -"alias of " -":py:class:`~xinference.client.restful.restful_client.RESTfulAudioModelHandle`" -msgstr "" - -#: ../../source/reference/index.rst:80:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.AudioModelHandle.transcriptions " -"<xinference.client.handlers.AudioModelHandle.transcriptions>`\\ " -"\\(audio\\)" -msgstr "" - -#: ../../source/reference/index.rst:80:<autosummary>:1 -msgid "Transcribes audio into the input language." -msgstr "" - -#: ../../source/reference/index.rst:80:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.AudioModelHandle.translations " -"<xinference.client.handlers.AudioModelHandle.translations>`\\ \\(audio\\)" -msgstr "" - -#: ../../source/reference/index.rst:80:<autosummary>:1 -msgid "Translates audio into English." -msgstr "" - -#: ../../source/reference/index.rst:80:<autosummary>:1 -msgid "" -":py:obj:`xinference.client.handlers.AudioModelHandle.speech " -"<xinference.client.handlers.AudioModelHandle.speech>`\\ \\(input\\)" -msgstr "" - -#: ../../source/reference/index.rst:80:<autosummary>:1 -msgid "Generates audio from the input text." -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/backends.po b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/backends.po deleted file mode 100644 index 79b4716f32..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/backends.po +++ /dev/null @@ -1,140 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 17:07+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/user_guide/backends.rst:5 -msgid "Backends" -msgstr "" - -#: ../../source/user_guide/backends.rst:7 -msgid "" -"Xinference supports multiple backends for different models. After the " -"user specifies the model, xinference will automatically select the " -"appropriate backend." -msgstr "" - -#: ../../source/user_guide/backends.rst:11 -msgid "llama-cpp-python" -msgstr "" - -#: ../../source/user_guide/backends.rst:12 -msgid "" -"`llama-cpp-python <https://github.com/abetlen/llama-cpp-python>`_ is the " -"python binding of `llama.cpp`. `llama-cpp` is developed based on the " -"tensor library `ggml`, supporting inference of the LLaMA series models " -"and their variants." -msgstr "" - -#: ../../source/user_guide/backends.rst:16 -msgid "" -"We recommend that users install `llama-cpp-python` on the worker " -"themselves and adjust the `cmake` parameters according to the hardware to" -" achieve the best inference efficiency. Please refer to the `llama-cpp-" -"python installation guide <https://github.com/abetlen/llama-cpp-python" -"#installation-with-openblas--cublas--clblast--metal>`_." -msgstr "" - -#: ../../source/user_guide/backends.rst:30 -msgid "transformers" -msgstr "" - -#: ../../source/user_guide/backends.rst:31 -msgid "" -"Transformers supports the inference of most state-of-art models. It is " -"the default backend for models in PyTorch format." -msgstr "" - -#: ../../source/user_guide/backends.rst:34 -msgid "vLLM" -msgstr "" - -#: ../../source/user_guide/backends.rst:35 -msgid "vLLM is a fast and easy-to-use library for LLM inference and serving." -msgstr "" - -#: ../../source/user_guide/backends.rst:37 -msgid "" -"vLLM is fast with: - State-of-the-art serving throughput - Efficient " -"management of attention key and value memory with PagedAttention - " -"Continuous batching of incoming requests - Optimized CUDA kernels" -msgstr "" - -#: ../../source/user_guide/backends.rst:43 -msgid "" -"When the following conditions are met, Xinference will choose vLLM as the" -" inference engine:" -msgstr "" - -#: ../../source/user_guide/backends.rst:45 -msgid "The model format is PyTorch" -msgstr "" - -#: ../../source/user_guide/backends.rst:46 -msgid "The quantization method is none" -msgstr "" - -#: ../../source/user_guide/backends.rst:47 -msgid "The system is Linux and has at least one CUDA device" -msgstr "" - -#: ../../source/user_guide/backends.rst:48 -msgid "The model is within the list of models supported by vLLM." -msgstr "" - -#: ../../source/user_guide/backends.rst:50 -msgid "Currently, supported model includes:" -msgstr "" - -#: ../../source/user_guide/backends.rst:52 -msgid "``llama-2``, ``llama-2-chat``" -msgstr "" - -#: ../../source/user_guide/backends.rst:53 -msgid "``baichuan``, ``baichuan-chat``" -msgstr "" - -#: ../../source/user_guide/backends.rst:54 -msgid "``internlm``, ``internlm-20b``, ``internlm-chat``, ``internlm-chat-20b``" -msgstr "" - -#: ../../source/user_guide/backends.rst:55 -msgid "``vicuna-v1.3``, ``vicuna-v1.5``" -msgstr "" - -#: ../../source/user_guide/backends.rst:56 -msgid "``Yi``, ``Yi-chat``" -msgstr "" - -#: ../../source/user_guide/backends.rst:57 -msgid "``qwen-chat``" -msgstr "" - -#: ../../source/user_guide/backends.rst:58 -msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" -msgstr "" - -#: ../../source/user_guide/backends.rst:59 -msgid "``mistral-instruct-v0.1``" -msgstr "" - -#: ../../source/user_guide/backends.rst:60 -msgid "``chatglm3``" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/cache_management.po b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/cache_management.po deleted file mode 100644 index d2f356a026..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/cache_management.po +++ /dev/null @@ -1,25 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/user_guide/cache_management.rst:5 -msgid "Cache Management" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/client_api.po b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/client_api.po deleted file mode 100644 index 2fb64db257..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/client_api.po +++ /dev/null @@ -1,98 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-27 15:43+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/user_guide/client_api.rst:5 -msgid "Client API" -msgstr "" - -#: ../../source/user_guide/client_api.rst:7 -msgid "Complete Client API Reference: :ref:`reference_index`" -msgstr "" - -#: ../../source/user_guide/client_api.rst:9 -msgid "" -"To utilize the Client API, initiate the xinference server using the " -"command below:" -msgstr "" - -#: ../../source/user_guide/client_api.rst:18 -msgid "" -"Based on the log above, the endpoint is `http://127.0.0.1:9997`. Users " -"can connect to the xinference server through this endpoint using the " -"Client." -msgstr "" - -#: ../../source/user_guide/client_api.rst:20 -msgid "" -"Models are categorized into LLM, embedding, image, etc. We plan to " -"introduce more model types in the future." -msgstr "" - -#: ../../source/user_guide/client_api.rst:23 -msgid "LLM" -msgstr "" - -#: ../../source/user_guide/client_api.rst:25 -msgid "To list the available built-in LLM models:" -msgstr "" - -#: ../../source/user_guide/client_api.rst:38 -msgid "To initialize an LLM and chat:" -msgstr "" - -#: ../../source/user_guide/client_api.rst:63 -msgid "Embedding" -msgstr "" - -#: ../../source/user_guide/client_api.rst:65 -msgid "To list the available built-in embedding models:" -msgstr "" - -#: ../../source/user_guide/client_api.rst:78 -msgid "To launch an embedding model and embed text:" -msgstr "" - -#: ../../source/user_guide/client_api.rst:92 -#: ../../source/user_guide/client_api.rst:138 -#: ../../source/user_guide/client_api.rst:168 -msgid "Output:" -msgstr "" - -#: ../../source/user_guide/client_api.rst:110 -msgid "Image" -msgstr "" - -#: ../../source/user_guide/client_api.rst:112 -msgid "To list the available built-in image models:" -msgstr "" - -#: ../../source/user_guide/client_api.rst:123 -msgid "To initiate an image model and generate an image using a text prompt:" -msgstr "" - -#: ../../source/user_guide/client_api.rst:147 -msgid "Rerank" -msgstr "" - -#: ../../source/user_guide/client_api.rst:148 -msgid "To launch a rerank model and compute the similarity scores:" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/examples/AI_Podcast.po b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/examples/AI_Podcast.po deleted file mode 100644 index dc8984eb51..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/examples/AI_Podcast.po +++ /dev/null @@ -1,168 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-07 11:39+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/user_guide/examples/AI_Podcast.rst:3 -msgid "Example: AI Podcast 🎙" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:5 -msgid "**Description**:" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:7 -msgid "🎙️AI Podcast - Voice Conversations with Multiple Agents on M2 Max 💻" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:9 -msgid "**Support Language** :" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:11 -msgid "English (AI_Podcast.py)" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:13 -msgid "Chinese (AI_Podcast_ZH.py)" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:15 -msgid "**Used Technology (EN version)** :" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:17 -msgid "" -"@ `OpenAI <https://twitter.com/OpenAI>`_ 's `whisper " -"<https://pypi.org/project/openai-whisper/>`_" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:19 -msgid "" -"@ `ggerganov <https://twitter.com/ggerganov>`_ 's `ggml " -"<https://github.com/ggerganov/ggml>`_" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:21 -msgid "" -"@ `WizardLM_AI <https://twitter.com/WizardLM_AI>`_ 's `wizardlm v1.0 " -"<https://huggingface.co/WizardLM>`_" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:23 -msgid "" -"@ `lmsysorg <https://twitter.com/lmsysorg>`_ 's `vicuna v1.3 " -"<https://huggingface.co/lmsys/vicuna-7b-v1.3>`_" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:25 -msgid "@ `Xinference <https://github.com/xorbitsai/inference>`_ as a launcher" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:27 -msgid "**Detailed Explanation on the Demo Functionality** :" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:29 -msgid "" -"Generate the Wizardlm Model and Vicuna Model when the program is " -"launching with Xorbits Inference. Initiate the Chatroom by giving the two" -" chatbot their names and telling them that there is a human user called " -"\"username\", where \"username\" is given by user's input. Initialize a " -"empty chat history for the chatroom." -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:33 -msgid "" -"Use Audio device to store recording into file, and transcribe the file " -"using OpenAI's Whisper to receive a human readable text as string." -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:35 -msgid "" -"Based on the input message string, determine which agents the user want " -"to talk to. Call the target agents and parse in the input string and chat" -" history for the model to generate." -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:38 -msgid "" -"When the responses are ready, use Macos's \"Say\" Command to produce " -"audio through speaker. Each agents have their own voice while speaking." -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:41 -msgid "" -"Store the user input and the agent response into chat history, and " -"recursively looping the program until user explicitly says words like " -"\"see you\" in their responses." -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:44 -msgid "**Highlight Features with Xinference** :" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:46 -msgid "" -"With Xinference's distributed system, we can easily deploy two different " -"models in the same session and in the same \"chatroom\". With enough " -"resources, the framework can deploy any amount of models you like at the " -"same time." -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:49 -msgid "" -"With Xinference, you can deploy the model easily by just adding a few " -"lines of code. For examples, for launching the vicuna model in the demo, " -"just by::" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:66 -msgid "" -"Then, the Xinference clinet will handle \"target model downloading and " -"caching\", \"set up environment and process for the model\", and \"run " -"the service at selected endpoint. \" You are now ready to play with your " -"llm model." -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:69 -msgid "**Original Demo Video** :" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:71 -msgid "" -"`🎙️AI Podcast - Voice Conversations with Multiple Agents on M2 Max💻🔥🤖 " -"<https://twitter.com/yichaocheng/status/1679129417778442240>`_" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:73 -msgid "**Source Code** :" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:75 -msgid "" -"`AI_Podcast " -"<https://github.com/xorbitsai/inference/blob/main/examples/AI_podcast.py>`_" -" (English Version)" -msgstr "" - -#: ../../source/user_guide/examples/AI_Podcast.rst:77 -msgid "AI_Podcast_ZH (Chinese Version)" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/examples/chat.po b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/examples/chat.po deleted file mode 100644 index a2d6b4784e..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/examples/chat.po +++ /dev/null @@ -1,98 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-07 11:39+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/user_guide/examples/chat.rst:3 -msgid "Example: chatbot 🤖️" -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:5 -msgid "**Description**:" -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:7 -msgid "" -"Demonstrate how to interact with Xinference to play with LLM chat " -"functionality with an AI agent 💻" -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:9 -msgid "**Used Technology**:" -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:11 -msgid "" -"@ `ggerganov <https://twitter.com/ggerganov>`_ 's `ggml " -"<https://github.com/ggerganov/ggml>`_" -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:13 -msgid "@ `Xinference <https://github.com/xorbitsai/inference>`_ as a launcher" -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:15 -msgid "" -"@ All LLaMA and Chatglm models supported by `Xorbitsio inference " -"<https://github.com/xorbitsai/inference>`_" -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:17 -msgid "**Detailed Explanation on the Demo Functionality** :" -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:19 -msgid "" -"Take the user command line input in the terminal and grab the required " -"parameters for model lanuching." -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:21 -msgid "" -"Launch the Xinference frameworks and automatically deploy the model user " -"demanded into the cluster." -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:23 -msgid "Initialize an empty chat history to store all the context in the chatroom." -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:25 -msgid "" -"Recursively ask for user's input as prompt and let the model to generate " -"response based on the prompt and the chat history. Show the Output of the" -" response in the terminal." -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:28 -msgid "" -"Store the user's input and agent's response into the chat history as " -"context for the upcoming rounds." -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:30 -msgid "**Source Code** :" -msgstr "" - -#: ../../source/user_guide/examples/chat.rst:31 -msgid "" -"`chat " -"<https://github.com/RayJi01/Xprobe_inference/blob/main/examples/chat.py>`_" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/faq.po b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/faq.po deleted file mode 100644 index 88e233e6ca..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/faq.po +++ /dev/null @@ -1,25 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-07 11:39+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/user_guide/faq.rst:3 -msgid "FAQ 📚" -msgstr "" - diff --git a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/index.po b/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/index.po deleted file mode 100644 index e3fb00f47e..0000000000 --- a/doc/source/locale/ja_JP/LC_MESSAGES/user_guide/index.po +++ /dev/null @@ -1,24 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Xorbits Inc. -# This file is distributed under the same license as the Xinference package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: Xinference \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-16 10:33+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language: ja_JP\n" -"Language-Team: ja_JP <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" - -#: ../../source/user_guide/index.rst:5 -msgid "User Guide" -msgstr "" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po index 9d4eae461d..c04979d7ff 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/getting_started/installation.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-13 17:44+0800\n" +"POT-Creation-Date: 2024-08-15 11:43+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.14.0\n" +"Generated-By: Babel 2.11.0\n" #: ../../source/getting_started/installation.rst:5 msgid "Installation" @@ -39,13 +39,13 @@ msgstr "如果你希望能够推理所有支持的模型,可以用以下命令 #: ../../source/getting_started/installation.rst:13 msgid "" -"If you want to serve models in GGML format, it's advised to install the " -"GGML dependencies manually based on your hardware specifications to " -"enable acceleration. For more details, see the :ref:`installation_ggml` " -"section." +"If you want to serve models in GGUF format, it's advised to install the " +"``llama-cpp-python`` dependency manually based on your hardware " +"specifications to enable acceleration. For more details, see the " +":ref:`installation_gguf` section." msgstr "" -"如果你想使用 GGML 格式的模型,建议根据当前使用的硬件手动安装所需要的依赖" -",以充分利用硬件的加速能力。更多细节可以参考 :ref:`installation_ggml` " +"如果你想使用 GGUF 格式的模型,建议根据当前使用的硬件手动安装所需要的依赖" +",以充分利用硬件的加速能力。更多细节可以参考 :ref:`installation_gguf` " "这一章节。" #: ../../source/getting_started/installation.rst:16 @@ -222,11 +222,11 @@ msgstr "Llama.cpp 引擎" #: ../../source/getting_started/installation.rst:80 msgid "" -"Xinference supports models in ``gguf`` and ``ggml`` format via ``llama-" -"cpp-python``. It's advised to install the llama.cpp-related dependencies " -"manually based on your hardware specifications to enable acceleration." +"Xinference supports models in ``gguf`` format via ``llama-cpp-python``. " +"It's advised to install the llama.cpp-related dependencies manually based" +" on your hardware specifications to enable acceleration." msgstr "" -"Xinference 通过 ``llama-cpp-python`` 支持 ``gguf`` 和 ``ggml`` 格式的模型" +"Xinference 通过 ``llama-cpp-python`` 支持 ``gguf`` 格式的模型" "。建议根据当前使用的硬件手动安装依赖,从而获得最佳的加速效果。" #: ../../source/getting_started/installation.rst:82 @@ -267,9 +267,8 @@ msgstr "" "如连续批处理和张量并行处理。" #: ../../source/getting_started/installation.rst:115 -#, fuzzy msgid "MLX Backend" -msgstr "vLLM 引擎" +msgstr "MLX 引擎" #: ../../source/getting_started/installation.rst:116 msgid "MLX-lm is designed for Apple silicon users to run LLM efficiently." diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po index dffacd0384..03a7e356cd 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/custom.po @@ -3,12 +3,11 @@ # This file is distributed under the same license as the Xinference package. # FIRST AUTHOR <EMAIL@ADDRESS>, 2023. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-08 18:01+0800\n" +"POT-Creation-Date: 2024-08-15 11:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -39,8 +38,10 @@ msgid "" "``model_path`` to the launch interface without downloading it. This way " "requires that the model's ``model_family`` is among the built-in " "supported models, and eliminates the hassle of registering the model." -msgstr "从 ``v0.14.0`` 版本开始,如果你需要注册的模型的家族是 Xinference 内置支持的模型," -"你可以直接通过 launch 接口中的 ``model_path`` 参数来启动它,从而免去注册步骤的麻烦。现在非常推荐使用这种方式。" +msgstr "" +"从 ``v0.14.0`` 版本开始,如果你需要注册的模型的家族是 Xinference 内置支持" +"的模型,你可以直接通过 launch 接口中的 ``model_path`` 参数来启动它,从而" +"免去注册步骤的麻烦。现在非常推荐使用这种方式。" #: ../../source/models/custom.rst:15 msgid "For example:" @@ -50,8 +51,7 @@ msgstr "例如:" msgid "" "The above example demonstrates how to directly launch a qwen1.5-chat " "model file without registering it." -msgstr "" -"上面的例子展示了当我已有 qwen1.5-chat 模型文件时,如何直接 launch 它。" +msgstr "上面的例子展示了当我已有 qwen1.5-chat 模型文件时,如何直接 launch 它。" #: ../../source/models/custom.rst:49 msgid "" @@ -59,8 +59,8 @@ msgid "" "you can directly launch it using the ``worker_ip`` and ``model_path`` " "parameters with the launch interface." msgstr "" -"对于分布式场景,将你的模型文件置于某个 worker ,然后通过 launch 接口的 ``worker_ip`` 和 ``model_path`` 参数" -"来达到直接 launch 的效果。" +"对于分布式场景,将你的模型文件置于某个 worker ,然后通过 launch 接口的 ``" +"worker_ip`` 和 ``model_path`` 参数来达到直接 launch 的效果。" #: ../../source/models/custom.rst:53 msgid "Define a custom LLM model" @@ -131,9 +131,9 @@ msgstr "model_specs: 一个包含定义模型规格的对象数组。这些规 #: ../../source/models/custom.rst:102 msgid "" -"model_format: A string that defines the model format, could be " -"\"pytorch\" or \"ggmlv3\"." -msgstr "model_format: 一个定义模型格式的字符串,可以是 'pytorch' 或 'ggmlv3'。" +"model_format: A string that defines the model format, like \"pytorch\" or" +" \"ggufv2\"." +msgstr "model_format: 一个定义模型格式的字符串,可以是 'pytorch' 或 'ggufv2'。" #: ../../source/models/custom.rst:103 msgid "" @@ -145,11 +145,11 @@ msgstr "model_size_in_billions: 一个整数,定义模型的参数量,以十 msgid "" "quantizations: A list of strings defining the available quantizations for" " the model. For PyTorch models, it could be \"4-bit\", \"8-bit\", or " -"\"none\". For ggmlv3 models, the quantizations should correspond to " +"\"none\". For ggufv2 models, the quantizations should correspond to " "values that work with the ``model_file_name_template``." msgstr "" "quantizations: 一个字符串列表,定义模型的量化方式。对于 PyTorch 模型,它" -"可以是 \"4-bit\"、\"8-bit\" 或 \"none\"。对于 ggmlv3 模型,量化方式应与 `" +"可以是 \"4-bit\"、\"8-bit\" 或 \"none\"。对于 ggufv2 模型,量化方式应与 `" "`model_file_name_template`` 中的值对应。" #: ../../source/models/custom.rst:105 @@ -167,25 +167,24 @@ msgstr "" msgid "" "model_uri: A string representing the URI where the model can be loaded " "from, such as \"file:///path/to/llama-2-7b\". **When the model format is " -"ggmlv3 or ggufv2, model_uri must be the specific file path. When the " -"model format is pytorch, model_uri must be the path to the directory " -"containing the model files.** If model URI is absent, Xinference will try" -" to download the model from Hugging Face with the model ID." +"ggufv2, model_uri must be the specific file path. When the model format " +"is pytorch, model_uri must be the path to the directory containing the " +"model files.** If model URI is absent, Xinference will try to download " +"the model from Hugging Face with the model ID." msgstr "" "model_uri:表示模型文件位置的字符串,例如本地目录:\"file:///path/to/" -"llama-2-7b\"。当 model_format 是 ggmlv3 或者 ggufv2 ,此字段必须是具体的" +"llama-2-7b\"。当 model_format 是 ggufv2 ,此字段必须是具体的" "模型文件路径。而当 model_format 是 pytorch 时,此字段必须是一个包含所有" "模型文件的目录。" #: ../../source/models/custom.rst:107 msgid "" -"model_file_name_template: Required by ggml/gguf models. An f-string " -"template used for defining the model file name based on the quantization." -" **Note that this field is just a template for the format of the " -"ggmlv3/ggufv2 model file, do not fill in the specific path of the model " -"file.**" +"model_file_name_template: Required by gguf models. An f-string template " +"used for defining the model file name based on the quantization. **Note " +"that this field is just a template for the format of the ggufv2 model " +"file, do not fill in the specific path of the model file.**" msgstr "" -"model_file_name_template: ggml 模型所需。一个 f-string 模板,用于根据量化" +"model_file_name_template: gguf 模型所需。一个 f-string 模板,用于根据量化" "定义模型文件名。注意,这里不要填入文件的路径。" #: ../../source/models/custom.rst:108 diff --git a/doc/source/models/custom.rst b/doc/source/models/custom.rst index 6224101f68..071785f32d 100644 --- a/doc/source/models/custom.rst +++ b/doc/source/models/custom.rst @@ -80,15 +80,15 @@ Define a custom LLM model based on the following template: "model_uri": "file:///path/to/llama-2-7b-hf" }, { - "model_format": "ggmlv3", + "model_format": "ggufv2", "model_size_in_billions": 7, "quantizations": [ "q4_0", "q8_0" ], - "model_id": "TheBloke/Llama-2-7B-GGML", - "model_file_name_template": "llama-2-7b.ggmlv3.{quantization}.bin" - "model_uri": "file:///path/to/ggml-file" + "model_id": "TheBloke/Llama-2-7B-GGUF", + "model_file_name_template": "llama-2-7b.{quantization}.gguf" + "model_uri": "file:///path/to/gguf-file" } ] } @@ -99,12 +99,12 @@ Define a custom LLM model based on the following template: * model_ability: A list of strings defining the abilities of the model. It could include options like "embed", "generate", and "chat". In this case, the model has the ability to "generate". * model_family: A required string representing the family of the model you want to register. The optional values are the model names of all :ref:`built-in models <models_llm_index>`. If the model family you register is not among the built-in models in Xinference, please fill in ``other``. Note that you should choose the model family based on the ability of the model you want to register. For example, if you want to register the ``llama-2`` model, do not fill in ``llama-2-chat`` as the model family. * model_specs: An array of objects defining the specifications of the model. These include: - * model_format: A string that defines the model format, could be "pytorch" or "ggmlv3". + * model_format: A string that defines the model format, like "pytorch" or "ggufv2". * model_size_in_billions: An integer defining the size of the model in billions of parameters. - * quantizations: A list of strings defining the available quantizations for the model. For PyTorch models, it could be "4-bit", "8-bit", or "none". For ggmlv3 models, the quantizations should correspond to values that work with the ``model_file_name_template``. + * quantizations: A list of strings defining the available quantizations for the model. For PyTorch models, it could be "4-bit", "8-bit", or "none". For ggufv2 models, the quantizations should correspond to values that work with the ``model_file_name_template``. * model_id: A string representing the model ID, possibly referring to an identifier used by Hugging Face. **If model_uri is missing, Xinference will try to download the model from the huggingface repository specified here.**. - * model_uri: A string representing the URI where the model can be loaded from, such as "file:///path/to/llama-2-7b". **When the model format is ggmlv3 or ggufv2, model_uri must be the specific file path. When the model format is pytorch, model_uri must be the path to the directory containing the model files.** If model URI is absent, Xinference will try to download the model from Hugging Face with the model ID. - * model_file_name_template: Required by ggml/gguf models. An f-string template used for defining the model file name based on the quantization. **Note that this field is just a template for the format of the ggmlv3/ggufv2 model file, do not fill in the specific path of the model file.** + * model_uri: A string representing the URI where the model can be loaded from, such as "file:///path/to/llama-2-7b". **When the model format is ggufv2, model_uri must be the specific file path. When the model format is pytorch, model_uri must be the path to the directory containing the model files.** If model URI is absent, Xinference will try to download the model from Hugging Face with the model ID. + * model_file_name_template: Required by gguf models. An f-string template used for defining the model file name based on the quantization. **Note that this field is just a template for the format of the ggufv2 model file, do not fill in the specific path of the model file.** * prompt_style: If the ``model_family`` field is not ``other``, this field does not need to be filled in. ``prompt_style`` is an optional field that could be required by ``chat`` models to define the style of prompts. The given example has this set to None, but additional details could be found in a referenced file xinference/model/llm/tests/test_utils.py. You can also specify this field as a string, which will use the builtin prompt style in Xinference. For example: .. code-block:: json diff --git a/doc/source/user_guide/client_api.rst b/doc/source/user_guide/client_api.rst index 4067acab9b..bd47822b7e 100644 --- a/doc/source/user_guide/client_api.rst +++ b/doc/source/user_guide/client_api.rst @@ -46,11 +46,11 @@ Xinference Client client = Client("http://localhost:9997") # The chatglm2 model has the capabilities of "chat" and "embed". - model_uid = client.launch_model(model_name="chatglm2", + model_uid = client.launch_model(model_name="glm4-chat", model_engine="llama.cpp", - model_format="ggmlv3", - model_size_in_billions=6, - quantization="q4_0") + model_format="ggufv2", + model_size_in_billions=9, + quantization="Q4_K") model = client.get_model(model_uid) chat_history = [] diff --git a/setup.cfg b/setup.cfg index 1d57e708b7..2019e95e2d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -38,8 +38,6 @@ install_requires = uvicorn huggingface-hub>=0.19.4 typing_extensions - fsspec==2023.10.0 - s3fs==2023.10.0 modelscope>=1.10.0 sse_starlette>=1.6.5 # ensure_bytes API break change: https://github.com/sysid/sse-starlette/issues/65 openai>1,<1.40 # For typing @@ -50,7 +48,6 @@ install_requires = async-timeout peft timm - opencv-contrib-python [options.packages.find] exclude = @@ -75,7 +72,6 @@ dev = flake8>=3.8.0 black openai>1,<1.40 - opencv-contrib-python langchain langchain-community orjson @@ -126,7 +122,7 @@ all = intel = torch==2.1.0a0 intel_extension_for_pytorch==2.1.10+xpu -ggml = +llama_cpp = llama-cpp-python>=0.2.25,!=0.2.58 transformers = transformers>=4.43.2 @@ -186,7 +182,6 @@ doc = sphinx-design prometheus_client timm - opencv-contrib-python benchmark = psutil diff --git a/xinference/api/restful_api.py b/xinference/api/restful_api.py index 1f03de316e..9c553c4c5d 100644 --- a/xinference/api/restful_api.py +++ b/xinference/api/restful_api.py @@ -1685,13 +1685,6 @@ async def create_chat_completion(self, request: Request) -> Response: ["gorilla-openfunctions-v1"] + QWEN_TOOL_CALL_FAMILY + GLM4_TOOL_CALL_FAMILY ) - is_qwen = desc.get("model_format") == "ggmlv3" and "qwen-chat" == model_family - - if is_qwen and system_prompt is not None: - raise HTTPException( - status_code=400, detail="Qwen ggml does not have system prompt" - ) - if model_family not in function_call_models: if body.tools: raise HTTPException( @@ -1722,18 +1715,13 @@ async def stream_results(): iterator = None try: try: - if is_qwen: - iterator = await model.chat( - prompt, chat_history, kwargs, raw_params=raw_kwargs - ) - else: - iterator = await model.chat( - prompt, - system_prompt, - chat_history, - kwargs, - raw_params=raw_kwargs, - ) + iterator = await model.chat( + prompt, + system_prompt, + chat_history, + kwargs, + raw_params=raw_kwargs, + ) except RuntimeError as re: await self._report_error_event(model_uid, str(re)) self.handle_request_limit_error(re) @@ -1761,18 +1749,13 @@ async def stream_results(): return EventSourceResponse(stream_results()) else: try: - if is_qwen: - data = await model.chat( - prompt, chat_history, kwargs, raw_params=raw_kwargs - ) - else: - data = await model.chat( - prompt, - system_prompt, - chat_history, - kwargs, - raw_params=raw_kwargs, - ) + data = await model.chat( + prompt, + system_prompt, + chat_history, + kwargs, + raw_params=raw_kwargs, + ) return Response(content=data, media_type="application/json") except Exception as e: logger.error(e, exc_info=True) diff --git a/xinference/client/restful/restful_client.py b/xinference/client/restful/restful_client.py index c11c30c29f..679f65d296 100644 --- a/xinference/client/restful/restful_client.py +++ b/xinference/client/restful/restful_client.py @@ -426,7 +426,7 @@ def generate( The user's message or user's input. generate_config: Optional[Union["LlamaCppGenerateConfig", "PytorchGenerateConfig"]] Additional configuration for the chat generation. - "LlamaCppGenerateConfig" -> Configuration for ggml model + "LlamaCppGenerateConfig" -> Configuration for llama-cpp-python model "PytorchGenerateConfig" -> Configuration for pytorch model Returns @@ -493,7 +493,7 @@ def chat( A tool list. generate_config: Optional[Union["LlamaCppGenerateConfig", "PytorchGenerateConfig"]] Additional configuration for the chat generation. - "LlamaCppGenerateConfig" -> configuration for ggml model + "LlamaCppGenerateConfig" -> configuration for llama-cpp-python model "PytorchGenerateConfig" -> configuration for pytorch model Returns diff --git a/xinference/client/tests/test_client.py b/xinference/client/tests/test_client.py index a89b54f4b1..095ef5e182 100644 --- a/xinference/client/tests/test_client.py +++ b/xinference/client/tests/test_client.py @@ -37,9 +37,9 @@ def test_RESTful_client(setup): assert len(client.list_models()) == 0 model_uid = client.launch_model( - model_name="orca", + model_name="qwen1.5-chat", model_engine="llama.cpp", - model_size_in_billions=3, + model_size_in_billions="0_5", quantization="q4_0", ) assert len(client.list_models()) == 1 @@ -93,7 +93,7 @@ def _check_stream(): for _ in range(2): r = executor.submit(_check_stream) results.append(r) - # Parallel generation is not supported by ggml. + # Parallel generation is not supported by llama-cpp-python. error_count = 0 for r in results: try: @@ -157,9 +157,9 @@ def _check(stream=False): client.terminate_model(model_uid=model_uid) model_uid2 = client.launch_model( - model_name="orca", + model_name="qwen1.5-chat", model_engine="llama.cpp", - model_size_in_billions=3, + model_size_in_billions="0_5", quantization="q4_0", ) @@ -175,34 +175,6 @@ def test_list_cached_models(setup): assert len(res) > 0 -@pytest.mark.skipif(os.name == "nt", reason="Skip windows") -def test_list_deletable_models(setup): - endpoint, local_host = setup - client = RESTfulClient(endpoint) - response = client.list_deletable_models("orca--3B--ggmlv3--q4_0") - paths = response.get("paths", []) - - expected_path = os.path.join( - os.environ["HOME"], - ".xinference", - "cache", - "orca-ggmlv3-3b", - "orca-mini-3b.ggmlv3.q4_0.bin", - ) - - normalized_expected_path = os.path.normpath(expected_path) - - assert normalized_expected_path in paths - - -@pytest.mark.skipif(os.name == "nt", reason="Skip windows") -def test_remove_cached_models(setup): - endpoint, local_host = setup - client = RESTfulClient(endpoint) - responses = client.confirm_and_remove_model("orca--3B--ggmlv3--q4_0") - assert responses - - def test_RESTful_client_for_embedding(setup): endpoint, _ = setup client = RESTfulClient(endpoint) @@ -477,9 +449,9 @@ def test_auto_recover(set_auto_recover_limit, setup_cluster): client = RESTfulClient(endpoint) model_uid = client.launch_model( - model_name="orca", + model_name="qwen1.5-chat", model_engine="llama.cpp", - model_size_in_billions=3, + model_size_in_billions="0_5", quantization="q4_0", ) new_children_proc = set(current_proc.children(recursive=True)) @@ -505,23 +477,3 @@ def test_auto_recover(set_auto_recover_limit, setup_cluster): time.sleep(1) else: assert False - - new_children_proc = set(current_proc.children(recursive=True)) - model_proc = next(iter(new_children_proc - chilren_proc)) - assert len(client.list_models()) == 1 - - model_proc.kill() - - expect_failed = False - for _ in range(5): - try: - completion = model.generate( - "Once upon a time, there was a very old computer", {"max_tokens": 64} - ) - assert "text" in completion["choices"][0] - break - except Exception: - time.sleep(1) - else: - expect_failed = True - assert expect_failed diff --git a/xinference/core/model.py b/xinference/core/model.py index 4c8ddee893..2650266efe 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -132,8 +132,8 @@ def gen_uid(cls, model: "LLM"): async def __pre_destroy__(self): from ..model.embedding.core import EmbeddingModel - from ..model.llm.pytorch.core import PytorchModel as LLMPytorchModel from ..model.llm.sglang.core import SGLANGModel + from ..model.llm.transformers.core import PytorchModel as LLMPytorchModel from ..model.llm.vllm.core import VLLMModel as LLMVLLMModel if self.allow_batching(): @@ -177,8 +177,8 @@ def __init__( request_limits: Optional[int] = None, ): super().__init__() - from ..model.llm.pytorch.core import PytorchModel from ..model.llm.sglang.core import SGLANGModel + from ..model.llm.transformers.core import PytorchModel from ..model.llm.vllm.core import VLLMModel self._worker_address = worker_address @@ -272,7 +272,7 @@ def is_vllm_backend(self) -> bool: return isinstance(self._model, VLLMModel) def allow_batching(self) -> bool: - from ..model.llm.pytorch.core import PytorchModel + from ..model.llm.transformers.core import PytorchModel model_ability = self._model_description.get("model_ability", []) @@ -415,7 +415,7 @@ async def _call_wrapper(self, output_type: str, fn: Callable, *args, **kwargs): ret = await asyncio.to_thread(fn, *args, **kwargs) if self._lock is not None and self._current_generator(): - raise Exception("Parallel generation is not supported by ggml.") + raise Exception("Parallel generation is not supported by llama-cpp-python.") if inspect.isgenerator(ret): gen = self._to_generator(output_type, ret) diff --git a/xinference/core/scheduler.py b/xinference/core/scheduler.py index c8a0747e56..6b28f70259 100644 --- a/xinference/core/scheduler.py +++ b/xinference/core/scheduler.py @@ -24,7 +24,6 @@ logger = logging.getLogger(__name__) -XINFERENCE_BATCHING_CLEAN_CACHE_INTERVAL = 5 XINFERENCE_STREAMING_DONE_FLAG = "<XINFERENCE_STREAMING_DONE>" XINFERENCE_STREAMING_ERROR_FLAG = "<XINFERENCE_STREAMING_ERROR>" XINFERENCE_STREAMING_ABORT_FLAG = "<XINFERENCE_STREAMING_ABORT>" @@ -359,7 +358,7 @@ def _handle_request(self) -> Optional[List[InferenceRequest]]: @staticmethod def _empty_cache(): - from ..model.llm.pytorch.utils import empty_cache + from ..model.llm.transformers.utils import empty_cache empty_cache() diff --git a/xinference/core/tests/test_metrics.py b/xinference/core/tests/test_metrics.py index 028e9586be..b6927b18c7 100644 --- a/xinference/core/tests/test_metrics.py +++ b/xinference/core/tests/test_metrics.py @@ -65,9 +65,9 @@ async def test_metrics_exporter_server(setup_cluster): client = Client(endpoint) model_uid = client.launch_model( - model_name="orca", + model_name="qwen1.5-chat", model_engine="llama.cpp", - model_size_in_billions=3, + model_size_in_billions="0_5", quantization="q4_0", ) @@ -84,7 +84,9 @@ async def test_metrics_exporter_server(setup_cluster): ) response = requests.get(metrics_exporter_address) assert response.ok - assert 'xinference:input_tokens_total_counter{model="orca"} 1' in response.text + assert ( + 'xinference:input_tokens_total_counter{model="qwen1.5-chat"} 1' in response.text + ) @pytest.fixture @@ -105,9 +107,9 @@ async def test_disable_metrics_exporter_server(disable_metrics, setup_cluster): client = Client(endpoint) client.launch_model( - model_name="orca", + model_name="qwen1.5-chat", model_engine="llama.cpp", - model_size_in_billions=3, + model_size_in_billions="0_5", quantization="q4_0", ) @@ -128,10 +130,10 @@ async def test_metrics_exporter_data(setup_cluster): client = Client(endpoint) model_uid = client.launch_model( - model_name="orca", + model_name="qwen1.5-chat", model_engine="llama.cpp", - model_size_in_billions=3, - model_format="ggmlv3", + model_size_in_billions="0_5", + model_format="ggufv2", quantization="q4_0", ) @@ -140,4 +142,4 @@ async def test_metrics_exporter_data(setup_cluster): response = requests.get(metrics_exporter_address) assert response.ok - assert 'format="ggmlv3",model="orca"' in response.text + assert 'format="ggufv2",model="qwen1.5-chat"' in response.text diff --git a/xinference/core/tests/test_restful_api.py b/xinference/core/tests/test_restful_api.py index 5eda8bd27e..cd47b98cc5 100644 --- a/xinference/core/tests/test_restful_api.py +++ b/xinference/core/tests/test_restful_api.py @@ -40,7 +40,8 @@ async def test_restful_api(setup): payload = { "model_uid": "test_restful_api", "model_engine": "llama.cpp", - "model_name": "orca", + "model_name": "qwen1.5-chat", + "model_size_in_billions": "0_5", "quantization": "q4_0", } @@ -52,7 +53,7 @@ async def test_restful_api(setup): # launch n_gpu error payload = { "model_uid": "test_restful_api", - "model_name": "orca", + "model_name": "qwen1.5-chat", "quantization": "q4_0", "n_gpu": -1, } @@ -62,7 +63,7 @@ async def test_restful_api(setup): # same model uid payload = { "model_uid": "test_restful_api", - "model_name": "orca", + "model_name": "qwen1.5-chat", "quantization": "q4_0", } response = requests.post(url, json=payload) @@ -76,7 +77,7 @@ async def test_restful_api(setup): # describe response = requests.get(f"{endpoint}/v1/models/test_restful_api") response_data = response.json() - assert response_data["model_name"] == "orca" + assert response_data["model_name"] == "qwen1.5-chat" assert response_data["replica"] == 1 response = requests.delete(f"{endpoint}/v1/models/bogus") @@ -972,7 +973,8 @@ def test_restful_api_with_request_limits(setup): payload = { "model_uid": "test_restful_api", "model_engine": "llama.cpp", - "model_name": "orca", + "model_name": "qwen1.5-chat", + "model_size_in_billions": "0_5", "quantization": "q4_0", "request_limits": 0, } @@ -1010,7 +1012,8 @@ async def test_openai(setup): payload = { "model_uid": "test_restful_api", "model_engine": "llama.cpp", - "model_name": "orca", + "model_name": "qwen1.5-chat", + "model_size_in_billions": "0_5", "quantization": "q4_0", } @@ -1069,7 +1072,8 @@ def test_lang_chain(setup): payload = { "model_uid": "test_restful_api", "model_engine": "llama.cpp", - "model_name": "orca", + "model_name": "qwen1.5-chat", + "model_size_in_billions": "0_5", "quantization": "q4_0", } @@ -1107,7 +1111,6 @@ def test_lang_chain(setup): r = chat(messages) assert type(r) == AIMessage assert r.content - assert "amo" in r.content.lower() template = "You are a helpful assistant that translates {input_language} to {output_language}." system_message_prompt = SystemMessagePromptTemplate.from_template(template) @@ -1135,18 +1138,19 @@ def test_launch_model_async(setup): url = f"{endpoint}/v1/models?wait_ready=false" payload = { - "model_uid": "test_orca", + "model_uid": "test_qwen_15", "model_engine": "llama.cpp", - "model_name": "orca", + "model_name": "qwen1.5-chat", + "model_size_in_billions": "0_5", "quantization": "q4_0", } response = requests.post(url, json=payload) response_data = response.json() model_uid_res = response_data["model_uid"] - assert model_uid_res == "test_orca" + assert model_uid_res == "test_qwen_15" - status_url = f"{endpoint}/v1/models/instances?model_uid=test_orca" + status_url = f"{endpoint}/v1/models/instances?model_uid=test_qwen_15" while True: response = requests.get(status_url) response_data = response.json() @@ -1158,7 +1162,7 @@ def test_launch_model_async(setup): time.sleep(2) # delete again - url = f"{endpoint}/v1/models/test_orca" + url = f"{endpoint}/v1/models/test_qwen_15" requests.delete(url) response = requests.get(status_url) @@ -1170,18 +1174,19 @@ def test_events(setup): url = f"{endpoint}/v1/models" payload = { - "model_uid": "test_orca", + "model_uid": "test_qwen_15", "model_engine": "llama.cpp", - "model_name": "orca", + "model_name": "qwen1.5-chat", + "model_size_in_billions": "0_5", "quantization": "q4_0", } response = requests.post(url, json=payload) response_data = response.json() model_uid_res = response_data["model_uid"] - assert model_uid_res == "test_orca" + assert model_uid_res == "test_qwen_15" - events_url = f"{endpoint}/v1/models/test_orca/events" + events_url = f"{endpoint}/v1/models/test_qwen_15/events" response = requests.get(events_url) response_data = response.json() # [{'event_type': 'INFO', 'event_ts': 1705896156, 'event_content': 'Launch model'}] @@ -1189,7 +1194,7 @@ def test_events(setup): assert "Launch" in response_data[0]["event_content"] # delete again - url = f"{endpoint}/v1/models/test_orca" + url = f"{endpoint}/v1/models/test_qwen_15" requests.delete(url) response = requests.get(events_url) @@ -1201,29 +1206,27 @@ def test_events(setup): def test_launch_model_by_version(setup): - from ...model.llm import get_llm_model_descriptions - endpoint, supervisor_addr = setup url = f"{endpoint}/v1/models/instance" - version_info = get_llm_model_descriptions()["orca"][0] + model_version = "qwen1.5-chat--0_5B--ggufv2--q4_0" payload = { - "model_uid": "test_orca", + "model_uid": "test_qwen15", "model_engine": "llama.cpp", "model_type": "LLM", - "model_version": version_info["model_version"], + "model_version": model_version, } response = requests.post(url, json=payload) - assert response.json()["model_uid"] == "test_orca" + assert response.json()["model_uid"] == "test_qwen15" - url_version = f"{endpoint}/v1/models/LLM/orca/versions" + url_version = f"{endpoint}/v1/models/LLM/qwen1.5-chat/versions" response = requests.get(url_version) versions = response.json() has_version = False for info in versions: - if info["model_version"] == version_info["model_version"]: + if info["model_version"] == model_version: has_version = True assert info["cache_status"] is True assert info["model_file_location"] is not None @@ -1234,5 +1237,5 @@ def test_launch_model_by_version(setup): assert has_version is True # delete again - url = f"{endpoint}/v1/models/test_orca" + url = f"{endpoint}/v1/models/test_qwen15" requests.delete(url) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index cfffd7fb17..e139d34c11 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -830,7 +830,7 @@ async def launch_builtin_model( raise ValueError( f"PEFT adaptors cannot be applied to embedding or rerank models." ) - if model_type == "LLM" and model_format in ("ggufv2", "ggmlv3"): + if model_type == "LLM" and model_format in ("ggufv2",): raise ValueError( f"PEFT adaptors can only be applied to pytorch-like models" ) diff --git a/xinference/deploy/cmdline.py b/xinference/deploy/cmdline.py index 1ae10fc5b5..8eea848077 100644 --- a/xinference/deploy/cmdline.py +++ b/xinference/deploy/cmdline.py @@ -750,7 +750,7 @@ def remove_cache( "-f", default=None, type=str, - help="Specify the format of the model, e.g. pytorch, ggmlv3, etc.", + help="Specify the format of the model, e.g. pytorch, ggufv2, etc.", ) @click.option( "--quantization", @@ -1516,7 +1516,7 @@ def handle_user_passed_parameters() -> List[str]: "-f", type=str, required=True, - help="Specify the format of the model, e.g. pytorch, ggmlv3, etc.", + help="Specify the format of the model, e.g. pytorch, ggufv2, etc.", ) @click.option( "--quantization", diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 6fea2f6f4d..e2e38bebd5 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -12,8 +12,6 @@ fastapi==0.110.3 uvicorn huggingface-hub>=0.19.4 typing_extensions -fsspec==2023.10.0 -s3fs==2023.10.0 modelscope>=1.10.0 sse_starlette>=1.6.5 # ensure_bytes API break change: https://github.com/sysid/sse-starlette/issues/65 openai>1,<1.40 # For typing diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index a838e614dd..e40a747816 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -11,8 +11,6 @@ fastapi==0.110.3 uvicorn huggingface-hub>=0.19.4 typing_extensions -fsspec==2023.10.0 -s3fs==2023.10.0 boto3>=1.28.55,<1.28.65 tensorizer~=2.9.0 modelscope>=1.10.0 diff --git a/xinference/deploy/test/test_cmdline.py b/xinference/deploy/test/test_cmdline.py index ddf76ef8c1..905b83a9a7 100644 --- a/xinference/deploy/test/test_cmdline.py +++ b/xinference/deploy/test/test_cmdline.py @@ -66,10 +66,10 @@ def test_cmdline(setup, stream, model_uid): replica = 1 original_model_uid = model_uid model_uid = client.launch_model( - model_name="orca", + model_name="qwen1.5-chat", model_engine="llama.cpp", model_uid=model_uid, - model_size_in_billions=3, + model_size_in_billions="0_5", quantization="q4_0", replica=replica, ) @@ -249,10 +249,10 @@ def test_rotate_logs(setup_with_file_logging): runner = CliRunner() replica = 1 if os.name == "nt" else 2 model_uid = client.launch_model( - model_name="orca", + model_name="qwen1.5-chat", model_engine="llama.cpp", model_uid=None, - model_size_in_billions=3, + model_size_in_billions="0_5", quantization="q4_0", replica=replica, ) @@ -288,7 +288,7 @@ def test_list_cached_models(setup): result = runner.invoke( list_cached_models, - ["--endpoint", endpoint, "--model_name", "orca"], + ["--endpoint", endpoint, "--model_name", "qwen1.5-chat"], ) assert "model_name" in result.stdout assert "model_format" in result.stdout @@ -305,9 +305,9 @@ def test_remove_cache(setup): result = runner.invoke( remove_cache, - ["--endpoint", endpoint, "--model_version", "orca"], + ["--endpoint", endpoint, "--model_version", "qwen1.5-chat"], input="y\n", ) assert result.exit_code == 0 - assert "Cache directory orca has been deleted." + assert "Cache directory qwen1.5-chat has been deleted." diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 0870d6735e..7b41e0b776 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -40,7 +40,7 @@ TRANSFORMERS_CLASSES, VLLM_CLASSES, CustomLLMFamilyV1, - GgmlLLMSpecV1, + LlamaCppLLMSpecV1, LLMFamilyV1, LLMSpecV1, MLXLLMSpecV1, @@ -55,10 +55,10 @@ def check_format_with_engine(model_format, engine): - # only llama-cpp-python support and only support ggufv2 and ggmlv3 - if model_format in ["ggufv2", "ggmlv3"] and engine != "llama.cpp": + # only llama-cpp-python support and only support ggufv2 + if model_format in ["ggufv2"] and engine != "llama.cpp": return False - if model_format not in ["ggufv2", "ggmlv3"] and engine == "llama.cpp": + if model_format not in ["ggufv2"] and engine == "llama.cpp": return False return True @@ -112,28 +112,25 @@ def generate_engine_config_by_model_family(model_family): def _install(): - from .ggml.llamacpp import LlamaCppChatModel, LlamaCppModel + from .llama_cpp.core import LlamaCppChatModel, LlamaCppModel from .mlx.core import MLXChatModel, MLXModel - from .pytorch.baichuan import BaichuanPytorchChatModel - from .pytorch.chatglm import ChatglmPytorchChatModel - from .pytorch.cogvlm2 import CogVLM2Model - from .pytorch.core import PytorchChatModel, PytorchModel - from .pytorch.deepseek_vl import DeepSeekVLChatModel - from .pytorch.falcon import FalconPytorchChatModel, FalconPytorchModel - from .pytorch.glm4v import Glm4VModel - from .pytorch.intern_vl import InternVLChatModel - from .pytorch.internlm2 import Internlm2PytorchChatModel - from .pytorch.llama_2 import LlamaPytorchChatModel, LlamaPytorchModel - from .pytorch.minicpmv25 import MiniCPMV25Model - from .pytorch.minicpmv26 import MiniCPMV26Model - from .pytorch.qwen_vl import QwenVLChatModel - from .pytorch.vicuna import VicunaPytorchChatModel - from .pytorch.yi_vl import YiVLChatModel from .sglang.core import SGLANGChatModel, SGLANGModel + from .transformers.chatglm import ChatglmPytorchChatModel + from .transformers.cogvlm2 import CogVLM2Model + from .transformers.core import PytorchChatModel, PytorchModel + from .transformers.deepseek_vl import DeepSeekVLChatModel + from .transformers.glm4v import Glm4VModel + from .transformers.intern_vl import InternVLChatModel + from .transformers.internlm2 import Internlm2PytorchChatModel + from .transformers.llama_2 import LlamaPytorchChatModel, LlamaPytorchModel + from .transformers.minicpmv25 import MiniCPMV25Model + from .transformers.minicpmv26 import MiniCPMV26Model + from .transformers.qwen_vl import QwenVLChatModel + from .transformers.yi_vl import YiVLChatModel from .vllm.core import VLLMChatModel, VLLMModel try: - from .pytorch.omnilmm import OmniLMMModel + from .transformers.omnilmm import OmniLMMModel except ImportError as e: # For quite old transformers version, # import will generate error @@ -152,14 +149,10 @@ def _install(): MLX_CLASSES.extend([MLXModel, MLXChatModel]) TRANSFORMERS_CLASSES.extend( [ - BaichuanPytorchChatModel, - VicunaPytorchChatModel, - FalconPytorchChatModel, ChatglmPytorchChatModel, LlamaPytorchModel, LlamaPytorchChatModel, PytorchChatModel, - FalconPytorchModel, Internlm2PytorchChatModel, QwenVLChatModel, YiVLChatModel, diff --git a/xinference/model/llm/ggml/tools/__init__.py b/xinference/model/llm/ggml/tools/__init__.py deleted file mode 100644 index e32bd7fbe7..0000000000 --- a/xinference/model/llm/ggml/tools/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from .convert_ggml_to_gguf import convert diff --git a/xinference/model/llm/ggml/tools/convert_ggml_to_gguf.py b/xinference/model/llm/ggml/tools/convert_ggml_to_gguf.py deleted file mode 100644 index d94d14d88a..0000000000 --- a/xinference/model/llm/ggml/tools/convert_ggml_to_gguf.py +++ /dev/null @@ -1,498 +0,0 @@ -#!/usr/bin/env python3 -# Copied from llama.cpp to convert ggml file to gguf -from __future__ import annotations - -import argparse -import struct -from enum import IntEnum -from pathlib import Path -from typing import Optional - -import numpy as np - -from . import gguf - -# Note: Does not support GGML_QKK_64 -QK_K = 256 -# Items here are (block size, type size) -GGML_QUANT_SIZES = { - gguf.GGMLQuantizationType.F32: (1, 4), - gguf.GGMLQuantizationType.F16: (1, 2), - gguf.GGMLQuantizationType.Q4_0: (32, 2 + 16), - gguf.GGMLQuantizationType.Q4_1: (32, 2 + 2 + 16), - gguf.GGMLQuantizationType.Q5_0: (32, 2 + 4 + 16), - gguf.GGMLQuantizationType.Q5_1: (32, 2 + 2 + 4 + 16), - gguf.GGMLQuantizationType.Q8_0: (32, 2 + 32), - gguf.GGMLQuantizationType.Q8_1: (32, 4 + 4 + 32), - gguf.GGMLQuantizationType.Q2_K: (256, 2 + 2 + QK_K // 16 + QK_K // 4), - gguf.GGMLQuantizationType.Q3_K: (256, 2 + QK_K // 4 + QK_K // 8 + 12), - gguf.GGMLQuantizationType.Q4_K: (256, 2 + 2 + QK_K // 2 + 12), - gguf.GGMLQuantizationType.Q5_K: (256, 2 + 2 + QK_K // 2 + QK_K // 8 + 12), - gguf.GGMLQuantizationType.Q6_K: (256, 2 + QK_K // 2 + QK_K // 4 + QK_K // 16), - gguf.GGMLQuantizationType.Q8_K: (256, 4 + QK_K + QK_K // 8), -} - - -class GGMLFormat(IntEnum): - GGML = 0 - GGMF = 1 - GGJT = 2 - - -class GGMLFType(IntEnum): - ALL_F32 = 0 - MOSTLY_F16 = 1 - MOSTLY_Q4_0 = 2 - MOSTLY_Q4_1 = 3 - MOSTLY_Q4_1_SOME_F16 = 4 - MOSTLY_Q8_0 = 7 - MOSTLY_Q5_0 = 8 - MOSTLY_Q5_1 = 9 - MOSTLY_Q2_K = 10 - MOSTLY_Q3_K_S = 11 - MOSTLY_Q3_K_M = 12 - MOSTLY_Q3_K_L = 13 - MOSTLY_Q4_K_S = 14 - MOSTLY_Q4_K_M = 15 - MOSTLY_Q5_K_S = 16 - MOSTLY_Q5_K_M = 17 - MOSTLY_Q6_K = 18 - - -class Hyperparameters: - def __init__(self): - self.n_vocab = self.n_embd = self.n_mult = self.n_head = 0 - self.n_layer = self.n_rot = self.n_ff = 0 - self.ftype = GGMLFType.ALL_F32 - - def set_n_ff(self, model): - ff_tensor_idx = model.tensor_map.get(b"layers.0.feed_forward.w1.weight") - assert ff_tensor_idx is not None, "Missing layer 0 FF tensor" - ff_tensor = model.tensors[ff_tensor_idx] - self.n_ff = ff_tensor.dims[1] - - def load(self, data, offset): - ( - self.n_vocab, - self.n_embd, - self.n_mult, - self.n_head, - self.n_layer, - self.n_rot, - ftype, - ) = struct.unpack("<7I", data[offset : offset + (4 * 7)]) - try: - self.ftype = GGMLFType(ftype) - except ValueError: - raise ValueError(f"Invalid ftype {ftype}") - return 4 * 7 - - def __str__(self): - return f"<Hyperparameters: n_vocab={self.n_vocab}, n_embd={self.n_embd}, n_mult={self.n_mult}, n_head={self.n_head}, n_layer={self.n_layer}, n_rot={self.n_rot}, n_ff={self.n_ff}, ftype={self.ftype.name}>" - - -class Vocab: - def __init__(self, load_scores=True): - self.items = [] - self.load_scores = load_scores - - def load(self, data, offset, n_vocab): - orig_offset = offset - for _ in range(n_vocab): - itemlen = struct.unpack("<I", data[offset : offset + 4])[0] - assert itemlen < 4096, "Absurd vocab item length" - offset += 4 - item_text = bytes(data[offset : offset + itemlen]) - offset += itemlen - if self.load_scores: - item_score = struct.unpack("<f", data[offset : offset + 4])[0] - offset += 4 - else: - item_score = 0.0 - self.items.append((item_text, item_score)) - return offset - orig_offset - - -class Tensor: - def __init__(self, use_padding=True): - self.name = None - self.dims: tuple[int, ...] = () # type: ignore - self.dtype = None - self.start_offset = 0 - self.len_bytes = np.int64(0) - self.use_padding = use_padding - - def load(self, data, offset): - orig_offset = offset - (n_dims, name_len, dtype) = struct.unpack("<3I", data[offset : offset + 12]) - assert n_dims >= 0 and n_dims <= 4, f"Invalid tensor dimensions {n_dims}" - assert name_len < 4096, "Absurd tensor name length" - quant = GGML_QUANT_SIZES.get(dtype) - assert quant is not None, "Unknown tensor type" - (blksize, tysize) = quant - offset += 12 - self.dtype = dtype - self.dims = struct.unpack(f"<{n_dims}I", data[offset : offset + (4 * n_dims)]) - offset += 4 * n_dims - self.name = bytes(data[offset : offset + name_len]) - offset += name_len - pad = ((offset + 31) & ~31) - offset if self.use_padding else 0 - offset += pad - n_elems = np.prod(self.dims) - n_bytes = np.int64(np.int64(n_elems) * np.int64(tysize)) // np.int64(blksize) - self.start_offset = offset - self.len_bytes = n_bytes - offset += n_bytes - # print(n_dims, name_len, dtype, self.dims, self.name, pad) - return offset - orig_offset - - -class GGMLModel: - def __init__(self): - self.hyperparameters = None - self.vocab = None - self.tensor_map = {} - self.tensors = [] - - def validate_header(self, data, offset): - magic = bytes(data[offset : offset + 4]) - if magic == b"GGUF": - raise ValueError("File is already in GGUF format.") - if magic == b"lmgg": - self.file_format = GGMLFormat.GGML - self.format_version = 1 - return 4 - version = struct.unpack("<I", data[offset + 4 : offset + 8])[0] - if magic == b"fmgg": - if version != 1: - raise ValueError( - f"Cannot handle unexpected GGMF file version {version}" - ) - self.file_format = GGMLFormat.GGMF - self.format_version = version - return 8 - if magic == b"tjgg": - if version < 1 or version > 3: - raise ValueError( - f"Cannot handle unexpected GGJT file version {version}" - ) - self.file_format = GGMLFormat.GGJT - self.format_version = version - return 8 - raise ValueError( - f"Unexpected file magic {magic!r}! This doesn't look like a GGML format file." - ) - - def validate_conversion(self, ftype): - err = "" - if self.file_format < GGMLFormat.GGJT or self.format_version < 2: - if ftype not in (GGMLFType.ALL_F32, GGMLFType.MOSTLY_F16): - err = "Quantizations changed in GGJTv2. Can only convert unquantized GGML files older than GGJTv2." - elif self.file_format == GGMLFormat.GGJT and self.format_version == 2: - if ftype in ( - GGMLFType.MOSTLY_Q4_0, - GGMLFType.MOSTLY_Q4_1, - GGMLFType.MOSTLY_Q4_1_SOME_F16, - GGMLFType.MOSTLY_Q8_0, - ): - err = "Q4 and Q8 quantizations changed in GGJTv3." - if len(err) > 0: - raise ValueError( - f"{err} Sorry, your {self.file_format.name}v{self.format_version} file of type {ftype.name} is not eligible for conversion." - ) - - def load(self, data, offset): - offset += self.validate_header(data, offset) - hp = Hyperparameters() - offset += hp.load(data, offset) - print( - f"* File format: {self.file_format.name}v{self.format_version} with ftype {hp.ftype.name}" - ) - self.validate_conversion(hp.ftype) - vocab = Vocab(load_scores=self.file_format > GGMLFormat.GGML) - offset += vocab.load(data, offset, hp.n_vocab) - tensors: list[Tensor] = [] # type: ignore - tensor_map = {} - while offset < len(data): - tensor = Tensor(use_padding=self.file_format > GGMLFormat.GGMF) - offset += tensor.load(data, offset) - tensor_map[tensor.name] = len(tensors) - tensors.append(tensor) - self.hyperparameters = hp - self.vocab = vocab - self.tensors = tensors - self.tensor_map = tensor_map - hp.set_n_ff(self) - return offset - - -class GGMLToGGUF: - def __init__( - self, - ggml_model, - data, - cfg, - params_override=None, - vocab_override=None, - special_vocab=None, - ): - hp = ggml_model.hyperparameters - self.model = ggml_model - self.data = data - self.cfg = cfg - self.params_override = params_override - self.vocab_override = vocab_override - self.special_vocab = special_vocab - if params_override is not None: - n_kv_head = params_override.n_head_kv - else: - if cfg.gqa == 1: - n_kv_head = hp.n_head - else: - gqa = float(cfg.gqa) - n_kv_head = None - for x in range(1, 256): - if float(hp.n_head) / float(x) == gqa: - n_kv_head = x - assert ( - n_kv_head is not None - ), "Couldn't determine n_kv_head from GQA param" - print(f"- Guessed n_kv_head = {n_kv_head} based on GQA {cfg.gqa}") - self.n_kv_head = n_kv_head - self.name_map = gguf.get_tensor_name_map( - gguf.MODEL_ARCH.LLAMA, ggml_model.hyperparameters.n_layer - ) - - def save(self): - print("* Preparing to save GGUF file") - gguf_writer = gguf.GGUFWriter( - self.cfg.output, - gguf.MODEL_ARCH_NAMES[gguf.MODEL_ARCH.LLAMA], - use_temp_file=False, - ) - self.add_params(gguf_writer) - self.add_vocab(gguf_writer) - if self.special_vocab is not None: - self.special_vocab.add_to_gguf(gguf_writer) - self.add_tensors(gguf_writer) - print(" gguf: write header") - gguf_writer.write_header_to_file() - print(" gguf: write metadata") - gguf_writer.write_kv_data_to_file() - print(" gguf: write tensors") - gguf_writer.write_tensors_to_file() - gguf_writer.close() - - def add_params(self, gguf_writer): - hp = self.model.hyperparameters - cfg = self.cfg - if cfg.desc is not None: - desc = cfg.desc - else: - desc = f"converted from legacy {self.model.file_format.name}v{self.model.format_version} {hp.ftype.name} format" - try: - # Filenames aren't necessarily valid UTF8. - name = cfg.name if cfg.name is not None else cfg.input.name - except UnicodeDecodeError: - name = None - print("* Adding model parameters and KV items") - if name is not None: - gguf_writer.add_name(name) - gguf_writer.add_description(desc) - gguf_writer.add_file_type(int(hp.ftype)) - if self.params_override is not None: - po = self.params_override - assert po.n_embd == hp.n_embd, "Model hyperparams mismatch" - assert po.n_layer == hp.n_layer, "Model hyperparams mismatch" - assert po.n_head == hp.n_head, "Model hyperparams mismatch" - gguf_writer.add_context_length(po.n_ctx) - gguf_writer.add_embedding_length(po.n_embd) - gguf_writer.add_block_count(po.n_layer) - gguf_writer.add_feed_forward_length(po.n_ff) - gguf_writer.add_rope_dimension_count(po.n_embd // po.n_head) - gguf_writer.add_head_count(po.n_head) - gguf_writer.add_head_count_kv(po.n_head_kv) - gguf_writer.add_layer_norm_rms_eps(po.f_norm_eps) - return - gguf_writer.add_context_length(cfg.context_length) - gguf_writer.add_embedding_length(hp.n_embd) - gguf_writer.add_block_count(hp.n_layer) - gguf_writer.add_feed_forward_length(hp.n_ff) - gguf_writer.add_rope_dimension_count(hp.n_embd // hp.n_head) - gguf_writer.add_head_count(hp.n_head) - gguf_writer.add_head_count_kv(self.n_kv_head) - gguf_writer.add_layer_norm_rms_eps(float(cfg.eps)) - - def add_vocab(self, gguf_writer): - hp = self.model.hyperparameters - gguf_writer.add_tokenizer_model("llama") - tokens = [] - scores = [] - toktypes = [] - if self.vocab_override is not None: - vo = self.vocab_override - print("* Adding vocab item(s)") - for idx, (vbytes, score, ttype) in enumerate(vo.all_tokens()): - tokens.append(vbytes) - scores.append(score) - toktypes.append(ttype) - assert ( - len(tokens) == hp.n_vocab - ), f"Override vocab has a different number of items than hyperparameters - override = {len(tokens)} but n_vocab={hp.n_vocab}" - gguf_writer.add_token_list(tokens) - gguf_writer.add_token_scores(scores) - if len(toktypes) > 0: - gguf_writer.add_token_types(toktypes) - return - print(f"* Adding {hp.n_vocab} vocab item(s)") - assert ( - len(self.model.vocab.items) >= 3 - ), "Cannot handle unexpectedly short model vocab" - for tokid, (vbytes, vscore) in enumerate(self.model.vocab.items): - tt = 1 # Normal - # Special handling for UNK, BOS, EOS tokens. - if tokid <= 2: - if tokid == 0: - vbytes = b"<unk>" - tt = 2 - elif tokid == 1: - vbytes = b"<s>" - tt = 3 - else: - vbytes = b"</s>" - tt = 3 - elif len(vbytes) == 0: - tt = 3 # Control - elif tokid >= 3 and tokid <= 258 and len(vbytes) == 1: - vbytes = bytes(f"<0x{vbytes[0]:02X}>", encoding="UTF-8") - tt = 6 # Byte - else: - vbytes = vbytes.replace(b" ", b"\xe2\x96\x81") - toktypes.append(tt) - tokens.append(vbytes) - scores.append(vscore) - gguf_writer.add_token_list(tokens) - gguf_writer.add_token_scores(scores) - gguf_writer.add_token_types(toktypes) - gguf_writer.add_unk_token_id(0) - gguf_writer.add_bos_token_id(1) - gguf_writer.add_eos_token_id(2) - - def add_tensors(self, gguf_writer): - tensor_map = self.name_map - data = self.data - print(f"* Adding {len(self.model.tensors)} tensor(s)") - for tensor in self.model.tensors: - name = str(tensor.name, "UTF-8") - mapped_name = tensor_map.get_name(name, try_suffixes=(".weight", ".bias")) - assert mapped_name is not None, f"Bad name {name}" - tempdims = list(tensor.dims[:]) - if len(tempdims) > 1: - temp = tempdims[1] - tempdims[1] = tempdims[0] - tempdims[0] = temp - # print(f'+ {tensor.name} | {mapped_name} {tensor.dims} :: {tempdims}') - gguf_writer.add_tensor( - mapped_name, - data[tensor.start_offset : tensor.start_offset + tensor.len_bytes], - raw_shape=tempdims, - raw_dtype=tensor.dtype, - ) - - -def handle_args(): - parser = argparse.ArgumentParser(description="Convert GGML models to GGUF") - parser.add_argument( - "--input", "-i", type=Path, required=True, help="Input GGMLv3 filename" - ) - parser.add_argument( - "--output", "-o", type=Path, required=True, help="Output GGUF filename" - ) - parser.add_argument("--name", help="Set model name") - parser.add_argument("--desc", help="Set model description") - parser.add_argument( - "--gqa", - type=int, - default=1, - help="grouped-query attention factor (use 8 for LLaMA2 70B)", - ) - parser.add_argument( - "--eps", - default="5.0e-06", - help="RMS norm eps: Use 1e-6 for LLaMA1 and OpenLLaMA, use 1e-5 for LLaMA2", - ) - parser.add_argument( - "--context-length", - "-c", - type=int, - default=2048, - help="Default max context length: LLaMA1 is typically 2048, LLaMA2 is typically 4096", - ) - return parser.parse_args() - - -from dataclasses import dataclass - - -@dataclass -class Config: - input: Path - output: Path - name: Optional[str] - desc: Optional[str] - gqa: int - eps: float - context_length: int - - -def convert( - source_path: str, - dest_path: str, - model_name: Optional[str] = None, - model_desc: Optional[str] = None, - gqa: int = 1, - eps: float = 5.0e-06, - context_length: int = 2048, -): - cfg = Config( - input=Path(source_path), - output=Path(dest_path), - name=model_name, - desc=model_desc, - gqa=gqa, - eps=eps, - context_length=context_length, - ) - print(f"* Using config: {cfg}") - print( - "\n=== WARNING === Be aware that this conversion script is best-effort. Use a native GGUF model if possible. === WARNING ===\n" - ) - if cfg.gqa == 1 or cfg.eps == "5.0e-06": - print( - '- Note: If converting LLaMA2, specifying "--eps 1e-5" is required. 70B models also need "--gqa 8".' - ) - data = np.memmap(cfg.input, mode="r") - model = GGMLModel() - print("* Scanning GGML input file") - model.load(data, 0) - print(f"* GGML model hyperparameters: {model.hyperparameters}") - vocab_override = None - params_override = None - special_vocab = None - print( - "\n=== WARNING === Special tokens may not be converted correctly. Use --model-metadata-dir if possible === WARNING ===\n" - ) - if model.file_format == GGMLFormat.GGML: - print( - "! This is a very old GGML file that does not contain vocab scores. Strongly recommend using model metadata!" - ) - converter = GGMLToGGUF( - model, - data, - cfg, - params_override=params_override, - vocab_override=vocab_override, - special_vocab=special_vocab, - ) - converter.save() - print(f"* Successful completion. Output saved to: {cfg.output}") diff --git a/xinference/model/llm/ggml/tools/gguf.py b/xinference/model/llm/ggml/tools/gguf.py deleted file mode 100644 index c624feeba1..0000000000 --- a/xinference/model/llm/ggml/tools/gguf.py +++ /dev/null @@ -1,884 +0,0 @@ -#!/usr/bin/env python3 -# copied from llama.cpp -from __future__ import annotations - -import json -import os -import shutil -import struct -import sys -import tempfile -from enum import IntEnum, auto -from io import BufferedWriter -from pathlib import Path -from typing import Any, BinaryIO, Callable, Sequence - -import numpy as np - -# -# constants -# - -GGUF_MAGIC = 0x46554747 -GGUF_VERSION = 2 -GGUF_DEFAULT_ALIGNMENT = 32 - -# general -KEY_GENERAL_ARCHITECTURE = "general.architecture" -KEY_GENERAL_QUANTIZATION_VERSION = "general.quantization_version" -KEY_GENERAL_ALIGNMENT = "general.alignment" -KEY_GENERAL_NAME = "general.name" -KEY_GENERAL_AUTHOR = "general.author" -KEY_GENERAL_URL = "general.url" -KEY_GENERAL_DESCRIPTION = "general.description" -KEY_GENERAL_LICENSE = "general.license" -KEY_GENERAL_SOURCE_URL = "general.source.url" -KEY_GENERAL_SOURCE_HF_REPO = "general.source.hugginface.repository" -KEY_GENERAL_FILE_TYPE = "general.file_type" - -# LLM -KEY_CONTEXT_LENGTH = "{arch}.context_length" -KEY_EMBEDDING_LENGTH = "{arch}.embedding_length" -KEY_BLOCK_COUNT = "{arch}.block_count" -KEY_FEED_FORWARD_LENGTH = "{arch}.feed_forward_length" -KEY_USE_PARALLEL_RESIDUAL = "{arch}.use_parallel_residual" -KEY_TENSOR_DATA_LAYOUT = "{arch}.tensor_data_layout" - -# attention -KEY_ATTENTION_HEAD_COUNT = "{arch}.attention.head_count" -KEY_ATTENTION_HEAD_COUNT_KV = "{arch}.attention.head_count_kv" -KEY_ATTENTION_MAX_ALIBI_BIAS = "{arch}.attention.max_alibi_bias" -KEY_ATTENTION_CLAMP_KQV = "{arch}.attention.clamp_kqv" -KEY_ATTENTION_LAYERNORM_EPS = "{arch}.attention.layer_norm_epsilon" -KEY_ATTENTION_LAYERNORM_RMS_EPS = "{arch}.attention.layer_norm_rms_epsilon" - -# RoPE -KEY_ROPE_DIMENSION_COUNT = "{arch}.rope.dimension_count" -KEY_ROPE_FREQ_BASE = "{arch}.rope.freq_base" -KEY_ROPE_SCALE_LINEAR = "{arch}.rope.scale_linear" - -# tokenization -KEY_TOKENIZER_MODEL = "tokenizer.ggml.model" -KEY_TOKENIZER_LIST = "tokenizer.ggml.tokens" -KEY_TOKENIZER_TOKEN_TYPE = "tokenizer.ggml.token_type" -KEY_TOKENIZER_SCORES = "tokenizer.ggml.scores" -KEY_TOKENIZER_MERGES = "tokenizer.ggml.merges" -KEY_TOKENIZER_BOS_ID = "tokenizer.ggml.bos_token_id" -KEY_TOKENIZER_EOS_ID = "tokenizer.ggml.eos_token_id" -KEY_TOKENIZER_UNK_ID = "tokenizer.ggml.unknown_token_id" -KEY_TOKENIZER_SEP_ID = "tokenizer.ggml.seperator_token_id" -KEY_TOKENIZER_PAD_ID = "tokenizer.ggml.padding_token_id" -KEY_TOKENIZER_HF_JSON = "tokenizer.huggingface.json" -KEY_TOKENIZER_RWKV = "tokenizer.rwkv.world" - - -# -# recommended mapping of model tensor names for storage in gguf -# - - -class MODEL_ARCH(IntEnum): - LLAMA: int = auto() - FALCON: int = auto() - GPT2: int = auto() - GPTJ: int = auto() - GPTNEOX: int = auto() - MPT: int = auto() - - -class MODEL_TENSOR(IntEnum): - TOKEN_EMBD: int = auto() - POS_EMBD: int = auto() - OUTPUT: int = auto() - OUTPUT_NORM: int = auto() - ROPE_FREQS: int = auto() - ATTN_Q: int = auto() - ATTN_K: int = auto() - ATTN_V: int = auto() - ATTN_QKV: int = auto() - ATTN_OUT: int = auto() - ATTN_NORM: int = auto() - ATTN_NORM_2: int = auto() - ATTN_ROT_EMBD: int = auto() - FFN_GATE: int = auto() - FFN_DOWN: int = auto() - FFN_UP: int = auto() - FFN_NORM: int = auto() - - -MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { - MODEL_ARCH.LLAMA: "llama", - MODEL_ARCH.FALCON: "falcon", - MODEL_ARCH.GPT2: "gpt2", - MODEL_ARCH.GPTJ: "gptj", - MODEL_ARCH.GPTNEOX: "gptneox", - MODEL_ARCH.MPT: "mpt", -} - -MODEL_TENSOR_NAMES: dict[MODEL_ARCH, dict[MODEL_TENSOR, str]] = { - MODEL_ARCH.LLAMA: { - MODEL_TENSOR.TOKEN_EMBD: "token_embd", - MODEL_TENSOR.OUTPUT_NORM: "output_norm", - MODEL_TENSOR.OUTPUT: "output", - MODEL_TENSOR.ROPE_FREQS: "rope_freqs", - MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", - MODEL_TENSOR.ATTN_Q: "blk.{bid}.attn_q", - MODEL_TENSOR.ATTN_K: "blk.{bid}.attn_k", - MODEL_TENSOR.ATTN_V: "blk.{bid}.attn_v", - MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", - MODEL_TENSOR.ATTN_ROT_EMBD: "blk.{bid}.attn_rot_embd", - MODEL_TENSOR.FFN_NORM: "blk.{bid}.ffn_norm", - MODEL_TENSOR.FFN_GATE: "blk.{bid}.ffn_gate", - MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", - MODEL_TENSOR.FFN_UP: "blk.{bid}.ffn_up", - }, - MODEL_ARCH.GPTNEOX: { - MODEL_TENSOR.TOKEN_EMBD: "token_embd", - MODEL_TENSOR.OUTPUT_NORM: "output_norm", - MODEL_TENSOR.OUTPUT: "output", - MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", - MODEL_TENSOR.ATTN_QKV: "blk.{bid}.attn_qkv", - MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", - MODEL_TENSOR.FFN_NORM: "blk.{bid}.ffn_norm", - MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", - MODEL_TENSOR.FFN_UP: "blk.{bid}.ffn_up", - }, - MODEL_ARCH.FALCON: { - MODEL_TENSOR.TOKEN_EMBD: "token_embd", - MODEL_TENSOR.OUTPUT_NORM: "output_norm", - MODEL_TENSOR.OUTPUT: "output", - MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", - MODEL_TENSOR.ATTN_NORM_2: "blk.{bid}.attn_norm_2", - MODEL_TENSOR.ATTN_QKV: "blk.{bid}.attn_qkv", - MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", - MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", - MODEL_TENSOR.FFN_UP: "blk.{bid}.ffn_up", - }, - MODEL_ARCH.GPT2: { - # TODO - }, - # TODO -} - -# tensors that will not be serialized -MODEL_TENSOR_SKIP: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { - MODEL_ARCH.LLAMA: [ - MODEL_TENSOR.ROPE_FREQS, - MODEL_TENSOR.ATTN_ROT_EMBD, - ], -} - - -class TensorNameMap: - mappings_cfg: dict[MODEL_TENSOR, tuple[str, ...]] = { - # Token embeddings - MODEL_TENSOR.TOKEN_EMBD: ( - "gpt_neox.embed_in", # gptneox - "transformer.wte", # gpt2 mpt - "transformer.word_embeddings", # falcon - "model.embed_tokens", # llama-hf - "tok_embeddings", # llama-pth - ), - # Position embeddings - MODEL_TENSOR.POS_EMBD: ("transformer.wpe",), # gpt2 - # Output - MODEL_TENSOR.OUTPUT: ( - "embed_out", # gptneox - "lm_head", # gpt2 mpt falcon llama-hf - "output", # llama-pth - ), - # Output norm - MODEL_TENSOR.OUTPUT_NORM: ( - "gpt_neox.final_layer_norm", # gptneox - "transformer.ln_f", # gpt2 falcon - "model.norm", # llama-hf - "norm", # llama-pth - ), - # Rope frequencies - MODEL_TENSOR.ROPE_FREQS: ("rope.freqs",), # llama-pth - } - - block_mappings_cfg: dict[MODEL_TENSOR, tuple[str, ...]] = { - # Attention norm - MODEL_TENSOR.ATTN_NORM: ( - "gpt_neox.layers.{bid}.input_layernorm", # gptneox - "transformer.h.{bid}.ln_1", # gpt2 - "transformer.blocks.{bid}.norm_1", # mpt - "transformer.h.{bid}.input_layernorm", # falcon7b - "transformer.h.{bid}.ln_mlp", # falcon40b - "model.layers.{bid}.input_layernorm", # llama-hf - "layers.{bid}.attention_norm", # llama-pth - ), - # Attention norm 2 - MODEL_TENSOR.ATTN_NORM_2: ("transformer.h.{bid}.ln_attn",), # falcon40b - # Attention query-key-value - MODEL_TENSOR.ATTN_QKV: ( - "gpt_neox.layers.{bid}.attention.query_key_value", # gptneox - "transformer.h.{bid}.attn.c_attn", # gpt2 - "transformer.blocks.{bid}.attn.Wqkv", # mpt - "transformer.h.{bid}.self_attention.query_key_value", # falcon - ), - # Attention query - MODEL_TENSOR.ATTN_Q: ( - "model.layers.{bid}.self_attn.q_proj", # llama-hf - "layers.{bid}.attention.wq", # llama-pth - ), - # Attention key - MODEL_TENSOR.ATTN_K: ( - "model.layers.{bid}.self_attn.k_proj", # llama-hf - "layers.{bid}.attention.wk", # llama-pth - ), - # Attention value - MODEL_TENSOR.ATTN_V: ( - "model.layers.{bid}.self_attn.v_proj", # llama-hf - "layers.{bid}.attention.wv", # llama-pth - ), - # Attention output - MODEL_TENSOR.ATTN_OUT: ( - "gpt_neox.layers.{bid}.attention.dense", # gptneox - "transformer.h.{bid}.attn.c_proj", # gpt2 - "transformer.blocks.{bid}.attn.out_proj", # mpt - "transformer.h.{bid}.self_attention.dense", # falcon - "model.layers.{bid}.self_attn.o_proj", # llama-hf - "layers.{bid}.attention.wo", # llama-pth - ), - # Rotary embeddings - MODEL_TENSOR.ATTN_ROT_EMBD: ( - "model.layers.{bid}.self_attn.rotary_emb.inv_freq", # llama-hf - "layers.{bid}.attention.inner_attention.rope.freqs", # llama-pth - ), - # Feed-forward norm - MODEL_TENSOR.FFN_NORM: ( - "gpt_neox.layers.{bid}.post_attention_layernorm", # gptneox - "transformer.h.{bid}.ln_2", # gpt2 - "transformer.blocks.{bid}.norm_2", # mpt - "model.layers.{bid}.post_attention_layernorm", # llama-hf - "layers.{bid}.ffn_norm", # llama-pth - ), - # Feed-forward up - MODEL_TENSOR.FFN_UP: ( - "gpt_neox.layers.{bid}.mlp.dense_h_to_4h", # gptneox - "transformer.h.{bid}.mlp.c_fc", # gpt2 - "transformer.blocks.{bid}.ffn.up_proj", # mpt - "transformer.h.{bid}.mlp.dense_h_to_4h", # falcon - "model.layers.{bid}.mlp.up_proj", # llama-hf - "layers.{bid}.feed_forward.w3", # llama-pth - ), - # Feed-forward gate - MODEL_TENSOR.FFN_GATE: ( - "model.layers.{bid}.mlp.gate_proj", # llama-hf - "layers.{bid}.feed_forward.w1", # llama-pth - ), - # Feed-forward down - MODEL_TENSOR.FFN_DOWN: ( - "gpt_neox.layers.{bid}.mlp.dense_4h_to_h", # gptneox - "transformer.h.{bid}.mlp.c_proj", # gpt2 - "transformer.blocks.{bid}.ffn.down_proj", # mpt - "transformer.h.{bid}.mlp.dense_4h_to_h", # falcon - "model.layers.{bid}.mlp.down_proj", # llama-hf - "layers.{bid}.feed_forward.w2", # llama-pth - ), - } - - mapping: dict[str, tuple[MODEL_TENSOR, str]] - - tensor_names: dict[MODEL_TENSOR, str] - - def __init__(self, arch: MODEL_ARCH, n_blocks: int): - mapping = self.mapping = {} - tensor_names = self.tensor_names = MODEL_TENSOR_NAMES[arch] - for tensor, keys in self.mappings_cfg.items(): - tensor_name = tensor_names.get(tensor) - if tensor_name is None: - continue - for key in keys: - mapping[key] = (tensor, tensor_name) - for bid in range(n_blocks): - for tensor, keys in self.block_mappings_cfg.items(): - tensor_name = tensor_names.get(tensor) - if tensor_name is None: - continue - tensor_name = tensor_name.format(bid=bid) - for key in keys: - key = key.format(bid=bid) - mapping[key] = (tensor, tensor_name) - - def get_type_and_name( - self, key: str, try_suffixes: Sequence[str] - ) -> tuple[MODEL_TENSOR, str] | None: - result = self.mapping.get(key) - if result is not None: - return result - for suffix in try_suffixes: - if key.endswith(suffix): - result = self.mapping.get(key[: -len(suffix)]) - if result is not None: - return (result[0], result[1] + suffix) - return None - - def get_name(self, key: str, try_suffixes: Sequence[str]) -> str | None: - result = self.get_type_and_name(key, try_suffixes=try_suffixes) - if result is None: - return None - return result[1] - - def get_type(self, key: str, try_suffixes: Sequence[str]) -> MODEL_TENSOR | None: - result = self.get_type_and_name(key, try_suffixes=try_suffixes) - if result is None: - return None - return result[0] - - def __getitem__(self, key: str) -> str: - try: - return self.mapping[key][1] - except KeyError: - raise KeyError(key) - - def __contains__(self, key: str) -> bool: - return key in self.mapping - - def __repr__(self) -> str: - return repr(self.mapping) - - -def get_tensor_name_map(arch: MODEL_ARCH, n_blocks: int) -> TensorNameMap: - return TensorNameMap(arch, n_blocks) - - -class TokenType(IntEnum): - NORMAL = 1 - UNKNOWN = 2 - CONTROL = 3 - USER_DEFINED = 4 - UNUSED = 5 - BYTE = 6 - - -# -# implementation -# - - -class GGMLQuantizationType(IntEnum): - F32 = 0 - F16 = 1 - Q4_0 = 2 - Q4_1 = 3 - Q5_0 = 6 - Q5_1 = 7 - Q8_0 = 8 - Q8_1 = 9 - Q2_K = 10 - Q3_K = 11 - Q4_K = 12 - Q5_K = 13 - Q6_K = 14 - Q8_K = 15 - - -class GGUFValueType(IntEnum): - UINT8 = 0 - INT8 = 1 - UINT16 = 2 - INT16 = 3 - UINT32 = 4 - INT32 = 5 - FLOAT32 = 6 - BOOL = 7 - STRING = 8 - ARRAY = 9 - UINT64 = 10 - INT64 = 11 - FLOAT64 = 12 - - @staticmethod - def get_type(val): - if isinstance(val, str) or isinstance(val, bytes) or isinstance(val, bytearray): - return GGUFValueType.STRING - elif isinstance(val, list): - return GGUFValueType.ARRAY - elif isinstance(val, float): - return GGUFValueType.FLOAT32 - elif isinstance(val, bool): - return GGUFValueType.BOOL - elif isinstance(val, int): - return GGUFValueType.INT32 - # TODO: need help with 64-bit types in Python - else: - print("Unknown type: " + str(type(val))) - sys.exit() - - -class GGUFWriter: - fout: BufferedWriter - arch: str - offset_tensor = 0 - data_alignment = GGUF_DEFAULT_ALIGNMENT - kv_data = b"" - kv_data_count = 0 - ti_data = b"" - ti_data_count = 0 - use_temp_file: bool - temp_file: tempfile.SpooledTemporaryFile[bytes] | None = None - tensors: list[tuple[np.ndarray[Any, Any], int]] - - def __init__(self, path: os.PathLike[str] | str, arch: str, use_temp_file=True): - self.fout = open(path, "wb") - self.arch = arch - self.add_architecture() - self.use_temp_file = use_temp_file - self.tensors = [] - - def write_header_to_file(self): - self.fout.write(struct.pack("<I", GGUF_MAGIC)) - self.fout.write(struct.pack("<I", GGUF_VERSION)) - self.fout.write(struct.pack("<Q", self.ti_data_count)) - self.fout.write(struct.pack("<Q", self.kv_data_count)) - self.flush() - - # print("tensors " + str(self.ti_data_count) + " kv " + str(self.kv_data_count)) - - def write_kv_data_to_file(self): - self.fout.write(self.kv_data) - self.flush() - - def write_ti_data_to_file(self): - self.fout.write(self.ti_data) - self.flush() - - def add_key(self, key: str): - self.add_val(key, GGUFValueType.STRING, add_vtype=False) - - def add_uint8(self, key: str, val: int): - self.add_key(key) - self.add_val(val, GGUFValueType.UINT8) - - def add_int8(self, key: str, val: int): - self.add_key(key) - self.add_val(val, GGUFValueType.INT8) - - def add_uint16(self, key: str, val: int): - self.add_key(key) - self.add_val(val, GGUFValueType.UINT16) - - def add_int16(self, key: str, val: int): - self.add_key(key) - self.add_val(val, GGUFValueType.INT16) - - def add_uint32(self, key: str, val: int): - self.add_key(key) - self.add_val(val, GGUFValueType.UINT32) - - def add_int32(self, key: str, val: int): - self.add_key(key) - self.add_val(val, GGUFValueType.INT32) - - def add_float32(self, key: str, val: float): - self.add_key(key) - self.add_val(val, GGUFValueType.FLOAT32) - - def add_uint64(self, key: str, val: int): - self.add_key(key) - self.add_val(val, GGUFValueType.UINT64) - - def add_int64(self, key: str, val: int): - self.add_key(key) - self.add_val(val, GGUFValueType.INT64) - - def add_float64(self, key: str, val: float): - self.add_key(key) - self.add_val(val, GGUFValueType.FLOAT64) - - def add_bool(self, key: str, val: bool): - self.add_key(key) - self.add_val(val, GGUFValueType.BOOL) - - def add_string(self, key: str, val: str): - if len(val) == 0: - return - self.add_key(key) - self.add_val(val, GGUFValueType.STRING) - - def add_array(self, key: str, val: Sequence[Any]): - if not isinstance(val, Sequence): - raise ValueError("Value must be a sequence for array type") - - self.add_key(key) - self.add_val(val, GGUFValueType.ARRAY) - - _simple_value_packing = { - GGUFValueType.UINT8: "<B", - GGUFValueType.INT8: "<b", - GGUFValueType.UINT16: "<H", - GGUFValueType.INT16: "<h", - GGUFValueType.UINT32: "<I", - GGUFValueType.INT32: "<i", - GGUFValueType.FLOAT32: "<f", - GGUFValueType.UINT64: "<Q", - GGUFValueType.INT64: "<q", - GGUFValueType.FLOAT64: "<d", - GGUFValueType.BOOL: "?", - } - - def add_val( - self, val: Any, vtype: GGUFValueType | None = None, add_vtype: bool = True - ): - if vtype is None: - vtype = GGUFValueType.get_type(val) - - if add_vtype: - self.kv_data += struct.pack("<I", vtype) - self.kv_data_count += 1 - - pack_fmt = self._simple_value_packing.get(vtype) - if pack_fmt is not None: - self.kv_data += struct.pack(pack_fmt, val) - elif vtype == GGUFValueType.STRING: - encoded_val = val.encode("utf8") if isinstance(val, str) else val - self.kv_data += struct.pack("<Q", len(encoded_val)) - self.kv_data += encoded_val - elif ( - vtype == GGUFValueType.ARRAY and isinstance(val, Sequence) and len(val) > 0 - ): - ltype = GGUFValueType.get_type(val[0]) - if not all(GGUFValueType.get_type(i) is ltype for i in val[1:]): - raise ValueError("All items in a GGUF array should be of the same type") - self.kv_data += struct.pack("<I", ltype) - self.kv_data += struct.pack("<Q", len(val)) - for item in val: - self.add_val(item, add_vtype=False) - else: - raise ValueError("Invalid GGUF metadata value type or value") - - @staticmethod - def ggml_pad(x: int, n: int) -> int: - return ((x + n - 1) // n) * n - - def add_tensor_info( - self, - name: str, - tensor_shape: Sequence[int], - tensor_dtype: np.dtype[np.float16] | np.dtype[np.float32], - tensor_nbytes: int, - raw_dtype: GGMLQuantizationType | None = None, - ): - assert raw_dtype is not None or tensor_dtype in ( - np.float32, - np.float16, - ), "Only F32 and F16 tensors are supported for now" - - encoded_name = name.encode("utf8") - self.ti_data += struct.pack("<Q", len(encoded_name)) - self.ti_data += encoded_name - n_dims = len(tensor_shape) - self.ti_data += struct.pack("<I", n_dims) - for i in range(n_dims): - self.ti_data += struct.pack("<Q", tensor_shape[n_dims - 1 - i]) - if raw_dtype is None: - dtype = ( - GGMLQuantizationType.F32 - if tensor_dtype == np.float32 - else GGMLQuantizationType.F16 - ) - else: - dtype = raw_dtype - self.ti_data += struct.pack("<I", dtype) - self.ti_data += struct.pack("<Q", self.offset_tensor) - self.offset_tensor += GGUFWriter.ggml_pad(tensor_nbytes, self.data_alignment) - self.ti_data_count += 1 - - def add_tensor( - self, - name: str, - tensor: np.ndarray[Any, Any], - raw_shape: Sequence[int] | None = None, - raw_dtype: GGMLQuantizationType | None = None, - ): - if self.use_temp_file and self.temp_file is None: - fp = tempfile.SpooledTemporaryFile(mode="w+b", max_size=256 * 1024 * 1024) - fp.seek(0) - self.temp_file = fp - - shape: Sequence[int] = raw_shape if raw_shape is not None else tensor.shape - self.add_tensor_info( - name, shape, tensor.dtype, tensor.nbytes, raw_dtype=raw_dtype - ) - - pad = GGUFWriter.ggml_pad(tensor.nbytes, self.data_alignment) - tensor.nbytes - - if self.temp_file is None: - self.tensors.append((tensor, pad)) - return - - tensor.tofile(self.temp_file) - - if pad != 0: - self.temp_file.write(bytes([0] * pad)) - - def write_padding(self, fp: BinaryIO, n: int, align: int | None = None): - pad = ( - GGUFWriter.ggml_pad(n, align if align is not None else self.data_alignment) - - n - ) - if pad != 0: - fp.write(bytes([0] * pad)) - - def write_tensor_data(self, tensor: np.ndarray[Any, Any]): - self.write_padding(self.fout, self.fout.tell()) - tensor.tofile(self.fout) - self.write_padding(self.fout, tensor.nbytes) - - def write_tensors_to_file(self): - self.write_ti_data_to_file() - - self.write_padding(self.fout, self.fout.tell()) - - if self.temp_file is None: - for currtensor, currpad in self.tensors: - currtensor.tofile(self.fout) - if currpad != 0: - self.fout.write(bytes([0] * currpad)) - return - - self.temp_file.seek(0) - - shutil.copyfileobj(self.temp_file, self.fout) - self.flush() - self.temp_file.close() - - def flush(self): - self.fout.flush() - - def close(self): - self.fout.close() - - def add_architecture(self): - self.add_string(KEY_GENERAL_ARCHITECTURE, self.arch) - - def add_author(self, author: str): - self.add_string(KEY_GENERAL_AUTHOR, author) - - def add_tensor_data_layout(self, layout: str): - self.add_string(KEY_TENSOR_DATA_LAYOUT.format(arch=self.arch), layout) - - def add_url(self, url: str): - self.add_string(KEY_GENERAL_URL, url) - - def add_description(self, description: str): - self.add_string(KEY_GENERAL_DESCRIPTION, description) - - def add_source_url(self, url: str): - self.add_string(KEY_GENERAL_SOURCE_URL, url) - - def add_source_hf_repo(self, repo: str): - self.add_string(KEY_GENERAL_SOURCE_HF_REPO, repo) - - def add_file_type(self, ftype: int): - self.add_uint32(KEY_GENERAL_FILE_TYPE, ftype) - - def add_name(self, name: str): - self.add_string(KEY_GENERAL_NAME, name) - - def add_quantization_version(self, quantization_version: GGMLQuantizationType): - self.add_uint32(KEY_GENERAL_QUANTIZATION_VERSION, quantization_version) - - def add_custom_alignment(self, alignment: int): - self.data_alignment = alignment - self.add_uint32(KEY_GENERAL_ALIGNMENT, alignment) - - def add_context_length(self, length: int): - self.add_uint32(KEY_CONTEXT_LENGTH.format(arch=self.arch), length) - - def add_embedding_length(self, length: int): - self.add_uint32(KEY_EMBEDDING_LENGTH.format(arch=self.arch), length) - - def add_block_count(self, length: int): - self.add_uint32(KEY_BLOCK_COUNT.format(arch=self.arch), length) - - def add_feed_forward_length(self, length: int): - self.add_uint32(KEY_FEED_FORWARD_LENGTH.format(arch=self.arch), length) - - def add_parallel_residual(self, use: bool): - self.add_bool(KEY_USE_PARALLEL_RESIDUAL.format(arch=self.arch), use) - - def add_head_count(self, count: int): - self.add_uint32(KEY_ATTENTION_HEAD_COUNT.format(arch=self.arch), count) - - def add_head_count_kv(self, count: int): - self.add_uint32(KEY_ATTENTION_HEAD_COUNT_KV.format(arch=self.arch), count) - - def add_max_alibi_bias(self, bias: float): - self.add_float32(KEY_ATTENTION_MAX_ALIBI_BIAS.format(arch=self.arch), bias) - - def add_clamp_kqv(self, value: float): - self.add_float32(KEY_ATTENTION_CLAMP_KQV.format(arch=self.arch), value) - - def add_layer_norm_eps(self, value: float): - self.add_float32(KEY_ATTENTION_LAYERNORM_EPS.format(arch=self.arch), value) - - def add_layer_norm_rms_eps(self, value: float): - self.add_float32(KEY_ATTENTION_LAYERNORM_RMS_EPS.format(arch=self.arch), value) - - def add_rope_dimension_count(self, count: int): - self.add_uint32(KEY_ROPE_DIMENSION_COUNT.format(arch=self.arch), count) - - def add_rope_freq_base(self, value: float): - self.add_float32(KEY_ROPE_FREQ_BASE.format(arch=self.arch), value) - - def add_rope_scale_linear(self, value: float): - self.add_float32(KEY_ROPE_SCALE_LINEAR.format(arch=self.arch), value) - - def add_tokenizer_model(self, model: str): - self.add_string(KEY_TOKENIZER_MODEL, model) - - def add_token_list( - self, tokens: Sequence[str] | Sequence[bytes] | Sequence[bytearray] - ): - self.add_array(KEY_TOKENIZER_LIST, tokens) - - def add_token_merges( - self, merges: Sequence[str] | Sequence[bytes] | Sequence[bytearray] - ): - self.add_array(KEY_TOKENIZER_MERGES, merges) - - def add_token_types(self, types: Sequence[TokenType] | Sequence[int]): - self.add_array(KEY_TOKENIZER_TOKEN_TYPE, types) - - def add_token_scores(self, scores: Sequence[float]): - self.add_array(KEY_TOKENIZER_SCORES, scores) - - def add_bos_token_id(self, id: int): - self.add_uint32(KEY_TOKENIZER_BOS_ID, id) - - def add_eos_token_id(self, id: int): - self.add_uint32(KEY_TOKENIZER_EOS_ID, id) - - def add_unk_token_id(self, id: int): - self.add_uint32(KEY_TOKENIZER_UNK_ID, id) - - def add_sep_token_id(self, id: int): - self.add_uint32(KEY_TOKENIZER_SEP_ID, id) - - def add_pad_token_id(self, id: int): - self.add_uint32(KEY_TOKENIZER_PAD_ID, id) - - -class SpecialVocab: - load_merges: bool = False - merges: list[str] = [] - special_token_types: tuple[str, ...] = ("bos", "eos", "unk", "sep", "pad") - special_token_ids: dict[str, int] = {} - - def __init__( - self, - path: Path, - load_merges: bool = False, - special_token_types: tuple[str, ...] | None = None, - ): - self.special_token_ids = {} - self.load_merges = load_merges - if special_token_types is not None: - self.special_token_types = special_token_types - self.load(path) - - def load(self, path: Path): - if not self.try_load_from_tokenizer_json(path): - self.try_load_from_config_json(path) - - def try_load_from_tokenizer_json(self, path: Path) -> bool: - tokenizer_file = path / "tokenizer.json" - if not tokenizer_file.is_file(): - return False - with open(tokenizer_file, "r", encoding="utf-8") as f: - tokenizer = json.load(f) - if self.load_merges: - merges = tokenizer.get("model", {}).get("merges") - if ( - isinstance(merges, list) - and len(merges) > 0 - and isinstance(merges[0], str) - ): - self.merges = merges - tokenizer_config_file = path / "tokenizer_config.json" - added_tokens = tokenizer.get("added_tokens") - if added_tokens is None or not tokenizer_config_file.is_file(): - return True - with open(tokenizer_config_file, "r", encoding="utf-8") as f: - tokenizer_config = json.load(f) - for typ in self.special_token_types: - entry = tokenizer_config.get(f"{typ}_token") - if isinstance(entry, str): - tc_content = entry - elif isinstance(entry, dict): - entry_content = entry.get("content") - if not isinstance(entry_content, str): - continue - tc_content = entry_content - else: - continue - for maybe_token_id in ( - atok.get("id") - for atok in added_tokens - if atok.get("content") == tc_content - ): - if isinstance(maybe_token_id, int) and maybe_token_id >= 0: - self.special_token_ids[typ] = maybe_token_id - break - return True - - def try_load_from_config_json(self, path: Path) -> bool: - config_file = path / "config.json" - if not config_file.is_file(): - return False - with open(config_file, "r", encoding="utf-8") as f: - config = json.load(f) - for typ in self.special_token_types: - maybe_token_id = config.get(f"{typ}_token_id") - if isinstance(maybe_token_id, int) and maybe_token_id >= 0: - self.special_token_ids[typ] = maybe_token_id - return True - - def add_to_gguf(self, gw: GGUFWriter): - if len(self.merges) > 0: - print(f"gguf: Adding {len(self.merges)} merge(s).") - gw.add_token_merges(self.merges) - for typ, tokid in self.special_token_ids.items(): - handler: Callable[[int], None] | None = getattr( - gw, f"add_{typ}_token_id", None - ) - if handler is None: - print( - f"gguf: WARNING: No handler for special token type {typ} with id {tokid} - skipping" - ) - continue - print(f"gguf: Setting special token type {typ} to {tokid}") - handler(tokid) - - def __repr__(self): - return f'<SpecialVocab with {len(self.merges)} merges and special tokens {self.special_token_ids if self.special_token_ids else "unset"}>' - - -# Example usage: -if __name__ == "__main__": - # Example usage with a file - gguf_writer = GGUFWriter("example.gguf", "llama") - - gguf_writer.add_architecture() - gguf_writer.add_block_count(12) - gguf_writer.add_uint32("answer", 42) # Write a 32-bit integer - gguf_writer.add_float32("answer_in_float", 42.0) # Write a 32-bit float - gguf_writer.add_custom_alignment(64) - - tensor1 = np.ones((32,), dtype=np.float32) * 100.0 - tensor2 = np.ones((64,), dtype=np.float32) * 101.0 - tensor3 = np.ones((96,), dtype=np.float32) * 102.0 - - gguf_writer.add_tensor("tensor1", tensor1) - gguf_writer.add_tensor("tensor2", tensor2) - gguf_writer.add_tensor("tensor3", tensor3) - - gguf_writer.write_header_to_file() - gguf_writer.write_kv_data_to_file() - gguf_writer.write_tensors_to_file() - - gguf_writer.close() diff --git a/xinference/model/llm/ggml/__init__.py b/xinference/model/llm/llama_cpp/__init__.py similarity index 100% rename from xinference/model/llm/ggml/__init__.py rename to xinference/model/llm/llama_cpp/__init__.py diff --git a/xinference/model/llm/ggml/llamacpp.py b/xinference/model/llm/llama_cpp/core.py similarity index 89% rename from xinference/model/llm/ggml/llamacpp.py rename to xinference/model/llm/llama_cpp/core.py index 9e8f09c02f..b820fce466 100644 --- a/xinference/model/llm/ggml/llamacpp.py +++ b/xinference/model/llm/llama_cpp/core.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import datetime import logging import os import time @@ -104,35 +103,6 @@ def _sanitize_generate_config( generate_config.pop("lora_name", None) # type: ignore return generate_config - def _convert_ggml_to_gguf(self, model_path: str) -> str: - from .tools import convert - - root_dir = os.path.dirname(os.path.dirname(model_path)) - gguf_dir = os.path.join( - root_dir, - "{}-ggufv2-{}b".format( - self.model_family.model_name, self.model_spec.model_size_in_billions - ), - ) - os.makedirs(gguf_dir, exist_ok=True) - gguf_path = os.path.join( - gguf_dir, - "{}.{}.ggufv2".format(self.model_family.model_name, self.quantization), - ) - # trick for validation, use a mark file to make sure the gguf file is converted - mark_file = os.path.join(gguf_dir, f"__valid_{self.quantization}") - if os.path.exists(mark_file): - return gguf_path - else: - logger.warning( - "You are using a model with ggmlv3, " - "and it will take some time to convert to ggufv2" - ) - convert(model_path, gguf_path) - with open(mark_file, "w") as f: - f.write(str(datetime.datetime.now())) - return gguf_path - def load(self): try: import llama_cpp @@ -167,9 +137,6 @@ def load(self): if os.path.exists(legacy_model_file_path): model_path = legacy_model_file_path - if self.model_spec.model_format == "ggmlv3": - model_path = self._convert_ggml_to_gguf(model_path) - try: self._llm = Llama( model_path=model_path, @@ -183,7 +150,7 @@ def load(self): def match( cls, llm_family: LLMFamilyV1, llm_spec: LLMSpecV1, quantization: str ) -> bool: - if llm_spec.model_format not in ["ggmlv3", "ggufv2"]: + if llm_spec.model_format not in ["ggufv2"]: return False if "qwen" in llm_family.model_name: return False @@ -285,7 +252,7 @@ def __init__( def match( cls, llm_family: LLMFamilyV1, llm_spec: LLMSpecV1, quantization: str ) -> bool: - if llm_spec.model_format not in ["ggmlv3", "ggufv2"]: + if llm_spec.model_format not in ["ggufv2"]: return False if "chat" not in llm_family.model_ability: return False diff --git a/xinference/model/llm/ggml/tests/__init__.py b/xinference/model/llm/llama_cpp/tests/__init__.py similarity index 100% rename from xinference/model/llm/ggml/tests/__init__.py rename to xinference/model/llm/llama_cpp/tests/__init__.py diff --git a/xinference/model/llm/ggml/tests/test_gguf.py b/xinference/model/llm/llama_cpp/tests/test_gguf.py similarity index 55% rename from xinference/model/llm/ggml/tests/test_gguf.py rename to xinference/model/llm/llama_cpp/tests/test_gguf.py index ef06f50d06..cb7c7f0a8a 100644 --- a/xinference/model/llm/ggml/tests/test_gguf.py +++ b/xinference/model/llm/llama_cpp/tests/test_gguf.py @@ -15,40 +15,6 @@ from .....client import Client -def test_load_ggmlv3(setup): - endpoint, _ = setup - client = Client(endpoint) - - model_uid = client.launch_model( - model_name="orca", - model_engine="llama.cpp", - model_size_in_billions=3, - model_format="ggmlv3", - quantization="q4_0", - ) - assert len(client.list_models()) == 1 - model = client.get_model(model_uid) - completion = model.chat("write a poem.") - assert "content" in completion["choices"][0]["message"] - assert len(completion["choices"][0]["message"]["content"]) != 0 - - # test grammar - grammar = r""" - root ::= answer - answer ::= ("Apple" | "Banana" | "Orange") - """ - completion = model.chat( - "Tell me a random fruit name.", - generate_config={"max_tokens": 10, "grammar": grammar}, - ) - assert "content" in completion["choices"][0]["message"] - assert completion["choices"][0]["message"]["content"] in [ - "Apple", - "Banana", - "Orange", - ] - - def test_gguf(setup): endpoint, _ = setup client = Client(endpoint) diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index a87c52b76d..066c1d77a9 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -1,103 +1,4 @@ [ - { - "version": 1, - "context_length": 4096, - "model_name": "baichuan", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "generate" - ], - "model_description": "Baichuan is an open-source Transformer based LLM that is trained on both Chinese and English data.", - "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 7, - "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" - ], - "model_id": "TheBloke/baichuan-llama-7B-GGML", - "model_file_name_template": "baichuan-llama-7b.ggmlv3.{quantization}.bin" - }, - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "baichuan-inc/Baichuan-7B", - "model_revision": "c1a5c7d5b7f50ecc51bb0e08150a9f12e5656756" - }, - { - "model_format": "pytorch", - "model_size_in_billions": 13, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "baichuan-inc/Baichuan-13B-Base", - "model_revision": "0ef0739c7bdd34df954003ef76d80f3dabca2ff9" - } - ] - }, - { - "version": 1, - "context_length": 4096, - "model_name": "baichuan-chat", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat" - ], - "model_description": "Baichuan-chat is a fine-tuned version of the Baichuan LLM, specializing in chatting.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 13, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "baichuan-inc/Baichuan-13B-Chat", - "model_revision": "19ef51ba5bad8935b03acd20ff04a269210983bc" - } - ], - "prompt_style": { - "style_name": "NO_COLON_TWO", - "system_prompt": "", - "roles": [ - " <reserved_102> ", - " <reserved_103> " - ], - "intra_message_sep": "", - "inter_message_sep": "</s>", - "stop_token_ids": [ - 2, - 195 - ] - } - }, { "version": 1, "context_length": 8194, @@ -164,258 +65,6 @@ ] } }, - { - "version": 1, - "context_length": 2048, - "model_name": "wizardlm-v1.0", - "model_lang": [ - "en" - ], - "model_ability": [ - "chat" - ], - "model_description": "WizardLM is an open-source LLM trained by fine-tuning LLaMA with Evol-Instruct.", - "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 7, - "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" - ], - "model_id": "TheBloke/WizardLM-7B-V1.0-Uncensored-GGML", - "model_file_name_template": "wizardlm-7b-v1.0-uncensored.ggmlv3.{quantization}.bin" - }, - { - "model_format": "ggmlv3", - "model_size_in_billions": 13, - "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" - ], - "model_id": "TheBloke/WizardLM-13B-V1.0-Uncensored-GGML", - "model_file_name_template": "wizardlm-13b-v1.0-uncensored.ggmlv3.{quantization}.bin" - } - ], - "prompt_style": { - "style_name": "ADD_COLON_SINGLE", - "system_prompt": "You are a helpful AI assistant.", - "roles": [ - "USER", - "ASSISTANT" - ], - "intra_message_sep": "\n" - } - }, - { - "version": 1, - "context_length": 2048, - "model_name": "vicuna-v1.3", - "model_lang": [ - "en" - ], - "model_ability": [ - "chat" - ], - "model_description": "Vicuna is an open-source LLM trained by fine-tuning LLaMA on data collected from ShareGPT.", - "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 7, - "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" - ], - "model_id": "TheBloke/vicuna-7B-v1.3-GGML", - "model_file_name_template": "vicuna-7b-v1.3.ggmlv3.{quantization}.bin" - }, - { - "model_format": "ggmlv3", - "model_size_in_billions": 13, - "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" - ], - "model_id": "TheBloke/vicuna-13b-v1.3.0-GGML", - "model_file_name_template": "vicuna-13b-v1.3.0.ggmlv3.{quantization}.bin" - }, - { - "model_format": "ggmlv3", - "model_size_in_billions": 33, - "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" - ], - "model_id": "TheBloke/vicuna-33B-GGML", - "model_file_name_template": "vicuna-33b.ggmlv3.{quantization}.bin" - }, - { - "model_format": "pytorch", - "model_size_in_billions": 33, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "lmsys/vicuna-33b-v1.3", - "model_revision": "ef8d6becf883fb3ce52e3706885f761819477ab4" - }, - { - "model_format": "pytorch", - "model_size_in_billions": 13, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "lmsys/vicuna-13b-v1.3", - "model_revision": "6566e9cb1787585d1147dcf4f9bc48f29e1328d2" - }, - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "lmsys/vicuna-7b-v1.3", - "model_revision": "236eeeab96f0dc2e463f2bebb7bb49809279c6d6" - } - ], - "prompt_style": { - "style_name": "ADD_COLON_TWO", - "system_prompt": "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.", - "roles": [ - "USER", - "ASSISTANT" - ], - "intra_message_sep": " ", - "inter_message_sep": "</s>" - } - }, - { - "version": 1, - "context_length": 2048, - "model_name": "orca", - "model_lang": [ - "en" - ], - "model_ability": [ - "chat" - ], - "model_description": "Orca is an LLM trained by fine-tuning LLaMA on explanation traces obtained from GPT-4.", - "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 3, - "quantizations": [ - "q4_0", - "q4_1", - "q5_0", - "q5_1", - "q8_0" - ], - "model_id": "TheBloke/orca_mini_3B-GGML", - "model_file_name_template": "orca-mini-3b.ggmlv3.{quantization}.bin" - }, - { - "model_format": "ggmlv3", - "model_size_in_billions": 7, - "quantizations": [ - "q4_0", - "q4_1", - "q5_0", - "q5_1", - "q8_0" - ], - "model_id": "TheBloke/orca_mini_7B-GGML", - "model_file_name_template": "orca-mini-7b.ggmlv3.{quantization}.bin" - }, - { - "model_format": "ggmlv3", - "model_size_in_billions": 13, - "quantizations": [ - "q4_0", - "q4_1", - "q5_0", - "q5_1", - "q8_0" - ], - "model_id": "TheBloke/orca_mini_13B-GGML", - "model_file_name_template": "orca-mini-13b.ggmlv3.{quantization}.bin" - } - ], - "prompt_style": { - "style_name": "ADD_COLON_SINGLE", - "system_prompt": "You are an AI assistant that follows instruction extremely well. Help as much as you can.", - "roles": [ - "User", - "Response" - ], - "intra_message_sep": "\n\n### " - } - }, { "version": 1, "context_length": 2048, @@ -561,111 +210,6 @@ ] } }, - { - "version": 1, - "context_length": 2048, - "model_name": "chatglm", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat" - ], - "model_description": "ChatGLM is an open-source General Language Model (GLM) based LLM trained on both Chinese and English data.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 6, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "THUDM/chatglm-6b", - "model_revision": "8b7d33596d18c5e83e2da052d05ca4db02e60620" - } - ], - "prompt_style": { - "style_name": "CHATGLM", - "system_prompt": "", - "roles": [ - "问", - "答" - ], - "intra_message_sep": "\n" - } - }, - { - "version": 1, - "context_length": 8192, - "model_name": "chatglm2", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat" - ], - "model_description": "ChatGLM2 is the second generation of ChatGLM, still open-source and trained on Chinese and English data.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 6, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "THUDM/chatglm2-6b", - "model_revision": "7fabe56db91e085c9c027f56f1c654d137bdba40" - } - ], - "prompt_style": { - "style_name": "CHATGLM", - "system_prompt": "", - "roles": [ - "问", - "答" - ], - "intra_message_sep": "\n\n" - } - }, - { - "version": 1, - "context_length": 32768, - "model_name": "chatglm2-32k", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat" - ], - "model_description": "ChatGLM2-32k is a special version of ChatGLM2, with a context window of 32k tokens instead of 8k.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 6, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "THUDM/chatglm2-6b-32k", - "model_revision": "a2065f5dc8253f036a209e642d7220a942d92765" - } - ], - "prompt_style": { - "style_name": "CHATGLM", - "system_prompt": "", - "roles": [ - "问", - "答" - ], - "intra_message_sep": "\n\n" - } - }, { "version": 1, "context_length": 8192, @@ -1148,70 +692,73 @@ "model_description": "Llama-2-Chat is a fine-tuned version of the Llama-2 LLM, specializing in chatting.", "model_specs": [ { - "model_format": "ggmlv3", + "model_format": "ggufv2", "model_size_in_billions": 7, "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_0", + "Q4_K_S", + "Q4_K_M", + "Q5_0", + "Q5_K_S", + "Q5_K_M", + "Q6_K", + "Q8_0" ], - "model_id": "TheBloke/Llama-2-7B-Chat-GGML", - "model_file_name_template": "llama-2-7b-chat.ggmlv3.{quantization}.bin" + "model_id": "TheBloke/Llama-2-7B-Chat-GGUF", + "model_file_name_template": "llama-2-7b-chat.{quantization}.gguf" }, { - "model_format": "ggmlv3", + "model_format": "ggufv2", "model_size_in_billions": 13, "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_0", + "Q4_K_S", + "Q4_K_M", + "Q5_0", + "Q5_K_S", + "Q5_K_M", + "Q6_K", + "Q8_0" ], - "model_id": "TheBloke/Llama-2-13B-chat-GGML", - "model_file_name_template": "llama-2-13b-chat.ggmlv3.{quantization}.bin" + "model_id": "TheBloke/Llama-2-13B-chat-GGUF", + "model_file_name_template": "llama-2-13b-chat.{quantization}.gguf" }, { - "model_format": "ggmlv3", + "model_format": "ggufv2", "model_size_in_billions": 70, "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_0", + "Q4_K_S", + "Q4_K_M", + "Q5_0", + "Q5_K_S", + "Q5_K_M" ], - "model_id": "TheBloke/Llama-2-70B-Chat-GGML", - "model_file_name_template": "llama-2-70b-chat.ggmlv3.{quantization}.bin" + "quantization_parts": { + "Q6_K": [ + "split-a", + "split-b" + ], + "Q8_0": [ + "split-a", + "split-b" + ] + }, + "model_id": "TheBloke/Llama-2-70B-Chat-GGUF", + "model_file_name_template": "llama-2-70b-chat.{quantization}.gguf", + "model_file_name_split_template": "llama-2-70b-chat.{quantization}.gguf-{part}" }, { "model_format": "pytorch", @@ -1293,64 +840,6 @@ ], "model_id": "meta-llama/Llama-2-70b-chat-hf", "model_revision": "36d9a7388cc80e5f4b3e9701ca2f250d21a96c30" - }, - { - "model_format": "ggufv2", - "model_size_in_billions": 7, - "quantizations": [ - "Q2_K", - "Q3_K_S", - "Q3_K_M", - "Q3_K_L", - "Q4_0", - "Q4_K_S", - "Q4_K_M", - "Q5_0", - "Q5_K_S", - "Q5_K_M", - "Q6_K", - "Q8_0" - ], - "model_id": "TheBloke/Llama-2-7B-Chat-GGUF", - "model_file_name_template": "llama-2-7b-chat.{quantization}.gguf" - }, - { - "model_format": "ggufv2", - "model_size_in_billions": 13, - "quantizations": [ - "Q2_K", - "Q3_K_S", - "Q3_K_M", - "Q3_K_L", - "Q4_0", - "Q4_K_S", - "Q4_K_M", - "Q5_0", - "Q5_K_S", - "Q5_K_M", - "Q6_K", - "Q8_0" - ], - "model_id": "TheBloke/Llama-2-13B-chat-GGUF", - "model_file_name_template": "llama-2-13b-chat.{quantization}.gguf" - }, - { - "model_format": "ggufv2", - "model_size_in_billions": 70, - "quantizations": [ - "Q2_K", - "Q3_K_S", - "Q3_K_M", - "Q3_K_L", - "Q4_0", - "Q4_K_S", - "Q4_K_M", - "Q5_0", - "Q5_K_S", - "Q5_K_M" - ], - "model_id": "TheBloke/Llama-2-70B-Chat-GGUF", - "model_file_name_template": "llama-2-70b-chat.{quantization}.gguf" } ], "prompt_style": { @@ -1383,26 +872,24 @@ "model_description": "Llama-2 is the second generation of Llama, open-source and trained on a larger amount of data.", "model_specs": [ { - "model_format": "ggmlv3", + "model_format": "ggufv2", "model_size_in_billions": 7, "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_0", + "Q4_K_S", + "Q4_K_M", + "Q5_0", + "Q5_K_S", + "Q5_K_M", + "Q6_K", + "Q8_0" ], - "model_id": "TheBloke/Llama-2-7B-GGML", - "model_file_name_template": "llama-2-7b.ggmlv3.{quantization}.bin" + "model_id": "TheBloke/Llama-2-7B-GGUF", + "model_file_name_template": "llama-2-7b.{quantization}.gguf" }, { "model_format": "gptq", @@ -1421,48 +908,53 @@ "model_id": "TheBloke/Llama-2-7B-AWQ" }, { - "model_format": "ggmlv3", + "model_format": "ggufv2", "model_size_in_billions": 13, "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_0", + "Q4_K_S", + "Q4_K_M", + "Q5_0", + "Q5_K_S", + "Q5_K_M", + "Q6_K", + "Q8_0" ], - "model_id": "TheBloke/Llama-2-13B-GGML", - "model_file_name_template": "llama-2-13b.ggmlv3.{quantization}.bin" + "model_id": "TheBloke/Llama-2-13B-GGUF", + "model_file_name_template": "llama-2-13b.{quantization}.gguf" }, { - "model_format": "ggmlv3", + "model_format": "ggufv2", "model_size_in_billions": 70, "quantizations": [ - "q2_K", - "q3_K_L", - "q3_K_M", - "q3_K_S", - "q4_0", - "q4_1", - "q4_K_M", - "q4_K_S", - "q5_0", - "q5_1", - "q5_K_M", - "q5_K_S", - "q6_K", - "q8_0" + "Q2_K", + "Q3_K_S", + "Q3_K_M", + "Q3_K_L", + "Q4_0", + "Q4_K_S", + "Q4_K_M", + "Q5_0", + "Q5_K_S", + "Q5_K_M" ], - "model_id": "TheBloke/Llama-2-70B-GGML", - "model_file_name_template": "llama-2-70b.ggmlv3.{quantization}.bin" + "quantization_parts": { + "Q6_K": [ + "split-a", + "split-b" + ], + "Q8_0": [ + "split-a", + "split-b" + ] + }, + "model_id": "TheBloke/Llama-2-70B-GGUF", + "model_file_name_template": "llama-2-70b.{quantization}.gguf", + "model_file_name_split_template": "llama-2-70b.{quantization}.gguf-{part}" }, { "model_format": "pytorch", @@ -2005,220 +1497,57 @@ "model_id": "hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4" }, { - "model_format": "awq", - "model_size_in_billions": 405, - "quantizations": [ - "Int4" - ], - "model_id": "hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4" - } - ], - "prompt_style": { - "style_name": "LLAMA3", - "system_prompt": "You are a helpful assistant.", - "roles": [ - "user", - "assistant" - ], - "intra_message_sep": "\n\n", - "inter_message_sep": "<|eot_id|>", - "stop_token_ids": [ - 128001, - 128009 - ], - "stop": [ - "<|end_of_text|>", - "<|eot_id|>" - ] - } - }, - { - "version": 1, - "context_length": 2048, - "model_name": "opt", - "model_lang": [ - "en" - ], - "model_ability": [ - "generate" - ], - "model_description": "Opt is an open-source, decoder-only, Transformer based LLM that was designed to replicate GPT-3.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 1, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "facebook/opt-125m", - "model_revision": "3d2b5f275bdf882b8775f902e1bfdb790e2cfc32" - } - ] - }, - { - "version": 1, - "context_length": 2048, - "model_name": "falcon", - "model_lang": [ - "en" - ], - "model_ability": [ - "generate" - ], - "model_description": "Falcon is an open-source Transformer based LLM trained on the RefinedWeb dataset.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 40, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "tiiuae/falcon-40b", - "model_revision": "561820f7eef0cc56a31ea38af15ca1acb07fab5d" - }, - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "tiiuae/falcon-7b", - "model_revision": "378337427557d1df3e742264a2901a49f25d4eb1" - } - ] - }, - { - "version": 1, - "context_length": 2048, - "model_name": "falcon-instruct", - "model_lang": [ - "en" - ], - "model_ability": [ - "chat" - ], - "model_description": "Falcon-instruct is a fine-tuned version of the Falcon LLM, specializing in chatting.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "tiiuae/falcon-7b-instruct", - "model_revision": "eb410fb6ffa9028e97adb801f0d6ec46d02f8b07" - }, - { - "model_format": "pytorch", - "model_size_in_billions": 40, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "tiiuae/falcon-40b-instruct", - "model_revision": "ca78eac0ed45bf64445ff0687fabba1598daebf3" - } - ], - "prompt_style": { - "style_name": "FALCON", - "system_prompt": "", - "roles": [ - "User", - "Assistant" - ], - "intra_message_sep": "\n", - "inter_message_sep": "<|endoftext|>", - "stop": [ - "\nUser" - ], - "stop_token_ids": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11 - ] - } - }, - { - "version": 1, - "context_length": 8192, - "model_name": "starcoderplus", - "model_lang": [ - "en" - ], - "model_ability": [ - "generate" - ], - "model_description": "Starcoderplus is an open-source LLM trained by fine-tuning Starcoder on RedefinedWeb and StarCoderData datasets.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 16, + "model_format": "awq", + "model_size_in_billions": 405, "quantizations": [ - "4-bit", - "8-bit", - "none" + "Int4" ], - "model_id": "bigcode/starcoderplus", - "model_revision": "95be82087c33f14ee9941c812a154a9dd66efe72" + "model_id": "hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4" } ], - "prompt_style": null + "prompt_style": { + "style_name": "LLAMA3", + "system_prompt": "You are a helpful assistant.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n\n", + "inter_message_sep": "<|eot_id|>", + "stop_token_ids": [ + 128001, + 128009 + ], + "stop": [ + "<|end_of_text|>", + "<|eot_id|>" + ] + } }, { "version": 1, - "context_length": 8192, - "model_name": "starchat-beta", + "context_length": 2048, + "model_name": "opt", "model_lang": [ "en" ], "model_ability": [ - "chat" + "generate" ], - "model_description": "Starchat-beta is a fine-tuned version of the Starcoderplus LLM, specializing in coding assistance.", + "model_description": "Opt is an open-source, decoder-only, Transformer based LLM that was designed to replicate GPT-3.", "model_specs": [ { "model_format": "pytorch", - "model_size_in_billions": 16, + "model_size_in_billions": 1, "quantizations": [ "4-bit", "8-bit", "none" ], - "model_id": "HuggingFaceH4/starchat-beta", - "model_revision": "b1bcda690655777373f57ea6614eb095ec2c886f" + "model_id": "facebook/opt-125m", + "model_revision": "3d2b5f275bdf882b8775f902e1bfdb790e2cfc32" } - ], - "prompt_style": { - "style_name": "CHATML", - "system_prompt": "<system>{system_message}\n", - "roles": [ - "<|user|>", - "<|assistant|>" - ], - "intra_message_sep": "<|end|>", - "stop_token_ids": [ - 0, - 49155 - ] - } + ] }, { "version": 1, @@ -3123,413 +2452,156 @@ ], "model_id": "Qwen/Qwen2-72B-Instruct-GGUF", "model_file_name_template": "qwen2-72b-instruct-{quantization}.gguf", - "model_file_name_split_template": "qwen2-72b-instruct-{quantization}-{part}.gguf", - "quantization_parts": { - "q5_0": [ - "00001-of-00002", - "00002-of-00002" - ], - "q5_k_m": [ - "00001-of-00002", - "00002-of-00002" - ], - "q6_k": [ - "00001-of-00002", - "00002-of-00002" - ], - "q8_0": [ - "00001-of-00002", - "00002-of-00002" - ], - "fp16": [ - "00001-of-00004", - "00002-of-00004", - "00003-of-00004", - "00004-of-00004" - ] - } - } - ], - "prompt_style": { - "style_name": "QWEN", - "system_prompt": "You are a helpful assistant.", - "roles": [ - "user", - "assistant" - ], - "intra_message_sep": "\n", - "stop_token_ids": [ - 151643, - 151644, - 151645 - ], - "stop": [ - "<|endoftext|>", - "<|im_start|>", - "<|im_end|>" - ] - } - }, - { - "version": 1, - "context_length": 32768, - "model_name": "qwen2-moe-instruct", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat", - "tools" - ], - "model_description": "Qwen2 is the new series of Qwen large language models. ", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 14, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "Qwen/Qwen2-57B-A14B-Instruct" - }, - { - "model_format": "gptq", - "model_size_in_billions": 14, - "quantizations": [ - "Int4" - ], - "model_id": "Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4" - }, - { - "model_format": "ggufv2", - "model_size_in_billions": 14, - "quantizations": [ - "q3_k_m", - "q4_0", - "q4_k_m", - "q5_0", - "q5_k_m", - "q6_k", - "q8_0", - "fp16" - ], - "model_id": "Qwen/Qwen2-57B-A14B-Instruct-GGUF", - "model_file_name_template": "qwen2-57b-a14b-instruct-{quantization}.gguf", - "model_file_name_split_template": "qwen2-57b-a14b-instruct-{quantization}-{part}.gguf", - "quantization_parts": { - "q8_0": [ - "00001-of-00002", - "00002-of-00002" - ], - "fp16": [ - "00001-of-00003", - "00002-of-00003", - "00003-of-00003" - ] - } - } - ], - "prompt_style": { - "style_name": "QWEN", - "system_prompt": "You are a helpful assistant.", - "roles": [ - "user", - "assistant" - ], - "intra_message_sep": "\n", - "stop_token_ids": [ - 151643, - 151644, - 151645 - ], - "stop": [ - "<|endoftext|>", - "<|im_start|>", - "<|im_end|>" - ] - } - }, - { - "version": 1, - "context_length": 8192, - "model_name": "starcoder", - "model_lang": [ - "en" - ], - "model_ability": [ - "generate" - ], - "model_description": "Starcoder is an open-source Transformer based LLM that is trained on permissively licensed data from GitHub.", - "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 16, - "quantizations": [ - "q4_0", - "q4_1", - "q5_0", - "q5_1", - "q8_0" - ], - "model_id": "TheBloke/starcoder-GGML", - "model_file_name_template": "starcoder.ggmlv3.{quantization}.bin" - } - ] - }, - { - "version": 1, - "context_length": 1024, - "model_name": "gpt-2", - "model_lang": [ - "en" - ], - "model_ability": [ - "generate" - ], - "model_description": "GPT-2 is a Transformer-based LLM that is trained on WebTest, a 40 GB dataset of Reddit posts with 3+ upvotes.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": "1_5", - "quantizations": [ - "none" - ], - "model_id": "openai-community/gpt2", - "model_revision": "607a30d783dfa663caf39e06633721c8d4cfcd7e" - } - ] - }, - { - "version": 1, - "context_length": 8192, - "model_name": "internlm-7b", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "generate" - ], - "model_description": "InternLM is a Transformer-based LLM that is trained on both Chinese and English data, focusing on practical scenarios.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "internlm/internlm-7b", - "model_revision": "592b0efc83be3eb1cba8990c4caf41ce604b958c" - } - ] - }, - { - "version": 1, - "context_length": 4096, - "model_name": "internlm-chat-7b", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat" - ], - "model_description": "Internlm-chat is a fine-tuned version of the Internlm LLM, specializing in chatting.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "internlm/internlm-chat-7b", - "model_revision": "d4fa2dbcbd2fa4edfa6735aa2ba0f0577fed6a62" + "model_file_name_split_template": "qwen2-72b-instruct-{quantization}-{part}.gguf", + "quantization_parts": { + "q5_0": [ + "00001-of-00002", + "00002-of-00002" + ], + "q5_k_m": [ + "00001-of-00002", + "00002-of-00002" + ], + "q6_k": [ + "00001-of-00002", + "00002-of-00002" + ], + "q8_0": [ + "00001-of-00002", + "00002-of-00002" + ], + "fp16": [ + "00001-of-00004", + "00002-of-00004", + "00003-of-00004", + "00004-of-00004" + ] + } } ], "prompt_style": { - "style_name": "INTERNLM", - "system_prompt": "", + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", "roles": [ - "<|User|>", - "<|Bot|>" + "user", + "assistant" ], - "intra_message_sep": "<eoh>\n", - "inter_message_sep": "<eoa>\n", + "intra_message_sep": "\n", "stop_token_ids": [ - 1, - 103028 + 151643, + 151644, + 151645 ], "stop": [ - "<eoa>" + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" ] } }, { "version": 1, - "context_length": 16384, - "model_name": "internlm-20b", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "generate" - ], - "model_description": "Pre-trained on over 2.3T Tokens containing high-quality English, Chinese, and code data.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 20, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "internlm/internlm-20b", - "model_revision": "c56a72957239b490ea206ea857e86611b3f65f3a" - } - ] - }, - { - "version": 1, - "context_length": 16384, - "model_name": "internlm-chat-20b", + "context_length": 32768, + "model_name": "qwen2-moe-instruct", "model_lang": [ "en", "zh" ], "model_ability": [ - "chat" + "chat", + "tools" ], - "model_description": "Pre-trained on over 2.3T Tokens containing high-quality English, Chinese, and code data. The Chat version has undergone SFT and RLHF training.", + "model_description": "Qwen2 is the new series of Qwen large language models. ", "model_specs": [ { "model_format": "pytorch", - "model_size_in_billions": 20, + "model_size_in_billions": 14, "quantizations": [ "4-bit", "8-bit", "none" ], - "model_id": "internlm/internlm-chat-20b", - "model_revision": "c67e80e42c4950ebae18a955c9fe138c5ceb5b10" - } - ], - "prompt_style": { - "style_name": "INTERNLM", - "system_prompt": "", - "roles": [ - "<|User|>", - "<|Bot|>" - ], - "intra_message_sep": "<eoh>\n", - "inter_message_sep": "<eoa>\n", - "stop_token_ids": [ - 1, - 103028 - ], - "stop": [ - "<eoa>" - ] - } - }, - { - "version": 1, - "context_length": 4096, - "model_name": "vicuna-v1.5", - "model_lang": [ - "en" - ], - "model_ability": [ - "chat" - ], - "model_description": "Vicuna is an open-source LLM trained by fine-tuning LLaMA on data collected from ShareGPT.", - "model_specs": [ + "model_id": "Qwen/Qwen2-57B-A14B-Instruct" + }, { - "model_format": "pytorch", - "model_size_in_billions": 7, + "model_format": "gptq", + "model_size_in_billions": 14, "quantizations": [ - "4-bit", - "8-bit", - "none" + "Int4" ], - "model_id": "lmsys/vicuna-7b-v1.5", - "model_revision": "de56c35b1763eaae20f4d60efd64af0a9091ebe5" + "model_id": "Qwen/Qwen2-57B-A14B-Instruct-GPTQ-Int4" }, { - "model_format": "pytorch", - "model_size_in_billions": 13, + "model_format": "ggufv2", + "model_size_in_billions": 14, "quantizations": [ - "4-bit", - "8-bit", - "none" + "q3_k_m", + "q4_0", + "q4_k_m", + "q5_0", + "q5_k_m", + "q6_k", + "q8_0", + "fp16" ], - "model_id": "lmsys/vicuna-13b-v1.5", - "model_revision": "3deb0106f72a3a433f0c6ea0cb978bdf14bcd3a6" + "model_id": "Qwen/Qwen2-57B-A14B-Instruct-GGUF", + "model_file_name_template": "qwen2-57b-a14b-instruct-{quantization}.gguf", + "model_file_name_split_template": "qwen2-57b-a14b-instruct-{quantization}-{part}.gguf", + "quantization_parts": { + "q8_0": [ + "00001-of-00002", + "00002-of-00002" + ], + "fp16": [ + "00001-of-00003", + "00002-of-00003", + "00003-of-00003" + ] + } } ], "prompt_style": { - "style_name": "ADD_COLON_TWO", - "system_prompt": "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.", + "style_name": "QWEN", + "system_prompt": "You are a helpful assistant.", "roles": [ - "USER", - "ASSISTANT" + "user", + "assistant" ], - "intra_message_sep": " ", - "inter_message_sep": "</s>" + "intra_message_sep": "\n", + "stop_token_ids": [ + 151643, + 151644, + 151645 + ], + "stop": [ + "<|endoftext|>", + "<|im_start|>", + "<|im_end|>" + ] } }, { "version": 1, - "context_length": 16384, - "model_name": "vicuna-v1.5-16k", + "context_length": 1024, + "model_name": "gpt-2", "model_lang": [ "en" ], "model_ability": [ - "chat" + "generate" ], - "model_description": "Vicuna-v1.5-16k is a special version of Vicuna-v1.5, with a context window of 16k tokens instead of 4k.", + "model_description": "GPT-2 is a Transformer-based LLM that is trained on WebTest, a 40 GB dataset of Reddit posts with 3+ upvotes.", "model_specs": [ { "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "lmsys/vicuna-7b-v1.5-16k", - "model_revision": "9a93d7d11fac7f3f9074510b80092b53bc1a5bec" - }, - { - "model_format": "pytorch", - "model_size_in_billions": 13, + "model_size_in_billions": "1_5", "quantizations": [ - "4-bit", - "8-bit", "none" ], - "model_id": "lmsys/vicuna-13b-v1.5-16k", - "model_revision": "277697af19d4b267626ebc9f4e078d19a9a0fddf" + "model_id": "openai-community/gpt2", + "model_revision": "607a30d783dfa663caf39e06633721c8d4cfcd7e" } - ], - "prompt_style": { - "style_name": "ADD_COLON_TWO", - "system_prompt": "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.", - "roles": [ - "USER", - "ASSISTANT" - ], - "intra_message_sep": " ", - "inter_message_sep": "</s>" - } + ] }, { "version": 1, @@ -5544,93 +4616,6 @@ ] } }, - { - "version": 1, - "context_length": 2048, - "model_name": "OpenBuddy", - "model_lang": [ - "en" - ], - "model_ability": [ - "chat" - ], - "model_description": "OpenBuddy is a powerful open multilingual chatbot model aimed at global users.", - "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 13, - "quantizations": [ - "Q2_K", - "Q3_K_S", - "Q3_K_M", - "Q3_K_L", - "Q4_0", - "Q4_1", - "Q4_K_S", - "Q4_K_M", - "Q5_0", - "Q5_1", - "Q5_K_S", - "Q5_K_M", - "Q6_K", - "Q8_0" - ], - "model_id": "TheBloke/OpenBuddy-Llama2-13B-v11.1-GGML", - "model_file_name_template": "openbuddy-llama2-13b-v11.1.ggmlv3.{quantization}.bin" - } - ], - "prompt_style": { - "style_name": "INSTRUCTION", - "system_prompt": "You are a professional translator. Be faithful or accurate in translation. Make the translation readable or intelligible. Be elegant or natural in translation. Do not translate person's name. Do not add any additional text to the translation. Do not give me any comments or suggestions.\nUser:\n\n{0}\nAssistant:", - "roles": [ - "User", - "Assistant" - ], - "intra_message_sep": "", - "inter_message_sep": "" - } - }, - { - "version": 1, - "context_length": 16384, - "model_name": "glaive-coder", - "model_description": "A code model trained on a dataset of ~140k programming related problems and solutions generated from Glaive’s synthetic data generation platform.", - "model_lang": [ - "en" - ], - "model_ability": [ - "chat" - ], - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "glaiveai/glaive-coder-7b", - "model_revision": "72a255a58480ef0713eed988312fe82f77f94f37" - } - ], - "prompt_style": { - "style_name": "LLAMA2", - "system_prompt": "<s>[INST] <<SYS>>\nWrite code to solve the following coding problem that obeys the constraints and passes the example test cases. Please wrap your code answer using ```:\n<</SYS>>\n\n", - "roles": [ - "[INST]", - "[/INST]" - ], - "intra_message_sep": " ", - "inter_message_sep": " </s><s>", - "stop_token_ids": [ - 2 - ], - "stop": [ - "</s>" - ] - } - }, { "version": 1, "context_length": 100000, diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 06e636f89c..8618155f28 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -14,7 +14,6 @@ import logging import os -import shutil from threading import Lock from typing import Any, Dict, List, Optional, Set, Tuple, Type, Union @@ -59,8 +58,8 @@ BUILTIN_LLM_MODEL_TOOL_CALL_FAMILIES: Set[str] = set() -class GgmlLLMSpecV1(BaseModel): - model_format: Literal["ggmlv3", "ggufv2"] +class LlamaCppLLMSpecV1(BaseModel): + model_format: Literal["ggufv2"] # Must in order that `str` first, then `int` model_size_in_billions: Union[str, int] quantizations: List[str] @@ -247,7 +246,7 @@ def parse_raw( LLMSpecV1 = Annotated[ - Union[GgmlLLMSpecV1, PytorchLLMSpecV1, MLXLLMSpecV1], + Union[LlamaCppLLMSpecV1, PytorchLLMSpecV1, MLXLLMSpecV1], Field(discriminator="model_format"), ] @@ -308,13 +307,10 @@ def cache( if os.path.exists(legacy_cache_path): logger.info("Legacy cache path exists: %s", legacy_cache_path) return os.path.dirname(legacy_cache_path) - elif download_from_self_hosted_storage() and is_self_hosted(llm_family, llm_spec): - logger.info(f"Caching from self-hosted storage") - return cache_from_self_hosted_storage(llm_family, llm_spec, quantization) else: if llm_spec.model_uri is not None: logger.info(f"Caching from URI: {llm_spec.model_uri}") - return cache_from_uri(llm_family, llm_spec, quantization) + return cache_from_uri(llm_family, llm_spec) else: if llm_spec.model_hub == "huggingface": logger.info(f"Caching from Hugging Face: {llm_spec.model_id}") @@ -329,68 +325,10 @@ def cache( raise ValueError(f"Unknown model hub: {llm_spec.model_hub}") -SUPPORTED_SCHEMES = ["s3"] - - -class AWSRegion: - def __init__(self, region: str): - self.region = region - self.original_aws_default_region = None - - def __enter__(self): - if "AWS_DEFAULT_REGION" in os.environ: - self.original_aws_default_region = os.environ["AWS_DEFAULT_REGION"] - os.environ["AWS_DEFAULT_REGION"] = self.region - - def __exit__(self, exc_type, exc_value, traceback): - if self.original_aws_default_region: - os.environ["AWS_DEFAULT_REGION"] = self.original_aws_default_region - else: - del os.environ["AWS_DEFAULT_REGION"] - - -def is_self_hosted( - llm_family: LLMFamilyV1, - llm_spec: "LLMSpecV1", -): - from fsspec import AbstractFileSystem, filesystem - - with AWSRegion("cn-northwest-1"): - src_fs: AbstractFileSystem = filesystem("s3", anon=True) - model_dir = ( - f"/xinference-models/llm/" - f"{llm_family.model_name}-{llm_spec.model_format}-{llm_spec.model_size_in_billions}b" - ) - return src_fs.exists(model_dir) - - -def cache_from_self_hosted_storage( - llm_family: LLMFamilyV1, - llm_spec: "LLMSpecV1", - quantization: Optional[str] = None, -) -> str: - with AWSRegion("cn-northwest-1"): - llm_spec = llm_spec.copy() - llm_spec.model_uri = ( - f"s3://xinference-models/llm/" - f"{llm_family.model_name}-{llm_spec.model_format}-{llm_spec.model_size_in_billions}b" - ) - - return cache_from_uri( - llm_family, llm_spec, quantization, self_hosted_storage=True - ) - - def cache_from_uri( llm_family: LLMFamilyV1, llm_spec: "LLMSpecV1", - quantization: Optional[str] = None, - self_hosted_storage: bool = False, ) -> str: - from fsspec import AbstractFileSystem, filesystem - - from ..utils import copy_from_src_to_dst - cache_dir_name = ( f"{llm_family.model_name}-{llm_spec.model_format}" f"-{llm_spec.model_size_in_billions}b" @@ -415,69 +353,6 @@ def cache_from_uri( else: os.symlink(src_root, cache_dir, target_is_directory=True) return cache_dir - elif src_scheme in SUPPORTED_SCHEMES: - # use anonymous connection for self-hosted storage. - src_fs: AbstractFileSystem = filesystem(src_scheme, anon=self_hosted_storage) - local_fs: AbstractFileSystem = filesystem("file") - - files_to_download = [] - if llm_spec.model_format == "pytorch": - if os.path.exists(cache_dir): - logger.info(f"Cache {cache_dir} exists") - return cache_dir - else: - os.makedirs(cache_dir, exist_ok=True) - - for path, _, files in src_fs.walk(llm_spec.model_uri): - for file in files: - src_path = f"{path}/{file}" - local_path = src_path.replace(src_root, cache_dir) - files_to_download.append((src_path, local_path)) - elif llm_spec.model_format == "ggmlv3": - file = llm_spec.model_file_name_template.format(quantization=quantization) - if os.path.exists(os.path.join(cache_dir, file)): - logger.info(f"Cache {os.path.join(cache_dir, file)} exists") - return cache_dir - else: - os.makedirs(cache_dir, exist_ok=True) - - src_path = f"{src_root}/{file}" - local_path = f"{cache_dir}/{file}" - files_to_download.append((src_path, local_path)) - else: - raise ValueError(f"Unsupported model format: {llm_spec.model_format}") - - from concurrent.futures import ThreadPoolExecutor - - failed = False - with ThreadPoolExecutor(max_workers=min(len(files_to_download), 4)) as executor: - futures = [ - ( - src_path, - executor.submit( - copy_from_src_to_dst, src_fs, src_path, local_fs, local_path - ), - ) - for src_path, local_path in files_to_download - ] - for src_path, future in futures: - if failed: - future.cancel() - else: - try: - future.result() - except: - logger.error(f"Download {src_path} failed", exc_info=True) - failed = True - - if failed: - logger.warning(f"Removing cache directory: {cache_dir}") - shutil.rmtree(cache_dir, ignore_errors=True) - raise RuntimeError( - f"Failed to download model '{llm_family.model_name}' " - f"(size: {llm_spec.model_size_in_billions}, format: {llm_spec.model_format})" - ) - return cache_dir else: raise ValueError(f"Unsupported URL scheme: {src_scheme}") @@ -597,7 +472,7 @@ def _get_meta_path( return os.path.join(cache_dir, "__valid_download") else: return os.path.join(cache_dir, f"__valid_download_{model_hub}") - elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "fp8", "mlx"]: + elif model_format in ["ggufv2", "gptq", "awq", "fp8", "mlx"]: assert quantization is not None if model_hub == "huggingface": return os.path.join(cache_dir, f"__valid_download_{quantization}") @@ -636,7 +511,7 @@ def _skip_download( logger.warning(f"Cache {cache_dir} exists, but it was from {hub}") return True return False - elif model_format in ["ggmlv3", "ggufv2", "gptq", "awq", "fp8", "mlx"]: + elif model_format in ["ggufv2", "gptq", "awq", "fp8", "mlx"]: assert quantization is not None return os.path.exists( _get_meta_path(cache_dir, model_format, model_hub, quantization) @@ -745,7 +620,7 @@ def cache_from_csghub( ) create_symlink(download_dir, cache_dir) - elif llm_spec.model_format in ["ggmlv3", "ggufv2"]: + elif llm_spec.model_format in ["ggufv2"]: file_names, final_file_name, need_merge = _generate_model_file_names( llm_spec, quantization ) @@ -812,7 +687,7 @@ def cache_from_modelscope( ) create_symlink(download_dir, cache_dir) - elif llm_spec.model_format in ["ggmlv3", "ggufv2"]: + elif llm_spec.model_format in ["ggufv2"]: file_names, final_file_name, need_merge = _generate_model_file_names( llm_spec, quantization ) @@ -884,8 +759,8 @@ def cache_from_huggingface( if IS_NEW_HUGGINGFACE_HUB: create_symlink(download_dir, cache_dir) - elif llm_spec.model_format in ["ggmlv3", "ggufv2"]: - assert isinstance(llm_spec, GgmlLLMSpecV1) + elif llm_spec.model_format in ["ggufv2"]: + assert isinstance(llm_spec, LlamaCppLLMSpecV1) file_names, final_file_name, need_merge = _generate_model_file_names( llm_spec, quantization ) diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 5e9a62a8b3..ba9ec1cbb2 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -503,78 +503,6 @@ } ] }, - { - "version": 1, - "context_length": 8192, - "model_name": "chatglm2", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat" - ], - "model_description": "ChatGLM2 is the second generation of ChatGLM, still open-source and trained on Chinese and English data.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 6, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_hub": "modelscope", - "model_id": "ZhipuAI/chatglm2-6b", - "model_revision": "v1.0.12" - } - ], - "prompt_style": { - "style_name": "CHATGLM", - "system_prompt": "", - "roles": [ - "问", - "答" - ], - "intra_message_sep": "\n\n" - } - }, - { - "version": 1, - "context_length": 32768, - "model_name": "chatglm2-32k", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat" - ], - "model_description": "ChatGLM2-32k is a special version of ChatGLM2, with a context window of 32k tokens instead of 8k.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 6, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_hub": "modelscope", - "model_id": "ZhipuAI/chatglm2-6b-32k", - "model_revision": "v1.0.2" - } - ], - "prompt_style": { - "style_name": "CHATGLM", - "system_prompt": "", - "roles": [ - "问", - "答" - ], - "intra_message_sep": "\n\n" - } - }, { "version": 1, "context_length": 8192, @@ -1058,148 +986,6 @@ } ] }, - { - "version": 1, - "context_length": 8192, - "model_name": "internlm-7b", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "generate" - ], - "model_description": "InternLM is a Transformer-based LLM that is trained on both Chinese and English data, focusing on practical scenarios.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "Shanghai_AI_Laboratory/internlm-7b", - "model_hub": "modelscope", - "model_revision": "v1.0.1" - } - ] - }, - { - "version": 1, - "context_length": 4096, - "model_name": "internlm-chat-7b", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat" - ], - "model_description": "Internlm-chat is a fine-tuned version of the Internlm LLM, specializing in chatting.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "Shanghai_AI_Laboratory/internlm-chat-7b", - "model_hub": "modelscope", - "model_revision": "v1.0.1" - } - ], - "prompt_style": { - "style_name": "INTERNLM", - "system_prompt": "", - "roles": [ - "<|User|>", - "<|Bot|>" - ], - "intra_message_sep": "<eoh>\n", - "inter_message_sep": "<eoa>\n", - "stop_token_ids": [ - 1, - 103028 - ], - "stop": [ - "<eoa>" - ] - } - }, - { - "version": 1, - "context_length": 16384, - "model_name": "internlm-20b", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "generate" - ], - "model_description": "Pre-trained on over 2.3T Tokens containing high-quality English, Chinese, and code data.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 20, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "Shanghai_AI_Laboratory/internlm-20b", - "model_hub": "modelscope", - "model_revision": "v1.0.1" - } - ] - }, - { - "version": 1, - "context_length": 16384, - "model_name": "internlm-chat-20b", - "model_lang": [ - "en", - "zh" - ], - "model_ability": [ - "chat" - ], - "model_description": "Pre-trained on over 2.3T Tokens containing high-quality English, Chinese, and code data. The Chat version has undergone SFT and RLHF training.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 20, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_id": "Shanghai_AI_Laboratory/internlm-chat-20b", - "model_hub": "modelscope", - "model_revision": "v1.0.1" - } - ], - "prompt_style": { - "style_name": "INTERNLM", - "system_prompt": "", - "roles": [ - "<|User|>", - "<|Bot|>" - ], - "intra_message_sep": "<eoh>\n", - "inter_message_sep": "<eoa>\n", - "stop_token_ids": [ - 1, - 103028 - ], - "stop": [ - "<eoa>" - ] - } - }, { "version": 1, "context_length": 32768, @@ -2439,59 +2225,6 @@ ] } }, - { - "version": 1, - "context_length": 2048, - "model_name": "falcon-instruct", - "model_lang": [ - "en" - ], - "model_ability": [ - "chat" - ], - "model_description": "Falcon-instruct is a fine-tuned version of the Falcon LLM, specializing in chatting.", - "model_specs": [ - { - "model_format": "pytorch", - "model_size_in_billions": 7, - "quantizations": [ - "4-bit", - "8-bit", - "none" - ], - "model_hub": "modelscope", - "model_id": "Xorbits/falcon-7b-instruct", - "model_revision": "v1.0.0" - } - ], - "prompt_style": { - "style_name": "FALCON", - "system_prompt": "", - "roles": [ - "User", - "Assistant" - ], - "intra_message_sep": "\n", - "inter_message_sep": "<|endoftext|>", - "stop": [ - "\nUser" - ], - "stop_token_ids": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11 - ] - } - }, { "version": 1, "context_length": 8192, @@ -2576,53 +2309,6 @@ ] } }, - { - "version": 1, - "context_length": 2048, - "model_name": "OpenBuddy", - "model_lang": [ - "en" - ], - "model_ability": [ - "chat" - ], - "model_description": "OpenBuddy is a powerful open multilingual chatbot model aimed at global users.", - "model_specs": [ - { - "model_format": "ggmlv3", - "model_size_in_billions": 13, - "quantizations": [ - "Q2_K", - "Q3_K_S", - "Q3_K_M", - "Q3_K_L", - "Q4_0", - "Q4_1", - "Q4_K_S", - "Q4_K_M", - "Q5_0", - "Q5_1", - "Q5_K_S", - "Q5_K_M", - "Q6_K", - "Q8_0" - ], - "model_hub": "modelscope", - "model_id": "Xorbits/OpenBuddy-Llama2-13B-v11.1-GGML", - "model_file_name_template": "openbuddy-llama2-13b-v11.1.ggmlv3.{quantization}.bin" - } - ], - "prompt_style": { - "style_name": "INSTRUCTION", - "system_prompt": "You are a professional translator. Be faithful or accurate in translation. Make the translation readable or intelligible. Be elegant or natural in translation. Do not translate person's name. Do not add any additional text to the translation. Do not give me any comments or suggestions.\nUser:\n\n{0}\nAssistant:", - "roles": [ - "User", - "Assistant" - ], - "intra_message_sep": "", - "inter_message_sep": "" - } - }, { "version": 1, "context_length": 32768, diff --git a/xinference/model/llm/memory.py b/xinference/model/llm/memory.py index 6b98ced5bc..982804e6b3 100644 --- a/xinference/model/llm/memory.py +++ b/xinference/model/llm/memory.py @@ -61,7 +61,7 @@ class ModelMemInfo: QUANT_NORMALIZE = {"int4": "4-bit", "int8": "8-bit", "4-bit": "4-bit", "8-bit": "8-bit"} -GGML_MULTI_FACTOR_DICT = { +GGUF_MULTI_FACTOR_DICT = { "q4_0": 18, "q4_1": 20, "q5_0": 22, @@ -70,14 +70,14 @@ class ModelMemInfo: "q8_1": 40, } -GGML_MULTI_FACTOR_DICT_64 = { +GGUF_MULTI_FACTOR_DICT_64 = { "q6_K": 54.0, "q3": 26.0, "q4": 38.0, "q5": 46.0, } -GGML_MULTI_FACTOR_DICT_COMBINE = { +GGUF_MULTI_FACTOR_DICT_COMBINE = { "q3_K_L": [38.0, 26.0], "q3_K_M": [46.0, 26.0], "q4_K_S": [46.0, 38.0], @@ -136,9 +136,9 @@ def estimate_llm_gpu_memory_details( else: kv_dtype_size = 4 overhead = 650.0 - if model_format == "ggmlv3": + if model_format == "ggufv2": assert quantization is not None and quantization != "none" - model_size_in_mb = _compute_model_size_ggml(info, quantization) + model_size_in_mb = _compute_model_size_gguf(info, quantization) inference_mem = float( context_length * kv_dtype_size * info.hidden_dim * info.num_layers ) @@ -291,7 +291,7 @@ def _compute_inference_only_activation_memory( return ret -def _compute_model_size_ggml(info: ModelLayersInfo, quantization: str) -> float: +def _compute_model_size_gguf(info: ModelLayersInfo, quantization: str) -> float: assert quantization is not None vocab_size = info.vocab_size num_layers = info.num_layers @@ -310,13 +310,13 @@ def _compute_model_size_ggml(info: ModelLayersInfo, quantization: str) -> float: ) total = 0.0 - v1 = GGML_MULTI_FACTOR_DICT.get(quantization) + v1 = GGUF_MULTI_FACTOR_DICT.get(quantization) if v1 is not None: total = (v1 * total_params) / (32 * 1024 * 1024) - v2 = GGML_MULTI_FACTOR_DICT_64.get(quantization) + v2 = GGUF_MULTI_FACTOR_DICT_64.get(quantization) if v2 is not None: total = (v2 * total_params) / (64 * 1024 * 1024) - v3 = GGML_MULTI_FACTOR_DICT_COMBINE.get(quantization) + v3 = GGUF_MULTI_FACTOR_DICT_COMBINE.get(quantization) if v3 is not None: factors = v3 if quantization == "q2_K": diff --git a/xinference/model/llm/pytorch/baichuan.py b/xinference/model/llm/pytorch/baichuan.py deleted file mode 100644 index f640670a28..0000000000 --- a/xinference/model/llm/pytorch/baichuan.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import List, Optional - -from ....types import LoRA -from ..llm_family import LLMFamilyV1, LLMSpecV1 -from .core import PytorchChatModel, PytorchModelConfig - - -class BaichuanPytorchChatModel(PytorchChatModel): - def __init__( - self, - model_uid: str, - model_family: "LLMFamilyV1", - model_spec: "LLMSpecV1", - quantization: str, - model_path: str, - pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model: Optional[List[LoRA]] = None, - ): - super().__init__( - model_uid, - model_family, - model_spec, - quantization, - model_path, - pytorch_model_config=pytorch_model_config, - peft_model=peft_model, - ) - self._use_fast_tokenizer = False - - def _load_model(self, **kwargs): - try: - from transformers import AutoModelForCausalLM, AutoTokenizer - from transformers.generation.utils import GenerationConfig - except ImportError: - error_message = "Failed to import module 'transformers'" - installation_guide = [ - "Please make sure 'transformers' is installed. ", - "You can install it by `pip install transformers`\n", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - tokenizer = AutoTokenizer.from_pretrained( - self.model_path, - use_fast=self._use_fast_tokenizer, - trust_remote_code=kwargs["trust_remote_code"], - revision=kwargs["revision"], - ) - model = AutoModelForCausalLM.from_pretrained( - self.model_path, - **kwargs, - ) - model.generation_config = GenerationConfig.from_pretrained(self.model_path) - return model, tokenizer - - @classmethod - def match( - cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str - ) -> bool: - if llm_spec.model_format != "pytorch": - return False - model_family = llm_family.model_family or llm_family.model_name - if model_family not in ["baichuan-chat", "baichuan-2-chat"]: - return False - if "chat" not in llm_family.model_ability: - return False - return True diff --git a/xinference/model/llm/pytorch/falcon.py b/xinference/model/llm/pytorch/falcon.py deleted file mode 100644 index d4f032333c..0000000000 --- a/xinference/model/llm/pytorch/falcon.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import List, Optional - -from ....types import LoRA -from ..llm_family import LLMFamilyV1, LLMSpecV1 -from .core import PytorchChatModel, PytorchModel, PytorchModelConfig - - -class FalconPytorchModel(PytorchModel): - def __init__( - self, - model_uid: str, - model_family: "LLMFamilyV1", - model_spec: "LLMSpecV1", - quantization: str, - model_path: str, - pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model: Optional[List[LoRA]] = None, - ): - super().__init__( - model_uid, - model_family, - model_spec, - quantization, - model_path, - pytorch_model_config=pytorch_model_config, - peft_model=peft_model, - ) - - def _load_model(self, **kwargs): - try: - from transformers import AutoModelForCausalLM, AutoTokenizer - except ImportError: - error_message = "Failed to import module 'transformers'" - installation_guide = [ - "Please make sure 'transformers' is installed. ", - "You can install it by `pip install transformers`\n", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - tokenizer = AutoTokenizer.from_pretrained( - self.model_path, - trust_remote_code=kwargs["trust_remote_code"], - revision=kwargs["revision"], - ) - model = AutoModelForCausalLM.from_pretrained( - self.model_path, - low_cpu_mem_usage=True, - **kwargs, - ) - tokenizer.pad_token_id = 9 - return model, tokenizer - - @classmethod - def match( - cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str - ) -> bool: - if llm_spec.model_format != "pytorch": - return False - model_family = llm_family.model_family or llm_family.model_name - if "falcon" not in model_family: - return False - if "generate" not in llm_family.model_ability: - return False - return True - - -class FalconPytorchChatModel(PytorchChatModel): - def __init__( - self, - model_uid: str, - model_family: "LLMFamilyV1", - model_spec: "LLMSpecV1", - quantization: str, - model_path: str, - pytorch_model_config: Optional[PytorchModelConfig] = None, - peft_model: Optional[List[LoRA]] = None, - ): - super().__init__( - model_uid, - model_family, - model_spec, - quantization, - model_path, - pytorch_model_config=pytorch_model_config, - peft_model=peft_model, - ) - - def _load_model(self, **kwargs): - try: - from transformers import AutoModelForCausalLM, AutoTokenizer - except ImportError: - error_message = "Failed to import module 'transformers'" - installation_guide = [ - "Please make sure 'transformers' is installed. ", - "You can install it by `pip install transformers`\n", - ] - - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - tokenizer = AutoTokenizer.from_pretrained( - self.model_path, - trust_remote_code=kwargs["trust_remote_code"], - revision=kwargs["revision"], - ) - model = AutoModelForCausalLM.from_pretrained( - self.model_path, - low_cpu_mem_usage=True, - **kwargs, - ) - tokenizer.pad_token_id = 9 - return model, tokenizer - - @classmethod - def match( - cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str - ) -> bool: - if llm_spec.model_format != "pytorch": - return False - if "falcon" not in llm_family.model_name: - return False - if "chat" not in llm_family.model_ability: - return False - return True diff --git a/xinference/model/llm/pytorch/vicuna.py b/xinference/model/llm/pytorch/vicuna.py deleted file mode 100644 index f9e8dcfc8a..0000000000 --- a/xinference/model/llm/pytorch/vicuna.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Copyright 2022-2023 XProbe Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import List, Optional - -from ....types import LoRA -from .. import LLMFamilyV1, LLMSpecV1 -from .core import PytorchChatModel, PytorchModelConfig - - -class VicunaPytorchChatModel(PytorchChatModel): - def __init__( - self, - model_uid: str, - model_family: "LLMFamilyV1", - model_spec: "LLMSpecV1", - quantization: str, - model_path: str, - pytorch_model_config: Optional["PytorchModelConfig"] = None, - peft_model: Optional[List[LoRA]] = None, - ): - super().__init__( - model_uid, - model_family, - model_spec, - quantization, - model_path, - pytorch_model_config=pytorch_model_config, - peft_model=peft_model, - ) - self._use_fast_tokenizer = False - - @classmethod - def match( - cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str - ) -> bool: - if llm_spec.model_format != "pytorch": - return False - model_family = llm_family.model_family or llm_family.model_name - if "vicuna" not in model_family: - return False - if "chat" not in llm_family.model_ability: - return False - return True diff --git a/xinference/model/llm/tests/test_llm_family.py b/xinference/model/llm/tests/test_llm_family.py index 38df03867c..252491282c 100644 --- a/xinference/model/llm/tests/test_llm_family.py +++ b/xinference/model/llm/tests/test_llm_family.py @@ -16,16 +16,15 @@ import os import shutil import tempfile -from unittest.mock import MagicMock, Mock, patch +from unittest.mock import patch import pytest from ....constants import XINFERENCE_ENV_MODEL_SRC from ...utils import is_locale_chinese_simplified, valid_model_revision from ..llm_family import ( - AWSRegion, CustomLLMFamilyV1, - GgmlLLMSpecV1, + LlamaCppLLMSpecV1, LLMFamilyV1, PromptStyleV1, PytorchLLMSpecV1, @@ -34,7 +33,6 @@ _get_meta_path, _skip_download, convert_model_size_to_float, - is_self_hosted, is_valid_model_uri, match_llm, match_model_size, @@ -55,15 +53,15 @@ def test_deserialize_llm_family_v1(): ], "model_specs":[ { - "model_format":"ggmlv3", + "model_format":"ggufv2", "model_size_in_billions":2, "quantizations": ["q4_0", "q4_1"], "quantization_parts": { "q4_2": ["a", "b"] }, "model_id":"example/TestModel", - "model_file_name_template":"TestModel.{quantization}.ggmlv3.bin", - "model_file_name_split_template":"TestModel.{quantization}.ggmlv3.bin.{part}" + "model_file_name_template":"TestModel.{quantization}.bin", + "model_file_name_split_template":"TestModel.{quantization}.bin.{part}" }, { "model_format":"pytorch", @@ -91,18 +89,18 @@ def test_deserialize_llm_family_v1(): assert model_family.model_ability == ["embed", "generate"] assert len(model_family.model_specs) == 2 - ggml_spec = model_family.model_specs[0] - assert ggml_spec.model_format == "ggmlv3" - assert ggml_spec.model_size_in_billions == 2 - assert ggml_spec.model_id == "example/TestModel" - assert ggml_spec.model_hub == "huggingface" - assert ggml_spec.model_file_name_template == "TestModel.{quantization}.ggmlv3.bin" + gguf_spec = model_family.model_specs[0] + assert gguf_spec.model_format == "ggufv2" + assert gguf_spec.model_size_in_billions == 2 + assert gguf_spec.model_id == "example/TestModel" + assert gguf_spec.model_hub == "huggingface" + assert gguf_spec.model_file_name_template == "TestModel.{quantization}.bin" assert ( - ggml_spec.model_file_name_split_template - == "TestModel.{quantization}.ggmlv3.bin.{part}" + gguf_spec.model_file_name_split_template + == "TestModel.{quantization}.bin.{part}" ) - assert ggml_spec.quantization_parts["q4_2"][0] == "a" - assert ggml_spec.quantization_parts["q4_2"][1] == "b" + assert gguf_spec.quantization_parts["q4_2"][0] == "a" + assert gguf_spec.quantization_parts["q4_2"][1] == "b" pytorch_spec = model_family.model_specs[1] assert pytorch_spec.model_format == "pytorch" @@ -124,15 +122,15 @@ def test_deserialize_llm_family_v1(): def test_serialize_llm_family_v1(): - ggml_spec = GgmlLLMSpecV1( - model_format="ggmlv3", + gguf_spec = LlamaCppLLMSpecV1( + model_format="ggufv2", model_size_in_billions=2, quantizations=["q4_0", "q4_1"], quantization_parts={"q4_2": ["a", "b"]}, model_id="example/TestModel", model_revision="123", - model_file_name_template="TestModel.{quantization}.ggmlv3.bin", - model_file_name_split_template="TestModel.{quantization}.ggmlv3.bin.{part}", + model_file_name_template="TestModel.{quantization}.bin", + model_file_name_split_template="TestModel.{quantization}.bin.{part}", ) pytorch_spec = PytorchLLMSpecV1( model_format="pytorch", @@ -157,11 +155,11 @@ def test_serialize_llm_family_v1(): model_name="TestModel", model_lang=["en"], model_ability=["embed", "generate"], - model_specs=[ggml_spec, pytorch_spec], + model_specs=[gguf_spec, pytorch_spec], prompt_style=prompt_style, ) - expected = """{"version": 1, "context_length": 2048, "model_name": "TestModel", "model_lang": ["en"], "model_ability": ["embed", "generate"], "model_description": null, "model_family": null, "model_specs": [{"model_format": "ggmlv3", "model_hub": "huggingface", "model_size_in_billions": 2, "quantizations": ["q4_0", "q4_1"], "quantization_parts": {"q4_2": ["a", "b"]}, "model_id": "example/TestModel", "model_revision": "123", "model_file_name_template": "TestModel.{quantization}.ggmlv3.bin", "model_file_name_split_template": "TestModel.{quantization}.ggmlv3.bin.{part}", "model_uri": null}, {"model_format": "pytorch", "model_hub": "huggingface", "model_size_in_billions": 3, "quantizations": ["int8", "int4", "none"], "model_id": "example/TestModel", "model_revision": "456", "model_uri": null}], "prompt_style": {"style_name": "ADD_COLON_SINGLE", "system_prompt": "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.", "roles": ["user", "assistant"], "intra_message_sep": "\\n### ", "inter_message_sep": "\\n### ", "stop": null, "stop_token_ids": null}}""" + expected = """{"version": 1, "context_length": 2048, "model_name": "TestModel", "model_lang": ["en"], "model_ability": ["embed", "generate"], "model_description": null, "model_family": null, "model_specs": [{"model_format": "ggufv2", "model_hub": "huggingface", "model_size_in_billions": 2, "quantizations": ["q4_0", "q4_1"], "quantization_parts": {"q4_2": ["a", "b"]}, "model_id": "example/TestModel", "model_revision": "123", "model_file_name_template": "TestModel.{quantization}.bin", "model_file_name_split_template": "TestModel.{quantization}.bin.{part}", "model_uri": null}, {"model_format": "pytorch", "model_hub": "huggingface", "model_size_in_billions": 3, "quantizations": ["int8", "int4", "none"], "model_id": "example/TestModel", "model_revision": "456", "model_uri": null}], "prompt_style": {"style_name": "ADD_COLON_SINGLE", "system_prompt": "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.", "roles": ["user", "assistant"], "intra_message_sep": "\\n### ", "inter_message_sep": "\\n### ", "stop": null, "stop_token_ids": null}}""" assert json.loads(llm_family.json()) == json.loads(expected) llm_family_context_length = LLMFamilyV1( @@ -171,7 +169,7 @@ def test_serialize_llm_family_v1(): model_name="TestModel", model_lang=["en"], model_ability=["embed", "generate"], - model_specs=[ggml_spec, pytorch_spec], + model_specs=[gguf_spec, pytorch_spec], prompt_style=prompt_style, ) @@ -214,13 +212,13 @@ def test_cache_from_huggingface_pytorch(): shutil.rmtree(cache_dir) -def test_cache_from_huggingface_ggml(): +def test_cache_from_huggingface_gguf(): from ..llm_family import cache_from_huggingface - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TheBloke/orca_mini_3B-GGML", + spec = LlamaCppLLMSpecV1( + model_format="ggufv2", + model_size_in_billions="0_5", + model_id="Qwen/Qwen1.5-0.5B-Chat-GGUF", quantizations=["q4_0"], model_file_name_template="README.md", ) @@ -228,9 +226,9 @@ def test_cache_from_huggingface_ggml(): version=1, context_length=2048, model_type="LLM", - model_name="orca", + model_name="qwen1.5-chat", model_lang=["en"], - model_ability=["embed", "chat"], + model_ability=["chat"], model_specs=[spec], prompt_style=None, ) @@ -252,8 +250,8 @@ def test_cache_from_uri_local(): with open("model.bin", "w") as fd: fd.write("foo") - spec = GgmlLLMSpecV1( - model_format="ggmlv3", + spec = LlamaCppLLMSpecV1( + model_format="ggufv2", model_size_in_billions=3, model_id="TestModel", model_uri=os.path.abspath(os.getcwd()), @@ -324,119 +322,13 @@ def test_parse_uri(): assert path == "bucket/dir" -def test_cache_from_uri_remote(): - from ..llm_family import cache_from_uri - - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TestModel", - model_uri="s3://test_bucket", - quantizations=[""], - model_file_name_template="model.bin", - ) - family = LLMFamilyV1( - version=1, - context_length=2048, - model_type="LLM", - model_name="test_cache_from_uri_remote", - model_lang=["en"], - model_ability=["embed", "chat"], - model_specs=[spec], - prompt_style=None, - ) - - from unittest.mock import patch - - import fsspec - - fsspec.real_filesystem = fsspec.filesystem - - def fsspec_filesystem_side_effect(scheme: str, *args, **kwargs): - if scheme == "s3": - mock_fs = Mock() - mock_fs.info.return_value = {"size": 3} - mock_fs.walk.return_value = [("test_bucket", None, ["model.bin"])] - mock_file = MagicMock() - mock_file_descriptor = Mock() - mock_file_descriptor.read.side_effect = ["foo".encode(), None] - mock_file.__enter__.return_value = mock_file_descriptor - mock_fs.open.return_value = mock_file - return mock_fs - else: - return fsspec.real_filesystem(scheme) - - with patch("fsspec.filesystem", side_effect=fsspec_filesystem_side_effect): - cache_dir = cache_from_uri(family, spec) - assert os.path.exists(cache_dir) - assert os.path.exists(os.path.join(cache_dir, "model.bin")) - shutil.rmtree(cache_dir, ignore_errors=True) - - -def test_cache_from_uri_remote_exception_handling(): - from ....constants import XINFERENCE_CACHE_DIR - from ..llm_family import cache_from_uri - - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TestModel", - model_uri="s3://test_bucket", - quantizations=[""], - model_file_name_template="model.bin", - ) - family = LLMFamilyV1( - version=1, - context_length=2048, - model_type="LLM", - model_name="test_cache_from_uri_remote_exception_handling", - model_lang=["en"], - model_ability=["embed", "chat"], - model_specs=[spec], - prompt_style=None, - ) - - from unittest.mock import patch - - import fsspec - - fsspec.real_filesystem = fsspec.filesystem - - def fsspec_filesystem_side_effect(scheme: str, *args, **kwargs): - if scheme == "s3": - mock_fs = Mock() - mock_fs.info.return_value = {"size": 3} - mock_fs.walk.return_value = [("test_bucket", None, ["model.bin"])] - mock_file = MagicMock() - mock_file_descriptor = Mock() - mock_file_descriptor.read.side_effect = Exception("Mock exception") - mock_file.__enter__.return_value = mock_file_descriptor - mock_fs.open.return_value = mock_file - return mock_fs - else: - return fsspec.real_filesystem(scheme) - - with pytest.raises( - RuntimeError, - match="Failed to download model 'test_cache_from_uri_remote_exception_handling'", - ): - with patch("fsspec.filesystem", side_effect=fsspec_filesystem_side_effect): - cache_from_uri(family, spec) - - cache_dir_name = ( - f"{family.model_name}-{spec.model_format}" f"-{spec.model_size_in_billions}b" - ) - cache_dir = os.path.realpath(os.path.join(XINFERENCE_CACHE_DIR, cache_dir_name)) - assert not os.path.exists(cache_dir) - - def test_legacy_cache(): from ..llm_family import cache, get_legacy_cache_path - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TheBloke/orca_mini_3B-GGML", + spec = LlamaCppLLMSpecV1( + model_format="ggufv2", + model_size_in_billions="0_5", + model_id="Qwen/Qwen1.5-0.5B-Chat-GGUF", quantizations=["test_legacy_cache"], model_file_name_template="README.md", ) @@ -444,9 +336,9 @@ def test_legacy_cache(): version=1, context_length=2048, model_type="LLM", - model_name="orca", + model_name="qwen1.5-chat", model_lang=["en"], - model_ability=["embed", "chat"], + model_ability=["chat"], model_specs=[spec], prompt_style=None, ) @@ -468,41 +360,13 @@ def test_legacy_cache(): shutil.rmtree(os.path.dirname(cache_path), ignore_errors=True) -@pytest.mark.skip(reason="Temporary disabled") -def test_cache_from_self_hosted_storage(): - from ..llm_family import cache_from_self_hosted_storage - - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TheBloke/orca_mini_3B-GGML", - quantizations=[""], - model_file_name_template="README.md", - ) - family = LLMFamilyV1( - version=1, - context_length=2048, - model_type="LLM", - model_name="orca", - model_lang=["en"], - model_ability=["embed", "chat"], - model_specs=[spec], - prompt_style=None, - ) - - cache_dir = cache_from_self_hosted_storage(family, spec, quantization="") - assert os.path.exists(cache_dir) - assert os.path.exists(os.path.join(cache_dir, "README.md")) - shutil.rmtree(cache_dir, ignore_errors=True) - - def test_custom_llm(): from ..llm_family import get_user_defined_llm_families, register_llm, unregister_llm - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TheBloke/orca_mini_3B-GGML", + spec = LlamaCppLLMSpecV1( + model_format="ggufv2", + model_size_in_billions="0_5", + model_id="Qwen/Qwen1.5-0.5B-Chat-GGUF", quantizations=[""], model_file_name_template="README.md", ) @@ -510,9 +374,9 @@ def test_custom_llm(): version=1, context_length=2048, model_type="LLM", - model_name="custom_model", + model_name="custom-qwen1.5-chat", model_lang=["en"], - model_ability=["embed", "chat"], + model_ability=["chat"], model_specs=[spec], prompt_style=None, ) @@ -529,10 +393,10 @@ def test_persistent_custom_llm(): from ....constants import XINFERENCE_MODEL_DIR from ..llm_family import get_user_defined_llm_families, register_llm, unregister_llm - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TheBloke/orca_mini_3B-GGML", + spec = LlamaCppLLMSpecV1( + model_format="ggufv2", + model_size_in_billions="0_5", + model_id="Qwen/Qwen1.5-0.5B-Chat-GGUF", quantizations=[""], model_file_name_template="README.md", ) @@ -542,7 +406,7 @@ def test_persistent_custom_llm(): model_type="LLM", model_name="custom_model", model_lang=["en"], - model_ability=["embed", "chat"], + model_ability=["chat"], model_specs=[spec], prompt_style=None, ) @@ -575,93 +439,17 @@ def en_us(): assert not is_locale_chinese_simplified() -def test_download_from_self_hosted_storage(): - from ....constants import XINFERENCE_ENV_MODEL_SRC - from ..llm_family import download_from_self_hosted_storage - - assert not download_from_self_hosted_storage() - - os.environ[XINFERENCE_ENV_MODEL_SRC] = "xorbits" - assert download_from_self_hosted_storage() - del os.environ[XINFERENCE_ENV_MODEL_SRC] - - -def test_aws_region_set(): - with AWSRegion("foo"): - assert os.environ["AWS_DEFAULT_REGION"] == "foo" - - # Ensure the region is deleted if it wasn't set before - assert "AWS_DEFAULT_REGION" not in os.environ - - -def test_aws_region_restore(): - # Set an initial region - os.environ["AWS_DEFAULT_REGION"] = "us-west-1" - - with AWSRegion("foo"): - assert os.environ["AWS_DEFAULT_REGION"] == "foo" - - # Ensure the region is restored to its original value after exiting the context - assert os.environ["AWS_DEFAULT_REGION"] == "us-west-1" - - -def test_aws_region_no_restore_if_not_set(): - # Ensure AWS_DEFAULT_REGION is not set - if "AWS_DEFAULT_REGION" in os.environ: - del os.environ["AWS_DEFAULT_REGION"] - - with AWSRegion("foo"): - assert os.environ["AWS_DEFAULT_REGION"] == "foo" - - # Ensure the region is deleted if it wasn't set before - assert "AWS_DEFAULT_REGION" not in os.environ - - -def test_aws_region_exception_handling(): - with pytest.raises(ValueError): - with AWSRegion("foo"): - raise ValueError("Test exception") - - # Ensure the region is deleted if it wasn't set before - assert "AWS_DEFAULT_REGION" not in os.environ - - -@pytest.mark.skip(reason="Temporary disabled") -def test_is_self_hosted(): - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TheBloke/orca_mini_3B-GGML", - quantizations=[""], - model_file_name_template="README.md", - ) - family = LLMFamilyV1( - version=1, - context_length=2048, - model_type="LLM", - model_name="orca", - model_lang=["en"], - model_ability=["embed", "chat"], - model_specs=[spec], - prompt_style=None, - ) - assert is_self_hosted(family, spec) - - family.model_name = "foo" - assert not is_self_hosted(family, spec) - - def test_match_llm(): assert match_llm("fake") is None - family, spec, q = match_llm("orca", model_format="ggmlv3") - assert family.model_name == "orca" - assert q == "q4_0" + family, spec, q = match_llm("qwen1.5-chat", model_format="ggufv2") + assert family.model_name == "qwen1.5-chat" + assert q == "q2_k" family, spec, q = match_llm( - "llama-2-chat", model_format="ggmlv3", quantization="Q4_0" + "llama-2-chat", model_format="ggufv2", quantization="Q4_0" ) assert family.model_name == "llama-2-chat" - assert q == "q4_0" + assert q == "Q4_0" family, spec, q = match_llm( "code-llama", model_format="ggufv2", quantization="q4_0" @@ -787,24 +575,24 @@ def test_skip_download_pytorch(): assert not os.path.exists(ms_meta_path) -def test_skip_download_ggml(): - hf_spec = GgmlLLMSpecV1( - model_format="ggmlv3", +def test_skip_download_gguf(): + hf_spec = LlamaCppLLMSpecV1( + model_format="ggufv2", model_size_in_billions=2, quantizations=["q4_0", "q4_1"], model_id="example/TestModel", model_hub="huggingface", model_revision="123", - model_file_name_template="TestModel.{quantization}.ggmlv3.bin", + model_file_name_template="TestModel.{quantization}.bin", ) - ms_spec = GgmlLLMSpecV1( - model_format="ggmlv3", + ms_spec = LlamaCppLLMSpecV1( + model_format="ggufv2", model_size_in_billions=2, quantizations=["q4_0", "q4_1"], model_id="example/TestModel", model_hub="modelscope", model_revision="123", - model_file_name_template="TestModel.{quantization}.ggmlv3.bin", + model_file_name_template="TestModel.{quantization}.bin", ) prompt_style = PromptStyleV1( style_name="ADD_COLON_SINGLE", @@ -916,13 +704,13 @@ def test_get_cache_status_pytorch(): shutil.rmtree(cache_dir) -def test_get_cache_status_ggml(): +def test_get_cache_status_gguf(): from ..llm_family import cache_from_huggingface, get_cache_status - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TheBloke/orca_mini_3B-GGML", + spec = LlamaCppLLMSpecV1( + model_format="ggufv2", + model_size_in_billions="0_5", + model_id="Qwen/Qwen1.5-0.5B-Chat-GGUF", quantizations=["q4_0", "q5_0"], model_file_name_template="README.md", ) @@ -930,9 +718,9 @@ def test_get_cache_status_ggml(): version=1, context_length=2048, model_type="LLM", - model_name="orca", + model_name="qwen1.5-chat", model_lang=["en"], - model_ability=["embed", "chat"], + model_ability=["chat"], model_specs=[spec], prompt_style=None, ) @@ -960,25 +748,25 @@ def test_parse_prompt_style(): # take some examples to assert assert "qwen-chat" in BUILTIN_LLM_PROMPT_STYLE assert "chatglm3" in BUILTIN_LLM_PROMPT_STYLE - assert "baichuan-chat" in BUILTIN_LLM_PROMPT_STYLE + assert "baichuan-2-chat" in BUILTIN_LLM_PROMPT_STYLE - hf_spec = GgmlLLMSpecV1( - model_format="ggmlv3", + hf_spec = LlamaCppLLMSpecV1( + model_format="ggufv2", model_size_in_billions=2, quantizations=["q4_0", "q4_1"], model_id="example/TestModel", model_hub="huggingface", model_revision="123", - model_file_name_template="TestModel.{quantization}.ggmlv3.bin", + model_file_name_template="TestModel.{quantization}.bin", ) - ms_spec = GgmlLLMSpecV1( - model_format="ggmlv3", + ms_spec = LlamaCppLLMSpecV1( + model_format="ggufv2", model_size_in_billions=2, quantizations=["q4_0", "q4_1"], model_id="example/TestModel", model_hub="modelscope", model_revision="123", - model_file_name_template="TestModel.{quantization}.ggmlv3.bin", + model_file_name_template="TestModel.{quantization}.bin", ) llm_family = CustomLLMFamilyV1( @@ -1126,7 +914,7 @@ def test_quert_engine_vLLM(): check_engine_by_spec_parameters( model_engine="vLLM", model_name=model_name, - model_format="ggmlv3", + model_format="ggufv2", model_size_in_billions="1_8", quantization="q2_k", ) @@ -1187,7 +975,7 @@ def test_quert_engine_SGLang(): check_engine_by_spec_parameters( model_engine="SGLang", model_name=model_name, - model_format="ggmlv3", + model_format="ggufv2", model_size_in_billions="1_8", quantization="q2_k", ) @@ -1196,7 +984,7 @@ def test_quert_engine_SGLang(): def test_query_engine_general(): - from ..ggml.llamacpp import LlamaCppChatModel + from ..llama_cpp.core import LlamaCppChatModel from ..llm_family import ( LLM_ENGINES, check_engine_by_spec_parameters, @@ -1261,19 +1049,19 @@ def test_query_engine_general(): check_engine_by_spec_parameters( model_engine="llama.cpp", model_name=model_name, - model_format="ggmlv3", - model_size_in_billions="1_8", + model_format="ggufv2", + model_size_in_billions="2_2", quantization="q2_k", ) assert ( str(exif.value) - == "Model qwen1.5-chat cannot be run on engine llama.cpp, with format ggmlv3, size 1_8 and quantization q2_k." + == "Model qwen1.5-chat cannot be run on engine llama.cpp, with format ggufv2, size 2_2 and quantization q2_k." ) - spec = GgmlLLMSpecV1( - model_format="ggmlv3", - model_size_in_billions=3, - model_id="TheBloke/orca_mini_3B-GGML", + spec = LlamaCppLLMSpecV1( + model_format="ggufv2", + model_size_in_billions="0_5", + model_id="Qwen/Qwen1.5-0.5B-Chat-GGUF", quantizations=[""], model_file_name_template="README.md", ) @@ -1283,7 +1071,7 @@ def test_query_engine_general(): model_type="LLM", model_name="custom_model", model_lang=["en"], - model_ability=["embed", "chat"], + model_ability=["chat"], model_specs=[spec], prompt_style=None, ) @@ -1295,8 +1083,8 @@ def test_query_engine_general(): assert check_engine_by_spec_parameters( model_engine="llama.cpp", model_name="custom_model", - model_format="ggmlv3", - model_size_in_billions=3, + model_format="ggufv2", + model_size_in_billions="0_5", quantization="", ) @@ -1304,7 +1092,7 @@ def test_query_engine_general(): assert family not in get_user_defined_llm_families() assert "custom_model" not in LLM_ENGINES - spec = GgmlLLMSpecV1( + spec = LlamaCppLLMSpecV1( model_format="ggufv2", model_size_in_billions="1_8", model_id="null", diff --git a/xinference/model/llm/tests/test_stream_options.py b/xinference/model/llm/tests/test_stream_options.py index c114920f8c..917890e09d 100644 --- a/xinference/model/llm/tests/test_stream_options.py +++ b/xinference/model/llm/tests/test_stream_options.py @@ -37,10 +37,9 @@ async def test_openai_stream_options_llamacpp_chatglm(setup): payload = { "model_uid": "test_restful_api", "model_engine": "llama.cpp", - "model_name": "chatglm3", - "model_size_in_billions": "6", - "quantization": "q4_0", - "model_format": "ggmlv3", + "model_name": "qwen1.5-chat", + "model_size_in_billions": "0_5", + "model_format": "ggufv2", } response = requests.post(url, json=payload) diff --git a/xinference/model/llm/tests/test_utils.py b/xinference/model/llm/tests/test_utils.py index add8552716..42125a0048 100644 --- a/xinference/model/llm/tests/test_utils.py +++ b/xinference/model/llm/tests/test_utils.py @@ -46,36 +46,6 @@ def test_prompt_style_add_colon_single(): ) -def test_prompt_style_add_colon_two(): - prompt_style = PromptStyleV1( - style_name="ADD_COLON_TWO", - system_prompt=( - "A chat between a curious user and an artificial intelligence assistant. The " - "assistant gives helpful, detailed, and polite answers to the user's questions." - ), - roles=["USER", "ASSISTANT"], - intra_message_sep=" ", - inter_message_sep="</s>", - ) - chat_history = [ - ChatCompletionMessage(role=prompt_style.roles[0], content="Hi there."), - ChatCompletionMessage( - role=prompt_style.roles[1], content="Hello, how may I help you?" - ), - ] - expected = ( - "A chat between a curious user and an artificial intelligence assistant. The " - "assistant gives helpful, detailed, and polite answers to the user's questions. " - "USER: Hi there. " - "ASSISTANT: Hello, how may I help you?</s>" - "USER: Write a poem. " - "ASSISTANT:" - ) - assert expected == ChatModelMixin.get_prompt( - "Write a poem.", chat_history, prompt_style - ) - - def test_prompt_style_no_colon_two(): prompt_style = PromptStyleV1( style_name="NO_COLON_TWO", @@ -182,82 +152,6 @@ def test_prompt_style_llama3(): ) -def test_prompt_style_falcon(): - prompt_style = PromptStyleV1( - style_name="FALCON", - system_prompt="", - roles=["User", "Assistant"], - intra_message_sep="\n", - inter_message_sep="<|endoftext|>", - stop=["\nUser"], - stop_token_ids=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], - ) - chat_history = [ - ChatCompletionMessage(role=prompt_style.roles[0], content="Hi there."), - ChatCompletionMessage( - role=prompt_style.roles[1], content="Hello, how may I help you?" - ), - ] - expected = ( - "User: Hi there.\n\n" - "Assistant: Hello, how may I help you?\n\n" - "User: Write a poem.\n\n" - "Assistant:" - ) - - assert expected == ChatModelMixin.get_prompt( - "Write a poem.", chat_history, prompt_style - ) - - -def test_prompt_style_chatglm_v1(): - prompt_style = PromptStyleV1( - style_name="CHATGLM", - system_prompt="", - roles=["问", "答"], - intra_message_sep="\n", - ) - chat_history = [ - ChatCompletionMessage(role=prompt_style.roles[0], content="Hi there."), - ChatCompletionMessage( - role=prompt_style.roles[1], content="Hello, how may I help you?" - ), - ] - expected = ( - "[Round 0]\n问:Hi there.\n" - "答:Hello, how may I help you?\n" - "[Round 1]\n问:Write a poem.\n" - "答:" - ) - assert expected == ChatModelMixin.get_prompt( - "Write a poem.", chat_history, prompt_style - ) - - -def test_prompt_style_chatglm_v2(): - prompt_style = PromptStyleV1( - style_name="CHATGLM", - system_prompt="", - roles=["问", "答"], - intra_message_sep="\n\n", - ) - chat_history = [ - ChatCompletionMessage(role=prompt_style.roles[0], content="Hi there."), - ChatCompletionMessage( - role=prompt_style.roles[1], content="Hello, how may I help you?" - ), - ] - expected = ( - "[Round 1]\n\n问:Hi there.\n\n" - "答:Hello, how may I help you?\n\n" - "[Round 2]\n\n问:Write a poem.\n\n" - "答:" - ) - assert expected == ChatModelMixin.get_prompt( - "Write a poem.", chat_history, prompt_style - ) - - def test_prompt_style_chatglm_v3(): prompt_style = PromptStyleV1( style_name="CHATGLM3", @@ -358,33 +252,6 @@ def test_prompt_style_chatml(): ) -def test_prompt_style_internlm(): - prompt_style = PromptStyleV1( - style_name="INTERNLM", - system_prompt="", - roles=["<|User|>", "<|Bot|>"], - intra_message_sep="<eoh>\n", - inter_message_sep="<eoa>\n", - ) - - expected = "<s><|User|>:Write a poem.<eoh>\n<|Bot|>:" - actual = ChatModelMixin.get_prompt("Write a poem.", [], prompt_style) - assert expected == actual - - chat_history = [ - ChatCompletionMessage(role=prompt_style.roles[0], content="Hi there."), - ChatCompletionMessage( - role=prompt_style.roles[1], content="Hello, how may I help you?" - ), - ] - expected = ( - "<s><|User|>:Hi there.<eoh>\n<|Bot|>:Hello, how may I help you?<eoa>\n" - "<|User|>:Write a poem.<eoh>\n<|Bot|>:" - ) - actual = ChatModelMixin.get_prompt("Write a poem.", chat_history, prompt_style) - assert expected == actual - - def test_prompt_style_add_colon_single_cot(): prompt_style = PromptStyleV1( style_name="ADD_COLON_SINGLE_COT", diff --git a/xinference/model/llm/pytorch/__init__.py b/xinference/model/llm/transformers/__init__.py similarity index 100% rename from xinference/model/llm/pytorch/__init__.py rename to xinference/model/llm/transformers/__init__.py diff --git a/xinference/model/llm/pytorch/chatglm.py b/xinference/model/llm/transformers/chatglm.py similarity index 100% rename from xinference/model/llm/pytorch/chatglm.py rename to xinference/model/llm/transformers/chatglm.py diff --git a/xinference/model/llm/pytorch/cogvlm2.py b/xinference/model/llm/transformers/cogvlm2.py similarity index 100% rename from xinference/model/llm/pytorch/cogvlm2.py rename to xinference/model/llm/transformers/cogvlm2.py diff --git a/xinference/model/llm/pytorch/compression.py b/xinference/model/llm/transformers/compression.py similarity index 100% rename from xinference/model/llm/pytorch/compression.py rename to xinference/model/llm/transformers/compression.py diff --git a/xinference/model/llm/pytorch/core.py b/xinference/model/llm/transformers/core.py similarity index 99% rename from xinference/model/llm/pytorch/core.py rename to xinference/model/llm/transformers/core.py index 16ec02b8a1..7e7bc609b6 100644 --- a/xinference/model/llm/pytorch/core.py +++ b/xinference/model/llm/transformers/core.py @@ -47,15 +47,6 @@ logger = logging.getLogger(__name__) NON_DEFAULT_MODEL_LIST: List[str] = [ - "baichuan-chat", - "baichuan-2-chat", - "vicuna-v1.3", - "falcon", - "falcon-instruct", - "chatglm", - "chatglm2", - "chatglm2-32k", - "chatglm2-128k", "chatglm3", "chatglm3-32k", "chatglm3-128k", @@ -64,6 +55,7 @@ "llama-2", "llama-2-chat", "internlm2-chat", + "internlm2.5-chat", "qwen-vl-chat", "OmniLMM", "yi-vl-chat", diff --git a/xinference/model/llm/pytorch/deepseek_vl.py b/xinference/model/llm/transformers/deepseek_vl.py similarity index 100% rename from xinference/model/llm/pytorch/deepseek_vl.py rename to xinference/model/llm/transformers/deepseek_vl.py diff --git a/xinference/model/llm/pytorch/glm4v.py b/xinference/model/llm/transformers/glm4v.py similarity index 100% rename from xinference/model/llm/pytorch/glm4v.py rename to xinference/model/llm/transformers/glm4v.py diff --git a/xinference/model/llm/pytorch/intern_vl.py b/xinference/model/llm/transformers/intern_vl.py similarity index 100% rename from xinference/model/llm/pytorch/intern_vl.py rename to xinference/model/llm/transformers/intern_vl.py diff --git a/xinference/model/llm/pytorch/internlm2.py b/xinference/model/llm/transformers/internlm2.py similarity index 96% rename from xinference/model/llm/pytorch/internlm2.py rename to xinference/model/llm/transformers/internlm2.py index 6d3b8d0c89..fc7b1c7588 100644 --- a/xinference/model/llm/pytorch/internlm2.py +++ b/xinference/model/llm/transformers/internlm2.py @@ -85,14 +85,10 @@ def _load_model(self, **kwargs): def match( cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str ) -> bool: - if llm_spec.model_format != "pytorch": - return False model_family = llm_family.model_family or llm_family.model_name - if model_family != "internlm2-chat": - return False - if "chat" not in llm_family.model_ability: - return False - return True + if model_family in ["internlm2-chat", "internlm2.5-chat"]: + return True + return False def prepare_sanitize_generate_config(self, req: InferenceRequest): """ @@ -153,7 +149,7 @@ def _stream_generator(): inputs = inputs.to(self._model.device) prompt_tokens = len(inputs["input_ids"][0]) for chunk_text, _ in self._model.stream_chat( - self._tokenizer, prompt, chat_history, **kwargs + self._tokenizer, prompt, input_history, **kwargs ): completion_tokens = completion_tokens + 1 total_tokens = prompt_tokens + completion_tokens diff --git a/xinference/model/llm/pytorch/llama_2.py b/xinference/model/llm/transformers/llama_2.py similarity index 100% rename from xinference/model/llm/pytorch/llama_2.py rename to xinference/model/llm/transformers/llama_2.py diff --git a/xinference/model/llm/pytorch/minicpmv25.py b/xinference/model/llm/transformers/minicpmv25.py similarity index 100% rename from xinference/model/llm/pytorch/minicpmv25.py rename to xinference/model/llm/transformers/minicpmv25.py diff --git a/xinference/model/llm/pytorch/minicpmv26.py b/xinference/model/llm/transformers/minicpmv26.py similarity index 100% rename from xinference/model/llm/pytorch/minicpmv26.py rename to xinference/model/llm/transformers/minicpmv26.py diff --git a/xinference/model/llm/pytorch/omnilmm.py b/xinference/model/llm/transformers/omnilmm.py similarity index 100% rename from xinference/model/llm/pytorch/omnilmm.py rename to xinference/model/llm/transformers/omnilmm.py diff --git a/xinference/model/llm/pytorch/qwen_vl.py b/xinference/model/llm/transformers/qwen_vl.py similarity index 100% rename from xinference/model/llm/pytorch/qwen_vl.py rename to xinference/model/llm/transformers/qwen_vl.py diff --git a/xinference/model/llm/pytorch/tensorizer_utils.py b/xinference/model/llm/transformers/tensorizer_utils.py similarity index 100% rename from xinference/model/llm/pytorch/tensorizer_utils.py rename to xinference/model/llm/transformers/tensorizer_utils.py diff --git a/xinference/model/llm/pytorch/tests/__init__.py b/xinference/model/llm/transformers/tests/__init__.py similarity index 100% rename from xinference/model/llm/pytorch/tests/__init__.py rename to xinference/model/llm/transformers/tests/__init__.py diff --git a/xinference/model/llm/pytorch/tests/test_opt.py b/xinference/model/llm/transformers/tests/test_opt.py similarity index 100% rename from xinference/model/llm/pytorch/tests/test_opt.py rename to xinference/model/llm/transformers/tests/test_opt.py diff --git a/xinference/model/llm/pytorch/tests/test_tensorizer.py b/xinference/model/llm/transformers/tests/test_tensorizer.py similarity index 96% rename from xinference/model/llm/pytorch/tests/test_tensorizer.py rename to xinference/model/llm/transformers/tests/test_tensorizer.py index 55709f8756..a4e228259c 100644 --- a/xinference/model/llm/pytorch/tests/test_tensorizer.py +++ b/xinference/model/llm/transformers/tests/test_tensorizer.py @@ -98,8 +98,8 @@ def mock_environment(tmp_path): return model_path, tensorizer_dir, tensor_path -@patch("xinference.model.llm.pytorch.tensorizer_utils.get_tensorizer_dir") -@patch("xinference.model.llm.pytorch.tensorizer_utils.logger") +@patch("xinference.model.llm.transformers.tensorizer_utils.get_tensorizer_dir") +@patch("xinference.model.llm.transformers.tensorizer_utils.logger") def test_tensorizer_serialize_model_cache_exists( mock_logger, mock_get_tensorizer_dir, mock_environment ): diff --git a/xinference/model/llm/pytorch/utils.py b/xinference/model/llm/transformers/utils.py similarity index 99% rename from xinference/model/llm/pytorch/utils.py rename to xinference/model/llm/transformers/utils.py index 3e29472880..5d64604315 100644 --- a/xinference/model/llm/pytorch/utils.py +++ b/xinference/model/llm/transformers/utils.py @@ -40,7 +40,7 @@ ) if TYPE_CHECKING: - from ...llm.pytorch.core import PytorchModel + from ...llm.transformers.core import PytorchModel logger = logging.getLogger(__name__) diff --git a/xinference/model/llm/pytorch/yi_vl.py b/xinference/model/llm/transformers/yi_vl.py similarity index 100% rename from xinference/model/llm/pytorch/yi_vl.py rename to xinference/model/llm/transformers/yi_vl.py diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 356a67248d..94024d6e83 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -28,7 +28,7 @@ CompletionChunk, ) from .llm_family import ( - GgmlLLMSpecV1, + LlamaCppLLMSpecV1, LLMFamilyV1, LLMSpecV1, PromptStyleV1, @@ -92,17 +92,6 @@ def get_role(role_name: str): else: ret += role + ":" return ret - elif prompt_style.style_name == "ADD_COLON_TWO": - seps = [prompt_style.intra_message_sep, prompt_style.inter_message_sep] - ret = prompt_style.system_prompt + seps[0] - for i, message in enumerate(chat_history): - role = get_role(message["role"]) - content = message["content"] - if content: - ret += role + ": " + content + seps[i % 2] - else: - ret += role + ":" - return ret elif prompt_style.style_name == "NO_COLON_TWO": seps = [prompt_style.intra_message_sep, prompt_style.inter_message_sep] ret = prompt_style.system_prompt @@ -144,21 +133,6 @@ def get_role(role_name: str): else: ret += f"<|start_header_id|>{role}<|end_header_id|>{prompt_style.intra_message_sep}" return ret - elif prompt_style.style_name == "FALCON": - ret = prompt_style.system_prompt - for message in chat_history: - role = get_role(message["role"]) - content = message["content"] - if content: - ret += ( - role - + ": " - + content.replace("\r\n", "\n").replace("\n\n", "\n") - ) - ret += "\n\n" - else: - ret += role + ":" - return ret elif prompt_style.style_name == "MIXTRAL_V01": ret = "" for i, message in enumerate(chat_history): @@ -168,22 +142,6 @@ def get_role(role_name: str): else: # assistant ret += f"{content} </s>" return ret - elif prompt_style.style_name == "CHATGLM": - round_add_n = 1 if prompt_style.intra_message_sep == "\n\n" else 0 - if prompt_style.system_prompt: - ret = prompt_style.system_prompt + prompt_style.intra_message_sep - else: - ret = "" - for i, message in enumerate(chat_history): - role = get_role(message["role"]) - content = message["content"] - if i % 2 == 0: - ret += f"[Round {i // 2 + round_add_n}]{prompt_style.intra_message_sep}" - if content: - ret += role + ":" + content + prompt_style.intra_message_sep - else: - ret += role + ":" - return ret elif prompt_style.style_name == "CHATGLM3": prompts = ( [f"<|system|>\n {prompt_style.system_prompt}"] @@ -323,25 +281,6 @@ def get_role(role_name: str): else: ret += role + "\n" return ret - elif prompt_style.style_name == "INTERNLM": - seps = [prompt_style.intra_message_sep, prompt_style.inter_message_sep] - ret = "" - for i, message in enumerate(chat_history[:-2]): - if i % 2 == 0: - ret += "<s>" - role = get_role(message["role"]) - content = message["content"] - ret += role + ":" + str(content) + seps[i % 2] - if len(ret) == 0: - ret += "<s>" - ret += ( - chat_history[-2]["role"] - + ":" - + str(chat_history[-2]["content"]) - + seps[0] - ) - ret += chat_history[-1]["role"] + ":" - return ret elif prompt_style.style_name == "INTERNLM2": ret = ( "<s>" @@ -370,9 +309,6 @@ def get_role(role_name: str): else: ret += role + ": Let's think step by step." return ret - elif prompt_style.style_name == "INSTRUCTION": - message = chat_history[-2] - return prompt_style.system_prompt.format(message["content"]) elif prompt_style.style_name == "DEEPSEEK_CHAT": seps = [prompt_style.intra_message_sep, prompt_style.inter_message_sep] ret = prompt_style.system_prompt @@ -872,8 +808,8 @@ def get_file_location( if spec.model_format in ["pytorch", "gptq", "awq", "fp8", "mlx"]: return cache_dir, is_cached - elif spec.model_format in ["ggmlv3", "ggufv2"]: - assert isinstance(spec, GgmlLLMSpecV1) + elif spec.model_format in ["ggufv2"]: + assert isinstance(spec, LlamaCppLLMSpecV1) filename = spec.model_file_name_template.format(quantization=quantization) model_path = os.path.join(cache_dir, filename) return model_path, is_cached diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index d4b11689aa..280150f9a3 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -91,8 +91,6 @@ class VLLMGenerateConfig(TypedDict, total=False): VLLM_SUPPORTED_MODELS = [ "llama-2", "llama-3", - "baichuan", - "internlm-16k", "mistral-v0.1", "codestral-v0.1", "Yi", @@ -105,13 +103,7 @@ class VLLMGenerateConfig(TypedDict, total=False): VLLM_SUPPORTED_CHAT_MODELS = [ "llama-2-chat", "llama-3-instruct", - "vicuna-v1.3", - "vicuna-v1.5", - "baichuan-chat", "baichuan-2-chat", - "internlm-chat-7b", - "internlm-chat-8k", - "internlm-chat-20b", "internlm2-chat", "internlm2.5-chat", "internlm2.5-chat-1m", diff --git a/xinference/model/utils.py b/xinference/model/utils.py index 961d132b7b..c266afcff9 100644 --- a/xinference/model/utils.py +++ b/xinference/model/utils.py @@ -14,13 +14,11 @@ import json import logging import os -import shutil from json import JSONDecodeError from pathlib import Path from typing import Any, Callable, Dict, Optional, Tuple, Union import huggingface_hub -from fsspec import AbstractFileSystem from ..constants import XINFERENCE_CACHE_DIR, XINFERENCE_ENV_MODEL_SRC from ..device_utils import get_available_device, is_device_available @@ -220,12 +218,7 @@ def is_valid_model_uri(model_uri: Optional[str]) -> bool: return True -def cache_from_uri( - model_spec: CacheableModelSpec, - self_hosted_storage: bool = False, -) -> str: - from fsspec import AbstractFileSystem, filesystem - +def cache_from_uri(model_spec: CacheableModelSpec) -> str: cache_dir = os.path.realpath( os.path.join(XINFERENCE_CACHE_DIR, model_spec.model_name) ) @@ -247,48 +240,6 @@ def cache_from_uri( os.makedirs(XINFERENCE_CACHE_DIR, exist_ok=True) os.symlink(src_root, cache_dir, target_is_directory=True) return cache_dir - elif src_scheme in ["s3"]: - # use anonymous connection for self-hosted storage. - src_fs: AbstractFileSystem = filesystem(src_scheme, anon=self_hosted_storage) - local_fs: AbstractFileSystem = filesystem("file") - - files_to_download = [] - os.makedirs(cache_dir, exist_ok=True) - - for path, _, files in src_fs.walk(model_spec.model_uri): - for file in files: - src_path = f"{path}/{file}" - local_path = src_path.replace(src_root, cache_dir) - files_to_download.append((src_path, local_path)) - - from concurrent.futures import ThreadPoolExecutor - - failed = False - with ThreadPoolExecutor(max_workers=min(len(files_to_download), 4)) as executor: - futures = [ - ( - src_path, - executor.submit( - copy_from_src_to_dst, src_fs, src_path, local_fs, local_path - ), - ) - for src_path, local_path in files_to_download - ] - for src_path, future in futures: - if failed: - future.cancel() - else: - try: - future.result() - except: - logger.error(f"Download {src_path} failed", exc_info=True) - failed = True - - if failed: - logger.warning(f"Removing cache directory: {cache_dir}") - shutil.rmtree(cache_dir, ignore_errors=True) - raise RuntimeError(f"Failed to download model '{model_spec.model_name}' ") - return cache_dir else: raise ValueError(f"Unsupported URL scheme: {src_scheme}") @@ -346,51 +297,6 @@ def cache(model_spec: CacheableModelSpec, model_description_type: type): return cache_dir -def copy_from_src_to_dst( - _src_fs: "AbstractFileSystem", - _src_path: str, - dst_fs: "AbstractFileSystem", - dst_path: str, - max_attempt: int = 3, -): - from tqdm import tqdm - - for attempt in range(max_attempt): - logger.info(f"Copy from {_src_path} to {dst_path}, attempt: {attempt}") - try: - with _src_fs.open(_src_path, "rb") as src_file: - file_size = _src_fs.info(_src_path)["size"] - - dst_fs.makedirs(os.path.dirname(dst_path), exist_ok=True) - with dst_fs.open(dst_path, "wb") as dst_file: - chunk_size = 1024 * 1024 # 1 MB - - with tqdm( - total=file_size, - unit="B", - unit_scale=True, - unit_divisor=1024, - desc=_src_path, - ) as pbar: - while True: - chunk = src_file.read(chunk_size) - if not chunk: - break - dst_file.write(chunk) - pbar.update(len(chunk)) - logger.info( - f"Copy from {_src_path} to {dst_path} finished, attempt: {attempt}" - ) - break - except: - logger.error( - f"Failed to copy from {_src_path} to {dst_path} on attempt {attempt + 1}", - exc_info=True, - ) - if attempt + 1 == max_attempt: - raise - - def patch_trust_remote_code(): """sentence-transformers calls transformers without the trust_remote_code=True, some embedding models will fail to load, e.g. jina-embeddings-v2-base-en diff --git a/xinference/thirdparty/omnilmm/model/utils.py b/xinference/thirdparty/omnilmm/model/utils.py index 9ec21a78f0..0df82e69d4 100644 --- a/xinference/thirdparty/omnilmm/model/utils.py +++ b/xinference/thirdparty/omnilmm/model/utils.py @@ -3,7 +3,6 @@ import pickle from io import BytesIO -import cv2 import numpy as np import torch import torch.distributed as dist @@ -75,6 +74,8 @@ def autocontrast_func(img, cutoff=0): """ same output as PIL.ImageOps.autocontrast """ + import cv2 + n_bins = 256 def tune_channel(ch): @@ -108,6 +109,8 @@ def equalize_func(img): same output as PIL.ImageOps.equalize PIL's implementation is different from cv2.equalize """ + import cv2 + n_bins = 256 def tune_channel(ch): @@ -131,6 +134,8 @@ def rotate_func(img, degree, fill=(0, 0, 0)): """ like PIL, rotate by degree, not radians """ + import cv2 + H, W = img.shape[0], img.shape[1] center = W / 2, H / 2 M = cv2.getRotationMatrix2D(center, degree, 1) @@ -194,6 +199,8 @@ def sharpness_func(img, factor): The differences the this result and PIL are all on the 4 boundaries, the center areas are same """ + import cv2 + kernel = np.ones((3, 3), dtype=np.float32) kernel[1][1] = 5 kernel /= 13 @@ -211,6 +218,8 @@ def sharpness_func(img, factor): def shear_x_func(img, factor, fill=(0, 0, 0)): + import cv2 + H, W = img.shape[0], img.shape[1] M = np.float32([[1, factor, 0], [0, 1, 0]]) out = cv2.warpAffine( @@ -223,6 +232,8 @@ def translate_x_func(img, offset, fill=(0, 0, 0)): """ same output as PIL.Image.transform """ + import cv2 + H, W = img.shape[0], img.shape[1] M = np.float32([[1, 0, -offset], [0, 1, 0]]) out = cv2.warpAffine( @@ -235,6 +246,8 @@ def translate_y_func(img, offset, fill=(0, 0, 0)): """ same output as PIL.Image.transform """ + import cv2 + H, W = img.shape[0], img.shape[1] M = np.float32([[1, 0, 0], [0, 1, -offset]]) out = cv2.warpAffine( @@ -252,6 +265,8 @@ def posterize_func(img, bits): def shear_y_func(img, factor, fill=(0, 0, 0)): + import cv2 + H, W = img.shape[0], img.shape[1] M = np.float32([[1, 0, 0], [factor, 1, 0]]) out = cv2.warpAffine( diff --git a/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js b/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js index 6c769c6e1f..df4120b932 100644 --- a/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js +++ b/xinference/web/ui/src/scenes/register_model/components/addModelSpecs.js @@ -14,7 +14,6 @@ import React, { useEffect, useState } from 'react' const modelFormatArr = [ { value: 'pytorch', label: 'PyTorch' }, - { value: 'ggmlv3', label: 'GGML' }, { value: 'ggufv2', label: 'GGUF' }, { value: 'gptq', label: 'GPTQ' }, { value: 'awq', label: 'AWQ' }, @@ -63,7 +62,7 @@ const AddModelSpecs = ({ const subPathArr = [] specsDataArr.forEach((item) => { - if (item.model_format !== 'ggmlv3' && item.model_format !== 'ggufv2') { + if (item.model_format !== 'ggufv2') { subPathArr.push(item.model_uri) } else { subPathArr.push(item.model_uri + '/' + item.model_file_name_template) @@ -99,10 +98,7 @@ const AddModelSpecs = ({ let handleQuantization = quantizations if (modelFormat === 'pytorch') { handleQuantization = ['none'] - } else if ( - handleQuantization[0] === '' && - (modelFormat === 'ggmlv3' || modelFormat === 'ggufv2') - ) { + } else if (handleQuantization[0] === '' && modelFormat === 'ggufv2') { handleQuantization = ['default'] } @@ -140,10 +136,7 @@ const AddModelSpecs = ({ const handleUpdateSpecsArr = (index, type, newValue) => { if (type === 'model_format') { const subPathArr = [...pathArr] - if ( - specsArr[index].model_format !== 'ggmlv3' && - specsArr[index].model_format !== 'ggufv2' - ) { + if (specsArr[index].model_format !== 'ggufv2') { pathArr[index] = specsArr[index].model_uri } else { pathArr[index] = @@ -160,7 +153,7 @@ const AddModelSpecs = ({ if (type === 'quantizations') { return { ...item, [type]: [newValue] } } else if (type === 'model_format') { - if (newValue === 'ggmlv3' || newValue === 'ggufv2') { + if (newValue === 'ggufv2') { const { baseDir, filename } = getPathComponents(pathArr[index]) const obj = { ...item, @@ -185,10 +178,7 @@ const AddModelSpecs = ({ const subPathArr = [...pathArr] subPathArr[index] = newValue setPathArr(subPathArr) - if ( - item.model_format === 'ggmlv3' || - item.model_format === 'ggufv2' - ) { + if (item.model_format === 'ggufv2') { const { baseDir, filename } = getPathComponents(newValue) const obj = { ...item, @@ -313,14 +303,14 @@ const AddModelSpecs = ({ label="Model Path" size="small" value={ - item.model_format !== 'ggmlv3' && item.model_format !== 'ggufv2' + item.model_format !== 'ggufv2' ? item.model_uri : item.model_uri + '/' + item.model_file_name_template } onChange={(e) => { handleUpdateSpecsArr(index, 'model_uri', e.target.value) }} - helperText="For PyTorch, provide the model directory. For GGML/GGUF, provide the model file path." + helperText="For PyTorch, provide the model directory. For GGUF, provide the model file path." /> <Box padding="15px"></Box> @@ -369,8 +359,7 @@ const AddModelSpecs = ({ : '' } /> - {item.model_format !== 'ggmlv3' && - item.model_format !== 'ggufv2' && + {item.model_format !== 'ggufv2' && quantizationAlertId.includes(item.id) && item.quantizations[0] == '' && ( <Alert severity="error"> From e4d225774dc7a9a9260396bf833e03a1df8e8a92 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:10:38 +0800 Subject: [PATCH 263/298] Feat: Support internvl2 and internvl stream (#2079) --- xinference/model/llm/__init__.py | 4 +- xinference/model/llm/llm_family.json | 185 +++++- .../model/llm/llm_family_modelscope.json | 182 +++++- xinference/model/llm/transformers/core.py | 2 +- .../model/llm/transformers/intern_vl.py | 601 ++++++++++-------- xinference/model/llm/transformers/utils.py | 1 - xinference/model/llm/utils.py | 72 ++- xinference/model/llm/vllm/core.py | 109 +++- xinference/thirdparty/internvl/__init__.py | 0 .../thirdparty/internvl/conversation.py | 393 ++++++++++++ 10 files changed, 1278 insertions(+), 271 deletions(-) create mode 100644 xinference/thirdparty/internvl/__init__.py create mode 100644 xinference/thirdparty/internvl/conversation.py diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 7b41e0b776..6d06b0ecaa 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -127,7 +127,7 @@ def _install(): from .transformers.minicpmv26 import MiniCPMV26Model from .transformers.qwen_vl import QwenVLChatModel from .transformers.yi_vl import YiVLChatModel - from .vllm.core import VLLMChatModel, VLLMModel + from .vllm.core import VLLMChatModel, VLLMModel, VLLMVisionModel try: from .transformers.omnilmm import OmniLMMModel @@ -145,7 +145,7 @@ def _install(): ] ) SGLANG_CLASSES.extend([SGLANGModel, SGLANGChatModel]) - VLLM_CLASSES.extend([VLLMModel, VLLMChatModel]) + VLLM_CLASSES.extend([VLLMModel, VLLMChatModel, VLLMVisionModel]) MLX_CLASSES.extend([MLXModel, MLXChatModel]) TRANSFORMERS_CLASSES.extend( [ diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 066c1d77a9..dafba3aa42 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -7083,32 +7083,195 @@ "model_format": "pytorch", "model_size_in_billions": 2, "quantizations": [ - "none" + "4-bit", + "8-bit", + "none" ], "model_id": "OpenGVLab/Mini-InternVL-Chat-2B-V1-5", - "model_revision": "ce3f67acff17281bacbf4b156f402a0580fb9605" + "model_revision": "ecbbd21dcf38caa74d925967b997167b0c7b3f47" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 4, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "OpenGVLab/Mini-InternVL-Chat-4B-V1-5", + "model_revision": "ce1559ddf9d87f5130aa5233b0e93b95e4e4161a" }, { "model_format": "pytorch", "model_size_in_billions": 26, "quantizations": [ - "none" + "4-bit", + "8-bit", + "none" ], "model_id": "OpenGVLab/InternVL-Chat-V1-5", - "model_revision": "e822119e5806946ce128043023a73d715ecabf8d" + "model_revision": "9db32d9127cac0c85961e169d75da57a18a847b1" + } + ], + "prompt_style": { + "style_name": "INTERNVL", + "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "stop_token_ids": [ + 2, + 92543, + 92542 + ], + "stop": [ + "</s>", + "<|im_end|>", + "<|im_start|>" + ] + } + }, + { + "version": 1, + "context_length": 32768, + "model_name": "internvl2", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "InternVL 2 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. ", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 1, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "OpenGVLab/InternVL2-1B", + "model_revision": "a9fc14aea824b6ea1d44f8778cad6b35512c4ce1" }, { "model_format": "pytorch", + "model_size_in_billions": 2, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "OpenGVLab/InternVL2-2B", + "model_revision": "422ad7c6335917bfb514958233955512338485a6" + }, + { + "model_format": "awq", + "model_size_in_billions": 2, + "quantizations": [ + "Int4" + ], + "model_id": "OpenGVLab/InternVL2-2B-AWQ", + "model_revision": "701bc3fc098a8a3b686b3b4135cfb77202be89e0" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 4, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "OpenGVLab/InternVL2-4B", + "model_revision": "b50544dafada6c41e80bfde2f57cc9b0140fc21c" + }, + { + "model_format": "awq", + "model_size_in_billions": 4, + "quantizations": [ + "Int4" + ], + "model_id": "OpenGVLab/InternVL2-8B-AWQ", + "model_revision": "9f1a4756b7ae18eb26d8a22b618dfc283e8193b3" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "OpenGVLab/InternVL2-8B", + "model_revision": "3bfd3664dea4f3da628785f5125d30f889701253" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 26, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "OpenGVLab/InternVL2-26B", + "model_revision": "b9f3c7e6d575b0115e076a3ffc46fd20b7586899" + }, + { + "model_format": "awq", "model_size_in_billions": 26, "quantizations": [ - "Int8" + "Int4" + ], + "model_id": "OpenGVLab/InternVL2-26B-AWQ", + "model_revision": "469e0019ffd251e22ff6501a5c2321964e86ef0d" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 40, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "OpenGVLab/InternVL2-40B", + "model_revision": "725a12063bb855c966e30a0617d0ccd9e870d772" + }, + { + "model_format": "awq", + "model_size_in_billions": 40, + "quantizations": [ + "Int4" + ], + "model_id": "OpenGVLab/InternVL2-40B-AWQ", + "model_revision": "d92e140f6dfe8ea9679924c6a31898f42c4e1846" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 76, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "OpenGVLab/InternVL2-Llama3-76B", + "model_revision": "cf7914905f78e9e3560ddbd6f5dfc39becac494f" + }, + { + "model_format": "awq", + "model_size_in_billions": 76, + "quantizations": [ + "Int4" ], - "model_id": "OpenGVLab/InternVL-Chat-V1-5-{quantization}", - "model_revision": "acaaed06937c603ab04f084216ecb0268160f538" + "model_id": "OpenGVLab/InternVL2-Llama3-76B-AWQ", + "model_revision": "1bc796bf80f2ebc7d6a14c15f55217a4600d50a4" } ], "prompt_style": { - "style_name": "INTERNLM2", + "style_name": "INTERNVL", "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", "roles": [ "<|im_start|>user", @@ -7116,10 +7279,14 @@ ], "intra_message_sep": "<|im_end|>", "stop_token_ids": [ + 2, + 92543, 92542 ], "stop": [ - "<|im_end|>" + "</s>", + "<|im_end|>", + "<|im_start|>" ] } }, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index ba9ec1cbb2..b9eae2252d 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -4709,25 +4709,187 @@ "model_format": "pytorch", "model_size_in_billions": 26, "quantizations": [ - "none" + "4-bit", + "8-bit", + "none" ], - "model_hub": "modelscope", - "model_id": "AI-ModelScope/InternVL-Chat-V1-5", + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL-Chat-V1-5", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "INTERNVL", + "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", + "roles": [ + "<|im_start|>user", + "<|im_start|>assistant" + ], + "intra_message_sep": "<|im_end|>", + "stop_token_ids": [ + 2, + 92543, + 92542 + ], + "stop": [ + "</s>", + "<|im_end|>", + "<|im_start|>" + ] + } + }, + { + "version": 1, + "context_length": 32768, + "model_name": "internvl2", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "InternVL 2 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. ", + "model_specs": [ + + { + "model_format": "pytorch", + "model_size_in_billions": 1, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-1B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 2, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-2B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 2, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-2B-AWQ", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 4, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-4B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-8B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 8, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-8B-AWQ", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 26, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-26B", "model_revision": "master" }, { "model_format": "pytorch", "model_size_in_billions": 26, "quantizations": [ - "Int8" + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-26B-AWQ", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 40, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-40B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 40, + "quantizations": [ + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-40B-AWQ", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 76, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-Llama3-76B", + "model_revision": "master" + }, + { + "model_format": "pytorch", + "model_size_in_billions": 76, + "quantizations": [ + "none" ], - "model_hub": "modelscope", - "model_id": "AI-ModelScope/InternVL-Chat-V1-5-{quantization}", + "model_hub": "modelscope", + "model_id": "OpenGVLab/InternVL2-Llama3-76B-AWQ", "model_revision": "master" } ], "prompt_style": { - "style_name": "INTERNLM2", + "style_name": "INTERNVL", "system_prompt": "You are InternLM (书生·浦语), a helpful, honest, and harmless AI assistant developed by Shanghai AI Laboratory (上海人工智能实验室).", "roles": [ "<|im_start|>user", @@ -4735,10 +4897,14 @@ ], "intra_message_sep": "<|im_end|>", "stop_token_ids": [ + 2, + 92543, 92542 ], "stop": [ - "<|im_end|>" + "</s>", + "<|im_end|>", + "<|im_start|>" ] } }, diff --git a/xinference/model/llm/transformers/core.py b/xinference/model/llm/transformers/core.py index 7e7bc609b6..60d35c19d2 100644 --- a/xinference/model/llm/transformers/core.py +++ b/xinference/model/llm/transformers/core.py @@ -61,7 +61,7 @@ "yi-vl-chat", "deepseek-vl-chat", "internvl-chat", - "mini-internvl-chat", + "internvl2", "cogvlm2", "MiniCPM-Llama3-V-2_5", "MiniCPM-V-2.6", diff --git a/xinference/model/llm/transformers/intern_vl.py b/xinference/model/llm/transformers/intern_vl.py index d9155f3b4b..dedac5b1bd 100644 --- a/xinference/model/llm/transformers/intern_vl.py +++ b/xinference/model/llm/transformers/intern_vl.py @@ -11,28 +11,25 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import base64 import logging import time import uuid from concurrent.futures import ThreadPoolExecutor -from io import BytesIO -from typing import Dict, Iterator, List, Optional, Tuple, Union +from typing import Dict, Iterator, List, Optional, Union -import requests import torch -from PIL import Image -from ....model.utils import select_device from ....types import ( ChatCompletion, ChatCompletionChunk, ChatCompletionMessage, Completion, CompletionChoice, + CompletionChunk, CompletionUsage, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import _decode_image from .core import PytorchChatModel, PytorchGenerateConfig logger = logging.getLogger(__name__) @@ -41,6 +38,142 @@ IMAGENET_STD = (0.229, 0.224, 0.225) +def _message_content_to_intern(content, image_cnt): + if not isinstance(content, str): + texts = [] + image_urls = [] + for c in content: + c_type = c.get("type") + if c_type == "text": + texts.append(c["text"]) + elif c_type == "image_url": + image_urls.append(c["image_url"]["url"]) + image_futures = [] + with ThreadPoolExecutor() as executor: + for image_url in image_urls: + fut = executor.submit(_decode_image, image_url) + image_futures.append(fut) + images = [fut.result() for fut in image_futures] + prefix = "" + for i, _ in enumerate(images): + prefix += f"Image-{image_cnt + i + 1}: <image>\n\n" + text = prefix + " ".join(texts) + if len(images) == 0: + return text, [] + else: + return text, images + return content, [] + + +def _get_prompt_and_chat_history( + prompt: Union[str, List[Dict]], + chat_history: Optional[List[ChatCompletionMessage]] = None, +): + # Convert openai history to intern vl history + images = [] + history = [] + image_cnt = 0 + for h1, h2 in zip(*[iter(chat_history or [])] * 2): + content1, img = _message_content_to_intern(h1["content"], image_cnt) + content2, _ = _message_content_to_intern(h2["content"], image_cnt) + history.append([content1, content2]) + images.extend(img) + image_cnt += len(img) + + question, img = _message_content_to_intern(prompt, image_cnt) + images.extend(img) + return question, history, images + + +def _build_transform(input_size=448): + import torchvision.transforms as T + from torchvision.transforms.functional import InterpolationMode + + MEAN, STD = IMAGENET_MEAN, IMAGENET_STD + transform = T.Compose( + [ + T.Lambda(lambda img: img.convert("RGB") if img.mode != "RGB" else img), + T.Resize((input_size, input_size), interpolation=InterpolationMode.BICUBIC), + T.ToTensor(), + T.Normalize(mean=MEAN, std=STD), + ] + ) + return transform + + +def _find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size): + best_ratio_diff = float("inf") + best_ratio = (1, 1) + area = width * height + for ratio in target_ratios: + target_aspect_ratio = ratio[0] / ratio[1] + ratio_diff = abs(aspect_ratio - target_aspect_ratio) + if ratio_diff < best_ratio_diff: + best_ratio_diff = ratio_diff + best_ratio = ratio + elif ratio_diff == best_ratio_diff: + if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]: + best_ratio = ratio + return best_ratio + + +def _dynamic_preprocess( + image, min_num=1, max_num=12, image_size=448, use_thumbnail=False +): + orig_width, orig_height = image.size + aspect_ratio = orig_width / orig_height + + # calculate the existing image aspect ratio + target_ratios = set( + (i, j) + for n in range(min_num, max_num + 1) + for i in range(1, n + 1) + for j in range(1, n + 1) + if i * j <= max_num and i * j >= min_num + ) + target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1]) + + # find the closest aspect ratio to the target + target_aspect_ratio = _find_closest_aspect_ratio( + aspect_ratio, target_ratios, orig_width, orig_height, image_size + ) + + # calculate the target width and height + target_width = image_size * target_aspect_ratio[0] + target_height = image_size * target_aspect_ratio[1] + blocks = target_aspect_ratio[0] * target_aspect_ratio[1] + + # resize the image + resized_img = image.resize((target_width, target_height)) + processed_images = [] + for i in range(blocks): + box = ( + (i % (target_width // image_size)) * image_size, + (i // (target_width // image_size)) * image_size, + ((i % (target_width // image_size)) + 1) * image_size, + ((i // (target_width // image_size)) + 1) * image_size, + ) + # split the image + split_img = resized_img.crop(box) + processed_images.append(split_img) + assert len(processed_images) == blocks + if use_thumbnail and len(processed_images) != 1: + thumbnail_img = image.resize((image_size, image_size)) + processed_images.append(thumbnail_img) + return processed_images + + +def _load_image(image_file, input_size=448, max_num=12): + image = image_file.convert("RGB") + transform = _build_transform(input_size=input_size) + images = _dynamic_preprocess( + image, image_size=input_size, use_thumbnail=True, max_num=max_num + ) + pixel_values = [transform(image) for image in images] + pixel_values = torch.stack(pixel_values) + return pixel_values + + class InternVLChatModel(PytorchChatModel): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -52,249 +185,89 @@ def match( cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str ) -> bool: family = model_family.model_family or model_family.model_name - if "internvl" in family.lower(): - return True - return False + if "internvl" not in family.lower(): + return False + if "pytorch" not in model_spec.model_format: + return False + return True def _get_model_class(self): from transformers import AutoModel return AutoModel + # Copy from InternVL page + # reference: https://huggingface.co/OpenGVLab/InternVL2-8B + def _split_model(self): + import math + + device_map = {} + world_size = torch.cuda.device_count() + # single gpu + if world_size == 1: + return None + model_size = f"{self.model_spec.model_size_in_billions}B" + num_layers = { + "1B": 24, + "2B": 24, + "4B": 32, + "8B": 32, + "26B": 48, + "40B": 60, + "76B": 80, + }[model_size] + # Since the first GPU will be used for ViT, treat it as half a GPU. + num_layers_per_gpu = math.ceil(num_layers / (world_size - 0.5)) + num_layers_per_gpu = [num_layers_per_gpu] * world_size + num_layers_per_gpu[0] = math.ceil(num_layers_per_gpu[0] * 0.5) + layer_cnt = 0 + for i, num_layer in enumerate(num_layers_per_gpu): + for j in range(num_layer): + device_map[f"language_model.model.layers.{layer_cnt}"] = i + layer_cnt += 1 + device_map["vision_model"] = 0 + device_map["mlp1"] = 0 + device_map["language_model.model.tok_embeddings"] = 0 + device_map["language_model.model.embed_tokens"] = 0 + device_map["language_model.output"] = 0 + device_map["language_model.model.norm"] = 0 + device_map["language_model.lm_head"] = 0 + device_map[f"language_model.model.layers.{num_layers - 1}"] = 0 + return device_map + def load(self, **kwargs): from transformers import AutoModel, AutoTokenizer - from transformers.generation import GenerationConfig if self._check_tensorizer_integrity(): self._model, self._tokenizer = self._load_tensorizer() return - device = self._pytorch_model_config.get("device", "auto") - device = select_device(device) - # for multiple GPU, set back to auto to make multiple devices work - device = "auto" if device == "cuda" else device - - self._tokenizer = AutoTokenizer.from_pretrained( - self.model_path, - trust_remote_code=True, - ) + device = self._split_model() kwargs = { "torch_dtype": torch.bfloat16, "low_cpu_mem_usage": True, "trust_remote_code": True, - "device_map": device, } - if "int8" in self.quantization.lower(): + if device is not None: + kwargs["device_map"] = device + + if "8-bit" in self.quantization.lower(): kwargs["load_in_8bit"] = True - elif 2 == self.model_spec.model_size_in_billions: - kwargs.pop("device_map") + elif "4-bit" in self.quantization.lower(): + kwargs["load_in_4bit"] = True self._model = AutoModel.from_pretrained(self.model_path, **kwargs).eval() - if "int8" not in self.quantization.lower(): + if device is None and "none" in self.quantization.lower(): self._model.cuda() - # Specify hyperparameters for generation - self._model.generation_config = GenerationConfig.from_pretrained( + self._tokenizer = AutoTokenizer.from_pretrained( self.model_path, trust_remote_code=True, + use_fast=False, ) - self._save_tensorizer() - - def _message_content_to_intern(self, content): - def _load_image(_url): - if _url.startswith("data:"): - logging.info("Parse url by base64 decoder.") - # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images - # e.g. f"data:image/jpeg;base64,{base64_image}" - _type, data = _url.split(";") - _, ext = _type.split("/") - data = data[len("base64,") :] - data = base64.b64decode(data.encode("utf-8")) - return Image.open(BytesIO(data)).convert("RGB") - else: - try: - response = requests.get(_url) - except requests.exceptions.MissingSchema: - return Image.open(_url).convert("RGB") - else: - return Image.open(BytesIO(response.content)).convert("RGB") - - if not isinstance(content, str): - texts = [] - image_urls = [] - for c in content: - c_type = c.get("type") - if c_type == "text": - texts.append(c["text"]) - elif c_type == "image_url": - image_urls.append(c["image_url"]["url"]) - image_futures = [] - with ThreadPoolExecutor() as executor: - for image_url in image_urls: - fut = executor.submit(_load_image, image_url) - image_futures.append(fut) - images = [fut.result() for fut in image_futures] - text = " ".join(texts) - if len(images) == 0: - return text, None - else: - return text, images - return content, None - - def _history_content_to_intern( - self, - chat_history: List[ChatCompletionMessage], - IMG_START_TOKEN="<img>", - IMG_END_TOKEN="</img>", - IMG_CONTEXT_TOKEN="<IMG_CONTEXT>", - ): - def _image_to_piexl_values(images): - load_images = [] - for image in images: - if image.startswith("data:"): - logging.info("Parse url by base64 decoder.") - # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images - # e.g. f"data:image/jpeg;base64,{base64_image}" - _type, data = image.split(";") - _, ext = _type.split("/") - data = data[len("base64,") :] - data = base64.b64decode(data.encode("utf-8")) - img = Image.open(BytesIO(data)).convert("RGB") - pixel_value = ( - self._load_image(img, max_num=6).to(torch.bfloat16).cuda() - ) - load_images.append(pixel_value) - else: - try: - response = requests.get(image) - except requests.exceptions.MissingSchema: - img = Image.open(image).convert("RGB") - else: - img = Image.open(BytesIO(response.content)).convert("RGB") - pixel_value = ( - self._load_image(img, max_num=6).to(torch.bfloat16).cuda() - ) - load_images.append(pixel_value) - return torch.cat(tuple(load_images), dim=0) - - history: List[Tuple] = [] - pixel_values = None - for i in range(0, len(chat_history), 2): - tmp = [] - images: List[str] = [] - user = chat_history[i]["content"] - if isinstance(user, List): - for content in user: - c_type = content.get("type") - if c_type == "text": - tmp.append(content["text"]) - elif c_type == "image_url" and not history: - images.append(content["image_url"]["url"]) - if not history: - pixel_values = _image_to_piexl_values(images) - image_bs = pixel_values.shape[0] - image_tokens = ( - IMG_START_TOKEN - + IMG_CONTEXT_TOKEN * self._model.num_image_token * image_bs - + IMG_END_TOKEN - ) - tmp[0] = image_tokens + "\n" + tmp[0] - else: - tmp.append(user) - tmp.append(chat_history[i + 1]["content"]) - history.append(tuple(tmp)) - return history, pixel_values - - def _find_closest_aspect_ratio( - self, aspect_ratio, target_ratios, width, height, image_size - ): - best_ratio_diff = float("inf") - best_ratio = (1, 1) - area = width * height - for ratio in target_ratios: - target_aspect_ratio = ratio[0] / ratio[1] - ratio_diff = abs(aspect_ratio - target_aspect_ratio) - if ratio_diff < best_ratio_diff: - best_ratio_diff = ratio_diff - best_ratio = ratio - elif ratio_diff == best_ratio_diff: - if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]: - best_ratio = ratio - return best_ratio - - def _dynamic_preprocess( - self, image, min_num=1, max_num=6, image_size=448, use_thumbnail=False - ): - orig_width, orig_height = image.size - aspect_ratio = orig_width / orig_height - - # calculate the existing image aspect ratio - target_ratios = set( - (i, j) - for n in range(min_num, max_num + 1) - for i in range(1, n + 1) - for j in range(1, n + 1) - if i * j <= max_num and i * j >= min_num - ) - target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1]) - - # find the closest aspect ratio to the target - target_aspect_ratio = self._find_closest_aspect_ratio( - aspect_ratio, target_ratios, orig_width, orig_height, image_size - ) - - # calculate the target width and height - target_width = image_size * target_aspect_ratio[0] - target_height = image_size * target_aspect_ratio[1] - blocks = target_aspect_ratio[0] * target_aspect_ratio[1] - - # resize the image - resized_img = image.resize((target_width, target_height)) - processed_images = [] - for i in range(blocks): - box = ( - (i % (target_width // image_size)) * image_size, - (i // (target_width // image_size)) * image_size, - ((i % (target_width // image_size)) + 1) * image_size, - ((i // (target_width // image_size)) + 1) * image_size, - ) - # split the image - split_img = resized_img.crop(box) - processed_images.append(split_img) - assert len(processed_images) == blocks - if use_thumbnail and len(processed_images) != 1: - thumbnail_img = image.resize((image_size, image_size)) - processed_images.append(thumbnail_img) - return processed_images - - def _build_transform(self, input_size): - import torchvision.transforms as T - from torchvision.transforms.functional import InterpolationMode - - MEAN, STD = IMAGENET_MEAN, IMAGENET_STD - transform = T.Compose( - [ - T.Lambda(lambda img: img.convert("RGB") if img.mode != "RGB" else img), - T.Resize( - (input_size, input_size), interpolation=InterpolationMode.BICUBIC - ), - T.ToTensor(), - T.Normalize(mean=MEAN, std=STD), - ] - ) - return transform - - def _load_image(self, image_file, input_size=448, max_num=6): - transform = self._build_transform(input_size=input_size) - images = self._dynamic_preprocess( - image_file, image_size=input_size, use_thumbnail=True, max_num=max_num - ) - pixel_values = [transform(image) for image in images] - pixel_values = torch.stack(pixel_values) - return pixel_values def chat( self, @@ -303,38 +276,108 @@ def chat( chat_history: Optional[List[ChatCompletionMessage]] = None, generate_config: Optional[PytorchGenerateConfig] = None, ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: - if generate_config and generate_config.get("stream"): - raise Exception( - f"Chat with model {self.model_family.model_name} does not support stream." - ) - sanitized_config = { - "num_beams": 1, - "max_new_tokens": generate_config.get("max_tokens", 512) + from ....thirdparty.internvl.conversation import get_conv_template + + IMG_START_TOKEN = "<img>" + IMG_END_TOKEN = "</img>" + IMG_CONTEXT_TOKEN = "<IMG_CONTEXT>" + + generation_config = { + "max_new_tokens": generate_config.get("max_tokens", 1024) if generate_config - else 512, + else 1024, "do_sample": False, } - content, image = self._message_content_to_intern(prompt) + stream = ( + generate_config.get("stream", False) + if isinstance(generate_config, dict) + else False + ) + stream_options = ( + generate_config.get("stream_options", None) + if isinstance(generate_config, dict) + else False + ) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) + + content, history, images = _get_prompt_and_chat_history(prompt, chat_history) - history = None - if chat_history: - history, pixel_values = self._history_content_to_intern(chat_history) + num_patches_list = [] + if len(images) == 1: + content = content.replace("Image-1: <image>\n\n", "<image>\n") + history = [ + [item[0].replace("Image-1: <image>\n\n", "<image>\n"), item[1]] + for item in history + ] + pixel_values = _load_image(images[-1], max_num=12).to(torch.bfloat16).cuda() + num_patches_list = ( + [pixel_values.shape[0]] if pixel_values is not None else [] + ) + elif len(images) > 1: + pixel_values = [ + _load_image(img, max_num=12).to(torch.bfloat16).cuda() for img in images + ] + num_patches_list = [values.size(0) for values in pixel_values] + pixel_values = torch.cat(pixel_values, dim=0) else: - load_images = [] - for img in image: - pixel_value = self._load_image(img, max_num=6).to(torch.bfloat16).cuda() - load_images.append(pixel_value) - pixel_values = torch.cat(tuple(load_images), dim=0) - - response, history = self._model.chat( - self._tokenizer, - pixel_values, - content, - sanitized_config, - history=history, - return_history=True, - ) + pixel_values = None + + assert pixel_values is None or len(pixel_values) == sum(num_patches_list) + + img_context_token_id = self._tokenizer.convert_tokens_to_ids(IMG_CONTEXT_TOKEN) + self._model.img_context_token_id = img_context_token_id + + template = get_conv_template(self._model.template) + template.system_message = self._model.system_message + eos_token_id = self._tokenizer.convert_tokens_to_ids(template.sep) + + history = [] if history is None else history + for old_question, old_answer in history: + template.append_message(template.roles[0], old_question) + template.append_message(template.roles[1], old_answer) + template.append_message(template.roles[0], content) + template.append_message(template.roles[1], None) + query = template.get_prompt() + + for num_patches in num_patches_list: + image_tokens = ( + IMG_START_TOKEN + + IMG_CONTEXT_TOKEN * self._model.num_image_token * num_patches + + IMG_END_TOKEN + ) + query = query.replace("<image>", image_tokens, 1) + + model_inputs = self._tokenizer(query, return_tensors="pt") + input_ids = model_inputs["input_ids"].cuda() + attention_mask = model_inputs["attention_mask"].cuda() + generation_config["eos_token_id"] = eos_token_id + generate_kwargs = { + "pixel_values": pixel_values, + "input_ids": input_ids, + "attention_mask": attention_mask, + } + generate_kwargs.update(generation_config) + + if stream: + chunk = self._generate_stream(generate_kwargs, input_ids, include_usage) + return self._to_chat_completion_chunks(chunk) + else: + chunk = self._generate(generate_kwargs, input_ids, template) + return self._to_chat_completion(chunk) + + def _generate(self, generate_kwargs, input_ids, template): + prompt_tokens = len(input_ids[0]) + generation_output = self._model.generate(**generate_kwargs) + completion_tokens = len(generation_output[0]) + response = self._tokenizer.batch_decode( + generation_output, skip_special_tokens=True + )[0] + response = response.split(template.sep)[0].strip() chunk = Completion( id=str(uuid.uuid1()), object="text_completion", @@ -346,7 +389,69 @@ def chat( ) ], usage=CompletionUsage( - prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=prompt_tokens + completion_tokens, ), ) - return self._to_chat_completion(chunk) + return chunk + + def _generate_stream(self, generate_kwargs, input_ids, include_usage): + from threading import Thread + + from transformers import TextIteratorStreamer + + # Initialize the streamer + streamer = TextIteratorStreamer( + self._tokenizer, skip_prompt=True, skip_special_tokens=True, timeout=10 + ) + # Define the generation configuration + generate_kwargs["streamer"] = streamer + # Start the model chat in a separate thread + thread = Thread( + target=self._model.generate, + kwargs=generate_kwargs, + ) + thread.start() + + completion_id = str(uuid.uuid1()) + prompt_tokens = len(input_ids[0]) + completion_tokens = 0 + # Loop through the streamer to get the new text as it is generated + for i, new_text in enumerate(streamer): + if new_text == self._model.conv_template.sep: + break + completion_choice = CompletionChoice( + text=new_text, index=0, logprobs=None, finish_reason=None + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_tokens = max(completion_tokens, len(streamer.token_cache)) + total_tokens = prompt_tokens + completion_tokens + completion_usage = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + chunk["usage"] = completion_usage + yield chunk + + if include_usage: + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + yield chunk diff --git a/xinference/model/llm/transformers/utils.py b/xinference/model/llm/transformers/utils.py index 5d64604315..5ada9a512c 100644 --- a/xinference/model/llm/transformers/utils.py +++ b/xinference/model/llm/transformers/utils.py @@ -42,7 +42,6 @@ if TYPE_CHECKING: from ...llm.transformers.core import PytorchModel - logger = logging.getLogger(__name__) diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 94024d6e83..2caaa83c71 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -11,14 +11,19 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import base64 import functools import json import logging import os import time import uuid +from io import BytesIO from typing import AsyncGenerator, Dict, Iterator, List, Optional, Tuple, cast +import requests +from PIL import Image + from ...types import ( SPECIAL_TOOL_PROMPT, ChatCompletion, @@ -60,7 +65,7 @@ def get_prompt( chat_history: List[ChatCompletionMessage], prompt_style: PromptStyleV1, tools: Optional[List[Dict]] = None, - ) -> str: + ): """ Inspired by FastChat. Format chat history into a prompt according to the prompty style of different models. @@ -440,6 +445,52 @@ def get_role(role_name: str): else: ret += role return ret + elif prompt_style.style_name == "INTERNVL": + ret = ( + "<s>" + if prompt_style.system_prompt == "" + else "<s><|im_start|>system\n" + + prompt_style.system_prompt + + prompt_style.intra_message_sep + + "\n" + ) + images = [] # type: ignore + for message in chat_history: + role = get_role(message["role"]) + content = message["content"] + if isinstance(content, str): + ret += role + "\n" + content + prompt_style.intra_message_sep + "\n" + elif isinstance(content, list): + text = "" + image_urls = [] + for c in content: + c_type = c.get("type") + if c_type == "text": + text = c["text"] + elif c_type == "image_url": + image_urls.append(c["image_url"]["url"]) + image_futures = [] + from concurrent.futures import ThreadPoolExecutor + + with ThreadPoolExecutor() as executor: + for image_url in image_urls: + fut = executor.submit(_decode_image, image_url) + image_futures.append(fut) + images = [fut.result() for fut in image_futures] + if len(image_futures) == 0: + ret += ( + role + "\n" + text + prompt_style.intra_message_sep + "\n" + ) + else: + ret += ( + role + + "\n" + + f"<image>\n{text}" + + prompt_style.intra_message_sep + + "\n" + ) + + return (ret, images) else: raise ValueError(f"Invalid prompt style: {prompt_style.style_name}") @@ -821,3 +872,22 @@ def get_model_version( llm_family: LLMFamilyV1, llm_spec: LLMSpecV1, quantization: str ) -> str: return f"{llm_family.model_name}--{llm_spec.model_size_in_billions}B--{llm_spec.model_format}--{quantization}" + + +def _decode_image(_url): + if _url.startswith("data:"): + logging.info("Parse url by base64 decoder.") + # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images + # e.g. f"data:image/jpeg;base64,{base64_image}" + _type, data = _url.split(";") + _, ext = _type.split("/") + data = data[len("base64,") :] + data = base64.b64decode(data.encode("utf-8")) + return Image.open(BytesIO(data)).convert("RGB") + else: + try: + response = requests.get(_url) + except requests.exceptions.MissingSchema: + return Image.open(_url).convert("RGB") + else: + return Image.open(BytesIO(response.content)).convert("RGB") diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 280150f9a3..49a324e5d9 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -21,6 +21,7 @@ import uuid from typing import ( TYPE_CHECKING, + Any, AsyncGenerator, Dict, Iterable, @@ -88,6 +89,9 @@ class VLLMGenerateConfig(TypedDict, total=False): except ImportError: VLLM_INSTALLED = False +VLLM_SUPPORTED_VISION_MODEL_LIST: List[str] = [ + "internvl2", +] VLLM_SUPPORTED_MODELS = [ "llama-2", "llama-3", @@ -413,7 +417,7 @@ def _convert_request_output_to_completion( async def async_generate( self, - prompt: str, + prompt: Union[str, Dict[str, Any]], generate_config: Optional[Dict] = None, tools: object = False, ) -> Union[Completion, AsyncGenerator[CompletionChunk, None]]: @@ -636,3 +640,106 @@ async def async_chat( self.model_family, self.model_uid, c, tools ) return self._to_chat_completion(c) + + +class VLLMVisionModel(VLLMModel, ChatModelMixin): + def load(self): + try: + import vllm + from vllm.engine.arg_utils import AsyncEngineArgs + from vllm.engine.async_llm_engine import AsyncLLMEngine + except ImportError: + error_message = "Failed to import module 'vllm'" + installation_guide = [ + "Please make sure 'vllm' is installed. ", + "You can install it by `pip install vllm`\n", + ] + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + if vllm.__version__ >= "0.3.1": + # from vllm v0.3.1, it uses cupy as NCCL backend + # in which cupy will fork a process + # only for xoscar >= 0.3.0, new process is allowed in subpool + # besides, xinference set start method as forkserver for unix + # we need to set it to fork to make cupy NCCL work + multiprocessing.set_start_method("fork", force=True) + + self._model_config = self._sanitize_model_config(self._model_config) + + logger.info( + f"Loading {self.model_uid} with following model config: {self._model_config}" + ) + + engine_args = AsyncEngineArgs( + model=self.model_path, + **self._model_config, + ) + self._engine = AsyncLLMEngine.from_engine_args(engine_args) + + @classmethod + def match( + cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str + ) -> bool: + if llm_spec.model_format != "pytorch": + return False + if llm_spec.model_format == "pytorch": + if quantization != "none" and not (quantization is None): + return False + if isinstance(llm_family, CustomLLMFamilyV1): + if llm_family.model_family not in VLLM_SUPPORTED_VISION_MODEL_LIST: + return False + else: + if llm_family.model_name not in VLLM_SUPPORTED_VISION_MODEL_LIST: + return False + if "vision" not in llm_family.model_ability: + return False + return VLLM_INSTALLED + + def _sanitize_chat_config( + self, + generate_config: Optional[Dict] = None, + ) -> Dict: + if not generate_config: + generate_config = {} + if self.model_family.prompt_style: + if self.model_family.prompt_style.stop_token_ids: + generate_config.setdefault( + "stop_token_ids", + self.model_family.prompt_style.stop_token_ids.copy(), + ) + return generate_config + + async def async_chat( + self, + prompt: str, + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[Dict] = None, + ) -> Union[ChatCompletion, AsyncGenerator[ChatCompletionChunk, None]]: + # only support single image, waiting vllm support multi images + assert self.model_family.prompt_style is not None + prompt_style = self.model_family.prompt_style.copy() + chat_history = chat_history or [] + prompt, images = self.get_prompt(prompt, chat_history, prompt_style) + logger.info(f"messages:{prompt}") + if len(images) == 0: + inputs = { + "prompt": prompt, + } + else: + inputs = { + "prompt": prompt, + "multi_modal_data": {"image": images[-1]}, # type: ignore + } + generate_config = self._sanitize_chat_config(generate_config) + + stream = generate_config.get("stream", None) + + if stream: + agen = await self.async_generate(inputs, generate_config) + assert isinstance(agen, AsyncGenerator) + return self._async_to_chat_completion_chunks(agen) + else: + c = await self.async_generate(inputs, generate_config) + assert not isinstance(c, AsyncGenerator) + return self._to_chat_completion(c) diff --git a/xinference/thirdparty/internvl/__init__.py b/xinference/thirdparty/internvl/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/internvl/conversation.py b/xinference/thirdparty/internvl/conversation.py new file mode 100644 index 0000000000..2fe37ad08c --- /dev/null +++ b/xinference/thirdparty/internvl/conversation.py @@ -0,0 +1,393 @@ +""" +Conversation prompt templates. + +We kindly request that you import fastchat instead of copying this file if you wish to use it. +If you have changes in mind, please contribute back so the community can benefit collectively and continue to maintain these valuable templates. +""" + +import dataclasses +from enum import IntEnum, auto +from typing import Any, Dict, List, Tuple, Union + + +class SeparatorStyle(IntEnum): + """Separator styles.""" + + ADD_COLON_SINGLE = auto() + ADD_COLON_TWO = auto() + ADD_COLON_SPACE_SINGLE = auto() + NO_COLON_SINGLE = auto() + NO_COLON_TWO = auto() + ADD_NEW_LINE_SINGLE = auto() + LLAMA2 = auto() + CHATGLM = auto() + CHATML = auto() + CHATINTERN = auto() + DOLLY = auto() + RWKV = auto() + PHOENIX = auto() + ROBIN = auto() + FALCON_CHAT = auto() + CHATGLM3 = auto() + INTERNVL_ZH = auto() + MPT = auto() + + +@dataclasses.dataclass +class Conversation: + """A class that manages prompt templates and keeps all conversation history.""" + + # The name of this template + name: str + # The template of the system prompt + system_template: str = '{system_message}' + # The system message + system_message: str = '' + # The names of two roles + roles: Tuple[str] = ('USER', 'ASSISTANT') + # All messages. Each item is (role, message). + messages: List[List[str]] = () + # The number of few shot examples + offset: int = 0 + # The separator style and configurations + sep_style: SeparatorStyle = SeparatorStyle.ADD_COLON_SINGLE + sep: str = '\n' + sep2: str = None + # Stop criteria (the default one is EOS token) + stop_str: Union[str, List[str]] = None + # Stops generation if meeting any token in this list + stop_token_ids: List[int] = None + + def get_prompt(self) -> str: + """Get the prompt for generation.""" + system_prompt = self.system_template.format(system_message=self.system_message) + if self.sep_style == SeparatorStyle.ADD_COLON_SINGLE: + ret = system_prompt + self.sep + for role, message in self.messages: + if message: + ret += role + ': ' + message + self.sep + else: + ret += role + ':' + return ret + elif self.sep_style == SeparatorStyle.ADD_COLON_TWO: + seps = [self.sep, self.sep2] + ret = system_prompt + seps[0] + for i, (role, message) in enumerate(self.messages): + if message: + ret += role + ': ' + message + seps[i % 2] + else: + ret += role + ':' + return ret + elif self.sep_style == SeparatorStyle.ADD_COLON_SPACE_SINGLE: + ret = system_prompt + self.sep + for role, message in self.messages: + if message: + ret += role + ': ' + message + self.sep + else: + ret += role + ': ' # must be end with a space + return ret + elif self.sep_style == SeparatorStyle.ADD_NEW_LINE_SINGLE: + ret = '' if system_prompt == '' else system_prompt + self.sep + for role, message in self.messages: + if message: + ret += role + '\n' + message + self.sep + else: + ret += role + '\n' + return ret + elif self.sep_style == SeparatorStyle.NO_COLON_SINGLE: + ret = system_prompt + for role, message in self.messages: + if message: + ret += role + message + self.sep + else: + ret += role + return ret + elif self.sep_style == SeparatorStyle.NO_COLON_TWO: + seps = [self.sep, self.sep2] + ret = system_prompt + for i, (role, message) in enumerate(self.messages): + if message: + ret += role + message + seps[i % 2] + else: + ret += role + return ret + elif self.sep_style == SeparatorStyle.RWKV: + ret = system_prompt + for i, (role, message) in enumerate(self.messages): + if message: + ret += ( + role + + ': ' + + message.replace('\r\n', '\n').replace('\n\n', '\n') + ) + ret += '\n\n' + else: + ret += role + ':' + return ret + elif self.sep_style == SeparatorStyle.LLAMA2: + seps = [self.sep, self.sep2] + if self.system_message: + ret = system_prompt + else: + ret = '[INST] ' + for i, (role, message) in enumerate(self.messages): + tag = self.roles[i % 2] + if message: + if i == 0: + ret += message + ' ' + else: + ret += tag + ' ' + message + seps[i % 2] + else: + ret += tag + return ret + elif self.sep_style == SeparatorStyle.CHATGLM: + # source: https://huggingface.co/THUDM/chatglm-6b/blob/1d240ba371910e9282298d4592532d7f0f3e9f3e/modeling_chatglm.py#L1302-L1308 + # source2: https://huggingface.co/THUDM/chatglm2-6b/blob/e186c891cf64310ac66ef10a87e6635fa6c2a579/modeling_chatglm.py#L926 + round_add_n = 1 if self.name == 'chatglm2' else 0 + if system_prompt: + ret = system_prompt + self.sep + else: + ret = '' + + for i, (role, message) in enumerate(self.messages): + if i % 2 == 0: + ret += f'[Round {i//2 + round_add_n}]{self.sep}' + + if message: + ret += f'{role}:{message}{self.sep}' + else: + ret += f'{role}:' + return ret + elif self.sep_style == SeparatorStyle.CHATML: + ret = '' if system_prompt == '' else system_prompt + self.sep + '\n' + for role, message in self.messages: + if message: + ret += role + '\n' + message + self.sep + '\n' + else: + ret += role + '\n' + return ret + elif self.sep_style == SeparatorStyle.CHATGLM3: + ret = '' + if self.system_message: + ret += system_prompt + for role, message in self.messages: + if message: + ret += role + '\n' + ' ' + message + else: + ret += role + return ret + elif self.sep_style == SeparatorStyle.CHATINTERN: + # source: https://huggingface.co/internlm/internlm-chat-7b-8k/blob/bd546fa984b4b0b86958f56bf37f94aa75ab8831/modeling_internlm.py#L771 + seps = [self.sep, self.sep2] + ret = system_prompt + for i, (role, message) in enumerate(self.messages): + # if i % 2 == 0: + # ret += "<s>" + if message: + ret += role + ':' + message + seps[i % 2] + '\n' + else: + ret += role + ':' + return ret + elif self.sep_style == SeparatorStyle.DOLLY: + seps = [self.sep, self.sep2] + ret = system_prompt + for i, (role, message) in enumerate(self.messages): + if message: + ret += role + ':\n' + message + seps[i % 2] + if i % 2 == 1: + ret += '\n\n' + else: + ret += role + ':\n' + return ret + elif self.sep_style == SeparatorStyle.PHOENIX: + ret = system_prompt + for role, message in self.messages: + if message: + ret += role + ': ' + '<s>' + message + '</s>' + else: + ret += role + ': ' + '<s>' + return ret + elif self.sep_style == SeparatorStyle.ROBIN: + ret = system_prompt + self.sep + for role, message in self.messages: + if message: + ret += role + ':\n' + message + self.sep + else: + ret += role + ':\n' + return ret + elif self.sep_style == SeparatorStyle.FALCON_CHAT: + ret = '' + if self.system_message: + ret += system_prompt + self.sep + for role, message in self.messages: + if message: + ret += role + ': ' + message + self.sep + else: + ret += role + ':' + + return ret + elif self.sep_style == SeparatorStyle.INTERNVL_ZH: + seps = [self.sep, self.sep2] + ret = self.system_message + seps[0] + for i, (role, message) in enumerate(self.messages): + if message: + ret += role + ': ' + message + seps[i % 2] + else: + ret += role + ':' + return ret + elif self.sep_style == SeparatorStyle.MPT: + ret = system_prompt + self.sep + for role, message in self.messages: + if message: + if type(message) is tuple: + message, _, _ = message + ret += role + message + self.sep + else: + ret += role + return ret + else: + raise ValueError(f'Invalid style: {self.sep_style}') + + def set_system_message(self, system_message: str): + """Set the system message.""" + self.system_message = system_message + + def append_message(self, role: str, message: str): + """Append a new message.""" + self.messages.append([role, message]) + + def update_last_message(self, message: str): + """Update the last output. + + The last message is typically set to be None when constructing the prompt, + so we need to update it in-place after getting the response from a model. + """ + self.messages[-1][1] = message + + def to_gradio_chatbot(self): + """Convert the conversation to gradio chatbot format.""" + ret = [] + for i, (role, msg) in enumerate(self.messages[self.offset :]): + if i % 2 == 0: + ret.append([msg, None]) + else: + ret[-1][-1] = msg + return ret + + def to_openai_api_messages(self): + """Convert the conversation to OpenAI chat completion format.""" + ret = [{'role': 'system', 'content': self.system_message}] + + for i, (_, msg) in enumerate(self.messages[self.offset :]): + if i % 2 == 0: + ret.append({'role': 'user', 'content': msg}) + else: + if msg is not None: + ret.append({'role': 'assistant', 'content': msg}) + return ret + + def copy(self): + return Conversation( + name=self.name, + system_template=self.system_template, + system_message=self.system_message, + roles=self.roles, + messages=[[x, y] for x, y in self.messages], + offset=self.offset, + sep_style=self.sep_style, + sep=self.sep, + sep2=self.sep2, + stop_str=self.stop_str, + stop_token_ids=self.stop_token_ids, + ) + + def dict(self): + return { + 'template_name': self.name, + 'system_message': self.system_message, + 'roles': self.roles, + 'messages': self.messages, + 'offset': self.offset, + } + + +# A global registry for all conversation templates +conv_templates: Dict[str, Conversation] = {} + + +def register_conv_template(template: Conversation, override: bool = False): + """Register a new conversation template.""" + if not override: + assert ( + template.name not in conv_templates + ), f'{template.name} has been registered.' + + conv_templates[template.name] = template + + +def get_conv_template(name: str) -> Conversation: + """Get a conversation template.""" + return conv_templates[name].copy() + + +# Both Hermes-2 and internlm2-chat are chatml-format conversation templates. The difference +# is that during training, the preprocessing function for the Hermes-2 template doesn't add +# <s> at the beginning of the tokenized sequence, while the internlm2-chat template does. +# Therefore, they are completely equivalent during inference. +register_conv_template( + Conversation( + name='Hermes-2', + system_template='<|im_start|>system\n{system_message}', + # note: The new system prompt was not used here to avoid changes in benchmark performance. + # system_message='我是书生·万象,英文名是InternVL,是由上海人工智能实验室、清华大学及多家合作单位联合开发的多模态大语言模型。', + system_message='你是由上海人工智能实验室联合商汤科技开发的书生多模态大模型,英文名叫InternVL, 是一个有用无害的人工智能助手。', + roles=('<|im_start|>user\n', '<|im_start|>assistant\n'), + sep_style=SeparatorStyle.MPT, + sep='<|im_end|>', + stop_token_ids=[ + 2, + 6, + 7, + 8, + ], + stop_str='<|endoftext|>', + ) +) + + +register_conv_template( + Conversation( + name='internlm2-chat', + system_template='<|im_start|>system\n{system_message}', + # note: The new system prompt was not used here to avoid changes in benchmark performance. + # system_message='我是书生·万象,英文名是InternVL,是由上海人工智能实验室、清华大学及多家合作单位联合开发的多模态大语言模型。', + system_message='你是由上海人工智能实验室联合商汤科技开发的书生多模态大模型,英文名叫InternVL, 是一个有用无害的人工智能助手。', + roles=('<|im_start|>user\n', '<|im_start|>assistant\n'), + sep_style=SeparatorStyle.MPT, + sep='<|im_end|>', + stop_token_ids=[ + 2, + 92543, + 92542 + ] + ) +) + + +register_conv_template( + Conversation( + name='phi3-chat', + system_template='<|system|>\n{system_message}', + # note: The new system prompt was not used here to avoid changes in benchmark performance. + # system_message='我是书生·万象,英文名是InternVL,是由上海人工智能实验室、清华大学及多家合作单位联合开发的多模态大语言模型。', + system_message='你是由上海人工智能实验室联合商汤科技开发的书生多模态大模型,英文名叫InternVL, 是一个有用无害的人工智能助手。', + roles=('<|user|>\n', '<|assistant|>\n'), + sep_style=SeparatorStyle.MPT, + sep='<|end|>', + stop_token_ids=[ + 2, + 32000, + 32007 + ] + ) +) From 466f1630f59003e9908ae6c786e426b54f69a23c Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Sat, 17 Aug 2024 09:22:50 +0200 Subject: [PATCH 264/298] FEAT: ChatTTS speech voice support encoded speaker str (#2096) --- xinference/model/audio/chattts.py | 33 ++++++++++++++------ xinference/model/audio/tests/test_chattts.py | 11 +++++++ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/xinference/model/audio/chattts.py b/xinference/model/audio/chattts.py index 3abd7869cd..8f866f429b 100644 --- a/xinference/model/audio/chattts.py +++ b/xinference/model/audio/chattts.py @@ -11,6 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import base64 import logging from io import BytesIO from typing import TYPE_CHECKING, Optional @@ -61,16 +62,31 @@ def speech( import torchaudio import xxhash - seed = xxhash.xxh32_intdigest(voice) + rnd_spk_emb = None - torch.manual_seed(seed) - np.random.seed(seed) - torch.cuda.manual_seed(seed) - torch.backends.cudnn.deterministic = True - torch.backends.cudnn.benchmark = False + if len(voice) > 400: + try: + assert self._model is not None + b = base64.b64decode(voice) + bio = BytesIO(b) + tensor = torch.load(bio, map_location="cpu") + rnd_spk_emb = self._model._encode_spk_emb(tensor) + logger.info("Speech by input speaker") + except Exception as e: + logger.info("Fallback to random speaker due to %s", e) - assert self._model is not None - rnd_spk_emb = self._model.sample_random_speaker() + if rnd_spk_emb is None: + seed = xxhash.xxh32_intdigest(voice) + + torch.manual_seed(seed) + np.random.seed(seed) + torch.cuda.manual_seed(seed) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + assert self._model is not None + rnd_spk_emb = self._model.sample_random_speaker() + logger.info("Speech by voice %s", voice) default = 5 infer_speed = int(default * speed) @@ -100,7 +116,6 @@ def _generator(): if new_last_pos != last_pos: out.seek(last_pos) encoded_bytes = out.read() - print(len(encoded_bytes)) yield encoded_bytes last_pos = new_last_pos diff --git a/xinference/model/audio/tests/test_chattts.py b/xinference/model/audio/tests/test_chattts.py index 1e557c62e6..92cb9ac96d 100644 --- a/xinference/model/audio/tests/test_chattts.py +++ b/xinference/model/audio/tests/test_chattts.py @@ -15,6 +15,8 @@ import os import tempfile +import pandas as pd + def test_chattts(setup): endpoint, _ = setup @@ -34,6 +36,15 @@ def test_chattts(setup): assert type(response) is bytes assert len(response) > 0 + df = pd.read_csv( + "https://raw.githubusercontent.com/6drf21e/ChatTTS_Speaker/main/evaluation_results.csv" + ) + speaker = df["emb_data"][0] + + response = model.speech(input_string, voice=speaker) + assert type(response) is bytes + assert len(response) > 0 + response = model.speech(input_string, stream=True) assert inspect.isgenerator(response) i = 0 From b0848ae119767cf8614c0289226f180faf15f2be Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Sun, 18 Aug 2024 14:12:09 +0800 Subject: [PATCH 265/298] REF: use utils._decode_image replacing same codes in individual vl files (#2105) --- xinference/model/llm/transformers/cogvlm2.py | 47 ++----------------- xinference/model/llm/transformers/glm4v.py | 25 +--------- .../model/llm/transformers/minicpmv25.py | 25 +--------- .../model/llm/transformers/minicpmv26.py | 24 +--------- xinference/model/llm/transformers/yi_vl.py | 26 +--------- 5 files changed, 11 insertions(+), 136 deletions(-) diff --git a/xinference/model/llm/transformers/cogvlm2.py b/xinference/model/llm/transformers/cogvlm2.py index 791ecedc98..937e2a2a78 100644 --- a/xinference/model/llm/transformers/cogvlm2.py +++ b/xinference/model/llm/transformers/cogvlm2.py @@ -11,17 +11,13 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import base64 import logging import time import uuid from concurrent.futures import ThreadPoolExecutor -from io import BytesIO from typing import Dict, Iterator, List, Optional, Tuple, Union -import requests import torch -from PIL import Image from ....core.scheduler import InferenceRequest from ....model.utils import select_device @@ -35,6 +31,7 @@ CompletionUsage, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import _decode_image from .core import PytorchChatModel, PytorchGenerateConfig from .utils import get_max_src_len @@ -116,24 +113,6 @@ def load(self, **kwargs): self._save_tensorizer() def _message_content_to_cogvlm2(self, content): - def _load_image(_url): - if _url.startswith("data:"): - logging.info("Parse url by base64 decoder.") - # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images - # e.g. f"data:image/jpeg;base64,{base64_image}" - _type, data = _url.split(";") - _, ext = _type.split("/") - data = data[len("base64,") :] - data = base64.b64decode(data.encode("utf-8")) - return Image.open(BytesIO(data)).convert("RGB") - else: - try: - response = requests.get(_url) - except requests.exceptions.MissingSchema: - return Image.open(_url).convert("RGB") - else: - return Image.open(BytesIO(response.content)).convert("RGB") - if not isinstance(content, str): texts = [] image_urls = [] @@ -146,7 +125,7 @@ def _load_image(_url): image_futures = [] with ThreadPoolExecutor() as executor: for image_url in image_urls: - fut = executor.submit(_load_image, image_url) + fut = executor.submit(_decode_image, image_url) image_futures.append(fut) images = [fut.result() for fut in image_futures] text = " ".join(texts) @@ -163,24 +142,6 @@ def _load_image(_url): def _history_content_to_cogvlm2( self, system_prompt: str, chat_history: List[ChatCompletionMessage] ): - def _image_to_piexl_values(image): - if image.startswith("data:"): - logging.info("Parse url by base64 decoder.") - # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images - # e.g. f"data:image/jpeg;base64,{base64_image}" - _type, data = image.split(";") - _, ext = _type.split("/") - data = data[len("base64,") :] - data = base64.b64decode(data.encode("utf-8")) - return Image.open(BytesIO(data)).convert("RGB") - else: - try: - response = requests.get(image) - except requests.exceptions.MissingSchema: - return Image.open(image).convert("RGB") - else: - return Image.open(BytesIO(response.content)).convert("RGB") - query = system_prompt history: List[Tuple] = [] pixel_values = None @@ -192,9 +153,7 @@ def _image_to_piexl_values(image): if c_type == "text": user = content["text"] elif c_type == "image_url" and not pixel_values: - pixel_values = _image_to_piexl_values( - content["image_url"]["url"] - ) + pixel_values = _decode_image(content["image_url"]["url"]) assistant = chat_history[i + 1]["content"] history.append((user, assistant)) query = assistant # type: ignore diff --git a/xinference/model/llm/transformers/glm4v.py b/xinference/model/llm/transformers/glm4v.py index 39e659934a..4df4f9cd4d 100644 --- a/xinference/model/llm/transformers/glm4v.py +++ b/xinference/model/llm/transformers/glm4v.py @@ -11,19 +11,15 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import base64 import logging import time import typing import uuid from concurrent.futures import ThreadPoolExecutor -from io import BytesIO from threading import Thread from typing import Dict, Iterator, List, Optional, Union -import requests import torch -from PIL import Image from ....core.scheduler import InferenceRequest from ....types import ( @@ -37,6 +33,7 @@ ) from ...utils import select_device from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import _decode_image from .core import PytorchChatModel, PytorchGenerateConfig from .utils import get_max_src_len @@ -106,24 +103,6 @@ def load(self): self._save_tensorizer() def _message_content_to_chat(self, content): - def _load_image(_url): - if _url.startswith("data:"): - logging.info("Parse url by base64 decoder.") - # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images - # e.g. f"data:image/jpeg;base64,{base64_image}" - _type, data = _url.split(";") - _, ext = _type.split("/") - data = data[len("base64,") :] - data = base64.b64decode(data.encode("utf-8")) - return Image.open(BytesIO(data)).convert("RGB") - else: - try: - response = requests.get(_url) - except requests.exceptions.MissingSchema: - return Image.open(_url).convert("RGB") - else: - return Image.open(BytesIO(response.content)).convert("RGB") - if not isinstance(content, str): texts = [] image_urls = [] @@ -136,7 +115,7 @@ def _load_image(_url): image_futures = [] with ThreadPoolExecutor() as executor: for image_url in image_urls: - fut = executor.submit(_load_image, image_url) + fut = executor.submit(_decode_image, image_url) image_futures.append(fut) images = [fut.result() for fut in image_futures] text = " ".join(texts) diff --git a/xinference/model/llm/transformers/minicpmv25.py b/xinference/model/llm/transformers/minicpmv25.py index 5ef32b93a0..af22319759 100644 --- a/xinference/model/llm/transformers/minicpmv25.py +++ b/xinference/model/llm/transformers/minicpmv25.py @@ -11,18 +11,14 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import base64 import json import logging import time import uuid from concurrent.futures import ThreadPoolExecutor -from io import BytesIO from typing import Dict, Iterator, List, Optional, Union -import requests import torch -from PIL import Image from ....types import ( ChatCompletion, @@ -35,6 +31,7 @@ ) from ...utils import select_device from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import _decode_image from .core import PytorchChatModel, PytorchGenerateConfig logger = logging.getLogger(__name__) @@ -102,24 +99,6 @@ def load(self, **kwargs): self._save_tensorizer() def _message_content_to_chat(self, content): - def _load_image(_url): - if _url.startswith("data:"): - logging.info("Parse url by base64 decoder.") - # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images - # e.g. f"data:image/jpeg;base64,{base64_image}" - _type, data = _url.split(";") - _, ext = _type.split("/") - data = data[len("base64,") :] - data = base64.b64decode(data.encode("utf-8")) - return Image.open(BytesIO(data)).convert("RGB") - else: - try: - response = requests.get(_url) - except requests.exceptions.MissingSchema: - return Image.open(_url).convert("RGB") - else: - return Image.open(BytesIO(response.content)).convert("RGB") - if not isinstance(content, str): texts = [] image_urls = [] @@ -132,7 +111,7 @@ def _load_image(_url): image_futures = [] with ThreadPoolExecutor() as executor: for image_url in image_urls: - fut = executor.submit(_load_image, image_url) + fut = executor.submit(_decode_image, image_url) image_futures.append(fut) images = [fut.result() for fut in image_futures] text = " ".join(texts) diff --git a/xinference/model/llm/transformers/minicpmv26.py b/xinference/model/llm/transformers/minicpmv26.py index 25b8e874ef..0900bc4a86 100644 --- a/xinference/model/llm/transformers/minicpmv26.py +++ b/xinference/model/llm/transformers/minicpmv26.py @@ -11,15 +11,12 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import base64 import logging import time import uuid from concurrent.futures import ThreadPoolExecutor -from io import BytesIO from typing import Dict, Iterator, List, Optional, Union -import requests import torch from PIL import Image @@ -34,6 +31,7 @@ ) from ...utils import select_device from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import _decode_image from .core import PytorchChatModel, PytorchGenerateConfig logger = logging.getLogger(__name__) @@ -105,24 +103,6 @@ def load(self, **kwargs): self._save_tensorizer() def _message_content_to_chat(self, content): - def _load_image(_url): - if _url.startswith("data:"): - logging.info("Parse url by base64 decoder.") - # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images - # e.g. f"data:image/jpeg;base64,{base64_image}" - _type, data = _url.split(";") - _, ext = _type.split("/") - data = data[len("base64,") :] - data = base64.b64decode(data.encode("utf-8")) - return Image.open(BytesIO(data)).convert("RGB") - else: - try: - response = requests.get(_url) - except requests.exceptions.MissingSchema: - return Image.open(_url).convert("RGB") - else: - return Image.open(BytesIO(response.content)).convert("RGB") - MAX_NUM_FRAMES = 64 def encode_video(video_path): @@ -166,7 +146,7 @@ def _load_video(_url): image_futures = [] with ThreadPoolExecutor() as executor: for image_url in image_urls: - fut = executor.submit(_load_image, image_url) + fut = executor.submit(_decode_image, image_url) image_futures.append(fut) images = [fut.result() for fut in image_futures] frames = [] diff --git a/xinference/model/llm/transformers/yi_vl.py b/xinference/model/llm/transformers/yi_vl.py index 9714ecec69..e4b3d1f6ce 100644 --- a/xinference/model/llm/transformers/yi_vl.py +++ b/xinference/model/llm/transformers/yi_vl.py @@ -11,18 +11,14 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import base64 import logging import time import uuid from concurrent.futures import ThreadPoolExecutor -from io import BytesIO from threading import Thread from typing import Dict, Iterator, List, Optional, Union -import requests import torch -from PIL import Image from ....model.utils import select_device from ....types import ( @@ -35,6 +31,7 @@ CompletionUsage, ) from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import _decode_image from .core import PytorchChatModel, PytorchGenerateConfig logger = logging.getLogger(__name__) @@ -78,25 +75,6 @@ def load(self): @staticmethod def _message_content_to_yi(content) -> Union[str, tuple]: - def _load_image(_url): - if _url.startswith("data:"): - logging.info("Parse url by base64 decoder.") - # https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images - # e.g. f"data:image/jpeg;base64,{base64_image}" - _type, data = _url.split(";") - _, ext = _type.split("/") - data = data[len("base64,") :] - data = base64.b64decode(data.encode("utf-8")) - - return Image.open(BytesIO(data)) - else: - try: - response = requests.get(_url) - except requests.exceptions.MissingSchema: - return Image.open(_url) - else: - return Image.open(BytesIO(response.content)) - if not isinstance(content, str): from ....thirdparty.llava.model.constants import DEFAULT_IMAGE_TOKEN @@ -111,7 +89,7 @@ def _load_image(_url): image_futures = [] with ThreadPoolExecutor() as executor: for image_url in image_urls: - fut = executor.submit(_load_image, image_url) + fut = executor.submit(_decode_image, image_url) image_futures.append(fut) images = [fut.result() for fut in image_futures] text = " ".join(texts) From 9804c550f2eaaf2d1756c53596a54953955ec0f8 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Sun, 18 Aug 2024 20:26:57 +0800 Subject: [PATCH 266/298] DOC: add more doc about ChatTTS (#2108) --- doc/source/index.rst | 17 +++- doc/source/locale/zh_CN/LC_MESSAGES/index.po | 84 ++++++++++--------- .../models/model_abilities/audio.po | 47 ++++++++--- doc/source/models/model_abilities/audio.rst | 35 ++++++++ 4 files changed, 133 insertions(+), 50 deletions(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index d5f3bce3e9..926cb8dca0 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -104,6 +104,15 @@ Developing Real-world AI Applications with Xinference ] print(model.rerank(corpus, query)) + .. code-tab:: python Video + + from xinference.client import Client + + client = Client("http://localhost:9997") + model = client.get_model("MODEL_UID") + + model.text_to_video("") + Getting Started --------------- @@ -189,12 +198,18 @@ Explore the API .. grid:: 2 - .. grid-item-card:: Audio + .. grid-item-card:: Audio :link: audio :link-type: ref Learn how to turn audio into text or text into audio with Xinference. + .. grid-item-card:: Video + :link: video + :link-type: ref + + Learn how to generate video with Xinference. + Getting Involved ---------------- diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/index.po b/doc/source/locale/zh_CN/LC_MESSAGES/index.po index 29a2689be6..070313bac4 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/index.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/index.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-01 16:47+0800\n" +"POT-Creation-Date: 2024-08-18 15:28+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -17,13 +17,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.14.0\n" #: ../../source/index.rst:5 msgid "Welcome to Xinference!" msgstr "欢迎来到 Xinference!" -#: ../../source/index.rst:18 +#: ../../source/index.rst:19 msgid "" "Xorbits Inference (Xinference) is an open-source platform to streamline " "the operation and integration of a wide array of AI models. With " @@ -35,143 +35,151 @@ msgstr "" "和集成。借助 Xinference,您可以使用任何开源 LLM、嵌入模型和多模态模型在" "云端或本地环境中运行推理,并创建强大的 AI 应用。" -#: ../../source/index.rst:24 +#: ../../source/index.rst:25 msgid "Developing Real-world AI Applications with Xinference" msgstr "使用 Xinference 开发真实场景的 AI 应用" -#: ../../source/index.rst:108 +#: ../../source/index.rst:118 msgid "Getting Started" msgstr "入门指南" -#: ../../source/index.rst:112 +#: ../../source/index.rst:122 msgid "Install Xinference" msgstr "安装 Xinference" -#: ../../source/index.rst:116 +#: ../../source/index.rst:126 msgid "Install Xinference on Linux, Windows, and macOS." msgstr "在 Linux、Windows 和 macOS 上安装 Xinference。" -#: ../../source/index.rst:118 +#: ../../source/index.rst:128 msgid "Try it out!" msgstr "立即体验!" -#: ../../source/index.rst:122 +#: ../../source/index.rst:132 msgid "Start by running Xinference on a local machine." msgstr "首先在本地计算机上运行 Xinference。" -#: ../../source/index.rst:127 +#: ../../source/index.rst:137 msgid "Explore models" msgstr "探索模型" -#: ../../source/index.rst:131 +#: ../../source/index.rst:141 msgid "Explore a wide range of models supported by Xinference." msgstr "探索 Xinference 支持的各种模型。" -#: ../../source/index.rst:133 +#: ../../source/index.rst:143 msgid "Register your own model" msgstr "注册你自己的模型" -#: ../../source/index.rst:137 +#: ../../source/index.rst:147 msgid "Register model weights and turn it into an API." msgstr "注册模型权重,并转化为 API" -#: ../../source/index.rst:142 +#: ../../source/index.rst:152 msgid "Explore the API" msgstr "探索 API" -#: ../../source/index.rst:146 +#: ../../source/index.rst:156 msgid "Chat & Generate" msgstr "聊天 & 生成" -#: ../../source/index.rst:150 +#: ../../source/index.rst:160 msgid "Learn how to chat with LLMs in Xinference." msgstr "学习如何在 Xinference 中与 LLM聊天。" -#: ../../source/index.rst:152 +#: ../../source/index.rst:162 msgid "Tools" msgstr "工具" -#: ../../source/index.rst:156 +#: ../../source/index.rst:166 msgid "Learn how to connect LLM with external tools." msgstr "学习如何将 LLM 与外部工具连接起来。" -#: ../../source/index.rst:161 +#: ../../source/index.rst:171 msgid "Embeddings" msgstr "嵌入" -#: ../../source/index.rst:165 +#: ../../source/index.rst:175 msgid "Learn how to create text embeddings in Xinference." msgstr "学习如何在 Xinference 中创建文本嵌入。" -#: ../../source/index.rst:167 +#: ../../source/index.rst:177 msgid "Rerank" msgstr "重排序" -#: ../../source/index.rst:171 +#: ../../source/index.rst:181 msgid "Learn how to use rerank models in Xinference." msgstr "学习如何在 Xinference 中使用重排序模型。" -#: ../../source/index.rst:176 +#: ../../source/index.rst:186 msgid "Images" msgstr "图像" -#: ../../source/index.rst:180 +#: ../../source/index.rst:190 msgid "Learn how to generate images with Xinference." msgstr "学习如何使用Xinference生成图像。" -#: ../../source/index.rst:182 +#: ../../source/index.rst:192 msgid "Vision" msgstr "视觉" -#: ../../source/index.rst:186 +#: ../../source/index.rst:196 msgid "Learn how to process image with LLMs." msgstr "学习如何使用 LLM 处理图像。" -#: ../../source/index.rst:191 +#: ../../source/index.rst:201 msgid "Audio" msgstr "音频" -#: ../../source/index.rst:195 +#: ../../source/index.rst:205 msgid "Learn how to turn audio into text or text into audio with Xinference." msgstr "学习如何使用 Xinference 将音频转换为文本或将文本转换为音频。" -#: ../../source/index.rst:199 +#: ../../source/index.rst:207 +msgid "Video" +msgstr "视频" + +#: ../../source/index.rst:211 +msgid "Learn how to generate video with Xinference." +msgstr "学习如何使用Xinference生成视频。" + +#: ../../source/index.rst:215 msgid "Getting Involved" msgstr "参与我们" -#: ../../source/index.rst:208 +#: ../../source/index.rst:224 msgid "Get Latest News" msgstr "最新资讯" -#: ../../source/index.rst:216 +#: ../../source/index.rst:232 msgid ":fab:`twitter` Follow us on Twitter" msgstr ":fab:`twitter` 在 Twitter 上关注我们" -#: ../../source/index.rst:221 +#: ../../source/index.rst:237 msgid ":fab:`zhihu` Read our blogs" msgstr ":fab:`zhihu` 阅读知乎博客" -#: ../../source/index.rst:228 +#: ../../source/index.rst:244 msgid "Get Support" msgstr "寻求帮助" -#: ../../source/index.rst:236 +#: ../../source/index.rst:252 msgid ":fab:`weixin` Find community on WeChat" msgstr ":fab:`weixin` 微信社区" -#: ../../source/index.rst:241 +#: ../../source/index.rst:257 msgid ":fab:`slack` Find community on Slack" msgstr ":fab:`slack` Slack 社区" -#: ../../source/index.rst:246 +#: ../../source/index.rst:262 msgid ":fab:`github` Open an issue" msgstr ":fab:`github` 在 Github 上提 issue" -#: ../../source/index.rst:253 +#: ../../source/index.rst:269 msgid "Contribute to Xinference" msgstr "贡献" -#: ../../source/index.rst:261 +#: ../../source/index.rst:277 msgid ":fab:`github` Create a pull request" msgstr ":fab:`github` 在 Github 上提 PR" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po index f2acf64572..55072b6766 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/audio.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-09 19:13+0800\n" +"POT-Creation-Date: 2024-08-18 19:26+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -187,7 +187,7 @@ msgstr "" msgid "Speech" msgstr "语音" -#: ../../source/models/model_abilities/audio.rst:177 +#: ../../source/models/model_abilities/audio.rst:179 msgid "" "The Speech API mimics OpenAI's `create speech API " "<https://platform.openai.com/docs/api-reference/audio/createSpeech>`_. We" @@ -198,11 +198,11 @@ msgstr "" "openai.com/docs/api-reference/audio/createSpeech>`_。你可以通过 cURL、" "OpenAI Client 或者 Xinference 的 Python 客户端来尝试 Speech API:" -#: ../../source/models/model_abilities/audio.rst:180 +#: ../../source/models/model_abilities/audio.rst:182 msgid "Speech API use non-stream by default as" msgstr "Speech API 默认使用非流式" -#: ../../source/models/model_abilities/audio.rst:182 +#: ../../source/models/model_abilities/audio.rst:184 msgid "" "The stream output of ChatTTS is not as good as the non-stream output, " "please refer to: https://github.com/2noise/ChatTTS/pull/564" @@ -210,7 +210,7 @@ msgstr "" "ChatTTS 的流式输出不如非流式的效果好,参考:https://github.com/2noise/" "ChatTTS/pull/564" -#: ../../source/models/model_abilities/audio.rst:183 +#: ../../source/models/model_abilities/audio.rst:185 msgid "" "The stream requires ffmpeg<7: " "https://pytorch.org/audio/stable/installation.html#optional-dependencies" @@ -218,27 +218,52 @@ msgstr "" "流式要求 ffmpeg<7:https://pytorch.org/audio/stable/installation.html#" "optional-dependencies" -#: ../../source/models/model_abilities/audio.rst:235 +#: ../../source/models/model_abilities/audio.rst:237 +msgid "ChatTTS Usage" +msgstr "ChatTTS 使用" + +#: ../../source/models/model_abilities/audio.rst:239 +msgid "Basic usage, refer to :ref:`audio speech usage <audio_speech>`." +msgstr "基本使用,参考 :ref:`语音使用章节 <audio_speech>`。" + +#: ../../source/models/model_abilities/audio.rst:241 +msgid "" +"Fixed tone color. We can use fixed tone color provided by " +"https://github.com/6drf21e/ChatTTS_Speaker, Download the " +"`evaluation_result.csv " +"<https://github.com/6drf21e/ChatTTS_Speaker/blob/main/evaluation_results.csv>`_" +" , take ``seed_2155`` as example, we get the ``emb_data`` of it." +msgstr "" +"固定音色。我们可以使用由 https://github.com/6drf21e/ChatTTS_Speaker 提供" +"的固定音色,下载 `evaluation_result.csv <https://github.com/6drf21e/" +"ChatTTS_Speaker/blob/main/evaluation_results.csv>`_ ,以 ``seed_2155`` " +"音色作为例子,我们使用 ``emb_data`` 列的数据。" + +#: ../../source/models/model_abilities/audio.rst:254 +msgid "Use the fixed tone color of ``seed_2155`` to generate speech." +msgstr "使用 ``seed_2155`` 固定音色来创建语音。" + +#: ../../source/models/model_abilities/audio.rst:270 msgid "CosyVoice Usage" msgstr "CosyVoice 模型使用" -#: ../../source/models/model_abilities/audio.rst:237 +#: ../../source/models/model_abilities/audio.rst:272 msgid "Basic usage, launch model ``CosyVoice-300M-SFT``." msgstr "基本使用,加载模型 ``CosyVoice-300M-SFT``。" -#: ../../source/models/model_abilities/audio.rst:286 +#: ../../source/models/model_abilities/audio.rst:321 msgid "Clone voice, launch model ``CosyVoice-300M``." msgstr "克隆声音,加载模型 ``CosyVoice-300M``。" -#: ../../source/models/model_abilities/audio.rst:309 +#: ../../source/models/model_abilities/audio.rst:344 msgid "Cross lingual usage, launch model ``CosyVoice-300M``." msgstr "跨语言使用,加载模型 ``CosyVoice-300M``。" -#: ../../source/models/model_abilities/audio.rst:328 +#: ../../source/models/model_abilities/audio.rst:363 msgid "Instruction based, launch model ``CosyVoice-300M-Instruct``." msgstr "基于指令的声音合成,加载模型 ``CosyVoice-300M-Instruct``。" -#: ../../source/models/model_abilities/audio.rst:345 +#: ../../source/models/model_abilities/audio.rst:380 msgid "" "More instructions and examples, could be found at https://fun-audio-" "llm.github.io/ ." diff --git a/doc/source/models/model_abilities/audio.rst b/doc/source/models/model_abilities/audio.rst index 53996b9bb6..d6731913d8 100644 --- a/doc/source/models/model_abilities/audio.rst +++ b/doc/source/models/model_abilities/audio.rst @@ -174,6 +174,8 @@ We can try Translation API out either via cURL, OpenAI Client, or Xinference's p Speech -------------------- +.. _audio_speech: + The Speech API mimics OpenAI's `create speech API <https://platform.openai.com/docs/api-reference/audio/createSpeech>`_. We can try Speech API out either via cURL, OpenAI Client, or Xinference's python client: @@ -231,6 +233,39 @@ Speech API use non-stream by default as The output will be an audio binary. +ChatTTS Usage +~~~~~~~~~~~~~ + +Basic usage, refer to :ref:`audio speech usage <audio_speech>`. + +Fixed tone color. We can use fixed tone color provided by +https://github.com/6drf21e/ChatTTS_Speaker, +Download the `evaluation_result.csv <https://github.com/6drf21e/ChatTTS_Speaker/blob/main/evaluation_results.csv>`_ , +take ``seed_2155`` as example, we get the ``emb_data`` of it. + +.. code-block:: python + + import pandas as pd + + df = pd.read_csv("evaluation_results.csv") + emb_data_2155 = df[df['seed_id'] == 'seed_2155'].iloc[0]["emb_data"] + + +Use the fixed tone color of ``seed_2155`` to generate speech. + +.. code-block:: python + + from xinference.client import Client + + client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") + + model = client.get_model("<MODEL_UID>") + resp_bytes = model.speech( + voice=emb_data_2155, + input=<The text to generate audio for> + ) + + CosyVoice Usage ~~~~~~~~~~~~~~~ From 05b6180776eb3332cf1e4fd19d1d526b68a8c796 Mon Sep 17 00:00:00 2001 From: Dawnfz <2912706234@qq.com> Date: Mon, 19 Aug 2024 15:50:27 +0800 Subject: [PATCH 267/298] BUG: fix asyncio.Queue error in benchmark (#2113) --- benchmark/benchmark_runner.py | 2 +- benchmark/benchmark_serving.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/benchmark/benchmark_runner.py b/benchmark/benchmark_runner.py index c7a0e29ecb..78bcff0ecc 100644 --- a/benchmark/benchmark_runner.py +++ b/benchmark/benchmark_runner.py @@ -231,7 +231,7 @@ def print_stats(self): p99_itl = np.percentile(itls, 99) * 1000 if itls else 0 # Print benchmark results - print("{s:{c}^{n}}".format(s=" Serving Benchmark Result ", n=50, c="=")) + print("{s:{c}^{n}}".format(s=" Benchmark Result ", n=50, c="=")) print("{:<40} {:<10}".format("Successful requests:", completed)) print("{:<40} {:<10.2f}".format("Benchmark duration (s):", total_time)) print("{:<40} {:<10}".format("Total input tokens:", total_input)) diff --git a/benchmark/benchmark_serving.py b/benchmark/benchmark_serving.py index 495ccd3176..105cce0976 100644 --- a/benchmark/benchmark_serving.py +++ b/benchmark/benchmark_serving.py @@ -48,7 +48,7 @@ def __init__( api_key, ) self.request_rate = request_rate - self.queue = asyncio.Queue(len(input_requests)) + self.queue = None # delay the creation of the queue async def _run(self): tasks = [] @@ -59,6 +59,9 @@ async def _run(self): await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) async def warm_up(self, num_requests: int = 5): + if self.queue is None: + self.queue = asyncio.Queue(len(self.input_requests)) + logger.info(f"Enqueuing {len(self.input_requests)} requests.") for req in iter(self.input_requests): await self.queue.put(req) From 95d8786f56cb32fda910ba946deecb0babc7f6dc Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Mon, 19 Aug 2024 17:00:57 +0800 Subject: [PATCH 268/298] BUG: fix deleting cache (#2114) --- xinference/core/worker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index e139d34c11..426a75c2e4 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -1081,7 +1081,7 @@ async def list_deletable_models(self, model_version: str) -> List[str]: paths.update([os.path.realpath(path) for path in paths]) # get tensorizer path - from ..model.llm.pytorch.tensorizer_utils import get_tensorizer_dir + from ..model.llm.transformers.tensorizer_utils import get_tensorizer_dir tensorizer_path = get_tensorizer_dir(path) if os.path.isdir(tensorizer_path): From 7c891a46cab3f606078dbaf18e0951a4d8ea6ef8 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 20 Aug 2024 14:27:00 +0800 Subject: [PATCH 269/298] DOC: remove models deleted (#2122) --- doc/source/gen_docs.py | 11 +- doc/source/getting_started/installation.rst | 4 +- .../models/model_abilities/vision.po | 24 +- .../zh_CN/LC_MESSAGES/user_guide/backends.po | 69 +++--- .../models/builtin/llm/baichuan-chat.rst | 31 --- doc/source/models/builtin/llm/baichuan.rst | 63 ------ doc/source/models/builtin/llm/chatglm.rst | 31 --- .../models/builtin/llm/chatglm2-32k.rst | 31 --- doc/source/models/builtin/llm/chatglm2.rst | 31 --- .../models/builtin/llm/falcon-instruct.rst | 47 ---- doc/source/models/builtin/llm/falcon.rst | 47 ---- .../models/builtin/llm/glaive-coder.rst | 31 --- doc/source/models/builtin/llm/index.rst | 154 +------------ .../models/builtin/llm/internlm-20b.rst | 31 --- doc/source/models/builtin/llm/internlm-7b.rst | 31 --- .../models/builtin/llm/internlm-chat-20b.rst | 31 --- .../models/builtin/llm/internlm-chat-7b.rst | 31 --- .../models/builtin/llm/internvl-chat.rst | 20 +- doc/source/models/builtin/llm/internvl2.rst | 207 ++++++++++++++++++ .../models/builtin/llm/llama-2-chat.rst | 84 ++----- doc/source/models/builtin/llm/llama-2.rst | 36 +-- doc/source/models/builtin/llm/openbuddy.rst | 31 --- doc/source/models/builtin/llm/orca.rst | 63 ------ .../models/builtin/llm/qwen2-instruct.rst | 96 +++++++- .../models/builtin/llm/starchat-beta.rst | 31 --- doc/source/models/builtin/llm/starcoder.rst | 31 --- .../models/builtin/llm/starcoderplus.rst | 31 --- doc/source/models/builtin/llm/vicuna-v1.3.rst | 111 ---------- .../models/builtin/llm/vicuna-v1.5-16k.rst | 47 ---- doc/source/models/builtin/llm/vicuna-v1.5.rst | 47 ---- .../models/builtin/llm/wizardlm-v1.0.rst | 47 ---- doc/source/models/model_abilities/vision.rst | 2 + doc/source/user_guide/backends.rst | 4 +- 33 files changed, 413 insertions(+), 1173 deletions(-) delete mode 100644 doc/source/models/builtin/llm/baichuan-chat.rst delete mode 100644 doc/source/models/builtin/llm/baichuan.rst delete mode 100644 doc/source/models/builtin/llm/chatglm.rst delete mode 100644 doc/source/models/builtin/llm/chatglm2-32k.rst delete mode 100644 doc/source/models/builtin/llm/chatglm2.rst delete mode 100644 doc/source/models/builtin/llm/falcon-instruct.rst delete mode 100644 doc/source/models/builtin/llm/falcon.rst delete mode 100644 doc/source/models/builtin/llm/glaive-coder.rst delete mode 100644 doc/source/models/builtin/llm/internlm-20b.rst delete mode 100644 doc/source/models/builtin/llm/internlm-7b.rst delete mode 100644 doc/source/models/builtin/llm/internlm-chat-20b.rst delete mode 100644 doc/source/models/builtin/llm/internlm-chat-7b.rst create mode 100644 doc/source/models/builtin/llm/internvl2.rst delete mode 100644 doc/source/models/builtin/llm/openbuddy.rst delete mode 100644 doc/source/models/builtin/llm/orca.rst delete mode 100644 doc/source/models/builtin/llm/starchat-beta.rst delete mode 100644 doc/source/models/builtin/llm/starcoder.rst delete mode 100644 doc/source/models/builtin/llm/starcoderplus.rst delete mode 100644 doc/source/models/builtin/llm/vicuna-v1.3.rst delete mode 100644 doc/source/models/builtin/llm/vicuna-v1.5-16k.rst delete mode 100644 doc/source/models/builtin/llm/vicuna-v1.5.rst delete mode 100644 doc/source/models/builtin/llm/wizardlm-v1.0.rst diff --git a/doc/source/gen_docs.py b/doc/source/gen_docs.py index a33d6d2c8a..68e381edf6 100644 --- a/doc/source/gen_docs.py +++ b/doc/source/gen_docs.py @@ -61,6 +61,7 @@ def main(): sorted_models = [] output_dir = './models/builtin/llm' os.makedirs(output_dir, exist_ok=True) + current_files = {f for f in os.listdir(output_dir) if os.path.isfile(os.path.join(output_dir, f))} for model_name in sorted(model_by_names, key=str.lower): @@ -106,11 +107,19 @@ def get_unique_id(spec): }) rendered = env.get_template('llm.rst.jinja').render(model) - output_file_path = os.path.join(output_dir, f"{model['model_name'].lower()}.rst") + output_file_name = f"{model['model_name'].lower()}.rst" + if output_file_name in current_files: + current_files.remove(output_file_name) + output_file_path = os.path.join(output_dir, output_file_name) with open(output_file_path, 'w') as output_file: output_file.write(rendered) print(output_file_path) + if current_files: + for f in current_files: + print(f"remove {f}") + os.remove(os.path.join(output_dir, f)) + index_file_path = os.path.join(output_dir, "index.rst") with open(index_file_path, "w") as file: rendered_index = env.get_template('llm_index.rst.jinja').render(models=sorted_models) diff --git a/doc/source/getting_started/installation.rst b/doc/source/getting_started/installation.rst index e72552319e..9dd563a0fc 100644 --- a/doc/source/getting_started/installation.rst +++ b/doc/source/getting_started/installation.rst @@ -40,15 +40,13 @@ Currently, supported models include: .. vllm_start - ``llama-2``, ``llama-3``, ``llama-3.1``, ``llama-2-chat``, ``llama-3-instruct``, ``llama-3.1-instruct`` -- ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` -- ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-instruct`` - ``codestral-v0.1`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` - ``codeqwen1.5``, ``codeqwen1.5-chat`` -- ``vicuna-v1.3``, ``vicuna-v1.5`` +- ``baichuan-2-chat`` - ``internlm2-chat`` - ``internlm2.5-chat``, ``internlm2.5-chat-1m`` - ``qwen-chat`` diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po index 35b5311ca0..2da5ae6a84 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/models/model_abilities/vision.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-28 22:01+0800\n" +"POT-Creation-Date: 2024-08-20 11:56+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -83,11 +83,19 @@ msgstr "" msgid ":ref:`GLM-4V <models_llm_glm-4v>`" msgstr "" -#: ../../source/models/model_abilities/vision.rst:34 +#: ../../source/models/model_abilities/vision.rst:31 +msgid ":ref:`MiniCPM-Llama3-V 2.6 <models_llm_minicpm-v-2.6>`" +msgstr "" + +#: ../../source/models/model_abilities/vision.rst:32 +msgid ":ref:`internvl2 <models_llm_internvl2>`" +msgstr "" + +#: ../../source/models/model_abilities/vision.rst:36 msgid "Quickstart" msgstr "快速入门" -#: ../../source/models/model_abilities/vision.rst:36 +#: ../../source/models/model_abilities/vision.rst:38 msgid "" "Images are made available to the model in two main ways: by passing a " "link to the image or by passing the base64 encoded image directly in the " @@ -96,23 +104,23 @@ msgstr "" "模型可以通过两种主要方式获取图像:通过传递图像的链接或直接在请求中传递 " "base64 编码的图像。" -#: ../../source/models/model_abilities/vision.rst:40 +#: ../../source/models/model_abilities/vision.rst:42 msgid "Example using OpenAI Client" msgstr "使用 OpenAI 客户端的示例" -#: ../../source/models/model_abilities/vision.rst:71 +#: ../../source/models/model_abilities/vision.rst:73 msgid "Uploading base 64 encoded images" msgstr "上传 Base64 编码的图片" -#: ../../source/models/model_abilities/vision.rst:113 +#: ../../source/models/model_abilities/vision.rst:115 msgid "You can find more examples of ``vision`` ability in the tutorial notebook:" msgstr "你可以在教程笔记本中找到更多关于 ``vision`` 能力的示例。" -#: ../../source/models/model_abilities/vision.rst:117 +#: ../../source/models/model_abilities/vision.rst:119 msgid "Qwen VL Chat" msgstr "" -#: ../../source/models/model_abilities/vision.rst:120 +#: ../../source/models/model_abilities/vision.rst:122 msgid "Learn vision ability from a example using qwen-vl-chat" msgstr "通过使用 qwen-vl-chat 的示例来学习使用 LLM 的视觉能力" diff --git a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po index 07e9d11568..08a03e75e8 100644 --- a/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po +++ b/doc/source/locale/zh_CN/LC_MESSAGES/user_guide/backends.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Xinference \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-13 17:44+0800\n" +"POT-Creation-Date: 2024-08-20 11:56+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_CN\n" @@ -145,101 +145,91 @@ msgid "" msgstr "" #: ../../source/user_guide/backends.rst:50 -msgid "``baichuan``, ``baichuan-chat``, ``baichuan-2-chat``" -msgstr "" - -#: ../../source/user_guide/backends.rst:51 -msgid "" -"``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-" -"chat-20b``" -msgstr "" - -#: ../../source/user_guide/backends.rst:52 msgid "" "``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, " "``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-" "instruct``" msgstr "" -#: ../../source/user_guide/backends.rst:53 +#: ../../source/user_guide/backends.rst:51 msgid "``codestral-v0.1``" msgstr "" -#: ../../source/user_guide/backends.rst:54 +#: ../../source/user_guide/backends.rst:52 msgid "``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k``" msgstr "" -#: ../../source/user_guide/backends.rst:55 +#: ../../source/user_guide/backends.rst:53 msgid "``code-llama``, ``code-llama-python``, ``code-llama-instruct``" msgstr "" -#: ../../source/user_guide/backends.rst:56 +#: ../../source/user_guide/backends.rst:54 msgid "" "``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-" "instruct``" msgstr "" -#: ../../source/user_guide/backends.rst:57 +#: ../../source/user_guide/backends.rst:55 msgid "``codeqwen1.5``, ``codeqwen1.5-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:58 -msgid "``vicuna-v1.3``, ``vicuna-v1.5``" +#: ../../source/user_guide/backends.rst:56 +msgid "``baichuan-2-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:59 +#: ../../source/user_guide/backends.rst:57 msgid "``internlm2-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:60 +#: ../../source/user_guide/backends.rst:58 msgid "``internlm2.5-chat``, ``internlm2.5-chat-1m``" msgstr "" -#: ../../source/user_guide/backends.rst:61 +#: ../../source/user_guide/backends.rst:59 msgid "``qwen-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:62 +#: ../../source/user_guide/backends.rst:60 msgid "``mixtral-instruct-v0.1``, ``mixtral-8x22B-instruct-v0.1``" msgstr "" -#: ../../source/user_guide/backends.rst:63 +#: ../../source/user_guide/backends.rst:61 msgid "``chatglm3``, ``chatglm3-32k``, ``chatglm3-128k``" msgstr "" -#: ../../source/user_guide/backends.rst:64 +#: ../../source/user_guide/backends.rst:62 msgid "``glm4-chat``, ``glm4-chat-1m``" msgstr "" -#: ../../source/user_guide/backends.rst:65 +#: ../../source/user_guide/backends.rst:63 msgid "``codegeex4``" msgstr "" -#: ../../source/user_guide/backends.rst:66 +#: ../../source/user_guide/backends.rst:64 msgid "``qwen1.5-chat``, ``qwen1.5-moe-chat``" msgstr "" -#: ../../source/user_guide/backends.rst:67 +#: ../../source/user_guide/backends.rst:65 msgid "``qwen2-instruct``, ``qwen2-moe-instruct``" msgstr "" -#: ../../source/user_guide/backends.rst:68 +#: ../../source/user_guide/backends.rst:66 msgid "``gemma-it``, ``gemma-2-it``" msgstr "" -#: ../../source/user_guide/backends.rst:69 +#: ../../source/user_guide/backends.rst:67 msgid "``orion-chat``, ``orion-chat-rag``" msgstr "" -#: ../../source/user_guide/backends.rst:70 +#: ../../source/user_guide/backends.rst:68 msgid "``c4ai-command-r-v01``" msgstr "" -#: ../../source/user_guide/backends.rst:74 +#: ../../source/user_guide/backends.rst:72 msgid "SGLang" msgstr "" -#: ../../source/user_guide/backends.rst:75 +#: ../../source/user_guide/backends.rst:73 msgid "" "`SGLang <https://github.com/sgl-project/sglang>`_ has a high-performance " "inference runtime with RadixAttention. It significantly accelerates the " @@ -251,11 +241,11 @@ msgstr "" " 的高性能推理运行时。它通过在多个调用之间自动重用KV缓存,显著加速了复杂 " "LLM 程序的执行。它还支持其他常见推理技术,如连续批处理和张量并行处理。" -#: ../../source/user_guide/backends.rst:80 +#: ../../source/user_guide/backends.rst:78 msgid "MLX" msgstr "" -#: ../../source/user_guide/backends.rst:81 +#: ../../source/user_guide/backends.rst:79 msgid "" "`MLX <https://github.com/ml-explore/mlx-examples/tree/main/llms>`_ " "provides efficient runtime to run LLM on Apple silicon. It's recommended " @@ -281,3 +271,14 @@ msgstr "" #~ msgid "``gemma-it``" #~ msgstr "" +#~ msgid "``baichuan``, ``baichuan-chat``, ``baichuan-2-chat``" +#~ msgstr "" + +#~ msgid "" +#~ "``internlm-16k``, ``internlm-chat-7b``, " +#~ "``internlm-chat-8k``, ``internlm-chat-20b``" +#~ msgstr "" + +#~ msgid "``vicuna-v1.3``, ``vicuna-v1.5``" +#~ msgstr "" + diff --git a/doc/source/models/builtin/llm/baichuan-chat.rst b/doc/source/models/builtin/llm/baichuan-chat.rst deleted file mode 100644 index c4aed11314..0000000000 --- a/doc/source/models/builtin/llm/baichuan-chat.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_baichuan-chat: - -======================================== -baichuan-chat -======================================== - -- **Context Length:** 4096 -- **Model Name:** baichuan-chat -- **Languages:** en, zh -- **Abilities:** chat -- **Description:** Baichuan-chat is a fine-tuned version of the Baichuan LLM, specializing in chatting. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 13 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** baichuan-inc/Baichuan-13B-Chat -- **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan-13B-Chat>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name baichuan-chat --size-in-billions 13 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/baichuan.rst b/doc/source/models/builtin/llm/baichuan.rst deleted file mode 100644 index 5d72a7c12e..0000000000 --- a/doc/source/models/builtin/llm/baichuan.rst +++ /dev/null @@ -1,63 +0,0 @@ -.. _models_llm_baichuan: - -======================================== -baichuan -======================================== - -- **Context Length:** 4096 -- **Model Name:** baichuan -- **Languages:** en, zh -- **Abilities:** generate -- **Description:** Baichuan is an open-source Transformer based LLM that is trained on both Chinese and English data. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (ggmlv3, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 7 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/baichuan-llama-7B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/baichuan-llama-7B-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name baichuan --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 2 (pytorch, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 7 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** baichuan-inc/Baichuan-7B -- **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan-7B>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name baichuan --size-in-billions 7 --model-format pytorch --quantization ${quantization} - - -Model Spec 3 (pytorch, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 13 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** baichuan-inc/Baichuan-13B-Base -- **Model Hubs**: `Hugging Face <https://huggingface.co/baichuan-inc/Baichuan-13B-Base>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name baichuan --size-in-billions 13 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/chatglm.rst b/doc/source/models/builtin/llm/chatglm.rst deleted file mode 100644 index 127c2cb33c..0000000000 --- a/doc/source/models/builtin/llm/chatglm.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_chatglm: - -======================================== -chatglm -======================================== - -- **Context Length:** 2048 -- **Model Name:** chatglm -- **Languages:** en, zh -- **Abilities:** chat -- **Description:** ChatGLM is an open-source General Language Model (GLM) based LLM trained on both Chinese and English data. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 6 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 6 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** THUDM/chatglm-6b -- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/chatglm-6b>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name chatglm --size-in-billions 6 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/chatglm2-32k.rst b/doc/source/models/builtin/llm/chatglm2-32k.rst deleted file mode 100644 index b4de49b62a..0000000000 --- a/doc/source/models/builtin/llm/chatglm2-32k.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_chatglm2-32k: - -======================================== -chatglm2-32k -======================================== - -- **Context Length:** 32768 -- **Model Name:** chatglm2-32k -- **Languages:** en, zh -- **Abilities:** chat -- **Description:** ChatGLM2-32k is a special version of ChatGLM2, with a context window of 32k tokens instead of 8k. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 6 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 6 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** THUDM/chatglm2-6b-32k -- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/chatglm2-6b-32k>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/chatglm2-6b-32k>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name chatglm2-32k --size-in-billions 6 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/chatglm2.rst b/doc/source/models/builtin/llm/chatglm2.rst deleted file mode 100644 index ecb56a8efa..0000000000 --- a/doc/source/models/builtin/llm/chatglm2.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_chatglm2: - -======================================== -chatglm2 -======================================== - -- **Context Length:** 8192 -- **Model Name:** chatglm2 -- **Languages:** en, zh -- **Abilities:** chat -- **Description:** ChatGLM2 is the second generation of ChatGLM, still open-source and trained on Chinese and English data. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 6 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 6 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** THUDM/chatglm2-6b -- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/chatglm2-6b>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/chatglm2-6b>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name chatglm2 --size-in-billions 6 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/falcon-instruct.rst b/doc/source/models/builtin/llm/falcon-instruct.rst deleted file mode 100644 index 3a3b754920..0000000000 --- a/doc/source/models/builtin/llm/falcon-instruct.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. _models_llm_falcon-instruct: - -======================================== -falcon-instruct -======================================== - -- **Context Length:** 2048 -- **Model Name:** falcon-instruct -- **Languages:** en -- **Abilities:** chat -- **Description:** Falcon-instruct is a fine-tuned version of the Falcon LLM, specializing in chatting. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 7 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** tiiuae/falcon-7b-instruct -- **Model Hubs**: `Hugging Face <https://huggingface.co/tiiuae/falcon-7b-instruct>`__, `ModelScope <https://modelscope.cn/models/Xorbits/falcon-7b-instruct>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name falcon-instruct --size-in-billions 7 --model-format pytorch --quantization ${quantization} - - -Model Spec 2 (pytorch, 40 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 40 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** tiiuae/falcon-40b-instruct -- **Model Hubs**: `Hugging Face <https://huggingface.co/tiiuae/falcon-40b-instruct>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name falcon-instruct --size-in-billions 40 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/falcon.rst b/doc/source/models/builtin/llm/falcon.rst deleted file mode 100644 index cb0f66fa7d..0000000000 --- a/doc/source/models/builtin/llm/falcon.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. _models_llm_falcon: - -======================================== -falcon -======================================== - -- **Context Length:** 2048 -- **Model Name:** falcon -- **Languages:** en -- **Abilities:** generate -- **Description:** Falcon is an open-source Transformer based LLM trained on the RefinedWeb dataset. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 40 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 40 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** tiiuae/falcon-40b -- **Model Hubs**: `Hugging Face <https://huggingface.co/tiiuae/falcon-40b>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name falcon --size-in-billions 40 --model-format pytorch --quantization ${quantization} - - -Model Spec 2 (pytorch, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 7 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** tiiuae/falcon-7b -- **Model Hubs**: `Hugging Face <https://huggingface.co/tiiuae/falcon-7b>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name falcon --size-in-billions 7 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/glaive-coder.rst b/doc/source/models/builtin/llm/glaive-coder.rst deleted file mode 100644 index a4fc98f7cc..0000000000 --- a/doc/source/models/builtin/llm/glaive-coder.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_glaive-coder: - -======================================== -glaive-coder -======================================== - -- **Context Length:** 16384 -- **Model Name:** glaive-coder -- **Languages:** en -- **Abilities:** chat -- **Description:** A code model trained on a dataset of ~140k programming related problems and solutions generated from Glaive’s synthetic data generation platform. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 7 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** glaiveai/glaive-coder-7b -- **Model Hubs**: `Hugging Face <https://huggingface.co/glaiveai/glaive-coder-7b>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name glaive-coder --size-in-billions 7 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index 100c590569..d7c23b977d 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -31,11 +31,6 @@ The following is a list of built-in LLM in Xinference: - 16384 - AquilaChat2-16k series models are the long-text chat models - * - :ref:`baichuan <models_llm_baichuan>` - - generate - - 4096 - - Baichuan is an open-source Transformer based LLM that is trained on both Chinese and English data. - * - :ref:`baichuan-2 <models_llm_baichuan-2>` - generate - 4096 @@ -46,31 +41,11 @@ The following is a list of built-in LLM in Xinference: - 4096 - Baichuan2-chat is a fine-tuned version of the Baichuan LLM, specializing in chatting. - * - :ref:`baichuan-chat <models_llm_baichuan-chat>` - - chat - - 4096 - - Baichuan-chat is a fine-tuned version of the Baichuan LLM, specializing in chatting. - * - :ref:`c4ai-command-r-v01 <models_llm_c4ai-command-r-v01>` - chat - 131072 - C4AI Command-R(+) is a research release of a 35 and 104 billion parameter highly performant generative model. - * - :ref:`chatglm <models_llm_chatglm>` - - chat - - 2048 - - ChatGLM is an open-source General Language Model (GLM) based LLM trained on both Chinese and English data. - - * - :ref:`chatglm2 <models_llm_chatglm2>` - - chat - - 8192 - - ChatGLM2 is the second generation of ChatGLM, still open-source and trained on Chinese and English data. - - * - :ref:`chatglm2-32k <models_llm_chatglm2-32k>` - - chat - - 32768 - - ChatGLM2-32k is a special version of ChatGLM2, with a context window of 32k tokens instead of 8k. - * - :ref:`chatglm3 <models_llm_chatglm3>` - chat, tools - 8192 @@ -166,16 +141,6 @@ The following is a list of built-in LLM in Xinference: - 4096 - DeepSeek-VL possesses general multimodal understanding capabilities, capable of processing logical diagrams, web pages, formula recognition, scientific literature, natural images, and embodied intelligence in complex scenarios. - * - :ref:`falcon <models_llm_falcon>` - - generate - - 2048 - - Falcon is an open-source Transformer based LLM trained on the RefinedWeb dataset. - - * - :ref:`falcon-instruct <models_llm_falcon-instruct>` - - chat - - 2048 - - Falcon-instruct is a fine-tuned version of the Falcon LLM, specializing in chatting. - * - :ref:`gemma-2-it <models_llm_gemma-2-it>` - chat - 8192 @@ -186,11 +151,6 @@ The following is a list of built-in LLM in Xinference: - 8192 - Gemma is a family of lightweight, state-of-the-art open models from Google, built from the same research and technology used to create the Gemini models. - * - :ref:`glaive-coder <models_llm_glaive-coder>` - - chat - - 16384 - - A code model trained on a dataset of ~140k programming related problems and solutions generated from Glaive’s synthetic data generation platform. - * - :ref:`glm-4v <models_llm_glm-4v>` - chat, vision - 8192 @@ -221,26 +181,6 @@ The following is a list of built-in LLM in Xinference: - 1024 - GPT-2 is a Transformer-based LLM that is trained on WebTest, a 40 GB dataset of Reddit posts with 3+ upvotes. - * - :ref:`internlm-20b <models_llm_internlm-20b>` - - generate - - 16384 - - Pre-trained on over 2.3T Tokens containing high-quality English, Chinese, and code data. - - * - :ref:`internlm-7b <models_llm_internlm-7b>` - - generate - - 8192 - - InternLM is a Transformer-based LLM that is trained on both Chinese and English data, focusing on practical scenarios. - - * - :ref:`internlm-chat-20b <models_llm_internlm-chat-20b>` - - chat - - 16384 - - Pre-trained on over 2.3T Tokens containing high-quality English, Chinese, and code data. The Chat version has undergone SFT and RLHF training. - - * - :ref:`internlm-chat-7b <models_llm_internlm-chat-7b>` - - chat - - 4096 - - Internlm-chat is a fine-tuned version of the Internlm LLM, specializing in chatting. - * - :ref:`internlm2-chat <models_llm_internlm2-chat>` - chat - 32768 @@ -261,6 +201,11 @@ The following is a list of built-in LLM in Xinference: - 32768 - InternVL 1.5 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. + * - :ref:`internvl2 <models_llm_internvl2>` + - chat, vision + - 32768 + - InternVL 2 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. + * - :ref:`llama-2 <models_llm_llama-2>` - generate - 4096 @@ -376,11 +321,6 @@ The following is a list of built-in LLM in Xinference: - 2048 - OmniLMM is a family of open-source large multimodal models (LMMs) adept at vision & language modeling. - * - :ref:`openbuddy <models_llm_openbuddy>` - - chat - - 2048 - - OpenBuddy is a powerful open multilingual chatbot model aimed at global users. - * - :ref:`openhermes-2.5 <models_llm_openhermes-2.5>` - chat - 8192 @@ -391,11 +331,6 @@ The following is a list of built-in LLM in Xinference: - 2048 - Opt is an open-source, decoder-only, Transformer based LLM that was designed to replicate GPT-3. - * - :ref:`orca <models_llm_orca>` - - chat - - 2048 - - Orca is an LLM trained by fine-tuning LLaMA on explanation traces obtained from GPT-4. - * - :ref:`orion-chat <models_llm_orion-chat>` - chat - 4096 @@ -476,21 +411,6 @@ The following is a list of built-in LLM in Xinference: - 4096 - Skywork is a series of large models developed by the Kunlun Group · Skywork team. - * - :ref:`starchat-beta <models_llm_starchat-beta>` - - chat - - 8192 - - Starchat-beta is a fine-tuned version of the Starcoderplus LLM, specializing in coding assistance. - - * - :ref:`starcoder <models_llm_starcoder>` - - generate - - 8192 - - Starcoder is an open-source Transformer based LLM that is trained on permissively licensed data from GitHub. - - * - :ref:`starcoderplus <models_llm_starcoderplus>` - - generate - - 8192 - - Starcoderplus is an open-source LLM trained by fine-tuning Starcoder on RedefinedWeb and StarCoderData datasets. - * - :ref:`starling-lm <models_llm_starling-lm>` - chat - 4096 @@ -506,31 +426,11 @@ The following is a list of built-in LLM in Xinference: - 2048 - The TinyLlama project aims to pretrain a 1.1B Llama model on 3 trillion tokens. - * - :ref:`vicuna-v1.3 <models_llm_vicuna-v1.3>` - - chat - - 2048 - - Vicuna is an open-source LLM trained by fine-tuning LLaMA on data collected from ShareGPT. - - * - :ref:`vicuna-v1.5 <models_llm_vicuna-v1.5>` - - chat - - 4096 - - Vicuna is an open-source LLM trained by fine-tuning LLaMA on data collected from ShareGPT. - - * - :ref:`vicuna-v1.5-16k <models_llm_vicuna-v1.5-16k>` - - chat - - 16384 - - Vicuna-v1.5-16k is a special version of Vicuna-v1.5, with a context window of 16k tokens instead of 4k. - * - :ref:`wizardcoder-python-v1.0 <models_llm_wizardcoder-python-v1.0>` - chat - 100000 - - * - :ref:`wizardlm-v1.0 <models_llm_wizardlm-v1.0>` - - chat - - 2048 - - WizardLM is an open-source LLM trained by fine-tuning LLaMA with Evol-Instruct. - * - :ref:`wizardmath-v1.0 <models_llm_wizardmath-v1.0>` - chat - 2048 @@ -602,22 +502,12 @@ The following is a list of built-in LLM in Xinference: aquila2-chat-16k - baichuan - baichuan-2 baichuan-2-chat - baichuan-chat - c4ai-command-r-v01 - chatglm - - chatglm2 - - chatglm2-32k - chatglm3 chatglm3-128k @@ -656,16 +546,10 @@ The following is a list of built-in LLM in Xinference: deepseek-vl-chat - falcon - - falcon-instruct - gemma-2-it gemma-it - glaive-coder - glm-4v glm4-chat @@ -678,14 +562,6 @@ The following is a list of built-in LLM in Xinference: gpt-2 - internlm-20b - - internlm-7b - - internlm-chat-20b - - internlm-chat-7b - internlm2-chat internlm2.5-chat @@ -694,6 +570,8 @@ The following is a list of built-in LLM in Xinference: internvl-chat + internvl2 + llama-2 llama-2-chat @@ -740,14 +618,10 @@ The following is a list of built-in LLM in Xinference: omnilmm - openbuddy - openhermes-2.5 opt - orca - orion-chat orion-chat-rag @@ -780,28 +654,14 @@ The following is a list of built-in LLM in Xinference: skywork-math - starchat-beta - - starcoder - - starcoderplus - starling-lm telechat tiny-llama - vicuna-v1.3 - - vicuna-v1.5 - - vicuna-v1.5-16k - wizardcoder-python-v1.0 - wizardlm-v1.0 - wizardmath-v1.0 xverse diff --git a/doc/source/models/builtin/llm/internlm-20b.rst b/doc/source/models/builtin/llm/internlm-20b.rst deleted file mode 100644 index a05f91bf2e..0000000000 --- a/doc/source/models/builtin/llm/internlm-20b.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_internlm-20b: - -======================================== -internlm-20b -======================================== - -- **Context Length:** 16384 -- **Model Name:** internlm-20b -- **Languages:** en, zh -- **Abilities:** generate -- **Description:** Pre-trained on over 2.3T Tokens containing high-quality English, Chinese, and code data. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 20 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 20 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** internlm/internlm-20b -- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm-20b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-20b>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name internlm-20b --size-in-billions 20 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/internlm-7b.rst b/doc/source/models/builtin/llm/internlm-7b.rst deleted file mode 100644 index 54b6e170be..0000000000 --- a/doc/source/models/builtin/llm/internlm-7b.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_internlm-7b: - -======================================== -internlm-7b -======================================== - -- **Context Length:** 8192 -- **Model Name:** internlm-7b -- **Languages:** en, zh -- **Abilities:** generate -- **Description:** InternLM is a Transformer-based LLM that is trained on both Chinese and English data, focusing on practical scenarios. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 7 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** internlm/internlm-7b -- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm-7b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-7b>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name internlm-7b --size-in-billions 7 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/internlm-chat-20b.rst b/doc/source/models/builtin/llm/internlm-chat-20b.rst deleted file mode 100644 index b318ea60c1..0000000000 --- a/doc/source/models/builtin/llm/internlm-chat-20b.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_internlm-chat-20b: - -======================================== -internlm-chat-20b -======================================== - -- **Context Length:** 16384 -- **Model Name:** internlm-chat-20b -- **Languages:** en, zh -- **Abilities:** chat -- **Description:** Pre-trained on over 2.3T Tokens containing high-quality English, Chinese, and code data. The Chat version has undergone SFT and RLHF training. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 20 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 20 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** internlm/internlm-chat-20b -- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm-chat-20b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-20b>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name internlm-chat-20b --size-in-billions 20 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/internlm-chat-7b.rst b/doc/source/models/builtin/llm/internlm-chat-7b.rst deleted file mode 100644 index 37e1c7a3b3..0000000000 --- a/doc/source/models/builtin/llm/internlm-chat-7b.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_internlm-chat-7b: - -======================================== -internlm-chat-7b -======================================== - -- **Context Length:** 4096 -- **Model Name:** internlm-chat-7b -- **Languages:** en, zh -- **Abilities:** chat -- **Description:** Internlm-chat is a fine-tuned version of the Internlm LLM, specializing in chatting. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 7 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** internlm/internlm-chat-7b -- **Model Hubs**: `Hugging Face <https://huggingface.co/internlm/internlm-chat-7b>`__, `ModelScope <https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-chat-7b>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name internlm-chat-7b --size-in-billions 7 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/internvl-chat.rst b/doc/source/models/builtin/llm/internvl-chat.rst index 18dd2e9bf2..87b66bb200 100644 --- a/doc/source/models/builtin/llm/internvl-chat.rst +++ b/doc/source/models/builtin/llm/internvl-chat.rst @@ -19,7 +19,7 @@ Model Spec 1 (pytorch, 2 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 2 -- **Quantizations:** none +- **Quantizations:** 4-bit, 8-bit, none - **Engines**: Transformers - **Model ID:** OpenGVLab/Mini-InternVL-Chat-2B-V1-5 - **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/Mini-InternVL-Chat-2B-V1-5>`__ @@ -30,20 +30,20 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name internvl-chat --size-in-billions 2 --model-format pytorch --quantization ${quantization} -Model Spec 2 (pytorch, 26 Billion) +Model Spec 2 (pytorch, 4 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** pytorch -- **Model Size (in billions):** 26 -- **Quantizations:** none +- **Model Size (in billions):** 4 +- **Quantizations:** 4-bit, 8-bit, none - **Engines**: Transformers -- **Model ID:** OpenGVLab/InternVL-Chat-V1-5 -- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-{quantization}>`__ +- **Model ID:** OpenGVLab/Mini-InternVL-Chat-4B-V1-5 +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/Mini-InternVL-Chat-4B-V1-5>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-engine ${engine} --model-name internvl-chat --size-in-billions 26 --model-format pytorch --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name internvl-chat --size-in-billions 4 --model-format pytorch --quantization ${quantization} Model Spec 3 (pytorch, 26 Billion) @@ -51,10 +51,10 @@ Model Spec 3 (pytorch, 26 Billion) - **Model Format:** pytorch - **Model Size (in billions):** 26 -- **Quantizations:** Int8 +- **Quantizations:** 4-bit, 8-bit, none - **Engines**: Transformers -- **Model ID:** OpenGVLab/InternVL-Chat-V1-5-{quantization} -- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5-{quantization}>`__, `ModelScope <https://modelscope.cn/models/AI-ModelScope/InternVL-Chat-V1-5-{quantization}>`__ +- **Model ID:** OpenGVLab/InternVL-Chat-V1-5 +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5>`__, `ModelScope <https://modelscope.cn/models/OpenGVLab/InternVL-Chat-V1-5>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: diff --git a/doc/source/models/builtin/llm/internvl2.rst b/doc/source/models/builtin/llm/internvl2.rst new file mode 100644 index 0000000000..cf74863d96 --- /dev/null +++ b/doc/source/models/builtin/llm/internvl2.rst @@ -0,0 +1,207 @@ +.. _models_llm_internvl2: + +======================================== +internvl2 +======================================== + +- **Context Length:** 32768 +- **Model Name:** internvl2 +- **Languages:** en, zh +- **Abilities:** chat, vision +- **Description:** InternVL 2 is an open-source multimodal large language model (MLLM) to bridge the capability gap between open-source and proprietary commercial models in multimodal understanding. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 1 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 1 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** OpenGVLab/InternVL2-1B +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-1B>`__, `ModelScope <https://modelscope.cn/models/OpenGVLab/InternVL2-1B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 1 --model-format pytorch --quantization ${quantization} + + +Model Spec 2 (pytorch, 2 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 2 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** OpenGVLab/InternVL2-2B +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-2B>`__, `ModelScope <https://modelscope.cn/models/OpenGVLab/InternVL2-2B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 2 --model-format pytorch --quantization ${quantization} + + +Model Spec 3 (awq, 2 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 2 +- **Quantizations:** Int4 +- **Engines**: +- **Model ID:** OpenGVLab/InternVL2-2B-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-2B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 2 --model-format awq --quantization ${quantization} + + +Model Spec 4 (pytorch, 4 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 4 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** OpenGVLab/InternVL2-4B +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-4B>`__, `ModelScope <https://modelscope.cn/models/OpenGVLab/InternVL2-4B>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 4 --model-format pytorch --quantization ${quantization} + + +Model Spec 5 (awq, 4 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 4 +- **Quantizations:** Int4 +- **Engines**: +- **Model ID:** OpenGVLab/InternVL2-8B-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-8B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 4 --model-format awq --quantization ${quantization} + + +Model Spec 6 (pytorch, 8 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 8 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** OpenGVLab/InternVL2-8B +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-8B>`__, `ModelScope <https://modelscope.cn/models/OpenGVLab/InternVL2-8B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 8 --model-format pytorch --quantization ${quantization} + + +Model Spec 7 (pytorch, 26 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 26 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** OpenGVLab/InternVL2-26B +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-26B>`__, `ModelScope <https://modelscope.cn/models/OpenGVLab/InternVL2-26B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 26 --model-format pytorch --quantization ${quantization} + + +Model Spec 8 (awq, 26 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 26 +- **Quantizations:** Int4 +- **Engines**: +- **Model ID:** OpenGVLab/InternVL2-26B-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-26B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 26 --model-format awq --quantization ${quantization} + + +Model Spec 9 (pytorch, 40 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 40 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** OpenGVLab/InternVL2-40B +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-40B>`__, `ModelScope <https://modelscope.cn/models/OpenGVLab/InternVL2-40B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 40 --model-format pytorch --quantization ${quantization} + + +Model Spec 10 (awq, 40 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 40 +- **Quantizations:** Int4 +- **Engines**: +- **Model ID:** OpenGVLab/InternVL2-40B-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-40B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 40 --model-format awq --quantization ${quantization} + + +Model Spec 11 (pytorch, 76 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 76 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: vLLM, Transformers (vLLM only available for quantization none) +- **Model ID:** OpenGVLab/InternVL2-Llama3-76B +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B>`__, `ModelScope <https://modelscope.cn/models/OpenGVLab/InternVL2-Llama3-76B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 76 --model-format pytorch --quantization ${quantization} + + +Model Spec 12 (awq, 76 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** awq +- **Model Size (in billions):** 76 +- **Quantizations:** Int4 +- **Engines**: +- **Model ID:** OpenGVLab/InternVL2-Llama3-76B-AWQ +- **Model Hubs**: `Hugging Face <https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B-AWQ>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name internvl2 --size-in-billions 76 --model-format awq --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/llama-2-chat.rst b/doc/source/models/builtin/llm/llama-2-chat.rst index 552ba6424b..ebcc14f7ca 100644 --- a/doc/source/models/builtin/llm/llama-2-chat.rst +++ b/doc/source/models/builtin/llm/llama-2-chat.rst @@ -14,52 +14,52 @@ Specifications ^^^^^^^^^^^^^^ -Model Spec 1 (ggmlv3, 7 Billion) +Model Spec 1 (ggufv2, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ -- **Model Format:** ggmlv3 +- **Model Format:** ggufv2 - **Model Size (in billions):** 7 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 - **Engines**: llama.cpp -- **Model ID:** TheBloke/Llama-2-7B-Chat-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML>`__ +- **Model ID:** TheBloke/Llama-2-7B-Chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Llama-2-7b-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} -Model Spec 2 (ggmlv3, 13 Billion) +Model Spec 2 (ggufv2, 13 Billion) ++++++++++++++++++++++++++++++++++++++++ -- **Model Format:** ggmlv3 +- **Model Format:** ggufv2 - **Model Size (in billions):** 13 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 - **Engines**: llama.cpp -- **Model ID:** TheBloke/Llama-2-13B-chat-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-chat-GGML>`__ +- **Model ID:** TheBloke/Llama-2-13B-chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Llama-2-13b-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} -Model Spec 3 (ggmlv3, 70 Billion) +Model Spec 3 (ggufv2, 70 Billion) ++++++++++++++++++++++++++++++++++++++++ -- **Model Format:** ggmlv3 +- **Model Format:** ggufv2 - **Model Size (in billions):** 70 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M - **Engines**: llama.cpp -- **Model ID:** TheBloke/Llama-2-70B-Chat-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-Chat-GGML>`__ +- **Model ID:** TheBloke/Llama-2-70B-Chat-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-Chat-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 70 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} Model Spec 4 (pytorch, 7 Billion) @@ -205,51 +205,3 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 70 --model-format pytorch --quantization ${quantization} - -Model Spec 13 (ggufv2, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggufv2 -- **Model Size (in billions):** 7 -- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/Llama-2-7B-Chat-GGUF -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Llama-2-7b-Chat-GGUF>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} - - -Model Spec 14 (ggufv2, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggufv2 -- **Model Size (in billions):** 13 -- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/Llama-2-13B-chat-GGUF -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-chat-GGUF>`__, `ModelScope <https://modelscope.cn/models/Xorbits/Llama-2-13b-Chat-GGUF>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} - - -Model Spec 15 (ggufv2, 70 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggufv2 -- **Model Size (in billions):** 70 -- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M -- **Engines**: llama.cpp -- **Model ID:** TheBloke/Llama-2-70B-Chat-GGUF -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-Chat-GGUF>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name llama-2-chat --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/llama-2.rst b/doc/source/models/builtin/llm/llama-2.rst index 0f836bd072..11c634b467 100644 --- a/doc/source/models/builtin/llm/llama-2.rst +++ b/doc/source/models/builtin/llm/llama-2.rst @@ -14,20 +14,20 @@ Specifications ^^^^^^^^^^^^^^ -Model Spec 1 (ggmlv3, 7 Billion) +Model Spec 1 (ggufv2, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ -- **Model Format:** ggmlv3 +- **Model Format:** ggufv2 - **Model Size (in billions):** 7 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 - **Engines**: llama.cpp -- **Model ID:** TheBloke/Llama-2-7B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-GGML>`__ +- **Model ID:** TheBloke/Llama-2-7B-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-7B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} Model Spec 2 (gptq, 7 Billion) @@ -62,36 +62,36 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 7 --model-format awq --quantization ${quantization} -Model Spec 4 (ggmlv3, 13 Billion) +Model Spec 4 (ggufv2, 13 Billion) ++++++++++++++++++++++++++++++++++++++++ -- **Model Format:** ggmlv3 +- **Model Format:** ggufv2 - **Model Size (in billions):** 13 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M, Q6_K, Q8_0 - **Engines**: llama.cpp -- **Model ID:** TheBloke/Llama-2-13B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-GGML>`__ +- **Model ID:** TheBloke/Llama-2-13B-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-13B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 13 --model-format ggufv2 --quantization ${quantization} -Model Spec 5 (ggmlv3, 70 Billion) +Model Spec 5 (ggufv2, 70 Billion) ++++++++++++++++++++++++++++++++++++++++ -- **Model Format:** ggmlv3 +- **Model Format:** ggufv2 - **Model Size (in billions):** 70 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 +- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_K_S, Q4_K_M, Q5_0, Q5_K_S, Q5_K_M - **Engines**: llama.cpp -- **Model ID:** TheBloke/Llama-2-70B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-GGML>`__ +- **Model ID:** TheBloke/Llama-2-70B-GGUF +- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/Llama-2-70B-GGUF>`__ Execute the following command to launch the model, remember to replace ``${quantization}`` with your chosen quantization method from the options listed above:: - xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 70 --model-format ggmlv3 --quantization ${quantization} + xinference launch --model-engine ${engine} --model-name llama-2 --size-in-billions 70 --model-format ggufv2 --quantization ${quantization} Model Spec 6 (pytorch, 7 Billion) diff --git a/doc/source/models/builtin/llm/openbuddy.rst b/doc/source/models/builtin/llm/openbuddy.rst deleted file mode 100644 index 5d05048101..0000000000 --- a/doc/source/models/builtin/llm/openbuddy.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_openbuddy: - -======================================== -OpenBuddy -======================================== - -- **Context Length:** 2048 -- **Model Name:** OpenBuddy -- **Languages:** en -- **Abilities:** chat -- **Description:** OpenBuddy is a powerful open multilingual chatbot model aimed at global users. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (ggmlv3, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 13 -- **Quantizations:** Q2_K, Q3_K_S, Q3_K_M, Q3_K_L, Q4_0, Q4_1, Q4_K_S, Q4_K_M, Q5_0, Q5_1, Q5_K_S, Q5_K_M, Q6_K, Q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/OpenBuddy-Llama2-13B-v11.1-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/OpenBuddy-Llama2-13B-v11.1-GGML>`__, `ModelScope <https://modelscope.cn/models/Xorbits/OpenBuddy-Llama2-13B-v11.1-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name OpenBuddy --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/orca.rst b/doc/source/models/builtin/llm/orca.rst deleted file mode 100644 index 566f89bbfd..0000000000 --- a/doc/source/models/builtin/llm/orca.rst +++ /dev/null @@ -1,63 +0,0 @@ -.. _models_llm_orca: - -======================================== -orca -======================================== - -- **Context Length:** 2048 -- **Model Name:** orca -- **Languages:** en -- **Abilities:** chat -- **Description:** Orca is an LLM trained by fine-tuning LLaMA on explanation traces obtained from GPT-4. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (ggmlv3, 3 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 3 -- **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/orca_mini_3B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/orca_mini_3B-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name orca --size-in-billions 3 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 2 (ggmlv3, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 7 -- **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/orca_mini_7B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/orca_mini_7B-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name orca --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 3 (ggmlv3, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 13 -- **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/orca_mini_13B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/orca_mini_13B-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name orca --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/qwen2-instruct.rst b/doc/source/models/builtin/llm/qwen2-instruct.rst index b7cd5dab92..a6bcf7d957 100644 --- a/doc/source/models/builtin/llm/qwen2-instruct.rst +++ b/doc/source/models/builtin/llm/qwen2-instruct.rst @@ -206,7 +206,87 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 72 --model-format awq --quantization ${quantization} -Model Spec 13 (mlx, 0_5 Billion) +Model Spec 13 (fp8, 0_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** fp8 +- **Model Size (in billions):** 0_5 +- **Quantizations:** fp8 +- **Engines**: vLLM, SGLang +- **Model ID:** neuralmagic/Qwen2-0.5B-Instruct-FP8 +- **Model Hubs**: `Hugging Face <https://huggingface.co/neuralmagic/Qwen2-0.5B-Instruct-FP8>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format fp8 --quantization ${quantization} + + +Model Spec 14 (fp8, 0_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** fp8 +- **Model Size (in billions):** 0_5 +- **Quantizations:** fp8 +- **Engines**: vLLM, SGLang +- **Model ID:** neuralmagic/Qwen2-0.5B-Instruct-FP8 +- **Model Hubs**: `Hugging Face <https://huggingface.co/neuralmagic/Qwen2-0.5B-Instruct-FP8>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format fp8 --quantization ${quantization} + + +Model Spec 15 (fp8, 1_5 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** fp8 +- **Model Size (in billions):** 1_5 +- **Quantizations:** fp8 +- **Engines**: vLLM, SGLang +- **Model ID:** neuralmagic/Qwen2-1.5B-Instruct-FP8 +- **Model Hubs**: `Hugging Face <https://huggingface.co/neuralmagic/Qwen2-1.5B-Instruct-FP8>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 1_5 --model-format fp8 --quantization ${quantization} + + +Model Spec 16 (fp8, 7 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** fp8 +- **Model Size (in billions):** 7 +- **Quantizations:** fp8 +- **Engines**: vLLM, SGLang +- **Model ID:** neuralmagic/Qwen2-7B-Instruct-FP8 +- **Model Hubs**: `Hugging Face <https://huggingface.co/neuralmagic/Qwen2-7B-Instruct-FP8>`__, `ModelScope <https://modelscope.cn/models/liuzhenghua/Qwen2-7B-FP8-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 7 --model-format fp8 --quantization ${quantization} + + +Model Spec 17 (fp8, 72 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** fp8 +- **Model Size (in billions):** 72 +- **Quantizations:** fp8 +- **Engines**: vLLM, SGLang +- **Model ID:** neuralmagic/Qwen2-72B-Instruct-FP8 +- **Model Hubs**: `Hugging Face <https://huggingface.co/neuralmagic/Qwen2-72B-Instruct-FP8>`__, `ModelScope <https://modelscope.cn/models/liuzhenghua/Qwen2-72B-FP8-Instruct>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 72 --model-format fp8 --quantization ${quantization} + + +Model Spec 18 (mlx, 0_5 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -222,7 +302,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format mlx --quantization ${quantization} -Model Spec 14 (mlx, 1_5 Billion) +Model Spec 19 (mlx, 1_5 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -238,7 +318,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 1_5 --model-format mlx --quantization ${quantization} -Model Spec 15 (mlx, 7 Billion) +Model Spec 20 (mlx, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -254,7 +334,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 7 --model-format mlx --quantization ${quantization} -Model Spec 16 (mlx, 72 Billion) +Model Spec 21 (mlx, 72 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** mlx @@ -270,7 +350,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 72 --model-format mlx --quantization ${quantization} -Model Spec 17 (ggufv2, 0_5 Billion) +Model Spec 22 (ggufv2, 0_5 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -286,7 +366,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 0_5 --model-format ggufv2 --quantization ${quantization} -Model Spec 18 (ggufv2, 1_5 Billion) +Model Spec 23 (ggufv2, 1_5 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -302,7 +382,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 1_5 --model-format ggufv2 --quantization ${quantization} -Model Spec 19 (ggufv2, 7 Billion) +Model Spec 24 (ggufv2, 7 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 @@ -318,7 +398,7 @@ chosen quantization method from the options listed above:: xinference launch --model-engine ${engine} --model-name qwen2-instruct --size-in-billions 7 --model-format ggufv2 --quantization ${quantization} -Model Spec 20 (ggufv2, 72 Billion) +Model Spec 25 (ggufv2, 72 Billion) ++++++++++++++++++++++++++++++++++++++++ - **Model Format:** ggufv2 diff --git a/doc/source/models/builtin/llm/starchat-beta.rst b/doc/source/models/builtin/llm/starchat-beta.rst deleted file mode 100644 index bbcc40b226..0000000000 --- a/doc/source/models/builtin/llm/starchat-beta.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_starchat-beta: - -======================================== -starchat-beta -======================================== - -- **Context Length:** 8192 -- **Model Name:** starchat-beta -- **Languages:** en -- **Abilities:** chat -- **Description:** Starchat-beta is a fine-tuned version of the Starcoderplus LLM, specializing in coding assistance. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 16 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 16 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** HuggingFaceH4/starchat-beta -- **Model Hubs**: `Hugging Face <https://huggingface.co/HuggingFaceH4/starchat-beta>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name starchat-beta --size-in-billions 16 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/starcoder.rst b/doc/source/models/builtin/llm/starcoder.rst deleted file mode 100644 index b80050e61b..0000000000 --- a/doc/source/models/builtin/llm/starcoder.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_starcoder: - -======================================== -starcoder -======================================== - -- **Context Length:** 8192 -- **Model Name:** starcoder -- **Languages:** en -- **Abilities:** generate -- **Description:** Starcoder is an open-source Transformer based LLM that is trained on permissively licensed data from GitHub. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (ggmlv3, 16 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 16 -- **Quantizations:** q4_0, q4_1, q5_0, q5_1, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/starcoder-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/starcoder-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name starcoder --size-in-billions 16 --model-format ggmlv3 --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/starcoderplus.rst b/doc/source/models/builtin/llm/starcoderplus.rst deleted file mode 100644 index 5b6e87199e..0000000000 --- a/doc/source/models/builtin/llm/starcoderplus.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _models_llm_starcoderplus: - -======================================== -starcoderplus -======================================== - -- **Context Length:** 8192 -- **Model Name:** starcoderplus -- **Languages:** en -- **Abilities:** generate -- **Description:** Starcoderplus is an open-source LLM trained by fine-tuning Starcoder on RedefinedWeb and StarCoderData datasets. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 16 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 16 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** bigcode/starcoderplus -- **Model Hubs**: `Hugging Face <https://huggingface.co/bigcode/starcoderplus>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name starcoderplus --size-in-billions 16 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/vicuna-v1.3.rst b/doc/source/models/builtin/llm/vicuna-v1.3.rst deleted file mode 100644 index 23b0cd01cf..0000000000 --- a/doc/source/models/builtin/llm/vicuna-v1.3.rst +++ /dev/null @@ -1,111 +0,0 @@ -.. _models_llm_vicuna-v1.3: - -======================================== -vicuna-v1.3 -======================================== - -- **Context Length:** 2048 -- **Model Name:** vicuna-v1.3 -- **Languages:** en -- **Abilities:** chat -- **Description:** Vicuna is an open-source LLM trained by fine-tuning LLaMA on data collected from ShareGPT. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (ggmlv3, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 7 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/vicuna-7B-v1.3-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/vicuna-7B-v1.3-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 2 (ggmlv3, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 13 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/vicuna-13b-v1.3.0-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/vicuna-13b-v1.3.0-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 3 (ggmlv3, 33 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 33 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/vicuna-33B-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/vicuna-33B-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 33 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 4 (pytorch, 33 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 33 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** lmsys/vicuna-33b-v1.3 -- **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-33b-v1.3>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 33 --model-format pytorch --quantization ${quantization} - - -Model Spec 5 (pytorch, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 13 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** lmsys/vicuna-13b-v1.3 -- **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-13b-v1.3>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 13 --model-format pytorch --quantization ${quantization} - - -Model Spec 6 (pytorch, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 7 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** lmsys/vicuna-7b-v1.3 -- **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-7b-v1.3>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.3 --size-in-billions 7 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/vicuna-v1.5-16k.rst b/doc/source/models/builtin/llm/vicuna-v1.5-16k.rst deleted file mode 100644 index 88adc9a0ba..0000000000 --- a/doc/source/models/builtin/llm/vicuna-v1.5-16k.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. _models_llm_vicuna-v1.5-16k: - -======================================== -vicuna-v1.5-16k -======================================== - -- **Context Length:** 16384 -- **Model Name:** vicuna-v1.5-16k -- **Languages:** en -- **Abilities:** chat -- **Description:** Vicuna-v1.5-16k is a special version of Vicuna-v1.5, with a context window of 16k tokens instead of 4k. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 7 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** lmsys/vicuna-7b-v1.5-16k -- **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-7b-v1.5-16k>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.5-16k --size-in-billions 7 --model-format pytorch --quantization ${quantization} - - -Model Spec 2 (pytorch, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 13 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: Transformers -- **Model ID:** lmsys/vicuna-13b-v1.5-16k -- **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-13b-v1.5-16k>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.5-16k --size-in-billions 13 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/vicuna-v1.5.rst b/doc/source/models/builtin/llm/vicuna-v1.5.rst deleted file mode 100644 index fa6a6b8860..0000000000 --- a/doc/source/models/builtin/llm/vicuna-v1.5.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. _models_llm_vicuna-v1.5: - -======================================== -vicuna-v1.5 -======================================== - -- **Context Length:** 4096 -- **Model Name:** vicuna-v1.5 -- **Languages:** en -- **Abilities:** chat -- **Description:** Vicuna is an open-source LLM trained by fine-tuning LLaMA on data collected from ShareGPT. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (pytorch, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 7 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** lmsys/vicuna-7b-v1.5 -- **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-7b-v1.5>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.5 --size-in-billions 7 --model-format pytorch --quantization ${quantization} - - -Model Spec 2 (pytorch, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** pytorch -- **Model Size (in billions):** 13 -- **Quantizations:** 4-bit, 8-bit, none -- **Engines**: vLLM, Transformers (vLLM only available for quantization none) -- **Model ID:** lmsys/vicuna-13b-v1.5 -- **Model Hubs**: `Hugging Face <https://huggingface.co/lmsys/vicuna-13b-v1.5>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name vicuna-v1.5 --size-in-billions 13 --model-format pytorch --quantization ${quantization} - diff --git a/doc/source/models/builtin/llm/wizardlm-v1.0.rst b/doc/source/models/builtin/llm/wizardlm-v1.0.rst deleted file mode 100644 index d298860fb4..0000000000 --- a/doc/source/models/builtin/llm/wizardlm-v1.0.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. _models_llm_wizardlm-v1.0: - -======================================== -wizardlm-v1.0 -======================================== - -- **Context Length:** 2048 -- **Model Name:** wizardlm-v1.0 -- **Languages:** en -- **Abilities:** chat -- **Description:** WizardLM is an open-source LLM trained by fine-tuning LLaMA with Evol-Instruct. - -Specifications -^^^^^^^^^^^^^^ - - -Model Spec 1 (ggmlv3, 7 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 7 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/WizardLM-7B-V1.0-Uncensored-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/WizardLM-7B-V1.0-Uncensored-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name wizardlm-v1.0 --size-in-billions 7 --model-format ggmlv3 --quantization ${quantization} - - -Model Spec 2 (ggmlv3, 13 Billion) -++++++++++++++++++++++++++++++++++++++++ - -- **Model Format:** ggmlv3 -- **Model Size (in billions):** 13 -- **Quantizations:** q2_K, q3_K_L, q3_K_M, q3_K_S, q4_0, q4_1, q4_K_M, q4_K_S, q5_0, q5_1, q5_K_M, q5_K_S, q6_K, q8_0 -- **Engines**: llama.cpp -- **Model ID:** TheBloke/WizardLM-13B-V1.0-Uncensored-GGML -- **Model Hubs**: `Hugging Face <https://huggingface.co/TheBloke/WizardLM-13B-V1.0-Uncensored-GGML>`__ - -Execute the following command to launch the model, remember to replace ``${quantization}`` with your -chosen quantization method from the options listed above:: - - xinference launch --model-engine ${engine} --model-name wizardlm-v1.0 --size-in-billions 13 --model-format ggmlv3 --quantization ${quantization} - diff --git a/doc/source/models/model_abilities/vision.rst b/doc/source/models/model_abilities/vision.rst index 7a8a25a750..74091abe43 100644 --- a/doc/source/models/model_abilities/vision.rst +++ b/doc/source/models/model_abilities/vision.rst @@ -28,6 +28,8 @@ The ``vision`` ability is supported with the following models in Xinference: * :ref:`cogvlm2 <models_llm_cogvlm2>` * :ref:`MiniCPM-Llama3-V 2.5 <models_llm_minicpm-llama3-v-2_5>` * :ref:`GLM-4V <models_llm_glm-4v>` +* :ref:`MiniCPM-Llama3-V 2.6 <models_llm_minicpm-v-2.6>` +* :ref:`internvl2 <models_llm_internvl2>` Quickstart diff --git a/doc/source/user_guide/backends.rst b/doc/source/user_guide/backends.rst index 8ec1c10181..57126871e8 100644 --- a/doc/source/user_guide/backends.rst +++ b/doc/source/user_guide/backends.rst @@ -47,15 +47,13 @@ Currently, supported model includes: .. vllm_start - ``llama-2``, ``llama-3``, ``llama-3.1``, ``llama-2-chat``, ``llama-3-instruct``, ``llama-3.1-instruct`` -- ``baichuan``, ``baichuan-chat``, ``baichuan-2-chat`` -- ``internlm-16k``, ``internlm-chat-7b``, ``internlm-chat-8k``, ``internlm-chat-20b`` - ``mistral-v0.1``, ``mistral-instruct-v0.1``, ``mistral-instruct-v0.2``, ``mistral-instruct-v0.3``, ``mistral-nemo-instruct``, ``mistral-large-instruct`` - ``codestral-v0.1`` - ``Yi``, ``Yi-1.5``, ``Yi-chat``, ``Yi-1.5-chat``, ``Yi-1.5-chat-16k`` - ``code-llama``, ``code-llama-python``, ``code-llama-instruct`` - ``deepseek``, ``deepseek-coder``, ``deepseek-chat``, ``deepseek-coder-instruct`` - ``codeqwen1.5``, ``codeqwen1.5-chat`` -- ``vicuna-v1.3``, ``vicuna-v1.5`` +- ``baichuan-2-chat`` - ``internlm2-chat`` - ``internlm2.5-chat``, ``internlm2.5-chat-1m`` - ``qwen-chat`` From eb9a4eac90bf2a7fe42e4816d6d7e25d0a099df8 Mon Sep 17 00:00:00 2001 From: yiboyasss <143868051+yiboyasss@users.noreply.github.com> Date: Wed, 21 Aug 2024 18:47:44 +0800 Subject: [PATCH 270/298] FEAT: [UI] Add other parameters to other models besides the LLM model. (#2129) --- .../ui/src/scenes/launch_model/modelCard.js | 243 ++++++++++-------- 1 file changed, 140 insertions(+), 103 deletions(-) diff --git a/xinference/web/ui/src/scenes/launch_model/modelCard.js b/xinference/web/ui/src/scenes/launch_model/modelCard.js index 4bc3eb8130..a4391f830a 100644 --- a/xinference/web/ui/src/scenes/launch_model/modelCard.js +++ b/xinference/web/ui/src/scenes/launch_model/modelCard.js @@ -93,6 +93,8 @@ const ModelCard = ({ const [isOther, setIsOther] = useState(false) const [isPeftModelConfig, setIsPeftModelConfig] = useState(false) const [openSnackbar, setOpenSnackbar] = useState(false) + const [openErrorSnackbar, setOpenErrorSnackbar] = useState(false) + const [errorSnackbarValue, setErrorSnackbarValue] = useState('') const { isCallingApi, setIsCallingApi } = useContext(ApiContext) const { isUpdatingModel } = useContext(ApiContext) const { setErrorMsg } = useContext(ApiContext) @@ -282,114 +284,120 @@ const ModelCard = ({ setIsCallingApi(true) - const modelDataWithID_LLM = { - // If user does not fill model_uid, pass null (None) to server and server generates it. - model_uid: modelUID?.trim() === '' ? null : modelUID?.trim(), - model_name: modelData.model_name, - model_type: modelType, - model_engine: modelEngine, - model_format: modelFormat, - model_size_in_billions: convertModelSize(modelSize), - quantization: quantization, - n_gpu: - parseInt(nGPU, 10) === 0 || nGPU === 'CPU' - ? null - : nGPU === 'auto' - ? 'auto' - : parseInt(nGPU, 10), - replica: replica, - request_limits: - String(requestLimits)?.trim() === '' - ? null - : Number(String(requestLimits)?.trim()), - worker_ip: workerIp?.trim() === '' ? null : workerIp?.trim(), - gpu_idx: GPUIdx?.trim() === '' ? null : handleGPUIdx(GPUIdx?.trim()), - download_hub: downloadHub === '' ? null : downloadHub, - model_path: modelPath?.trim() === '' ? null : modelPath?.trim(), - } - - let modelDataWithID_other = { - model_uid: modelUID?.trim() === '' ? null : modelUID?.trim(), - model_name: modelData.model_name, - model_type: modelType, - replica: replica, - n_gpu: nGpu === 'GPU' ? 'auto' : null, - worker_ip: workerIp?.trim() === '' ? null : workerIp.trim(), - gpu_idx: GPUIdx?.trim() === '' ? null : handleGPUIdx(GPUIdx?.trim()), - download_hub: downloadHub === '' ? null : downloadHub, - model_path: modelPath?.trim() === '' ? null : modelPath?.trim(), - } - - if (nGPULayers >= 0) { - modelDataWithID_LLM.n_gpu_layers = nGPULayers - } + try { + const modelDataWithID_LLM = { + // If user does not fill model_uid, pass null (None) to server and server generates it. + model_uid: modelUID?.trim() === '' ? null : modelUID?.trim(), + model_name: modelData.model_name, + model_type: modelType, + model_engine: modelEngine, + model_format: modelFormat, + model_size_in_billions: convertModelSize(modelSize), + quantization: quantization, + n_gpu: + parseInt(nGPU, 10) === 0 || nGPU === 'CPU' + ? null + : nGPU === 'auto' + ? 'auto' + : parseInt(nGPU, 10), + replica: replica, + request_limits: + String(requestLimits)?.trim() === '' + ? null + : Number(String(requestLimits)?.trim()), + worker_ip: workerIp?.trim() === '' ? null : workerIp?.trim(), + gpu_idx: GPUIdx?.trim() === '' ? null : handleGPUIdx(GPUIdx?.trim()), + download_hub: downloadHub === '' ? null : downloadHub, + model_path: modelPath?.trim() === '' ? null : modelPath?.trim(), + } - if ( - loraListArr.length || - imageLoraLoadKwargsArr.length || - imageLoraFuseKwargsArr.length - ) { - const peft_model_config = {} - if (imageLoraLoadKwargsArr.length) { - const image_lora_load_kwargs = {} - imageLoraLoadKwargsArr.forEach((item) => { - image_lora_load_kwargs[item.key] = handleValueType(item.value) - }) - peft_model_config['image_lora_load_kwargs'] = image_lora_load_kwargs + const modelDataWithID_other = { + model_uid: modelUID?.trim() === '' ? null : modelUID?.trim(), + model_name: modelData.model_name, + model_type: modelType, + replica: replica, + n_gpu: nGpu === 'GPU' ? 'auto' : null, + worker_ip: workerIp?.trim() === '' ? null : workerIp.trim(), + gpu_idx: GPUIdx?.trim() === '' ? null : handleGPUIdx(GPUIdx?.trim()), + download_hub: downloadHub === '' ? null : downloadHub, + model_path: modelPath?.trim() === '' ? null : modelPath?.trim(), } - if (imageLoraFuseKwargsArr.length) { - const image_lora_fuse_kwargs = {} - imageLoraFuseKwargsArr.forEach((item) => { - image_lora_fuse_kwargs[item.key] = handleValueType(item.value) - }) - peft_model_config['image_lora_fuse_kwargs'] = image_lora_fuse_kwargs + + if (nGPULayers >= 0) { + modelDataWithID_LLM.n_gpu_layers = nGPULayers } - if (loraListArr.length) { - const lora_list = loraListArr - lora_list.map((item) => { - delete item.id - }) - peft_model_config['lora_list'] = lora_list + + if ( + loraListArr.length || + imageLoraLoadKwargsArr.length || + imageLoraFuseKwargsArr.length + ) { + const peft_model_config = {} + if (imageLoraLoadKwargsArr.length) { + const image_lora_load_kwargs = {} + imageLoraLoadKwargsArr.forEach((item) => { + image_lora_load_kwargs[item.key] = handleValueType(item.value) + }) + peft_model_config['image_lora_load_kwargs'] = image_lora_load_kwargs + } + if (imageLoraFuseKwargsArr.length) { + const image_lora_fuse_kwargs = {} + imageLoraFuseKwargsArr.forEach((item) => { + image_lora_fuse_kwargs[item.key] = handleValueType(item.value) + }) + peft_model_config['image_lora_fuse_kwargs'] = image_lora_fuse_kwargs + } + if (loraListArr.length) { + const lora_list = loraListArr + lora_list.map((item) => { + delete item.id + }) + peft_model_config['lora_list'] = lora_list + } + modelDataWithID_LLM['peft_model_config'] = peft_model_config } - modelDataWithID_LLM['peft_model_config'] = peft_model_config - } - if (customParametersArr.length) { - customParametersArr.forEach((item) => { - modelDataWithID_LLM[item.key] = handleValueType(item.value) - }) - } + const modelDataWithID = + modelType === 'LLM' ? modelDataWithID_LLM : modelDataWithID_other - const modelDataWithID = - modelType === 'LLM' ? modelDataWithID_LLM : modelDataWithID_other + if (customParametersArr.length) { + customParametersArr.forEach((item) => { + modelDataWithID[item.key] = handleValueType(item.value) + }) + } - // First fetcher request to initiate the model - fetchWrapper - .post('/v1/models', modelDataWithID) - .then(() => { - navigate(`/running_models/${modelType}`) - sessionStorage.setItem( - 'runningModelType', - `/running_models/${modelType}` - ) - let historyArr = JSON.parse(localStorage.getItem('historyArr')) || [] - if (!historyArr.some((item) => deepEqual(item, modelDataWithID))) { - historyArr = historyArr.filter( - (item) => item.model_name !== modelDataWithID.model_name + // First fetcher request to initiate the model + fetchWrapper + .post('/v1/models', modelDataWithID) + .then(() => { + navigate(`/running_models/${modelType}`) + sessionStorage.setItem( + 'runningModelType', + `/running_models/${modelType}` ) - historyArr.push(modelDataWithID) - } - localStorage.setItem('historyArr', JSON.stringify(historyArr)) + let historyArr = JSON.parse(localStorage.getItem('historyArr')) || [] + if (!historyArr.some((item) => deepEqual(item, modelDataWithID))) { + historyArr = historyArr.filter( + (item) => item.model_name !== modelDataWithID.model_name + ) + historyArr.push(modelDataWithID) + } + localStorage.setItem('historyArr', JSON.stringify(historyArr)) - setIsCallingApi(false) - }) - .catch((error) => { - console.error('Error:', error) - if (error.response.status !== 403) { - setErrorMsg(error.message) - } - setIsCallingApi(false) - }) + setIsCallingApi(false) + }) + .catch((error) => { + console.error('Error:', error) + if (error.response.status !== 403) { + setErrorMsg(error.message) + } + setIsCallingApi(false) + }) + } catch (error) { + setOpenErrorSnackbar(true) + setErrorSnackbarValue(`${error}`) + setIsCallingApi(false) + } } const handleGPUIdx = (data) => { @@ -644,10 +652,17 @@ const ModelCard = ({ setModelUID(arr[0].model_uid || '') setReplica(arr[0].replica || 1) setNGpu(arr[0].n_gpu === 'auto' ? 'GPU' : 'CPU') - setGPUIdx(arr[0].gpu_idx || '') + setGPUIdx(arr[0].gpu_idx?.join(',') || '') setWorkerIp(arr[0].worker_ip || '') - setDownloadHub(arr[0].download_hub) + setDownloadHub(arr[0].download_hub || '') setModelPath(arr[0].model_path || '') + + let customData = [] + for (let key in arr[0]) { + !llmAllDataKey.includes(key) && + customData.push({ key: key, value: arr[0][key] }) + } + setCustomArr(customData) } } @@ -1574,6 +1589,18 @@ const ModelCard = ({ onChange={(e) => setModelPath(e.target.value)} /> </FormControl> + <AddPair + customData={{ + title: 'Additional parameters passed to the inference engine', + key: 'key', + value: 'value', + }} + onGetArr={(arr) => { + setCustomParametersArr(arr) + }} + onJudgeArr={judgeArr} + pairData={customArr} + /> </FormControl> )} <Box className="buttonsContainer"> @@ -1592,14 +1619,14 @@ const ModelCard = ({ (quantization || (!modelData.is_builtin && modelFormat !== 'pytorch')) ) || - !judgeArr(customParametersArr, ['key', 'value']) || !judgeArr(loraListArr, ['lora_name', 'local_path']) || !judgeArr(imageLoraLoadKwargsArr, ['key', 'value']) || !judgeArr(imageLoraFuseKwargsArr, ['key', 'value']) || requestLimitsAlert || GPUIdxAlert)) || ((modelType === 'embedding' || modelType === 'rerank') && - GPUIdxAlert) + GPUIdxAlert) || + !judgeArr(customParametersArr, ['key', 'value']) } > {(() => { @@ -1701,6 +1728,16 @@ const ModelCard = ({ message="Please fill in the complete parameters before adding!" key={'top' + 'center'} /> + <Snackbar + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + open={openErrorSnackbar} + onClose={() => setOpenErrorSnackbar(false)} + key={'top' + 'center'} + > + <Alert severity="error" variant="filled" sx={{ width: '100%' }}> + {errorSnackbarValue} + </Alert> + </Snackbar> <Backdrop sx={{ color: '#fff', zIndex: (theme) => theme.zIndex.drawer + 1 }} From ce0ff049f779038f12cd2477b6c11173f7c275e8 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Thu, 22 Aug 2024 19:02:24 +0800 Subject: [PATCH 271/298] FEAT: support SD3-medium inpainting (#2137) --- xinference/model/image/model_spec.json | 3 ++- .../model/image/model_spec_modelscope.json | 3 ++- .../model/image/stable_diffusion/core.py | 23 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/xinference/model/image/model_spec.json b/xinference/model/image/model_spec.json index db062dace7..0c1d6f9068 100644 --- a/xinference/model/image/model_spec.json +++ b/xinference/model/image/model_spec.json @@ -24,7 +24,8 @@ "model_revision": "ea42f8cef0f178587cf766dc8129abd379c90671", "model_ability": [ "text2image", - "image2image" + "image2image", + "inpainting" ] }, { diff --git a/xinference/model/image/model_spec_modelscope.json b/xinference/model/image/model_spec_modelscope.json index ee07c46632..d0a596ca7d 100644 --- a/xinference/model/image/model_spec_modelscope.json +++ b/xinference/model/image/model_spec_modelscope.json @@ -27,7 +27,8 @@ "model_revision": "master", "model_ability": [ "text2image", - "image2image" + "image2image", + "inpainting" ] }, { diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index 17c83e9f18..4d950bfc0d 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -46,8 +46,13 @@ def __init__( self._model_uid = model_uid self._model_path = model_path self._device = device + # when a model has text2image ability, + # it will be loaded as AutoPipelineForText2Image + # for image2image and inpainting, + # we convert to the corresponding model self._model = None self._i2i_model = None # image to image model + self._inpainting_model = None # inpainting model self._lora_model = lora_model self._lora_load_kwargs = lora_load_kwargs or {} self._lora_fuse_kwargs = lora_fuse_kwargs or {} @@ -258,6 +263,23 @@ def inpainting( response_format: str = "url", **kwargs, ): + if "inpainting" not in self._abilities: + raise RuntimeError(f"{self._model_uid} does not support inpainting") + + if ( + "text2image" in self._abilities or "image2image" in self._abilities + ) and self._model is not None: + from diffusers import AutoPipelineForInpainting + + if self._inpainting_model is not None: + model = self._inpainting_model + else: + model = self._inpainting_model = AutoPipelineForInpainting.from_pipe( + self._model + ) + else: + model = self._model + width, height = map(int, re.split(r"[^\d]+", size)) return self._call_model( image=image, @@ -268,5 +290,6 @@ def inpainting( width=width, num_images_per_prompt=n, response_format=response_format, + model=model, **kwargs, ) From 6a372d60c9e2d34df321d08c6298577bd9a11761 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Fri, 23 Aug 2024 11:51:10 +0800 Subject: [PATCH 272/298] ENH: make internvl2 support video (#2104) --- xinference/core/chat_interface.py | 2 +- .../model/llm/transformers/intern_vl.py | 87 ++++++++++++++++--- 2 files changed, 78 insertions(+), 11 deletions(-) diff --git a/xinference/core/chat_interface.py b/xinference/core/chat_interface.py index 0264c94c36..8738141f90 100644 --- a/xinference/core/chat_interface.py +++ b/xinference/core/chat_interface.py @@ -340,7 +340,7 @@ def update_button(text): state = gr.State([]) with gr.Row(): chatbot = gr.Chatbot( - elem_id="chatbot", label=self.model_name, height=550, scale=7 + elem_id="chatbot", label=self.model_name, height=700, scale=7 ) with gr.Column(scale=3): imagebox = gr.Image(type="filepath") diff --git a/xinference/model/llm/transformers/intern_vl.py b/xinference/model/llm/transformers/intern_vl.py index dedac5b1bd..dc90cd0516 100644 --- a/xinference/model/llm/transformers/intern_vl.py +++ b/xinference/model/llm/transformers/intern_vl.py @@ -42,27 +42,38 @@ def _message_content_to_intern(content, image_cnt): if not isinstance(content, str): texts = [] image_urls = [] + video_urls = [] for c in content: c_type = c.get("type") if c_type == "text": texts.append(c["text"]) elif c_type == "image_url": image_urls.append(c["image_url"]["url"]) + elif c_type == "video_url": + video_urls.append(c["video_url"]["url"]) + if len(video_urls) > 1: + raise RuntimeError("Only one video per message is supported") image_futures = [] with ThreadPoolExecutor() as executor: for image_url in image_urls: fut = executor.submit(_decode_image, image_url) image_futures.append(fut) images = [fut.result() for fut in image_futures] + videos = [] + for vid_url in video_urls: + videos.append(_load_video(vid_url, num_segments=8, max_num=1)) prefix = "" for i, _ in enumerate(images): prefix += f"Image-{image_cnt + i + 1}: <image>\n\n" + + if len(videos) > 0: + prefix = "".join( + [f"Frame{i+1}: <image>\n" for i in range(len(videos[0][1]))] + ) + text = prefix + " ".join(texts) - if len(images) == 0: - return text, [] - else: - return text, images - return content, [] + return text, images, videos + return content, [], [] def _get_prompt_and_chat_history( @@ -71,18 +82,21 @@ def _get_prompt_and_chat_history( ): # Convert openai history to intern vl history images = [] + videos = [] history = [] image_cnt = 0 for h1, h2 in zip(*[iter(chat_history or [])] * 2): - content1, img = _message_content_to_intern(h1["content"], image_cnt) - content2, _ = _message_content_to_intern(h2["content"], image_cnt) + content1, img, vid = _message_content_to_intern(h1["content"], image_cnt) + content2, _, _ = _message_content_to_intern(h2["content"], image_cnt) history.append([content1, content2]) images.extend(img) image_cnt += len(img) + videos.extend(vid) - question, img = _message_content_to_intern(prompt, image_cnt) + question, img, vid = _message_content_to_intern(prompt, image_cnt) images.extend(img) - return question, history, images + videos.extend(vid) + return question, history, images, videos def _build_transform(input_size=448): @@ -174,6 +188,53 @@ def _load_image(image_file, input_size=448, max_num=12): return pixel_values +# video multi-round conversation +def _get_index(bound, fps, max_frame, first_idx=0, num_segments=32): + import numpy as np + + if bound: + start, end = bound[0], bound[1] + else: + start, end = -100000, 100000 + start_idx = max(first_idx, round(start * fps)) + end_idx = min(round(end * fps), max_frame) + seg_size = float(end_idx - start_idx) / num_segments + frame_indices = np.array( + [ + int(start_idx + (seg_size / 2) + np.round(seg_size * idx)) + for idx in range(num_segments) + ] + ) + return frame_indices + + +def _load_video(video_path, bound=None, input_size=448, max_num=1, num_segments=32): + from decord import VideoReader, cpu + from PIL import Image + + vr = VideoReader(video_path, ctx=cpu(0), num_threads=1) + max_frame = len(vr) - 1 + fps = float(vr.get_avg_fps()) + + pixel_values_list, num_patches_list = [], [] + transform = _build_transform(input_size=input_size) + frame_indices = _get_index( + bound, fps, max_frame, first_idx=0, num_segments=num_segments + ) + for frame_index in frame_indices: + img = Image.fromarray(vr[frame_index].asnumpy()).convert("RGB") + img = _dynamic_preprocess( + img, image_size=input_size, use_thumbnail=True, max_num=max_num + ) + pixel_values = [transform(tile) for tile in img] + pixel_values = torch.stack(pixel_values) + pixel_values = pixel_values.to(torch.bfloat16).cuda() + num_patches_list.append(pixel_values.shape[0]) + pixel_values_list.append(pixel_values) + pixel_values = torch.cat(pixel_values_list) + return pixel_values, num_patches_list + + class InternVLChatModel(PytorchChatModel): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -305,7 +366,9 @@ def chat( else False ) - content, history, images = _get_prompt_and_chat_history(prompt, chat_history) + content, history, images, videos = _get_prompt_and_chat_history( + prompt, chat_history + ) num_patches_list = [] if len(images) == 1: @@ -327,6 +390,10 @@ def chat( else: pixel_values = None + if len(videos) > 0: + pixel_values = videos[0][0] + num_patches_list = videos[0][1] + assert pixel_values is None or len(pixel_values) == sum(num_patches_list) img_context_token_id = self._tokenizer.convert_tokens_to_ids(IMG_CONTEXT_TOKEN) From c6a58ba2a1e3b77cab8cc727e40f6bfcd3bb025e Mon Sep 17 00:00:00 2001 From: Zzzz1111 <34296741+Zzzz1111@users.noreply.github.com> Date: Fri, 23 Aug 2024 12:08:27 +0800 Subject: [PATCH 273/298] FEAT: Added the model dtype parameter for embedding (currently only supported for models gte-Qwen2). (#2120) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 胡子俊 <huzijun@cvte.com> --- xinference/model/embedding/core.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/xinference/model/embedding/core.py b/xinference/model/embedding/core.py index ed8b6c6eb0..23a9766c48 100644 --- a/xinference/model/embedding/core.py +++ b/xinference/model/embedding/core.py @@ -154,10 +154,32 @@ def to(self, *args, **kwargs): "gte" in self._model_spec.model_name.lower() and "qwen2" in self._model_spec.model_name.lower() ): + import torch + + torch_dtype_str = self._kwargs.get("torch_dtype") + if torch_dtype_str is not None: + try: + torch_dtype = getattr(torch, torch_dtype_str) + if torch_dtype not in [ + torch.float16, + torch.float32, + torch.bfloat16, + ]: + logger.warning( + f"Load embedding model with unsupported torch dtype : {torch_dtype_str}. Using default torch dtype: fp32." + ) + torch_dtype = torch.float32 + except AttributeError: + logger.warning( + f"Load embedding model with unknown torch dtype '{torch_dtype_str}'. Using default torch dtype: fp32." + ) + torch_dtype = torch.float32 + else: + torch_dtype = "auto" self._model = XSentenceTransformer( self._model_path, device=self._device, - model_kwargs={"device_map": "auto"}, + model_kwargs={"device_map": "auto", "torch_dtype": torch_dtype}, ) else: self._model = SentenceTransformer(self._model_path, device=self._device) From bd4c26d1e4652b141b450b5619437667779f4a3f Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 23 Aug 2024 06:34:08 +0200 Subject: [PATCH 274/298] FEAT: Support fish speech model (#2119) --- .github/workflows/python.yaml | 10 +- setup.cfg | 10 + xinference/model/audio/core.py | 9 +- xinference/model/audio/fish_speech.py | 228 +++ xinference/model/audio/model_spec.json | 8 + .../model/audio/tests/test_fish_speech.py | 43 + xinference/thirdparty/fish_speech/__init__.py | 0 .../fish_speech/fish_speech/__init__.py | 0 .../fish_speech/callbacks/__init__.py | 3 + .../fish_speech/callbacks/grad_norm.py | 113 ++ .../fish_speech/configs/__init__.py | 0 .../fish_speech/fish_speech/configs/base.yaml | 87 ++ .../fish_speech/configs/firefly_gan_vq.yaml | 34 + .../fish_speech/configs/lora/__init__.py | 0 .../configs/lora/r_8_alpha_16.yaml | 4 + .../configs/text2semantic_finetune.yaml | 83 ++ .../fish_speech/fish_speech/conversation.py | 2 + .../fish_speech/datasets/__init__.py | 0 .../fish_speech/datasets/concat_repeat.py | 53 + .../fish_speech/datasets/protos/__init__.py | 0 .../datasets/protos/text-data.proto | 24 + .../datasets/protos/text_data_pb2.py | 33 + .../datasets/protos/text_data_stream.py | 36 + .../fish_speech/datasets/semantic.py | 496 +++++++ .../fish_speech/fish_speech/datasets/vqgan.py | 147 ++ .../fish_speech/fish_speech/i18n/README.md | 27 + .../fish_speech/fish_speech/i18n/__init__.py | 3 + .../fish_speech/fish_speech/i18n/core.py | 40 + .../fish_speech/i18n/locale/__init__.py | 0 .../fish_speech/i18n/locale/en_US.json | 122 ++ .../fish_speech/i18n/locale/es_ES.json | 122 ++ .../fish_speech/i18n/locale/ja_JP.json | 123 ++ .../fish_speech/i18n/locale/pt_BR.json | 133 ++ .../fish_speech/i18n/locale/zh_CN.json | 122 ++ .../fish_speech/fish_speech/i18n/scan.py | 122 ++ .../fish_speech/models/__init__.py | 0 .../models/text2semantic/__init__.py | 0 .../models/text2semantic/lit_module.py | 202 +++ .../fish_speech/models/text2semantic/llama.py | 779 +++++++++++ .../fish_speech/models/text2semantic/lora.py | 92 ++ .../fish_speech/models/vqgan/__init__.py | 3 + .../fish_speech/models/vqgan/lit_module.py | 442 ++++++ .../models/vqgan/modules/__init__.py | 0 .../models/vqgan/modules/discriminator.py | 44 + .../models/vqgan/modules/firefly.py | 625 +++++++++ .../fish_speech/models/vqgan/modules/fsq.py | 139 ++ .../models/vqgan/modules/reference.py | 115 ++ .../models/vqgan/modules/wavenet.py | 225 +++ .../fish_speech/models/vqgan/utils.py | 94 ++ .../fish_speech/fish_speech/scheduler.py | 40 + .../fish_speech/fish_speech/text/__init__.py | 4 + .../fish_speech/text/chn_text_norm/.gitignore | 114 ++ .../fish_speech/text/chn_text_norm/README.md | 36 + .../text/chn_text_norm/__init__.py | 0 .../text/chn_text_norm/basic_class.py | 172 +++ .../text/chn_text_norm/basic_constant.py | 30 + .../text/chn_text_norm/basic_util.py | 342 +++++ .../text/chn_text_norm/cardinal.py | 32 + .../fish_speech/text/chn_text_norm/date.py | 75 + .../fish_speech/text/chn_text_norm/digit.py | 32 + .../text/chn_text_norm/fraction.py | 35 + .../fish_speech/text/chn_text_norm/money.py | 43 + .../text/chn_text_norm/percentage.py | 33 + .../text/chn_text_norm/telephone.py | 51 + .../fish_speech/text/chn_text_norm/text.py | 177 +++ .../fish_speech/fish_speech/text/clean.py | 69 + .../fish_speech/fish_speech/text/spliter.py | 130 ++ .../fish_speech/fish_speech/train.py | 139 ++ .../fish_speech/fish_speech/utils/__init__.py | 23 + .../fish_speech/utils/braceexpand.py | 217 +++ .../fish_speech/fish_speech/utils/context.py | 13 + .../fish_speech/fish_speech/utils/file.py | 16 + .../fish_speech/utils/instantiators.py | 50 + .../fish_speech/fish_speech/utils/logger.py | 55 + .../fish_speech/utils/logging_utils.py | 48 + .../fish_speech/utils/rich_utils.py | 100 ++ .../fish_speech/utils/spectrogram.py | 122 ++ .../fish_speech/fish_speech/utils/utils.py | 114 ++ .../fish_speech/fish_speech/webui/__init__.py | 0 .../fish_speech/webui/css/style.css | 161 +++ .../fish_speech/webui/html/footer.html | 11 + .../fish_speech/webui/js/animate.js | 69 + .../fish_speech/webui/launch_utils.py | 120 ++ .../fish_speech/fish_speech/webui/manage.py | 1237 +++++++++++++++++ .../thirdparty/fish_speech/tools/__init__.py | 0 .../thirdparty/fish_speech/tools/api.py | 495 +++++++ .../fish_speech/tools/auto_rerank.py | 159 +++ .../fish_speech/tools/download_models.py | 55 + .../fish_speech/tools/extract_model.py | 21 + .../thirdparty/fish_speech/tools/file.py | 108 ++ .../thirdparty/fish_speech/tools/gen_ref.py | 36 + .../fish_speech/tools/llama/__init__.py | 0 .../fish_speech/tools/llama/build_dataset.py | 169 +++ .../tools/llama/eval_in_context.py | 171 +++ .../fish_speech/tools/llama/generate.py | 698 ++++++++++ .../fish_speech/tools/llama/merge_lora.py | 95 ++ .../fish_speech/tools/llama/quantize.py | 497 +++++++ .../tools/llama/rebuild_tokenizer.py | 57 + .../fish_speech/tools/merge_asr_files.py | 55 + .../thirdparty/fish_speech/tools/post_api.py | 164 +++ .../fish_speech/tools/sensevoice/README.md | 59 + .../fish_speech/tools/sensevoice/__init__.py | 0 .../tools/sensevoice/auto_model.py | 573 ++++++++ .../fish_speech/tools/sensevoice/fun_asr.py | 332 +++++ .../fish_speech/tools/sensevoice/vad_utils.py | 61 + .../thirdparty/fish_speech/tools/smart_pad.py | 47 + .../fish_speech/tools/vqgan/__init__.py | 0 .../tools/vqgan/create_train_split.py | 83 ++ .../fish_speech/tools/vqgan/extract_vq.py | 227 +++ .../fish_speech/tools/vqgan/inference.py | 120 ++ .../thirdparty/fish_speech/tools/webui.py | 619 +++++++++ .../fish_speech/tools/whisper_asr.py | 176 +++ 112 files changed, 13981 insertions(+), 3 deletions(-) create mode 100644 xinference/model/audio/fish_speech.py create mode 100644 xinference/model/audio/tests/test_fish_speech.py create mode 100644 xinference/thirdparty/fish_speech/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/callbacks/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/callbacks/grad_norm.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/configs/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/configs/base.yaml create mode 100644 xinference/thirdparty/fish_speech/fish_speech/configs/firefly_gan_vq.yaml create mode 100644 xinference/thirdparty/fish_speech/fish_speech/configs/lora/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/configs/lora/r_8_alpha_16.yaml create mode 100644 xinference/thirdparty/fish_speech/fish_speech/configs/text2semantic_finetune.yaml create mode 100644 xinference/thirdparty/fish_speech/fish_speech/conversation.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/datasets/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/datasets/concat_repeat.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/datasets/protos/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text-data.proto create mode 100644 xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text_data_pb2.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text_data_stream.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/datasets/semantic.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/datasets/vqgan.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/README.md create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/core.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/locale/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/locale/en_US.json create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/locale/es_ES.json create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/locale/ja_JP.json create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/locale/pt_BR.json create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/locale/zh_CN.json create mode 100644 xinference/thirdparty/fish_speech/fish_speech/i18n/scan.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/lit_module.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/llama.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/lora.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/vqgan/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/vqgan/lit_module.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/discriminator.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/firefly.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/fsq.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/reference.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/wavenet.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/models/vqgan/utils.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/scheduler.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/.gitignore create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/README.md create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_class.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_constant.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_util.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/cardinal.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/date.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/digit.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/fraction.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/money.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/percentage.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/telephone.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/text.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/clean.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/text/spliter.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/train.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/braceexpand.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/context.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/file.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/instantiators.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/logger.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/logging_utils.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/rich_utils.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/spectrogram.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/utils/utils.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/webui/__init__.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/webui/css/style.css create mode 100644 xinference/thirdparty/fish_speech/fish_speech/webui/html/footer.html create mode 100644 xinference/thirdparty/fish_speech/fish_speech/webui/js/animate.js create mode 100644 xinference/thirdparty/fish_speech/fish_speech/webui/launch_utils.py create mode 100644 xinference/thirdparty/fish_speech/fish_speech/webui/manage.py create mode 100644 xinference/thirdparty/fish_speech/tools/__init__.py create mode 100644 xinference/thirdparty/fish_speech/tools/api.py create mode 100644 xinference/thirdparty/fish_speech/tools/auto_rerank.py create mode 100644 xinference/thirdparty/fish_speech/tools/download_models.py create mode 100644 xinference/thirdparty/fish_speech/tools/extract_model.py create mode 100644 xinference/thirdparty/fish_speech/tools/file.py create mode 100644 xinference/thirdparty/fish_speech/tools/gen_ref.py create mode 100644 xinference/thirdparty/fish_speech/tools/llama/__init__.py create mode 100644 xinference/thirdparty/fish_speech/tools/llama/build_dataset.py create mode 100644 xinference/thirdparty/fish_speech/tools/llama/eval_in_context.py create mode 100644 xinference/thirdparty/fish_speech/tools/llama/generate.py create mode 100644 xinference/thirdparty/fish_speech/tools/llama/merge_lora.py create mode 100644 xinference/thirdparty/fish_speech/tools/llama/quantize.py create mode 100644 xinference/thirdparty/fish_speech/tools/llama/rebuild_tokenizer.py create mode 100644 xinference/thirdparty/fish_speech/tools/merge_asr_files.py create mode 100644 xinference/thirdparty/fish_speech/tools/post_api.py create mode 100644 xinference/thirdparty/fish_speech/tools/sensevoice/README.md create mode 100644 xinference/thirdparty/fish_speech/tools/sensevoice/__init__.py create mode 100644 xinference/thirdparty/fish_speech/tools/sensevoice/auto_model.py create mode 100644 xinference/thirdparty/fish_speech/tools/sensevoice/fun_asr.py create mode 100644 xinference/thirdparty/fish_speech/tools/sensevoice/vad_utils.py create mode 100644 xinference/thirdparty/fish_speech/tools/smart_pad.py create mode 100644 xinference/thirdparty/fish_speech/tools/vqgan/__init__.py create mode 100644 xinference/thirdparty/fish_speech/tools/vqgan/create_train_split.py create mode 100644 xinference/thirdparty/fish_speech/tools/vqgan/extract_vq.py create mode 100644 xinference/thirdparty/fish_speech/tools/vqgan/inference.py create mode 100644 xinference/thirdparty/fish_speech/tools/webui.py create mode 100644 xinference/thirdparty/fish_speech/tools/whisper_asr.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 4836de3cd0..4eb5ae28ef 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -163,7 +163,12 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pip install -U matcha-tts ${{ env.SELF_HOST_PYTHON }} -m pip install -U onnxruntime-gpu==1.16.0; sys_platform == 'linux' ${{ env.SELF_HOST_PYTHON }} -m pip install -U openai-whisper - ${{ env.SELF_HOST_PYTHON }} -m pip install -U "torch==2.1.0" "torchaudio==2.1.0" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "torch==2.3.1" "torchaudio==2.3.1" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "loguru" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "natsort" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "loralib" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "opencc==1.1.6" + ${{ env.SELF_HOST_PYTHON }} -m pip install -U "faster_whisper" ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/image/tests/test_stable_diffusion.py @@ -179,6 +184,9 @@ jobs: ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_cosyvoice.py + ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ + -W ignore::PendingDeprecationWarning \ + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_fish_speech.py elif [ "$MODULE" == "metal" ]; then pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ diff --git a/setup.cfg b/setup.cfg index 2019e95e2d..38b7132e2c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -119,6 +119,11 @@ all = boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 eva-decord # For video in VL + loguru # For Fish Speech + natsort # For Fish Speech + loralib # For Fish Speech + opencc==1.1.6 # For Fish Speech + faster_whisper # For Fish Speech intel = torch==2.1.0a0 intel_extension_for_pytorch==2.1.10+xpu @@ -173,6 +178,11 @@ audio = matcha-tts # For CosyVoice onnxruntime==1.16.0 # For CosyVoice, use onnxruntime-gpu==1.16.0 if possible openai-whisper # For CosyVoice + loguru # For Fish Speech + natsort # For Fish Speech + loralib # For Fish Speech + opencc==1.1.6 # For Fish Speech + faster_whisper # For Fish Speech doc = ipython>=6.5.0 sphinx>=3.0.0 diff --git a/xinference/model/audio/core.py b/xinference/model/audio/core.py index 2989496004..7772a8f8ba 100644 --- a/xinference/model/audio/core.py +++ b/xinference/model/audio/core.py @@ -21,6 +21,7 @@ from ..utils import valid_model_revision from .chattts import ChatTTSModel from .cosyvoice import CosyVoiceModel +from .fish_speech import FishSpeechModel from .funasr import FunASRModel from .whisper import WhisperModel @@ -156,13 +157,15 @@ def create_audio_model_instance( model_path: Optional[str] = None, **kwargs, ) -> Tuple[ - Union[WhisperModel, FunASRModel, ChatTTSModel, CosyVoiceModel], + Union[WhisperModel, FunASRModel, ChatTTSModel, CosyVoiceModel, FishSpeechModel], AudioModelDescription, ]: model_spec = match_audio(model_name, download_hub) if model_path is None: model_path = cache(model_spec) - model: Union[WhisperModel, FunASRModel, ChatTTSModel, CosyVoiceModel] + model: Union[ + WhisperModel, FunASRModel, ChatTTSModel, CosyVoiceModel, FishSpeechModel + ] if model_spec.model_family == "whisper": model = WhisperModel(model_uid, model_path, model_spec, **kwargs) elif model_spec.model_family == "funasr": @@ -171,6 +174,8 @@ def create_audio_model_instance( model = ChatTTSModel(model_uid, model_path, model_spec, **kwargs) elif model_spec.model_family == "CosyVoice": model = CosyVoiceModel(model_uid, model_path, model_spec, **kwargs) + elif model_spec.model_family == "FishAudio": + model = FishSpeechModel(model_uid, model_path, model_spec, **kwargs) else: raise Exception(f"Unsupported audio model family: {model_spec.model_family}") model_description = AudioModelDescription( diff --git a/xinference/model/audio/fish_speech.py b/xinference/model/audio/fish_speech.py new file mode 100644 index 0000000000..642b575a27 --- /dev/null +++ b/xinference/model/audio/fish_speech.py @@ -0,0 +1,228 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import gc +import logging +import os.path +import queue +import sys +from io import BytesIO +from typing import TYPE_CHECKING, Optional + +import numpy as np +import torch + +from ...device_utils import get_available_device, is_device_available + +if TYPE_CHECKING: + from .core import AudioModelFamilyV1 + +logger = logging.getLogger(__name__) + + +def wav_chunk_header(sample_rate=44100, bit_depth=16, channels=1): + import wave + + buffer = BytesIO() + + with wave.open(buffer, "wb") as wav_file: + wav_file.setnchannels(channels) + wav_file.setsampwidth(bit_depth // 8) + wav_file.setframerate(sample_rate) + + wav_header_bytes = buffer.getvalue() + buffer.close() + return wav_header_bytes + + +class FishSpeechModel: + def __init__( + self, + model_uid: str, + model_path: str, + model_spec: "AudioModelFamilyV1", + device: Optional[str] = None, + **kwargs, + ): + self._model_uid = model_uid + self._model_path = model_path + self._model_spec = model_spec + self._device = device + self._llama_queue = None + self._model = None + self._kwargs = kwargs + + def load(self): + # There are too many imports from fish_speech. + sys.path.insert( + 0, os.path.join(os.path.dirname(__file__), "../../thirdparty/fish_speech") + ) + + from tools.llama.generate import launch_thread_safe_queue + from tools.vqgan.inference import load_model as load_decoder_model + + if self._device is None: + self._device = get_available_device() + else: + if not is_device_available(self._device): + raise ValueError(f"Device {self._device} is not available!") + + logger.info("Loading Llama model...") + self._llama_queue = launch_thread_safe_queue( + checkpoint_path=self._model_path, + device=self._device, + precision=torch.bfloat16, + compile=False, + ) + logger.info("Llama model loaded, loading VQ-GAN model...") + + checkpoint_path = os.path.join( + self._model_path, + "firefly-gan-vq-fsq-4x1024-42hz-generator.pth", + ) + self._model = load_decoder_model( + config_name="firefly_gan_vq", + checkpoint_path=checkpoint_path, + device=self._device, + ) + + @torch.inference_mode() + def _inference( + self, + text, + enable_reference_audio, + reference_audio, + reference_text, + max_new_tokens, + chunk_length, + top_p, + repetition_penalty, + temperature, + streaming=False, + ): + from fish_speech.utils import autocast_exclude_mps + from tools.api import decode_vq_tokens, encode_reference + from tools.llama.generate import ( + GenerateRequest, + GenerateResponse, + WrappedGenerateResponse, + ) + + # Parse reference audio aka prompt + prompt_tokens = encode_reference( + decoder_model=self._model, + reference_audio=reference_audio, + enable_reference_audio=enable_reference_audio, + ) + + # LLAMA Inference + request = dict( + device=self._model.device, + max_new_tokens=max_new_tokens, + text=text, + top_p=top_p, + repetition_penalty=repetition_penalty, + temperature=temperature, + compile=False, + iterative_prompt=chunk_length > 0, + chunk_length=chunk_length, + max_length=2048, + prompt_tokens=prompt_tokens if enable_reference_audio else None, + prompt_text=reference_text if enable_reference_audio else None, + ) + + response_queue = queue.Queue() + self._llama_queue.put( + GenerateRequest( + request=request, + response_queue=response_queue, + ) + ) + + if streaming: + yield wav_chunk_header(), None, None + + segments = [] + + while True: + result: WrappedGenerateResponse = response_queue.get() + if result.status == "error": + raise Exception(str(result.response)) + + result: GenerateResponse = result.response + if result.action == "next": + break + + with autocast_exclude_mps( + device_type=self._model.device.type, dtype=torch.bfloat16 + ): + fake_audios = decode_vq_tokens( + decoder_model=self._model, + codes=result.codes, + ) + + fake_audios = fake_audios.float().cpu().numpy() + segments.append(fake_audios) + + if streaming: + yield (fake_audios * 32768).astype(np.int16).tobytes(), None, None + + if len(segments) == 0: + raise Exception("No audio generated, please check the input text.") + + # No matter streaming or not, we need to return the final audio + audio = np.concatenate(segments, axis=0) + yield None, (self._model.spec_transform.sample_rate, audio), None + + if torch.cuda.is_available(): + torch.cuda.empty_cache() + gc.collect() + + def speech( + self, + input: str, + voice: str, + response_format: str = "mp3", + speed: float = 1.0, + stream: bool = False, + **kwargs, + ): + logger.warning("Fish speech does not support setting voice: %s.", voice) + if speed != 1.0: + logger.warning("Fish speech does not support setting speed: %s.", speed) + if stream is True: + logger.warning("stream mode is not implemented.") + import torchaudio + + result = list( + self._inference( + text=input, + enable_reference_audio=False, + reference_audio=None, + reference_text="", + max_new_tokens=0, + chunk_length=100, + top_p=0.7, + repetition_penalty=1.2, + temperature=0.7, + ) + ) + sample_rate, audio = result[0][1] + audio = np.array([audio]) + + # Save the generated audio + with BytesIO() as out: + torchaudio.save( + out, torch.from_numpy(audio), sample_rate, format=response_format + ) + return out.getvalue() diff --git a/xinference/model/audio/model_spec.json b/xinference/model/audio/model_spec.json index b4330d6119..4cbe77a37a 100644 --- a/xinference/model/audio/model_spec.json +++ b/xinference/model/audio/model_spec.json @@ -146,5 +146,13 @@ "model_revision": "fb5f676733139f35670bed9b59a77d476b1aa898", "ability": "text-to-audio", "multilingual": true + }, + { + "model_name": "FishSpeech-1.2-SFT", + "model_family": "FishAudio", + "model_id": "fishaudio/fish-speech-1.2-sft", + "model_revision": "180288e21ec5c50cfc564023a22f789e4b88a0e0", + "ability": "text-to-audio", + "multilingual": true } ] diff --git a/xinference/model/audio/tests/test_fish_speech.py b/xinference/model/audio/tests/test_fish_speech.py new file mode 100644 index 0000000000..8b339290ad --- /dev/null +++ b/xinference/model/audio/tests/test_fish_speech.py @@ -0,0 +1,43 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import os +import tempfile + + +def test_fish_speech(setup): + endpoint, _ = setup + from ....client import Client + + client = Client(endpoint) + + model_uid = client.launch_model( + model_name="FishSpeech-1.2-SFT", + model_type="audio", + ) + model = client.get_model(model_uid) + input_string = "你好,你是谁?" + response = model.speech(input_string) + assert type(response) is bytes + assert len(response) > 0 + + # Test openai API + import openai + + client = openai.Client(api_key="not empty", base_url=f"{endpoint}/v1") + with client.audio.speech.with_streaming_response.create( + model=model_uid, input=input_string, voice="echo" + ) as response: + with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f: + response.stream_to_file(f.name) + assert os.stat(f.name).st_size > 0 diff --git a/xinference/thirdparty/fish_speech/__init__.py b/xinference/thirdparty/fish_speech/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/callbacks/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/callbacks/__init__.py new file mode 100644 index 0000000000..bbcf3f3365 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/callbacks/__init__.py @@ -0,0 +1,3 @@ +from .grad_norm import GradNormMonitor + +__all__ = ["GradNormMonitor"] diff --git a/xinference/thirdparty/fish_speech/fish_speech/callbacks/grad_norm.py b/xinference/thirdparty/fish_speech/fish_speech/callbacks/grad_norm.py new file mode 100644 index 0000000000..dbc95ef2a3 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/callbacks/grad_norm.py @@ -0,0 +1,113 @@ +from typing import Optional, Union + +import lightning.pytorch as pl +import torch +from lightning import LightningModule, Trainer +from lightning.pytorch.callbacks import Callback +from torch import Tensor, nn +from torch.utils._foreach_utils import ( + _group_tensors_by_device_and_dtype, + _has_foreach_support, +) + + +@torch.no_grad() +def grad_norm( + parameters: Union[Tensor, list[Tensor]], + norm_type: float = 2.0, +) -> float: + """ + Returns the norm of the gradients of the given parameters. + + Args: + parameters (Iterable[Tensor] or Tensor): an iterable of Tensors or a + single Tensor that will have gradients normalized + norm_type (float): type of the used p-norm. + + Returns: + Total norm of the parameter gradients (viewed as a single vector). + """ # noqa: E501 + + if isinstance(parameters, Tensor): + parameters = [parameters] + + grads = [p.grad for p in parameters if p.grad is not None] + if len(grads) == 0: + return None + + first_device = grads[0].device + grouped_grads: dict[ + tuple[torch.device, torch.dtype], list[list[Tensor]] + ] = _group_tensors_by_device_and_dtype( + [[g.detach() for g in grads]] + ) # type: ignore[assignment] + + norms = [] + for (device, _), ([grads], _) in grouped_grads.items(): + if _has_foreach_support(grads, device=device): + norms.extend(torch._foreach_norm(grads, norm_type)) + else: + norms.extend([torch.norm(g, norm_type) for g in grads]) + + return torch.norm(torch.stack([norm.to(first_device) for norm in norms]), norm_type) + + +class GradNormMonitor(Callback): + """ + Callback that computes the gradient norm of the model parameters. + """ + + def __init__( + self, + norm_type: float = 2.0, + logging_interval: str = "step", + sub_module: Optional[Union[str, list[str]]] = None, + ) -> None: + """ + Args: + norm_type (float): type of the used p-norm. + logging_interval (str): "step" or "epoch". + """ + super().__init__() + + self.norm_type = norm_type + self.logging_interval = logging_interval + self.sub_module = sub_module + + def on_after_backward(self, trainer: Trainer, model: LightningModule) -> None: + """ + Computes the gradient norm of the model parameters and logs it to the logger. + + Args: + trainer (Trainer): The trainer object + model (LightningModule): The current lightningModule + """ + + lightning_model = model + + if self.sub_module is None: + return self.log_sub_module_grad_norm(lightning_model, model, "") + + sub_modules = self.sub_module + if isinstance(sub_modules, str): + sub_modules = [sub_modules] + + for sub_module in sub_modules: + self.log_sub_module_grad_norm( + lightning_model, getattr(model, sub_module), f"/{sub_module}" + ) + + def log_sub_module_grad_norm( + self, lightning_model: LightningModule, model: nn.Module, path: str + ) -> None: + grad_norm_val = grad_norm(model.parameters(), self.norm_type) + if grad_norm_val is None: + return + + on_step = self.logging_interval == "step" + lightning_model.log( + f"train{path}/grad_norm", + grad_norm_val, + on_step=on_step, + on_epoch=not on_step, + ) diff --git a/xinference/thirdparty/fish_speech/fish_speech/configs/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/configs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/configs/base.yaml b/xinference/thirdparty/fish_speech/fish_speech/configs/base.yaml new file mode 100644 index 0000000000..99e6dab54d --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/configs/base.yaml @@ -0,0 +1,87 @@ +# Base configuration for training a model +paths: + run_dir: results/${project} + ckpt_dir: ${paths.run_dir}/checkpoints + +hydra: + run: + dir: ${paths.run_dir} + +# Lightning Trainer +trainer: + _target_: lightning.pytorch.trainer.Trainer + + default_root_dir: ${paths.run_dir} + accelerator: gpu + num_nodes: 1 + devices: auto + strategy: + _target_: lightning.pytorch.strategies.DDPStrategy + process_group_backend: nccl # This should be override when training on windows + + precision: bf16-mixed + + # disable validation by epoch end + check_val_every_n_epoch: null + val_check_interval: 5000 + max_steps: 100_000 + + # Use torch.backends.cudnn.benchmark to speed up training + benchmark: true + +# Callbacks +callbacks: + model_checkpoint: + _target_: lightning.pytorch.callbacks.ModelCheckpoint + dirpath: ${paths.ckpt_dir} + filename: "step_{step:09d}" + save_last: false # additionally always save an exact copy of the last checkpoint to a file last.ckpt + save_top_k: 5 # save 5 latest checkpoints + monitor: step # use step to monitor checkpoints + mode: max # save the latest checkpoint with the highest global_step + every_n_epochs: null # don't save checkpoints by epoch end + every_n_train_steps: 5000 # save checkpoints every 5000 steps + auto_insert_metric_name: false + + model_summary: + _target_: lightning.pytorch.callbacks.ModelSummary + max_depth: 2 # the maximum depth of layer nesting that the summary will include + + learning_rate_monitor: + _target_: lightning.pytorch.callbacks.LearningRateMonitor + logging_interval: step + log_momentum: false + + grad_norm_monitor: + _target_: fish_speech.callbacks.GradNormMonitor + norm_type: 2 + logging_interval: step + +# Logger +logger: + tensorboard: + _target_: lightning.pytorch.loggers.tensorboard.TensorBoardLogger + save_dir: "${paths.run_dir}/tensorboard/" + name: null + log_graph: false + default_hp_metric: true + prefix: "" + + # wandb: + # _target_: lightning.pytorch.loggers.wandb.WandbLogger + # # name: "" # name of the run (normally generated by wandb) + # save_dir: "${paths.run_dir}" + # offline: False + # id: null # pass correct id to resume experiment! + # anonymous: null # enable anonymous logging + # project: "fish-speech" + # log_model: False # upload lightning ckpts + # prefix: "" # a string to put at the beginning of metric keys + # # entity: "" # set to name of your wandb team + # group: "" + # tags: ["vq", "hq", "finetune"] + # job_type: "" + +# Loop +train: true +test: false diff --git a/xinference/thirdparty/fish_speech/fish_speech/configs/firefly_gan_vq.yaml b/xinference/thirdparty/fish_speech/fish_speech/configs/firefly_gan_vq.yaml new file mode 100644 index 0000000000..7417623b03 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/configs/firefly_gan_vq.yaml @@ -0,0 +1,34 @@ +_target_: fish_speech.models.vqgan.modules.firefly.FireflyArchitecture +spec_transform: + _target_: fish_speech.utils.spectrogram.LogMelSpectrogram + sample_rate: 44100 + n_mels: 160 + n_fft: 2048 + hop_length: 512 + win_length: 2048 +backbone: + _target_: fish_speech.models.vqgan.modules.firefly.ConvNeXtEncoder + input_channels: 160 + depths: [3, 3, 9, 3] + dims: [128, 256, 384, 512] + drop_path_rate: 0.2 + kernel_size: 7 +head: + _target_: fish_speech.models.vqgan.modules.firefly.HiFiGANGenerator + hop_length: 512 + upsample_rates: [8, 8, 2, 2, 2] # aka. strides + upsample_kernel_sizes: [16, 16, 4, 4, 4] + resblock_kernel_sizes: [3, 7, 11] + resblock_dilation_sizes: [[1, 3, 5], [1, 3, 5], [1, 3, 5]] + num_mels: 512 + upsample_initial_channel: 512 + use_template: false + pre_conv_kernel_size: 13 + post_conv_kernel_size: 13 +quantizer: + _target_: fish_speech.models.vqgan.modules.fsq.DownsampleFiniteScalarQuantize + input_dim: 512 + n_groups: 4 + n_codebooks: 1 + levels: [8, 5, 5, 5] + downsample_factor: [2] diff --git a/xinference/thirdparty/fish_speech/fish_speech/configs/lora/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/configs/lora/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/configs/lora/r_8_alpha_16.yaml b/xinference/thirdparty/fish_speech/fish_speech/configs/lora/r_8_alpha_16.yaml new file mode 100644 index 0000000000..aecc4d9766 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/configs/lora/r_8_alpha_16.yaml @@ -0,0 +1,4 @@ +_target_: fish_speech.models.text2semantic.lora.LoraConfig +r: 8 +lora_alpha: 16 +lora_dropout: 0.01 diff --git a/xinference/thirdparty/fish_speech/fish_speech/configs/text2semantic_finetune.yaml b/xinference/thirdparty/fish_speech/fish_speech/configs/text2semantic_finetune.yaml new file mode 100644 index 0000000000..1bf8fd6b6d --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/configs/text2semantic_finetune.yaml @@ -0,0 +1,83 @@ +defaults: + - base + - _self_ + +project: text2semantic_finetune_dual_ar +max_length: 4096 +pretrained_ckpt_path: checkpoints/fish-speech-1.2-sft + +# Lightning Trainer +trainer: + accumulate_grad_batches: 1 + gradient_clip_val: 1.0 + gradient_clip_algorithm: "norm" + max_steps: 1000 + precision: bf16-true + limit_val_batches: 10 + val_check_interval: 100 + +# Dataset Configuration +tokenizer: + _target_: transformers.AutoTokenizer.from_pretrained + pretrained_model_name_or_path: ${pretrained_ckpt_path} + +# Dataset Configuration +train_dataset: + _target_: fish_speech.datasets.semantic.AutoTextSemanticInstructionDataset + proto_files: + - data/protos + tokenizer: ${tokenizer} + causal: true + max_length: ${max_length} + use_speaker: false + interactive_prob: 0.7 + +val_dataset: + _target_: fish_speech.datasets.semantic.AutoTextSemanticInstructionDataset + proto_files: + - data/protos + tokenizer: ${tokenizer} + causal: true + max_length: ${max_length} + use_speaker: false + interactive_prob: 0.7 + +data: + _target_: fish_speech.datasets.semantic.SemanticDataModule + train_dataset: ${train_dataset} + val_dataset: ${val_dataset} + num_workers: 4 + batch_size: 8 + tokenizer: ${tokenizer} + max_length: ${max_length} + +# Model Configuration +model: + _target_: fish_speech.models.text2semantic.lit_module.TextToSemantic + model: + _target_: fish_speech.models.text2semantic.llama.BaseTransformer.from_pretrained + path: ${pretrained_ckpt_path} + load_weights: true + max_length: ${max_length} + lora_config: null + + optimizer: + _target_: torch.optim.AdamW + _partial_: true + lr: 1e-4 + weight_decay: 0 + betas: [0.9, 0.95] + eps: 1e-5 + + lr_scheduler: + _target_: torch.optim.lr_scheduler.LambdaLR + _partial_: true + lr_lambda: + _target_: fish_speech.scheduler.get_constant_schedule_with_warmup_lr_lambda + _partial_: true + num_warmup_steps: 10 + +# Callbacks +callbacks: + model_checkpoint: + every_n_train_steps: ${trainer.val_check_interval} diff --git a/xinference/thirdparty/fish_speech/fish_speech/conversation.py b/xinference/thirdparty/fish_speech/fish_speech/conversation.py new file mode 100644 index 0000000000..c9ca0ef918 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/conversation.py @@ -0,0 +1,2 @@ +SEMANTIC_TOKEN = "<|semantic|>" +CODEBOOK_PAD_TOKEN_ID = 0 diff --git a/xinference/thirdparty/fish_speech/fish_speech/datasets/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/datasets/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/datasets/concat_repeat.py b/xinference/thirdparty/fish_speech/fish_speech/datasets/concat_repeat.py new file mode 100644 index 0000000000..4aa596b95a --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/datasets/concat_repeat.py @@ -0,0 +1,53 @@ +import bisect +import random +from typing import Iterable + +from torch.utils.data import Dataset, IterableDataset + + +class ConcatRepeatDataset(Dataset): + datasets: list[Dataset] + cumulative_sizes: list[int] + repeats: list[int] + + @staticmethod + def cumsum(sequence, repeats): + r, s = [], 0 + for dataset, repeat in zip(sequence, repeats): + l = len(dataset) * repeat + r.append(l + s) + s += l + return r + + def __init__(self, datasets: Iterable[Dataset], repeats: list[int]): + super().__init__() + + self.datasets = list(datasets) + self.repeats = repeats + + assert len(self.datasets) > 0, "datasets should not be an empty iterable" + assert len(self.datasets) == len( + repeats + ), "datasets and repeats should have the same length" + + for d in self.datasets: + assert not isinstance( + d, IterableDataset + ), "ConcatRepeatDataset does not support IterableDataset" + + self.cumulative_sizes = self.cumsum(self.datasets, self.repeats) + + def __len__(self): + return self.cumulative_sizes[-1] + + def __getitem__(self, idx): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, idx) + + if dataset_idx == 0: + sample_idx = idx + else: + sample_idx = idx - self.cumulative_sizes[dataset_idx - 1] + + dataset = self.datasets[dataset_idx] + + return dataset[sample_idx % len(dataset)] diff --git a/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text-data.proto b/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text-data.proto new file mode 100644 index 0000000000..5eb26d94aa --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text-data.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +package text_data; + +message Semantics { + repeated uint32 values = 1; +} + +message Sentence { + repeated string texts = 1; + repeated Semantics semantics = 3; +} + +message TextData { + string source = 1; + string name = 2; + repeated Sentence sentences = 4; +} + +message SampledData { + string source = 1; + string name = 2; + repeated Sentence samples = 3; +} diff --git a/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text_data_pb2.py b/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text_data_pb2.py new file mode 100644 index 0000000000..bfce0e8be5 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text_data_pb2.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: text-data.proto +# Protobuf Python Version: 4.25.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x0ftext-data.proto\x12\ttext_data"\x1b\n\tSemantics\x12\x0e\n\x06values\x18\x01 \x03(\r"B\n\x08Sentence\x12\r\n\x05texts\x18\x01 \x03(\t\x12\'\n\tsemantics\x18\x03 \x03(\x0b\x32\x14.text_data.Semantics"P\n\x08TextData\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12&\n\tsentences\x18\x04 \x03(\x0b\x32\x13.text_data.Sentence"Q\n\x0bSampledData\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12$\n\x07samples\x18\x03 \x03(\x0b\x32\x13.text_data.Sentenceb\x06proto3' +) + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "text_data_pb2", _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + _globals["_SEMANTICS"]._serialized_start = 30 + _globals["_SEMANTICS"]._serialized_end = 57 + _globals["_SENTENCE"]._serialized_start = 59 + _globals["_SENTENCE"]._serialized_end = 125 + _globals["_TEXTDATA"]._serialized_start = 127 + _globals["_TEXTDATA"]._serialized_end = 207 + _globals["_SAMPLEDDATA"]._serialized_start = 209 + _globals["_SAMPLEDDATA"]._serialized_end = 290 +# @@protoc_insertion_point(module_scope) diff --git a/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text_data_stream.py b/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text_data_stream.py new file mode 100644 index 0000000000..ec3c25bcd7 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/datasets/protos/text_data_stream.py @@ -0,0 +1,36 @@ +import struct + +from .text_data_pb2 import TextData + + +def read_pb_stream(f): + while True: + buf = f.read(4) + if len(buf) == 0: + break + size = struct.unpack("I", buf)[0] + buf = f.read(size) + text_data = TextData() + text_data.ParseFromString(buf) + yield text_data + + +def write_pb_stream(f, text_data): + buf = text_data.SerializeToString() + f.write(struct.pack("I", len(buf))) + f.write(buf) + + +def pack_pb_stream(text_data): + buf = text_data.SerializeToString() + return struct.pack("I", len(buf)) + buf + + +def split_pb_stream(f): + while True: + head = f.read(4) + if len(head) == 0: + break + size = struct.unpack("I", head)[0] + buf = f.read(size) + yield head + buf diff --git a/xinference/thirdparty/fish_speech/fish_speech/datasets/semantic.py b/xinference/thirdparty/fish_speech/fish_speech/datasets/semantic.py new file mode 100644 index 0000000000..3c64e01077 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/datasets/semantic.py @@ -0,0 +1,496 @@ +import random +from dataclasses import dataclass +from itertools import chain +from pathlib import Path +from random import Random +from typing import Optional, Union + +import numpy as np +import pyarrow.parquet as pq +import torch +import torch.nn.functional as F +from datasets.download.streaming_download_manager import xopen +from huggingface_hub import HfApi +from lightning import LightningDataModule +from torch.distributed import get_rank, get_world_size, is_initialized +from torch.utils.data import DataLoader, IterableDataset, get_worker_info +from transformers import AutoTokenizer + +from fish_speech.conversation import CODEBOOK_PAD_TOKEN_ID +from fish_speech.datasets.protos.text_data_pb2 import SampledData +from fish_speech.datasets.protos.text_data_stream import read_pb_stream +from fish_speech.text.clean import clean_text +from fish_speech.utils import RankedLogger +from fish_speech.utils.braceexpand import braceexpand + +log = RankedLogger(__name__, rank_zero_only=True) + + +def split_by_rank_worker(files): + # We need to know the total number of devices + # to split the data properly + + total_devices = 1 + if is_initialized(): + total_devices = get_world_size() + + worker_info = get_worker_info() + if worker_info is not None: + total_devices *= worker_info.num_workers + + if len(files) < total_devices: + # Repeat the files N times to match the number of devices + files = files * (total_devices // len(files) + 1) + + # DDP + if is_initialized(): + files = files[get_rank() :: get_world_size()] + + # Split by worker + if worker_info is not None: + files = files[worker_info.id :: worker_info.num_workers] + + return files + + +class AutoTextSemanticInstructionDataset(IterableDataset): + """ + Auto Augment Dataset by Speaker + + 1. Random concatenate multiple sentences from the same speaker to form a longer sentence + 2. Automatically normalize the text + + For interactive mode, we use the following format (multiple sequences): + <s> [INST] [SPK: speaker] text [/INST] ... [INST] text [/INST] </s> + + For non-interactive mode, we use the following format (one long sequence): + <s> [INST] text [/INST] ... </s> + """ + + def __init__( + self, + proto_files: list[str], + seed: int = 42, + interactive_prob: float = 0.5, + max_length: int = 1024, + tokenizer: AutoTokenizer = None, + use_speaker: bool | float = True, + causal: bool = True, + num_codebooks: Optional[int] = None, + skip_text_prob: float = 0.0, + ): + """ + Args: + proto_files: proto buf files if using local data + seed: random seed + interactive_prob: probability to use interactive mode + max_length: max length of the text + tokenizer: tokenizer + use_speaker: include speaker information in the prompt + causal: use causal sampling when using local data, disable will lead to random sampling + num_codebooks: number of codebooks, if None, it will be automatically detected + skip_text_prob: probability to skip the text (audio only), this only applies to interactive mode + """ + + super().__init__() + + assert 0 <= interactive_prob <= 1, "interactive_prob must be in [0, 1]" + + self.seed = seed + self.max_length = max_length + self.tokenizer = tokenizer + self.interactive_prob = interactive_prob + self.use_speaker = use_speaker + self.proto_files = proto_files + self.causal = causal + self.num_codebooks = num_codebooks + self.skip_text_prob = skip_text_prob + + self.semantic_token_id = self.tokenizer.convert_tokens_to_ids("<|semantic|>") + self.groups = None + + def init_mock_data_server(self): + if self.groups is not None: + return + + # Expand the proto files + expanded_proto_files = [] + for filename in self.proto_files: + for i in braceexpand(filename): + i = Path(i) + if i.is_file(): + expanded_proto_files.append(i) + elif i.is_dir(): + expanded_proto_files.extend(i.rglob("*.proto")) + expanded_proto_files.extend(i.rglob("*.protos")) + else: + raise ValueError(f"{i} is not a file or directory") + + expanded_proto_files = sorted(expanded_proto_files) + Random(self.seed).shuffle(expanded_proto_files) + + self.groups = [] + shard_proto_files = split_by_rank_worker(expanded_proto_files) + log.info( + f"Reading {len(shard_proto_files)} / {len(expanded_proto_files)} files" + ) + + count = 0 + for filename in shard_proto_files: + with open(filename, "rb") as f: + for text_data in read_pb_stream(f): + self.groups.append(text_data) + count += 1 + + log.info(f"Read total {count} groups of data") + + # Shuffle the lines + Random(self.seed).shuffle(self.groups) + self.group_weights = [len(i.sentences) for i in self.groups] + + def __iter__(self): + while True: + yield self.augment() + + def tokenize_sentence(self, sentence: str): + sentence = clean_text(sentence) + tokens = self.tokenizer.encode( + f"{sentence}", + max_length=10**6, + add_special_tokens=False, + truncation=False, + ) + return sentence, len(tokens) + + def sample_data(self): + if self.groups is None: + self.init_mock_data_server() + + # Shuffle unique lines, estimate that each sample is at least 20 tokens + num_samples = self.max_length // 20 + + # choice group based on their number of samples + group = random.choices(self.groups, weights=self.group_weights, k=1)[0] + + if self.causal: + # Sample in order + if num_samples >= len(group.sentences): + samples = group.sentences + else: + begin = random.randint(0, len(group.sentences) - num_samples) + samples = group.sentences[begin : begin + num_samples] + else: + samples = random.choices( + group.sentences, k=min(num_samples, len(group.sentences)) + ) + + return SampledData( + source=group.source, + name=group.name, + samples=samples, + ) + + def augment(self): + final_text, final_semantic = [], [] + response = self.sample_data() + if len(response.samples) == 0: + # Invalid group + return None + + samples = list(response.samples) + idx = 0 + use_interactive = random.random() < self.interactive_prob + + if use_interactive is False: + # Random sample based on speaker using a truncated normal distribution + a = torch.tensor([0], dtype=torch.float32) + torch.nn.init.trunc_normal_( + a, + mean=self.max_length // 2, + std=self.max_length // 4, + a=10, + b=self.max_length, + ) + remaining_tokens = a.long().item() - 4 + else: + remaining_tokens = self.max_length + + # Use speaker + if isinstance(self.use_speaker, float): + use_speaker = random.random() < self.use_speaker + else: + use_speaker = self.use_speaker + + all_tokens, all_labels = [], [] + while remaining_tokens > 0 and len(samples) > 0: + sentence = samples.pop(0) + + text = random.choice(sentence.texts) + text, length = self.tokenize_sentence(text) + remaining_tokens -= length + len(sentence.semantics[0].values) + + if use_interactive is False: + final_text.append(text) + final_semantic.append(sentence.semantics) + else: + # For interactive mode, we only apply speaker for the first sentence + # [INST] [SPK: speaker] text [/INST] ... [INST] text [/INST] + tokens, labels = self.pack_sentences( + sentences=[text], + semantics=[sentence.semantics], + speaker=response.name if use_speaker else None, + skip_text=random.random() < self.skip_text_prob, + ) + + all_tokens.append(tokens) + all_labels.append(labels) + + idx += 1 + + if use_interactive is False: + tokens, labels = self.pack_sentences( + final_text, + semantics=final_semantic, + speaker=response.name if use_speaker else None, + ) + all_tokens.append(tokens) + all_labels.append(labels) + + tokens = torch.cat(all_tokens, dim=1) + labels = torch.cat(all_labels, dim=1) + + # Verify that the length is correct + assert tokens.size(1) == labels.size(1), f"{tokens.size(1)} != {labels.size(1)}" + + data = {"tokens": tokens, "labels": labels} + + return data + + def pack_sentences( + self, + sentences: list[str], + semantics: list, + speaker: Optional[str] = None, + skip_text: bool = False, + ): + if speaker is None: + speaker = "assistant" + + cated_sentences = " ".join(sentences) + if skip_text: + cated_sentences = "<|skip_text|>" + + final_text = "<|im_start|>user\n" + cated_sentences + "<|im_end|>" + final_text = final_text + f"<|im_start|>{speaker}\n" + + encoded = self.tokenizer.encode( + final_text, + add_special_tokens=False, + truncation=False, + max_length=10**6, + ) + semantic_length = sum([len(i[0].values) for i in semantics]) + prompt_length = len(encoded) + num_codebooks = ( + len(semantics[0]) if self.num_codebooks is None else self.num_codebooks + ) + + # Pack the tokens and semantics (add <s> and </s> to semantic tokens) + tokens = ( + encoded + + [self.semantic_token_id] * semantic_length + + self.tokenizer.convert_tokens_to_ids(["<|im_end|>"]) + ) + + # Codebook bos/padding: 0, eos: 1 + codes = [[CODEBOOK_PAD_TOKEN_ID] * prompt_length for _ in range(num_codebooks)] + for segment in semantics: + for book_idx, book in zip(range(num_codebooks), segment): + for j in book.values: + codes[book_idx].append(int(j) + 1) + + for book in codes: + book.extend([CODEBOOK_PAD_TOKEN_ID] * 1) + + tokens = [tokens] + codes + + tokens = torch.tensor(tokens, dtype=torch.long) + labels = tokens.clone() + + if skip_text: + # If text is not provided, the sentence is used for condition only, all labels are -100 + torch.fill_(labels, -100) + return tokens, labels + + # Mask out the <s> tokens for semantic, predict semantic tokens only + # Since we don't mask out the input tokens, the language modeling still works + labels[1:, :prompt_length] = -100 + + tokens = tokens[:, :-1] + labels = labels[:, 1:] + + # Verify the padding is correct, and the last token is eos + assert (tokens[1:, :prompt_length] == CODEBOOK_PAD_TOKEN_ID).all() + assert (labels[1:, -1:] == CODEBOOK_PAD_TOKEN_ID).all() + + return tokens, labels + + +@dataclass +class TextDataCollator: + tokenizer: AutoTokenizer + max_length: int = 1024 + + def __call__(self, examples): + if "negative_tokens" in examples: + positive_examples = [] + negative_examples = [] + + for i in examples: + positive_examples.append( + { + "tokens": i["tokens"], + "labels": i["labels"], + } + ) + negative_examples.append( + { + "tokens": i["negative_tokens"], + "labels": i["negative_labels"], + } + ) + + examples = positive_examples + negative_examples + + return self.batchify(examples) + + def batchify(self, examples, tokens_key="tokens", labels_key="labels"): + tokens, attention_masks, labels = [], [], [] + + # Calculate the max length + max_tokens_length = 0 + for example in examples: + max_tokens_length = max(max_tokens_length, example[tokens_key].size(1)) + max_tokens_length = min(max_tokens_length, self.max_length) + + for example in examples: + _tokens = example[tokens_key][:, :max_tokens_length] + _labels = example[labels_key][:, :max_tokens_length] + _attention_mask = torch.ones((max_tokens_length,), dtype=torch.bool) + tokens_length = _tokens.size(1) + _attention_mask[:tokens_length] = False + + assert tokens_length == _labels.size( + 1 + ), f"{tokens_length} != {_labels.size(1)}" + + if tokens_length < max_tokens_length: + _tokens = F.pad( + _tokens, + (0, max_tokens_length - tokens_length), + value=self.tokenizer.eos_token_id, + ) + _tokens[1:, tokens_length:] = CODEBOOK_PAD_TOKEN_ID + _labels = F.pad( + _labels, (0, max_tokens_length - _labels.size(1)), value=-100 + ) + + tokens.append(_tokens) + attention_masks.append(_attention_mask) + labels.append(_labels) + + tokens = torch.stack(tokens, dim=0) + attention_masks = torch.stack(attention_masks, dim=0) + labels = torch.stack(labels, dim=0) + + return { + "inputs": tokens, + "attention_masks": attention_masks, + "labels": labels, + } + + +class InterleaveDataset(IterableDataset): + def __init__( + self, + datasets: list[IterableDataset], + probabilities: list[float], + seed: int = 42, + ): + super().__init__() + + self.datasets = datasets + self.probabilities = probabilities + self.seed = seed + + def __iter__(self): + rng = np.random.default_rng(self.seed) + dataset_iterators = [iter(dataset) for dataset in self.datasets] + + while True: + # Random choice one + dataset_idx = rng.choice(len(self.datasets), p=self.probabilities) + dataset_iterator = dataset_iterators[dataset_idx] + + try: + yield next(dataset_iterator) + except StopIteration: + # Exhausted, create a new iterator + dataset_iterators[dataset_idx] = iter(self.datasets[dataset_idx]) + yield next(dataset_iterators[dataset_idx]) + + +class SemanticDataModule(LightningDataModule): + def __init__( + self, + train_dataset: Union[AutoTextSemanticInstructionDataset, InterleaveDataset], + val_dataset: Union[AutoTextSemanticInstructionDataset, InterleaveDataset], + batch_size: int = 32, + tokenizer: AutoTokenizer = None, + max_length: int = 1024, + num_workers: int = 4, + ): + super().__init__() + + self.train_dataset = train_dataset + self.val_dataset = val_dataset + self.batch_size = batch_size + self.tokenizer = tokenizer + self.max_length = max_length + self.num_workers = num_workers + + def train_dataloader(self): + return DataLoader( + self.train_dataset, + batch_size=self.batch_size, + collate_fn=TextDataCollator(self.tokenizer, self.max_length), + num_workers=self.num_workers, + persistent_workers=True, + ) + + def val_dataloader(self): + return DataLoader( + self.val_dataset, + batch_size=self.batch_size, + collate_fn=TextDataCollator(self.tokenizer, self.max_length), + num_workers=self.num_workers, + persistent_workers=True, + ) + + +if __name__ == "__main__": + from tqdm import tqdm + + ds = AutoTextSemanticInstructionDataset( + ["data/protos"], + tokenizer=AutoTokenizer.from_pretrained("fishaudio/fish-speech-1"), + use_speaker=False, + interactive_prob=1.0, + skip_text_prob=0.5, + ) + + for i in ds: + print(ds.tokenizer.decode(i["tokens"][0], skip_special_tokens=False)) + # i["labels"][0][i["labels"][0] == -100] = 0 + # print(ds.tokenizer.decode(i["labels"][0], skip_special_tokens=False)) + break diff --git a/xinference/thirdparty/fish_speech/fish_speech/datasets/vqgan.py b/xinference/thirdparty/fish_speech/fish_speech/datasets/vqgan.py new file mode 100644 index 0000000000..a45583d22e --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/datasets/vqgan.py @@ -0,0 +1,147 @@ +from dataclasses import dataclass +from pathlib import Path +from typing import Optional + +import librosa +import numpy as np +import torch +from lightning import LightningDataModule +from torch.utils.data import DataLoader, Dataset + +from fish_speech.utils import RankedLogger + +logger = RankedLogger(__name__, rank_zero_only=False) + + +class VQGANDataset(Dataset): + def __init__( + self, + filelist: str, + sample_rate: int = 32000, + hop_length: int = 640, + slice_frames: Optional[int] = None, + ): + super().__init__() + + filelist = Path(filelist) + root = filelist.parent + + self.files = [ + root / line.strip() + for line in filelist.read_text(encoding="utf-8").splitlines() + if line.strip() + ] + self.sample_rate = sample_rate + self.hop_length = hop_length + self.slice_frames = slice_frames + + def __len__(self): + return len(self.files) + + def get_item(self, idx): + file = self.files[idx] + + audio, _ = librosa.load(file, sr=self.sample_rate, mono=True) + + # Slice audio and features + if ( + self.slice_frames is not None + and audio.shape[0] > self.slice_frames * self.hop_length + ): + start = np.random.randint( + 0, audio.shape[0] - self.slice_frames * self.hop_length + ) + audio = audio[start : start + self.slice_frames * self.hop_length] + + if len(audio) == 0: + return None + + max_value = np.abs(audio).max() + if max_value > 1.0: + audio = audio / max_value + + return { + "audio": torch.from_numpy(audio), + } + + def __getitem__(self, idx): + try: + return self.get_item(idx) + except Exception as e: + import traceback + + traceback.print_exc() + logger.error(f"Error loading {self.files[idx]}: {e}") + return None + + +@dataclass +class VQGANCollator: + def __call__(self, batch): + batch = [x for x in batch if x is not None] + + audio_lengths = torch.tensor([len(x["audio"]) for x in batch]) + audio_maxlen = audio_lengths.max() + + # Rounds up to nearest multiple of 2 (audio_lengths) + audios = [] + for x in batch: + audios.append( + torch.nn.functional.pad(x["audio"], (0, audio_maxlen - len(x["audio"]))) + ) + + return { + "audios": torch.stack(audios), + "audio_lengths": audio_lengths, + } + + +class VQGANDataModule(LightningDataModule): + def __init__( + self, + train_dataset: VQGANDataset, + val_dataset: VQGANDataset, + batch_size: int = 32, + num_workers: int = 4, + val_batch_size: Optional[int] = None, + ): + super().__init__() + + self.train_dataset = train_dataset + self.val_dataset = val_dataset + self.batch_size = batch_size + self.val_batch_size = val_batch_size or batch_size + self.num_workers = num_workers + + def train_dataloader(self): + return DataLoader( + self.train_dataset, + batch_size=self.batch_size, + collate_fn=VQGANCollator(), + num_workers=self.num_workers, + shuffle=True, + persistent_workers=True, + ) + + def val_dataloader(self): + return DataLoader( + self.val_dataset, + batch_size=self.val_batch_size, + collate_fn=VQGANCollator(), + num_workers=self.num_workers, + persistent_workers=True, + ) + + +if __name__ == "__main__": + dataset = VQGANDataset("data/LibriTTS_R/vq_train_filelist.txt") + dataloader = DataLoader( + dataset, batch_size=4, shuffle=False, collate_fn=VQGANCollator() + ) + + for batch in dataloader: + print(batch["audios"].shape) + print(batch["features"].shape) + print(batch["audio_lengths"]) + print(batch["feature_lengths"]) + break diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/README.md b/xinference/thirdparty/fish_speech/fish_speech/i18n/README.md new file mode 100644 index 0000000000..700902b09d --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/i18n/README.md @@ -0,0 +1,27 @@ +## i18n Folder Attribution + +The `i18n` folder within the `fish_speech` directory contains files initially sourced from the RVC project. In compliance with the MIT license under which these files were released, we acknowledge the original authors and sources below: + +### fish_speech/i18n/core.py + +**Related code from RVC:** +[https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/83d6a64e675d9bbd6e92ee450c5f807ed2bb54d8/i18n/i18n.py](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/83d6a64e675d9bbd6e92ee450c5f807ed2bb54d8/i18n/i18n.py) + +**Initial commit:** +add localization(添加本地化) [RVC-Project/Retrieval-based-Voice-Conversion-WebUI#35](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/pull/35) + +**Initial author:** +[@L4Ph](https://github.com/L4Ph) + +### fish_speech/i18n/scan.py + +**Related code from RVC:** +[https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/83d6a64e675d9bbd6e92ee450c5f807ed2bb54d8/i18n/scan_i18n.py](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/83d6a64e675d9bbd6e92ee450c5f807ed2bb54d8/i18n/scan_i18n.py) + +**Initial commit:** +File for detecting i18n missing keys [RVC-Project/Retrieval-based-Voice-Conversion-WebUI#1058](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/pull/1058) + +**Initial author:** +[@towzeur](https://github.com/towzeur) + +We appreciate the contributions of the RVC project and its authors. diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/i18n/__init__.py new file mode 100644 index 0000000000..981dbb3b3e --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/i18n/__init__.py @@ -0,0 +1,3 @@ +from .core import i18n + +__all__ = ["i18n"] diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/core.py b/xinference/thirdparty/fish_speech/fish_speech/i18n/core.py new file mode 100644 index 0000000000..9f793ec956 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/i18n/core.py @@ -0,0 +1,40 @@ +import json +import locale +from pathlib import Path + +I18N_FILE_PATH = Path(__file__).parent / "locale" +DEFAULT_LANGUAGE = "en_US" + + +def load_language_list(language): + with open(I18N_FILE_PATH / f"{language}.json", "r", encoding="utf-8") as f: + language_list = json.load(f) + + return language_list + + +class I18nAuto: + def __init__(self): + i18n_file = Path(".locale") + + if i18n_file.exists(): + with open(i18n_file, "r", encoding="utf-8") as f: + language = f.read().strip() + else: + # getlocale can't identify the system's language ((None, None)) + language = locale.getdefaultlocale()[0] + + if (I18N_FILE_PATH / f"{language}.json").exists() is False: + language = DEFAULT_LANGUAGE + + self.language = language + self.language_map = load_language_list(language) + + def __call__(self, key): + return self.language_map.get(key, key) + + def __repr__(self): + return "Use Language: " + self.language + + +i18n = I18nAuto() diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/en_US.json b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/en_US.json new file mode 100644 index 0000000000..cf6ad6ca1e --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/en_US.json @@ -0,0 +1,122 @@ +{ + "16-mixed is recommended for 10+ series GPU": "16-mixed is recommended for 10+ series GPU", + "5 to 10 seconds of reference audio, useful for specifying speaker.": "5 to 10 seconds of reference audio, useful for specifying speaker.", + "A text-to-speech model based on VQ-GAN and Llama developed by [Fish Audio](https://fish.audio).": "A text-to-speech model based on VQ-GAN and Llama developed by [Fish Audio](https://fish.audio).", + "Accumulate Gradient Batches": "Accumulate Gradient Batches", + "Add to Processing Area": "Add to Processing Area", + "Added path successfully!": "Added path successfully!", + "Advanced Config": "Advanced Config", + "Base LLAMA Model": "Base LLAMA Model", + "Batch Inference": "Batch Inference", + "Batch Size": "Batch Size", + "Changing with the Model Path": "Changing with the Model Path", + "Chinese": "Chinese", + "Compile Model": "Compile Model", + "Compile the model can significantly reduce the inference time, but will increase cold start time": "Compile the model can significantly reduce the inference time, but will increase cold start time", + "Copy": "Copy", + "Data Preprocessing": "Data Preprocessing", + "Data Preprocessing Path": "Data Preprocessing Path", + "Data Source": "Data Source", + "Decoder Model Config": "Decoder Model Config", + "Decoder Model Path": "Decoder Model Path", + "Disabled": "Disabled", + "Enable Reference Audio": "Enable Reference Audio", + "English": "English", + "Error Message": "Error Message", + "File Preprocessing": "File Preprocessing", + "Generate": "Generate", + "Generated Audio": "Generated Audio", + "If there is no corresponding text for the audio, apply ASR for assistance, support .txt or .lab format": "If there is no corresponding text for the audio, apply ASR for assistance, support .txt or .lab format", + "Infer interface is closed": "Infer interface is closed", + "Inference Configuration": "Inference Configuration", + "Inference Server Configuration": "Inference Server Configuration", + "Inference Server Error": "Inference Server Error", + "Inferring interface is launched at {}": "Inferring interface is launched at {}", + "Initial Learning Rate": "Initial Learning Rate", + "Input Audio & Source Path for Transcription": "Input Audio & Source Path for Transcription", + "Input Text": "Input Text", + "Invalid path: {}": "Invalid path: {}", + "It is recommended to use CUDA, if you have low configuration, use CPU": "It is recommended to use CUDA, if you have low configuration, use CPU", + "Iterative Prompt Length, 0 means off": "Iterative Prompt Length, 0 means off", + "Japanese": "Japanese", + "LLAMA Configuration": "LLAMA Configuration", + "LLAMA Model Config": "LLAMA Model Config", + "LLAMA Model Path": "LLAMA Model Path", + "Labeling Device": "Labeling Device", + "LoRA Model to be merged": "LoRA Model to be merged", + "Maximum Audio Duration": "Maximum Audio Duration", + "Maximum Length per Sample": "Maximum Length per Sample", + "Maximum Training Steps": "Maximum Training Steps", + "Maximum tokens per batch, 0 means no limit": "Maximum tokens per batch, 0 means no limit", + "Merge": "Merge", + "Merge LoRA": "Merge LoRA", + "Merge successfully": "Merge successfully", + "Minimum Audio Duration": "Minimum Audio Duration", + "Model Output Path": "Model Output Path", + "Model Size": "Model Size", + "Move": "Move", + "Move files successfully": "Move files successfully", + "No audio generated, please check the input text.": "No audio generated, please check the input text.", + "No selected options": "No selected options", + "Number of Workers": "Number of Workers", + "Open Inference Server": "Open Inference Server", + "Open Labeler WebUI": "Open Labeler WebUI", + "Open Tensorboard": "Open Tensorboard", + "Opened labeler in browser": "Opened labeler in browser", + "Optional Label Language": "Optional Label Language", + "Optional online ver": "Optional online ver", + "Output Path": "Output Path", + "Path error, please check the model file exists in the corresponding path": "Path error, please check the model file exists in the corresponding path", + "Precision": "Precision", + "Probability of applying Speaker Condition": "Probability of applying Speaker Condition", + "Put your text here.": "Put your text here.", + "Reference Audio": "Reference Audio", + "Reference Text": "Reference Text", + "Related code are released under BSD-3-Clause License, and weights are released under CC BY-NC-SA 4.0 License.": "Related code are released under BSD-3-Clause License, and weights are released under CC BY-NC-SA 4.0 License.", + "Remove Selected Data": "Remove Selected Data", + "Removed path successfully!": "Removed path successfully!", + "Repetition Penalty": "Repetition Penalty", + "Save model every n steps": "Save model every n steps", + "Select LLAMA ckpt": "Select LLAMA ckpt", + "Select VITS ckpt": "Select VITS ckpt", + "Select VQGAN ckpt": "Select VQGAN ckpt", + "Select source file processing method": "Select source file processing method", + "Select the model to be trained (Depending on the Tab page you are on)": "Select the model to be trained (Depending on the Tab page you are on)", + "Selected: {}": "Selected: {}", + "Speaker": "Speaker", + "Speaker is identified by the folder name": "Speaker is identified by the folder name", + "Start Training": "Start Training", + "Streaming Audio": "Streaming Audio", + "Streaming Generate": "Streaming Generate", + "Tensorboard Host": "Tensorboard Host", + "Tensorboard Log Path": "Tensorboard Log Path", + "Tensorboard Port": "Tensorboard Port", + "Tensorboard interface is closed": "Tensorboard interface is closed", + "Tensorboard interface is launched at {}": "Tensorboard interface is launched at {}", + "Text is too long, please keep it under {} characters.": "Text is too long, please keep it under {} characters.", + "The path of the input folder on the left or the filelist. Whether checked or not, it will be used for subsequent training in this list.": "The path of the input folder on the left or the filelist. Whether checked or not, it will be used for subsequent training in this list.", + "Training Configuration": "Training Configuration", + "Training Error": "Training Error", + "Training stopped": "Training stopped", + "Type name of the speaker": "Type name of the speaker", + "Type the path or select from the dropdown": "Type the path or select from the dropdown", + "Use LoRA": "Use LoRA", + "Use LoRA can save GPU memory, but may reduce the quality of the model": "Use LoRA can save GPU memory, but may reduce the quality of the model", + "Use filelist": "Use filelist", + "Use large for 10G+ GPU, medium for 5G, small for 2G": "Use large for 10G+ GPU, medium for 5G, small for 2G", + "VITS Configuration": "VITS Configuration", + "VQGAN Configuration": "VQGAN Configuration", + "Validation Batch Size": "Validation Batch Size", + "View the status of the preprocessing folder (use the slider to control the depth of the tree)": "View the status of the preprocessing folder (use the slider to control the depth of the tree)", + "We are not responsible for any misuse of the model, please consider your local laws and regulations before using it.": "We are not responsible for any misuse of the model, please consider your local laws and regulations before using it.", + "WebUI Host": "WebUI Host", + "WebUI Port": "WebUI Port", + "Whisper Model": "Whisper Model", + "You can find the source code [here](https://github.com/fishaudio/fish-speech) and models [here](https://huggingface.co/fishaudio/fish-speech-1).": "You can find the source code [here](https://github.com/fishaudio/fish-speech) and models [here](https://huggingface.co/fishaudio/fish-speech-1).", + "bf16-true is recommended for 30+ series GPU, 16-mixed is recommended for 10+ series GPU": "bf16-true is recommended for 30+ series GPU, 16-mixed is recommended for 10+ series GPU", + "latest": "latest", + "new": "new", + "Realtime Transform Text": "Realtime Transform Text", + "Normalization Result Preview (Currently Only Chinese)": "Normalization Result Preview (Currently Only Chinese)", + "Text Normalization": "Text Normalization" +} diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/es_ES.json b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/es_ES.json new file mode 100644 index 0000000000..1ea5988213 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/es_ES.json @@ -0,0 +1,122 @@ +{ + "16-mixed is recommended for 10+ series GPU": "se recomienda 16-mixed para GPU de la serie 10+", + "5 to 10 seconds of reference audio, useful for specifying speaker.": "5 a 10 segundos de audio de referencia, útil para especificar el hablante.", + "A text-to-speech model based on VQ-GAN and Llama developed by [Fish Audio](https://fish.audio).": "Un modelo de texto a voz basado en VQ-GAN y Llama desarrollado por [Fish Audio](https://fish.audio).", + "Accumulate Gradient Batches": "Acumular lotes de gradientes", + "Add to Processing Area": "Agregar al Área de Procesamiento", + "Added path successfully!": "¡Ruta agregada exitosamente!", + "Advanced Config": "Configuración Avanzada", + "Base LLAMA Model": "Modelo Base LLAMA", + "Batch Inference": "Inferencia por Lote", + "Batch Size": "Tamaño del Lote", + "Changing with the Model Path": "Cambiando con la Ruta del Modelo", + "Chinese": "Chino", + "Compile Model": "Compilar Modelo", + "Compile the model can significantly reduce the inference time, but will increase cold start time": "Compilar el modelo puede reducir significativamente el tiempo de inferencia, pero aumentará el tiempo de inicio en frío", + "Copy": "Copiar", + "Data Preprocessing": "Preprocesamiento de Datos", + "Data Preprocessing Path": "Ruta de Preprocesamiento de Datos", + "Data Source": "Fuente de Datos", + "Decoder Model Config": "Configuración del modelo decodificador", + "Decoder Model Path": "Ruta del modelo decodificador", + "Disabled": "Desactivado", + "Enable Reference Audio": "Habilitar Audio de Referencia", + "English": "Inglés", + "Error Message": "Mensaje de Error", + "File Preprocessing": "Preprocesamiento de Archivos", + "Generate": "Generar", + "Generated Audio": "Audio Generado", + "If there is no corresponding text for the audio, apply ASR for assistance, support .txt or .lab format": "Si no hay texto correspondiente para el audio, aplique ASR para asistencia, soporte para formato .txt o .lab", + "Infer interface is closed": "La interfaz de inferencia está cerrada", + "Inference Configuration": "Configuración de Inferencia", + "Inference Server Configuration": "Configuración del Servidor de Inferencia", + "Inference Server Error": "Error del Servidor de Inferencia", + "Inferring interface is launched at {}": "La interfaz de inferencia se ha lanzado en {}", + "Initial Learning Rate": "Tasa de Aprendizaje Inicial", + "Input Audio & Source Path for Transcription": "Audio de Entrada y Ruta de Origen para Transcripción", + "Input Text": "Texto de Entrada", + "Invalid path: {}": "Ruta inválida: {}", + "It is recommended to use CUDA, if you have low configuration, use CPU": "Se recomienda usar CUDA, si tiene una configuración baja, use CPU", + "Iterative Prompt Length, 0 means off": "Longitud de la Indicación Iterativa, 0 significa apagado", + "Japanese": "Japonés", + "LLAMA Configuration": "Configuración de LLAMA", + "LLAMA Model Config": "Configuración del Modelo LLAMA", + "LLAMA Model Path": "Ruta del Modelo LLAMA", + "Labeling Device": "Dispositivo de Etiquetado", + "LoRA Model to be merged": "Modelo LoRA a fusionar", + "Maximum Audio Duration": "Duración máxima de audio", + "Maximum Length per Sample": "Longitud Máxima por Muestra", + "Maximum Training Steps": "Pasos Máximos de Entrenamiento", + "Maximum tokens per batch, 0 means no limit": "Máximo de tokens por lote, 0 significa sin límite", + "Merge": "Fusionar", + "Merge LoRA": "Fusionar LoRA", + "Merge successfully": "Fusionado exitosamente", + "Minimum Audio Duration": "Duración mínima de audio", + "Model Output Path": "Ruta de Salida del Modelo", + "Model Size": "Tamaño del Modelo", + "Move": "Mover", + "Move files successfully": "Archivos movidos exitosamente", + "No audio generated, please check the input text.": "No se generó audio, por favor verifique el texto de entrada.", + "No selected options": "No hay opciones seleccionadas", + "Number of Workers": "Número de Trabajadores", + "Open Inference Server": "Abrir Servidor de Inferencia", + "Open Labeler WebUI": "Abrir Interfaz Web del Etiquetador", + "Open Tensorboard": "Abrir Tensorboard", + "Opened labeler in browser": "Se abrió el etiquetador en el navegador", + "Optional Label Language": "Idioma de Etiquetado Opcional", + "Optional online ver": "Ver en línea opcional", + "Output Path": "Ruta de Salida", + "Path error, please check the model file exists in the corresponding path": "Error de ruta, por favor verifique que el archivo del modelo exista en la ruta correspondiente", + "Precision": "Precisión", + "Probability of applying Speaker Condition": "Probabilidad de aplicar Condición de Hablante", + "Put your text here.": "Ponga su texto aquí.", + "Reference Audio": "Audio de Referencia", + "Reference Text": "Texto de Referencia", + "Related code are released under BSD-3-Clause License, and weights are released under CC BY-NC-SA 4.0 License.": "El código relacionado se publica bajo la Licencia BSD-3-Clause, y los pesos se publican bajo la Licencia CC BY-NC-SA 4.0.", + "Remove Selected Data": "Eliminar Datos Seleccionados", + "Removed path successfully!": "¡Ruta eliminada exitosamente!", + "Repetition Penalty": "Penalización por Repetición", + "Save model every n steps": "Guardar modelo cada n pasos", + "Select LLAMA ckpt": "Seleccionar punto de control LLAMA", + "Select VITS ckpt": "Seleccionar punto de control VITS", + "Select VQGAN ckpt": "Seleccionar punto de control VQGAN", + "Select source file processing method": "Seleccione el método de procesamiento de archivos fuente", + "Select the model to be trained (Depending on the Tab page you are on)": "Seleccione el modelo a entrenar (Dependiendo de la pestaña en la que se encuentre)", + "Selected: {}": "Seleccionado: {}", + "Speaker": "Hablante", + "Speaker is identified by the folder name": "El hablante se identifica por el nombre de la carpeta", + "Start Training": "Iniciar Entrenamiento", + "Streaming Audio": "transmisión de audio", + "Streaming Generate": "síntesis en flujo", + "Tensorboard Host": "Host de Tensorboard", + "Tensorboard Log Path": "Ruta de Registro de Tensorboard", + "Tensorboard Port": "Puerto de Tensorboard", + "Tensorboard interface is closed": "La interfaz de Tensorboard está cerrada", + "Tensorboard interface is launched at {}": "La interfaz de Tensorboard se ha lanzado en {}", + "Text is too long, please keep it under {} characters.": "El texto es demasiado largo, por favor manténgalo por debajo de {} caracteres.", + "The path of the input folder on the left or the filelist. Whether checked or not, it will be used for subsequent training in this list.": "La ruta de la carpeta de entrada a la izquierda o la lista de archivos. Ya sea que esté marcado o no, se utilizará para el entrenamiento posterior en esta lista.", + "Training Configuration": "Configuración de Entrenamiento", + "Training Error": "Error de Entrenamiento", + "Training stopped": "Entrenamiento detenido", + "Type name of the speaker": "Escriba el nombre del hablante", + "Type the path or select from the dropdown": "Escriba la ruta o seleccione de la lista desplegable", + "Use LoRA": "Usar LoRA", + "Use LoRA can save GPU memory, but may reduce the quality of the model": "Usar LoRA puede ahorrar memoria GPU, pero puede reducir la calidad del modelo", + "Use filelist": "Usar lista de archivos", + "Use large for 10G+ GPU, medium for 5G, small for 2G": "Use grande para GPU de 10G+, mediano para 5G, pequeño para 2G", + "VITS Configuration": "Configuración de VITS", + "VQGAN Configuration": "Configuración de VQGAN", + "Validation Batch Size": "Tamaño del Lote de Validación", + "View the status of the preprocessing folder (use the slider to control the depth of the tree)": "Vea el estado de la carpeta de preprocesamiento (use el control deslizante para controlar la profundidad del árbol)", + "We are not responsible for any misuse of the model, please consider your local laws and regulations before using it.": "No somos responsables de ningún mal uso del modelo, por favor considere sus leyes y regulaciones locales antes de usarlo.", + "WebUI Host": "Host de WebUI", + "WebUI Port": "Puerto de WebUI", + "Whisper Model": "Modelo Whisper", + "You can find the source code [here](https://github.com/fishaudio/fish-speech) and models [here](https://huggingface.co/fishaudio/fish-speech-1).": "Puede encontrar el código fuente [aquí](https://github.com/fishaudio/fish-speech) y los modelos [aquí](https://huggingface.co/fishaudio/fish-speech-1).", + "bf16-true is recommended for 30+ series GPU, 16-mixed is recommended for 10+ series GPU": "Se recomienda bf16-true para GPU de la serie 30+, se recomienda 16-mixed para GPU de la serie 10+", + "latest": "más reciente", + "new": "nuevo", + "Realtime Transform Text": "Transformación de Texto en Tiempo Real", + "Normalization Result Preview (Currently Only Chinese)": "Vista Previa del Resultado de Normalización (Actualmente Solo Chino)", + "Text Normalization": "Normalización de Texto" +} diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/ja_JP.json b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/ja_JP.json new file mode 100644 index 0000000000..e7817eb0c5 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/ja_JP.json @@ -0,0 +1,123 @@ +{ + "16-mixed is recommended for 10+ series GPU": "10シリーズ以降のGPUには16-mixedをお勧めします", + "5 to 10 seconds of reference audio, useful for specifying speaker.": "話者を指定するのに役立つ、5~10秒のリファレンスオーディオ。", + "A text-to-speech model based on VQ-GAN and Llama developed by [Fish Audio](https://fish.audio).": "[Fish Audio](https://fish.audio)が開発したVQ-GANとLlamaに基づくテキスト音声合成モデル。", + "Accumulate Gradient Batches": "勾配バッチの累積", + "Add to Processing Area": "処理エリアに追加", + "Added path successfully!": "パスの追加に成功しました!", + "Advanced Config": "詳細設定", + "Base LLAMA Model": "基本LLAMAモデル", + "Batch Inference": "バッチ推論", + "Batch Size": "バッチサイズ", + "Changing with the Model Path": "モデルのパスに伴って変化する", + "Chinese": "中国語", + "Compile Model": "モデルのコンパイル", + "Compile the model can significantly reduce the inference time, but will increase cold start time": "モデルをコンパイルすると推論時間を大幅に短縮できますが、コールドスタート時間が長くなります", + "Copy": "コピー", + "Data Preprocessing": "データ前処理", + "Data Preprocessing Path": "データ前処理パス", + "Data Source": "データソース", + "Decoder Model Config": "デコーダーモデルの構成", + "Decoder Model Path": "デコーダーモデルのパス", + "Disabled": "無効", + "Enable Reference Audio": "リファレンスオーディオを有効にする", + "English": "英語", + "Error Message": "エラーメッセージ", + "File Preprocessing": "文書前处理", + "Generate": "生成", + "Generated Audio": "生成されたオーディオ", + "If there is no corresponding text for the audio, apply ASR for assistance, support .txt or .lab format": "音声に対応するテキストがない場合は、ASRを適用してサポートします。.txtまたは.lab形式をサポートしています", + "Infer interface is closed": "推論インターフェースが閉じられています", + "Inference Configuration": "推論設定", + "Inference Server Configuration": "推論サーバー設定", + "Inference Server Error": "推論サーバーエラー", + "Inferring interface is launched at {}": "推論インターフェースが{}で起動しました", + "Initial Learning Rate": "初期学習率", + "Input Audio & Source Path for Transcription": "入力オーディオと文字起こしのソースパス", + "Input Text": "入力テキスト", + "Invalid path: {}": "無効なパス: {}", + "It is recommended to use CUDA, if you have low configuration, use CPU": "CUDAの使用をお勧めします。低い構成の場合はCPUを使用してください", + "Iterative Prompt Length, 0 means off": "反復プロンプト長。0はオフを意味します", + "Japanese": "日本語", + "LLAMA Configuration": "LLAMA設定", + "LLAMA Model Config": "LLAMAモデル設定", + "LLAMA Model Path": "LLAMAモデルパス", + "Labeling Device": "ラベリングデバイス", + "LoRA Model to be merged": "マージするLoRAモデル", + "Maximum Audio Duration": "最大オーディオの長さ", + "Maximum Length per Sample": "サンプルあたりの最大長", + "Maximum Training Steps": "最大トレーニングステップ数", + "Maximum tokens per batch, 0 means no limit": "バッチあたりの最大トークン数。0は制限なしを意味します", + "Merge": "マージ", + "Merge LoRA": "LoRAのマージ", + "Merge successfully": "マージに成功しました", + "Minimum Audio Duration": "最小オーディオの長さ", + "Model Output Path": "モデル出力パス", + "Model Size": "モデルサイズ", + "Move": "移動", + "Move files successfully": "ファイルの移動に成功しました", + "No audio generated, please check the input text.": "オーディオが生成されていません。入力テキストを確認してください。", + "No selected options": "選択されたオプションはありません", + "Number of Workers": "ワーカー数", + "Open Inference Server": "推論サーバーを開く", + "Open Labeler WebUI": "ラベラーWebUIを開く", + "Open Tensorboard": "Tensorboardを開く", + "Opened labeler in browser": "ブラウザでラベラーを開きました", + "Optional Label Language": "オプションのラベル言語", + "Optional online ver": "オプションのオンラインバージョン", + "Output Path": "出力パス", + "Path error, please check the model file exists in the corresponding path": "パスエラー。対応するパスにモデルファイルが存在するか確認してください", + "Precision": "精度", + "Probability of applying Speaker Condition": "話者条件を適用する確率", + "Put your text here.": "ここにテキストを入力してください。", + "Reference Audio": "リファレンスオーディオ", + "Reference Text": "リファレンステキスト", + "Related code are released under BSD-3-Clause License, and weights are released under CC BY-NC-SA 4.0 License.": "関連コードはBSD-3-Clauseライセンスの下でリリースされ、重みはCC BY-NC-SA 4.0ライセンスの下でリリースされます。", + "Remove Selected Data": "選択したデータを削除", + "Removed path successfully!": "パスの削除に成功しました!", + "Repetition Penalty": "反復ペナルティ", + "Save model every n steps": "nステップごとにモデルを保存", + "Select LLAMA ckpt": " LLAMA チェックポイントを選択", + "Select VITS ckpt": "VITS チェックポイントを選択", + "Select VQGAN ckpt": "VQGAN チェックポイントを選択", + "Select source file processing method": "ソースファイルの処理方法を選択", + "Select the model to be trained (Depending on the Tab page you are on)": "タブページに応じてトレーニングするモデルを選択してください", + "Selected: {}": "選択済み: {}", + "Speaker": "話者", + "Speaker is identified by the folder name": "話者はフォルダ名で識別されます", + "Start Training": "トレーニング開始", + "Streaming Audio": "ストリーミングオーディオ", + "Streaming Generate": "ストリーミング合成", + "Tensorboard Host": "Tensorboardホスト", + "Tensorboard Log Path": "Tensorboardログパス", + "Tensorboard Port": "Tensorboardポート", + "Tensorboard interface is closed": "Tensorboardインターフェースが閉じられています", + "Tensorboard interface is launched at {}": "Tensorboardインターフェースが{}で起動されました", + "Text is too long, please keep it under {} characters.": "テキストが長すぎます。{}文字以内に抑えてください。", + "The path of the input folder on the left or the filelist. Whether checked or not, it will be used for subsequent training in this list.": "左側の入力フォルダまたはファイルリストのパス。チェックの有無にかかわらず、このリストの後続のトレーニングに使用されます。", + "Training Configuration": "トレーニング設定", + "Training Error": "トレーニングエラー", + "Training stopped": "トレーニングが停止しました", + "Type name of the speaker": "話者の名前を入力", + "Type the path or select from the dropdown": "パスを入力するか、ドロップダウンから選択してください", + "Use LoRA": "LoRAを使用", + "Use LoRA can save GPU memory, but may reduce the quality of the model": "LoRAを使用するとGPUメモリを節約できますが、モデルの品質が低下する可能性があります", + "Use filelist": "ファイルリストを使用", + "Use large for 10G+ GPU, medium for 5G, small for 2G": "10G以上のGPUには大、5Gには中、2Gには小を使用してください", + "VITS Configuration": "VITS の構成", + "VQGAN Configuration": "VQGAN の構成", + "Validation Batch Size": "検証バッチサイズ", + "View the status of the preprocessing folder (use the slider to control the depth of the tree)": "前処理フォルダの状態を表示(スライダーを使用してツリーの深さを制御)", + "We are not responsible for any misuse of the model, please consider your local laws and regulations before using it.": "モデルの誤用については一切責任を負いません。使用する前に、現地の法律と規制を考慮してください。", + "WebUI Host": "WebUIホスト", + "WebUI Port": "WebUIポート", + "Whisper Model": "Whisperモデル", + "You can find the source code [here](https://github.com/fishaudio/fish-speech) and models [here](https://huggingface.co/fishaudio/fish-speech-1).": "ソースコードは[こちら](https://github.com/fishaudio/fish-speech)、モデルは[こちら](https://huggingface.co/fishaudio/fish-speech-1)にあります。", + "bf16-true is recommended for 30+ series GPU, 16-mixed is recommended for 10+ series GPU": "30シリーズ以降のGPUにはbf16-trueを、10シリーズ以降のGPUには16-mixedをお勧めします", + "latest": "最新", + "new": "新規", + "Realtime Transform Text": "リアルタイム変換テキスト", + "Normalization Result Preview (Currently Only Chinese)": "正規化結果プレビュー(現在は中国語のみ)", + "Text Normalization": "テキスト正規化" + +} diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/pt_BR.json b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/pt_BR.json new file mode 100644 index 0000000000..c3df431a40 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/pt_BR.json @@ -0,0 +1,133 @@ +{ + "5 to 10 seconds of reference audio, useful for specifying speaker.": "5 a 10 segundos de áudio de referência, útil para especificar o orador.", + "A text-to-speech model based on VQ-GAN and Llama developed by [Fish Audio](https://fish.audio).": "Um modelo de texto para fala baseado em VQ-GAN e Llama desenvolvido por [Fish Audio](https://fish.audio).", + "Accumulate Gradient Batches": "Acumular Lotes de Gradiente", + "Add to Processing Area": "Adicionar à Área de Processamento", + "Added path successfully!": "Caminho adicionado com sucesso!", + "Advanced Config": "Configuração Avançada", + "Base LLAMA Model": "Modelo LLAMA Base", + "Batch Inference": "Inferência em Lote", + "Batch Size": "Tamanho do Lote", + "Changing with the Model Path": "Alterando com o Caminho do Modelo", + + "Compile Model": "Compilar Modelo", + "Compile the model can significantly reduce the inference time, but will increase cold start time": "Compilar o modelo pode reduzir significativamente o tempo de inferência, mas aumentará a latência inicial", + "Copy": "Copiar", + "Data Preprocessing": "Pré-processamento de Dados", + "Data Preprocessing Path": "Caminho de Pré-processamento de Dados", + "Data Source": "Fonte de Dados", + "Decoder Model Config": "Configuração do Modelo Decodificador", + "Decoder Model Path": "Caminho do Modelo Decodificador", + "Disabled": "Desativado", + "Enable Initial Prompt": "Habilitar Prompt Inicial", + "Enable Reference Audio": "Habilitar Áudio de Referência", + "English": "Inglês", + "Japanese": "Japonês", + "Chinese": "Chinês", + "Portuguese": "Português", + "Spanish": "Espanhol", + "Error Message": "Mensagem de Erro", + "Faster Whisper, Up to 5g GPU memory usage": "Faster Whisper (Usa até 5 GB de vRAM)", + "File Preprocessing": "Pré-processamento de Arquivos", + "Generate": "Gerar", + "Generated Audio": "Áudio Gerado", + "If there is no corresponding text for the audio, apply ASR for assistance, support .txt or .lab format": "Se não houver texto correspondente ao áudio, utilize o ASR para assistência (formatos .txt ou .lab)", + "Infer interface is closed": "A interface de inferência foi fechada", + "Inference Configuration": "Configuração de Inferência", + "Inference Server Configuration": "Configuração do Servidor de Inferência", + "Inference Server Error": "Erro do Servidor de Inferência", + "Inferring interface is launched at {}": "A interface de inferência foi iniciada em {}", + "Initial Learning Rate": "Taxa de Aprendizagem Inicial", + "Initial Prompt": "Prompt Inicial", + "Initial prompt can provide contextual or vocabulary-specific guidance to the model.": "O prompt inicial pode fornecer orientação contextual ou específica de vocabulário para o modelo.", + "Input Audio & Source Path for Transcription": "Entrada de Áudio/Caminho de Origem para Transcrição", + "Input Text": "Texto de Entrada", + "Invalid path: {}": "Caminho inválido: {}", + "It is recommended to use CUDA, if you have low configuration, use CPU": "Para GPUs Nvidia é recomendado usar CUDA. Se não tiver uma GPU Nvidia, use CPU", + "Iterative Prompt Length, 0 means off": "Comprimento do Prompt Iterativo (0 = desativado)", + "LLAMA Configuration": "Configuração do LLAMA", + "LLAMA Model Config": "Configuração do Modelo LLAMA", + "LLAMA Model Path": "Caminho do Modelo LLAMA", + "Labeling Device": "Dispositivo de Rotulagem", + "LoRA Model to be merged": "Modelo LoRA para mesclagem", + "Maximum Length per Sample": "Comprimento Máximo por Amostra", + "Maximum Training Steps": "Etapas Máximas de Treinamento", + "Maximum tokens per batch, 0 means no limit": "Número máximo de tokens por lote, 0 significa sem limite", + "Merge": "Mesclar", + "Merge LoRA": "Mesclar LoRA", + "Merge successfully": "Mesclado com sucesso", + "Model Output Path": "Caminho de Saída do Modelo", + "Model Quantization": "Quantização do Modelo", + "Model Size": "Tamanho do Modelo", + "Move": "Mover", + "Move files successfully": "Arquivos movidos com sucesso", + "No audio generated, please check the input text.": "Nenhum áudio gerado, verifique o texto de entrada.", + "No selected options": "Nenhuma opção selecionada", + "Normalization Result Preview (Currently Only Chinese)": "Pré-visualização do Resultado da Normalização (Atualmente Apenas Chinês)", + "Number of Workers": "Número de Processos", + "Open Inference Server": "Abrir Servidor de Inferência", + "Open Labeler WebUI": "Abrir WebUI de Rotulagem", + "Open Tensorboard": "Abrir Tensorboard", + "Opened labeler in browser": "WebUI de rotulagem aberta no navegador", + "Optional Label Language": "Idioma do Rótulo (Opcional)", + "Optional online ver": "Versão online (opcional)", + "Output Path": "Caminho de Saída", + "Path error, please check the model file exists in the corresponding path": "Erro de caminho, verifique se o arquivo do modelo existe no caminho correspondente", + "Post-quantification Precision": "Precisão Pós-quantização", + "Precision": "Precisão", + "Probability of applying Speaker Condition": "Probabilidade de Aplicar Condição de Orador", + "Put your text here.": "Insira seu texto aqui.", + "Quantify": "Quantizar", + "Quantify successfully": "Quantizado com sucesso", + "Realtime Transform Text": "Transformar Texto em Tempo Real", + "Reference Audio": "Áudio de Referência", + "Reference Text": "Texto de Referência", + "warning": "Aviso", + "Pre-processing begins...": "O pré-processamento começou!", + "Related code are released under BSD-3-Clause License, and weights are released under CC BY-NC-SA 4.0 License.": "O código relacionado é licenciado sob a Licença BSD-3-Clause, e os pesos sob a Licença CC BY-NC-SA 4.0.", + "Remove Selected Data": "Remover Dados Selecionados", + "Removed path successfully!": "Caminho removido com sucesso!", + "Repetition Penalty": "Penalidade de Repetição", + "Save model every n steps": "Salvar modelo a cada n etapas", + "Select LLAMA ckpt": "Selecionar .ckpt do LLAMA", + "Select source file processing method": "Escolha como processar o arquivo de origem", + "Select the model to be trained (Depending on the Tab page you are on)": "Selecione o modelo para o treinamento (dependendo da aba em que você está)", + "Selected: {}": "Selecionado: {}", + "Speaker is identified by the folder name": "O orador é identificado pelo nome da pasta", + "Start Training": "Iniciar Treinamento", + "Streaming Audio": "Áudio em Streaming", + "Streaming Generate": "Geração em Streaming", + "Tensorboard Host": "Host do Tensorboard", + "Tensorboard Log Path": "Caminho de Log do Tensorboard", + "Tensorboard Port": "Porta do Tensorboard", + "Tensorboard interface is closed": "A interface do Tensorboard está fechada", + "Tensorboard interface is launched at {}": "A interface do Tensorboard foi iniciada em {}", + "Text Normalization": "Normalização de Texto", + "Text is too long, please keep it under {} characters.": "O texto é muito longo. Mantenha-o com menos de {} caracteres.", + "The lower the quantitative precision, the more the effectiveness may decrease, but the greater the efficiency will increase": "Quanto menor a precisão quantitativa, mais a eficácia pode diminuir, mas maior será o aumento da eficiência", + "The path of the input folder on the left or the filelist. Whether checked or not, it will be used for subsequent training in this list.": "O caminho da pasta de entrada à esquerda ou a lista de arquivos. Independentemente de estar marcada ou não, ela será utilizada para o treinamento subsequente nesta lista.", + "Training Configuration": "Configuração de Treinamento", + "Training Error": "Erro de Treinamento", + "Training stopped": "Treinamento interrompido!", + "Type the path or select from the dropdown": "Digite o caminho ou selecione no menu suspenso", + "Use LoRA": "Usar LoRA", + "Use LoRA can save GPU memory, but may reduce the quality of the model": "O uso de LoRAs pode economizar memória da GPU, mas também pode reduzir a qualidade", + "Use filelist": "Usar lista de arquivos", + "VQGAN Configuration": "Configuração do VQGAN", + "View the status of the preprocessing folder (use the slider to control the depth of the tree)": "Visualizar o status da pasta de pré-processamento (use o controle deslizante para controlar a profundidade da árvore)", + "We are not responsible for any misuse of the model, please consider your local laws and regulations before using it.": "Não nos responsabilizamos por qualquer uso indevido do modelo. Por favor, considere as leis e regulamentações locais antes de usá-lo.", + "WebUI Host": "Host da WebUI", + "WebUI Port": "Porta da WebUI", + "Whisper Model": "Modelo Whisper", + "You can find the source code [here](https://github.com/fishaudio/fish-speech) and models [here](https://huggingface.co/fishaudio/fish-speech-1).": "Você pode encontrar o código fonte [aqui](https://github.com/fishaudio/fish-speech) e os modelos [aqui](https://huggingface.co/fishaudio/fish-speech-1).", + "auto": "automático", + "bf16-true is recommended for 30+ series GPU, 16-mixed is recommended for 10+ series GPU": "bf16-true é recomendado para GPUs da série 30+, 16-mixed é recomendado para GPUs da série 10+", + "latest": "mais recente", + "new": "novo", + "This audio introduces the basic concepts and applications of artificial intelligence and machine learning.": "Este áudio introduz os conceitos básicos e aplicações de inteligência artificial e aprendizado de máquina.", + "You don't need to train this model!": "Não é necessário treinar este modelo!", + "Yes": "Sim", + "No": "Não", + "version:": "versão:", + "author:": "autor:" +} diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/zh_CN.json b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/zh_CN.json new file mode 100644 index 0000000000..da81eef1cf --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/i18n/locale/zh_CN.json @@ -0,0 +1,122 @@ +{ + "16-mixed is recommended for 10+ series GPU": "10+ 系列 GPU 建议使用 16-mixed", + "5 to 10 seconds of reference audio, useful for specifying speaker.": "5 到 10 秒的参考音频,适用于指定音色。", + "A text-to-speech model based on VQ-GAN and Llama developed by [Fish Audio](https://fish.audio).": "由 [Fish Audio](https://fish.audio) 研发的基于 VQ-GAN 和 Llama 的多语种语音合成.", + "Accumulate Gradient Batches": "梯度累积批次", + "Add to Processing Area": "加入处理区", + "Added path successfully!": "添加路径成功!", + "Advanced Config": "高级参数", + "Base LLAMA Model": "基础 LLAMA 模型", + "Batch Inference": "批量推理", + "Batch Size": "批次大小", + "Changing with the Model Path": "随模型路径变化", + "Chinese": "中文", + "Compile Model": "编译模型", + "Compile the model can significantly reduce the inference time, but will increase cold start time": "编译模型可以显著减少推理时间,但会增加冷启动时间", + "Copy": "复制", + "Data Preprocessing": "数据预处理", + "Data Preprocessing Path": "数据预处理路径", + "Data Source": "数据源", + "Decoder Model Config": "解码器模型配置", + "Decoder Model Path": "解码器模型路径", + "Disabled": "禁用", + "Enable Reference Audio": "启用参考音频", + "English": "英文", + "Error Message": "错误信息", + "File Preprocessing": "文件预处理", + "Generate": "生成", + "Generated Audio": "音频", + "If there is no corresponding text for the audio, apply ASR for assistance, support .txt or .lab format": "如果音频没有对应的文本,可以应用 ASR 辅助,支持 .txt 或 .lab 格式", + "Infer interface is closed": "推理界面已关闭", + "Inference Configuration": "推理配置", + "Inference Server Configuration": "推理服务器配置", + "Inference Server Error": "推理服务器错误", + "Inferring interface is launched at {}": "推理界面已在 {} 上启动", + "Initial Learning Rate": "初始学习率", + "Input Audio & Source Path for Transcription": "输入音频和转录源路径", + "Input Text": "输入文本", + "Invalid path: {}": "无效路径: {}", + "It is recommended to use CUDA, if you have low configuration, use CPU": "建议使用 CUDA,如果配置较低,使用 CPU", + "Iterative Prompt Length, 0 means off": "迭代提示长度,0 表示关闭", + "Japanese": "日文", + "LLAMA Configuration": "LLAMA 配置", + "LLAMA Model Config": "LLAMA 模型配置", + "LLAMA Model Path": "LLAMA 模型路径", + "Labeling Device": "标注加速设备", + "LoRA Model to be merged": "要合并的 LoRA 模型", + "Maximum Audio Duration": "最大音频时长", + "Maximum Length per Sample": "每个样本的最大长度", + "Maximum Training Steps": "最大训练步数", + "Maximum tokens per batch, 0 means no limit": "每批最大令牌数,0 表示无限制", + "Merge": "合并", + "Merge LoRA": "合并 LoRA", + "Merge successfully": "合并成功", + "Minimum Audio Duration": "最小音频时长", + "Model Output Path": "模型输出路径", + "Model Size": "模型规模", + "Move": "移动", + "Move files successfully": "移动文件成功", + "No audio generated, please check the input text.": "没有生成音频,请检查输入文本.", + "No selected options": "没有选择的选项", + "Number of Workers": "数据加载进程数", + "Open Inference Server": "打开推理服务器", + "Open Labeler WebUI": "打开标注工具", + "Open Tensorboard": "打开 Tensorboard", + "Opened labeler in browser": "在浏览器中打开标注工具", + "Optional Label Language": "[可选] 标注语言", + "Optional online ver": "[可选] 使用在线版", + "Output Path": "输出路径", + "Path error, please check the model file exists in the corresponding path": "路径错误,请检查模型文件是否存在于相应路径", + "Precision": "精度", + "Probability of applying Speaker Condition": "应用说话人条件的概率", + "Put your text here.": "在此处输入文本.", + "Reference Audio": "参考音频", + "Reference Text": "参考文本", + "Related code are released under BSD-3-Clause License, and weights are released under CC BY-NC-SA 4.0 License.": "相关代码使用 BSD-3-Clause 许可证发布,权重使用 CC BY-NC-SA 4.0 许可证发布.", + "Remove Selected Data": "移除选中数据", + "Removed path successfully!": "移除路径成功!", + "Repetition Penalty": "重复惩罚", + "Save model every n steps": "每 n 步保存模型", + "Select LLAMA ckpt": "选择 LLAMA 检查点", + "Select VITS ckpt": "选择 VITS 检查点", + "Select VQGAN ckpt": "选择 VQGAN 检查点", + "Select source file processing method": "选择源文件处理方法", + "Select the model to be trained (Depending on the Tab page you are on)": "根据您所在的选项卡页面选择要训练的模型", + "Selected: {}": "已选择: {}", + "Speaker": "说话人", + "Speaker is identified by the folder name": "自动根据父目录名称识别说话人", + "Start Training": "开始训练", + "Streaming Audio": "流式音频", + "Streaming Generate": "流式合成", + "Tensorboard Host": "Tensorboard 监听地址", + "Tensorboard Log Path": "Tensorboard 日志路径", + "Tensorboard Port": "Tensorboard 端口", + "Tensorboard interface is closed": "Tensorboard 界面已关闭", + "Tensorboard interface is launched at {}": "Tensorboard 界面已在 {} 上启动", + "Text is too long, please keep it under {} characters.": "文本太长,请保持在 {} 个字符以内.", + "The path of the input folder on the left or the filelist. Whether checked or not, it will be used for subsequent training in this list.": "左侧输入文件夹的路径或文件列表。无论是否选中,都将在此列表中用于后续训练.", + "Training Configuration": "训练配置", + "Training Error": "训练错误", + "Training stopped": "训练已停止", + "Type name of the speaker": "输入说话人的名称", + "Type the path or select from the dropdown": "输入路径或从下拉菜单中选择", + "Use LoRA": "使用 LoRA", + "Use LoRA can save GPU memory, but may reduce the quality of the model": "使用 LoRA 可以节省 GPU 内存,但可能会降低模型质量", + "Use filelist": "使用文件列表", + "Use large for 10G+ GPU, medium for 5G, small for 2G": "10G+ GPU 使用 large, 5G 使用 medium, 2G 使用 small", + "VITS Configuration": "VITS 配置", + "VQGAN Configuration": "VQGAN 配置", + "Validation Batch Size": "验证批次大小", + "View the status of the preprocessing folder (use the slider to control the depth of the tree)": "查看预处理文件夹的状态 (使用滑块控制树的深度)", + "We are not responsible for any misuse of the model, please consider your local laws and regulations before using it.": "我们不对模型的任何滥用负责,请在使用之前考虑您当地的法律法规.", + "WebUI Host": "WebUI 监听地址", + "WebUI Port": "WebUI 端口", + "Whisper Model": "Whisper 模型", + "You can find the source code [here](https://github.com/fishaudio/fish-speech) and models [here](https://huggingface.co/fishaudio/fish-speech-1).": "你可以在 [这里](https://github.com/fishaudio/fish-speech) 找到源代码和 [这里](https://huggingface.co/fishaudio/fish-speech-1) 找到模型.", + "bf16-true is recommended for 30+ series GPU, 16-mixed is recommended for 10+ series GPU": "30+ 系列 GPU 建议使用 bf16-true, 10+ 系列 GPU 建议使用 16-mixed", + "latest": "最近的检查点", + "new": "创建新的检查点", + "Realtime Transform Text": "实时规范化文本", + "Normalization Result Preview (Currently Only Chinese)": "规范化结果预览", + "Text Normalization": "文本规范化" +} diff --git a/xinference/thirdparty/fish_speech/fish_speech/i18n/scan.py b/xinference/thirdparty/fish_speech/fish_speech/i18n/scan.py new file mode 100644 index 0000000000..d0194c0f1a --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/i18n/scan.py @@ -0,0 +1,122 @@ +import ast +import glob +import json +from collections import OrderedDict +from pathlib import Path + +from loguru import logger + +from .core import DEFAULT_LANGUAGE, I18N_FILE_PATH + + +def extract_i18n_strings(node): + i18n_strings = [] + + if ( + isinstance(node, ast.Call) + and isinstance(node.func, ast.Name) + and node.func.id == "i18n" + ): + for arg in node.args: + if isinstance(arg, ast.Str): + i18n_strings.append(arg.s) + + for child_node in ast.iter_child_nodes(node): + i18n_strings.extend(extract_i18n_strings(child_node)) + + return i18n_strings + + +# scan the directory for all .py files (recursively) +# for each file, parse the code into an AST +# for each AST, extract the i18n strings + +strings = [] +folders = ["fish_speech", "tools"] +# for filename in glob.iglob("**/*.py", recursive=True): +for folder in folders: + for f in Path(folder).rglob("*.py"): + code = f.read_text(encoding="utf-8") + if "i18n(" in code: + tree = ast.parse(code) + i18n_strings = extract_i18n_strings(tree) + logger.info(f"Found {len(i18n_strings)} i18n strings in {f}") + strings.extend(i18n_strings) + +code_keys = set(strings) +logger.info(f"Total unique: {len(code_keys)}") + + +standard_file = I18N_FILE_PATH / f"{DEFAULT_LANGUAGE}.json" +with open(standard_file, "r", encoding="utf-8") as f: + standard_data = json.load(f, object_pairs_hook=OrderedDict) +standard_keys = set(standard_data.keys()) + +# Define the standard file name +unused_keys = standard_keys - code_keys +logger.info(f"Found {len(unused_keys)} unused keys in {standard_file}") +for unused_key in unused_keys: + logger.info(f"\t{unused_key}") + +missing_keys = code_keys - standard_keys +logger.info(f"Found {len(missing_keys)} missing keys in {standard_file}") +for missing_key in missing_keys: + logger.info(f"\t{missing_key}") + +code_keys_dict = OrderedDict() +for s in strings: + code_keys_dict[s] = s + +# write back +with open(standard_file, "w", encoding="utf-8") as f: + json.dump(code_keys_dict, f, ensure_ascii=False, indent=4, sort_keys=True) + f.write("\n") + +logger.info(f"Updated {standard_file}") + + +# Define the standard file name +standard_file = I18N_FILE_PATH / f"{DEFAULT_LANGUAGE}.json" + +# Find all JSON files in the directory +dir_path = I18N_FILE_PATH +languages = [f for f in dir_path.glob("*.json") if f.stem != DEFAULT_LANGUAGE] + +# Load the standard file +with open(standard_file, "r", encoding="utf-8") as f: + standard_data = json.load(f, object_pairs_hook=OrderedDict) + +# Loop through each language file +for lang_file in languages: + # Load the language file + with open(lang_file, "r", encoding="utf-8") as f: + lang_data = json.load(f, object_pairs_hook=OrderedDict) + + # Find the difference between the language file and the standard file + diff = set(standard_data.keys()) - set(lang_data.keys()) + + miss = set(lang_data.keys()) - set(standard_data.keys()) + + # Add any missing keys to the language file + for key in diff: + lang_data[key] = "#!" + key + logger.info(f"Added missing key: {key} to {lang_file}") + + # Del any extra keys to the language file + for key in miss: + del lang_data[key] + logger.info(f"Del extra key: {key} from {lang_file}") + + # Sort the keys of the language file to match the order of the standard file + lang_data = OrderedDict( + sorted(lang_data.items(), key=lambda x: list(standard_data.keys()).index(x[0])) + ) + + # Save the updated language file + with open(lang_file, "w", encoding="utf-8") as f: + json.dump(lang_data, f, ensure_ascii=False, indent=4, sort_keys=True) + f.write("\n") + + logger.info(f"Updated {lang_file}") + +logger.info("Done") diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/models/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/lit_module.py b/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/lit_module.py new file mode 100644 index 0000000000..df970400f8 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/lit_module.py @@ -0,0 +1,202 @@ +from typing import Any, Optional + +import lightning as L +import torch +import torch.nn.functional as F +from lightning.pytorch.utilities.types import OptimizerLRScheduler + +import fish_speech.utils as utils +from fish_speech.conversation import CODEBOOK_PAD_TOKEN_ID +from fish_speech.models.text2semantic.llama import NaiveTransformer + +log = utils.RankedLogger(__name__, rank_zero_only=True) + + +class TextToSemantic(L.LightningModule): + def __init__( + self, + model: NaiveTransformer, + optimizer: Any, + lr_scheduler: Any, + ): + super().__init__() + + self.model = model + self.optimizer_builder = optimizer + self.lr_scheduler_builder = lr_scheduler + + def forward(self, x): + return self.model(x) + + def on_save_checkpoint(self, checkpoint): + # Save only LoRA parameters + state_dict = checkpoint["state_dict"] + use_lora = any("lora" in name for name in state_dict.keys()) + if not use_lora: + return + + for name in list(state_dict.keys()): + if "lora" not in name: + state_dict.pop(name) + + def configure_optimizers(self) -> OptimizerLRScheduler: + # Get weight decay parameters + weight_decay_parameters, other_parameters = [], [] + for name, param in self.named_parameters(): + if ".bias" in name or "norm.weight" in name or ".embeddings." in name: + other_parameters.append(param) + else: + weight_decay_parameters.append(param) + + optimizer = self.optimizer_builder( + [ + {"params": weight_decay_parameters}, + {"params": other_parameters, "weight_decay": 0.0}, + ] + ) + + # Print the parameters and their weight decay + for i in optimizer.param_groups: + log.info( + f"Set weight decay: {i['weight_decay']} for {len(i['params'])} parameters" + ) + + lr_scheduler = self.lr_scheduler_builder(optimizer) + + return { + "optimizer": optimizer, + "lr_scheduler": { + "scheduler": lr_scheduler, + "interval": "step", + }, + } + + # Copied from https://github.com/eric-mitchell/direct-preference-optimization/blob/main/trainers.py#L90 + def get_batch_logps( + self, + logits: torch.FloatTensor, + labels: torch.LongTensor, + average_log_prob: bool = False, + ) -> torch.FloatTensor: + """Compute the log probabilities of the given labels under the given logits. + + Args: + logits: Logits of the model (unnormalized). Shape: (batch_size, sequence_length, codebook_size, vocab_size) + labels: Labels for which to compute the log probabilities. Label tokens with a value of -100 are ignored. Shape: (batch_size, sequence_length, codebook_size) + average_log_prob: If True, return the average log probability per (non-masked) token. Otherwise, return the sum of the log probabilities of the (non-masked) tokens. + + Returns: + A tensor of shape (batch_size,) containing the average/sum log probabilities of the given labels under the given logits. + """ + assert logits.shape[:-1] == labels.shape + + labels = labels.clone() + loss_mask = labels != -100 + + # dummy token; we'll ignore the losses on these tokens later + labels[labels == -100] = 0 + + per_token_logps = torch.gather( + logits.log_softmax(-1), dim=-1, index=labels.unsqueeze(-1) + ).squeeze(-1) + + if average_log_prob: + return (per_token_logps * loss_mask).sum(-1) / loss_mask.sum(-1) + else: + return (per_token_logps * loss_mask).sum(-1) + + def _step(self, batch, batch_idx, stage: str): + is_train = stage == "train" + + if is_train: + # Key part to make lora work + # Otherwise the parameters are merged, which lead to incorrect gradients + self.model.train() + + # Do positive and negative samples in the same batch to speed up training + labels = batch["labels"] + outputs = self.model( + inp=batch["inputs"], + key_padding_mask=batch["attention_masks"], + ) + token_logits = outputs.token_logits + codebook_logits = outputs.codebook_logits + + # Generate labels + base_loss = F.cross_entropy( + token_logits.view(-1, token_logits.size(-1)), + labels[:, 0].reshape(-1), + ignore_index=-100, + ) + + codebook_labels = labels[:, 1 : 1 + self.model.config.num_codebooks].mT + semantic_loss = F.cross_entropy( + codebook_logits.view(-1, codebook_logits.size(-1)), + codebook_labels.reshape(-1), + ignore_index=-100, + ) + + loss = base_loss + semantic_loss + + self.log( + f"{stage}/loss", + loss, + on_step=is_train, + on_epoch=not is_train, + prog_bar=True, + logger=True, + sync_dist=not is_train, + ) + + self.log( + f"{stage}/base_loss", + base_loss, + on_step=is_train, + on_epoch=not is_train, + prog_bar=False, + logger=True, + sync_dist=not is_train, + ) + + self.log( + f"{stage}/semantic_loss", + semantic_loss, + on_step=is_train, + on_epoch=not is_train, + prog_bar=False, + logger=True, + sync_dist=not is_train, + ) + + # Top-5 accuracy + accuracy = self.get_accuracy(codebook_logits, codebook_labels) + self.log( + f"{stage}/top_5_accuracy", + accuracy, + on_step=is_train, + on_epoch=not is_train, + prog_bar=True, + logger=True, + sync_dist=not is_train, + ) + + return loss + + def get_accuracy(self, logits, labels): + mask = (labels != -100) & (labels != CODEBOOK_PAD_TOKEN_ID) + if mask.sum() == 0: + return torch.tensor(0.0, device=logits.device) + + _, indices = logits.topk(5, dim=-1) + correct = indices.eq(labels.unsqueeze(-1)) + correct[~mask] = 0 + correct = correct.sum() + accuracy = correct / mask.sum() + + return accuracy + + def training_step(self, batch, batch_idx): + return self._step(batch, batch_idx, "train") + + def validation_step(self, batch, batch_idx): + return self._step(batch, batch_idx, "val") diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/llama.py b/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/llama.py new file mode 100644 index 0000000000..4eef92b0ba --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/llama.py @@ -0,0 +1,779 @@ +import json +import math +from collections import OrderedDict +from dataclasses import dataclass +from pathlib import Path +from typing import Optional + +import torch +import torch.nn as nn +from einops import rearrange +from loguru import logger +from torch import Tensor +from torch.nn import functional as F +from torch.nn.attention import SDPBackend, sdpa_kernel +from torch.utils.checkpoint import checkpoint +from transformers import AutoTokenizer + +from fish_speech.conversation import SEMANTIC_TOKEN +from fish_speech.utils import RankedLogger + +from .lora import LoraConfig, setup_lora + +log = RankedLogger(__name__, rank_zero_only=True) + + +def find_multiple(n: int, k: int) -> int: + if n % k == 0: + return n + return n + k - (n % k) + + +@dataclass +class BaseModelArgs: + model_type: str = "base" + + vocab_size: int = 32000 + n_layer: int = 32 + n_head: int = 32 + dim: int = 4096 + intermediate_size: int = None + n_local_heads: int = -1 + head_dim: int = 64 + rope_base: float = 10000 + norm_eps: float = 1e-5 + max_seq_len: int = 2048 + dropout: float = 0.0 + tie_word_embeddings: bool = True + attention_qkv_bias: bool = False + + # Codebook configs + codebook_size: int = 160 + num_codebooks: int = 4 + + # Gradient checkpointing + use_gradient_checkpointing: bool = True + + # Initialize the model + initializer_range: float = 0.02 + + def __post_init__(self): + if self.n_local_heads == -1: + self.n_local_heads = self.n_head + if self.intermediate_size is None: + hidden_dim = 4 * self.dim + n_hidden = int(2 * hidden_dim / 3) + self.intermediate_size = find_multiple(n_hidden, 256) + self.head_dim = self.dim // self.n_head + + @staticmethod + def from_pretrained(path: str): + path = Path(path) + + if path.is_dir(): + path = path / "config.json" + + with open(path, "r", encoding="utf-8") as f: + data = json.load(f) + + match data["model_type"]: + case "naive": + cls = NaiveModelArgs + case "dual_ar": + cls = DualARModelArgs + case _: + raise ValueError(f"Unknown model type: {data['model_type']}") + + return cls(**data) + + def save(self, path: str): + with open(path, "w") as f: + json.dump(self.__dict__, f, indent=4, sort_keys=True, ensure_ascii=False) + + +@dataclass +class NaiveModelArgs(BaseModelArgs): + model_type: str = "naive" + + +@dataclass +class DualARModelArgs(BaseModelArgs): + model_type: str = "dual_ar" + n_fast_layer: int = 4 + + +class KVCache(nn.Module): + def __init__( + self, max_batch_size, max_seq_len, n_heads, head_dim, dtype=torch.bfloat16 + ): + super().__init__() + cache_shape = (max_batch_size, n_heads, max_seq_len, head_dim) + self.register_buffer("k_cache", torch.zeros(cache_shape, dtype=dtype)) + self.register_buffer("v_cache", torch.zeros(cache_shape, dtype=dtype)) + + def update(self, input_pos, k_val, v_val): + # input_pos: [S], k_val: [B, H, S, D] + assert input_pos.shape[0] == k_val.shape[2] + + k_out = self.k_cache + v_out = self.v_cache + k_out[:, :, input_pos] = k_val + v_out[:, :, input_pos] = v_val + + return k_out, v_out + + +@dataclass +class TransformerForwardResult: + token_logits: Tensor + codebook_logits: Tensor + + +@dataclass +class BaseTransformerForwardResult: + logits: Tensor + hidden_states: Tensor + + +class BaseTransformer(nn.Module): + def __init__( + self, config: BaseModelArgs, tokenizer: AutoTokenizer, init_weights: bool = True + ) -> None: + super().__init__() + self.config = config + self.tokenizer = tokenizer + + self.semantic_token_id = tokenizer.convert_tokens_to_ids(SEMANTIC_TOKEN) + + # Slow transformer + self.embeddings = nn.Embedding( + config.vocab_size, + config.dim, + ) + self.codebook_embeddings = nn.Embedding( + config.codebook_size * config.num_codebooks, + config.dim, + ) + self.layers = nn.ModuleList( + TransformerBlock(config, use_sdpa=True) for _ in range(config.n_layer) + ) + self.norm = RMSNorm(config.dim, eps=config.norm_eps) + + if self.config.tie_word_embeddings is False: + self.output = nn.Linear( + config.dim, + config.vocab_size, + bias=False, + ) + + self.register_buffer( + "freqs_cis", + precompute_freqs_cis( + config.max_seq_len, + config.dim // config.n_head, + config.rope_base, + ), + persistent=False, + ) + self.register_buffer( + "causal_mask", + torch.tril( + torch.ones( + config.max_seq_len, + config.max_seq_len, + dtype=torch.bool, + ) + ), + persistent=False, + ) + + # For kv cache + self.max_batch_size = -1 + self.max_seq_len = -1 + + if init_weights: + self.apply(self._init_weights) + + def setup_caches( + self, max_batch_size: int, max_seq_len: int, dtype: torch.dtype = torch.bfloat16 + ): + if self.max_seq_len >= max_seq_len and self.max_batch_size >= max_batch_size: + return + + head_dim = self.config.dim // self.config.n_head + max_seq_len = find_multiple(max_seq_len, 8) + self.max_seq_len = max_seq_len + self.max_batch_size = max_batch_size + + for b in self.layers: + b.attention.kv_cache = KVCache( + max_batch_size, + max_seq_len, + self.config.n_local_heads, + head_dim, + dtype=dtype, + ) + + def embed(self, x: Tensor) -> Tensor: + vocab_embeds = [self.embeddings(x[:, 0])] + for i in range(self.config.num_codebooks): + emb = self.codebook_embeddings(x[:, i + 1] + i * self.config.codebook_size) + emb[x[:, 0] != self.semantic_token_id] = 0 + vocab_embeds.append(emb) + + x = torch.stack(vocab_embeds, dim=3) + x = x.sum(dim=3) + + return x + + def forward( + self, + inp: Tensor, + key_padding_mask: Optional[Tensor] = None, + ) -> BaseTransformerForwardResult: + seq_len = inp.size(2) + + # Here we want to merge the embeddings of the codebooks + x = self.embed(inp) + + freqs_cis = self.freqs_cis[:seq_len] + + # Not that the causal mask here follows the definition of scaled_dot_product_attention + # That is, FALSE means masked out + # To maintain consistency, key_padding_mask use TRUE to mask out + mask = None + if key_padding_mask is not None: + mask = self.causal_mask[None, None, :seq_len, :seq_len] # (B, N, Q, K) + mask = mask & key_padding_mask[:, None, None, :].logical_not() + + for layer in self.layers: + if self.config.use_gradient_checkpointing and self.training: + x = checkpoint(layer, x, freqs_cis, mask, use_reentrant=True) + else: + x = layer(x, freqs_cis, mask) + + # We got slow_out here + slow_out = self.norm(x) + + if self.config.tie_word_embeddings: + token_logits = F.linear(slow_out, self.embeddings.weight) + else: + token_logits = self.output(slow_out) + + return BaseTransformerForwardResult( + logits=token_logits, + hidden_states=x, + ) + + def forward_generate( + self, + x: Tensor, + input_pos: Optional[Tensor] = None, + return_all: bool = False, + ) -> BaseTransformerForwardResult: + # This is used for generation, optimized for torch compile + assert ( + self.max_seq_len != -1 and self.max_batch_size != -1 + ), "Please call setup_caches before forward_generate" + + x = self.embed(x) + + mask = self.causal_mask[ + None, None, input_pos, : self.max_seq_len + ] # (B, N, Q, K) + freqs_cis = self.freqs_cis[input_pos] + + for layer in self.layers: + x = layer(x, freqs_cis, mask, input_pos=input_pos) + + # If prefill, we only calculate the logits of last token + if x.size(1) > 1 and not return_all: + x = x[:, -1:] + + # We got slow_out here + slow_out = self.norm(x) + + if self.config.tie_word_embeddings: + token_logits = F.linear(slow_out, self.embeddings.weight) + else: + token_logits = self.output(slow_out) + + return BaseTransformerForwardResult( + logits=token_logits, + hidden_states=x, + ) + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + @staticmethod + def from_pretrained( + path: str, + load_weights: bool = False, + max_length: int | None = None, + lora_config: LoraConfig | None = None, + rope_base: int | None = None, + ) -> "BaseTransformer": + config = BaseModelArgs.from_pretrained(str(path)) + if max_length is not None: + config.max_seq_len = max_length + log.info(f"Override max_seq_len to {max_length}") + + if rope_base is not None: + config.rope_base = rope_base + log.info(f"Override rope_base to {rope_base}") + + match config.model_type: + case "naive": + model_cls = NaiveTransformer + case "dual_ar": + model_cls = DualARTransformer + case _: + raise ValueError(f"Unknown model type: {config.model_type}") + + tokenizer = AutoTokenizer.from_pretrained(str(path)) + log.info(f"Loading model from {path}, config: {config}") + model = model_cls(config, tokenizer=tokenizer) + + if lora_config is not None: + setup_lora(model, lora_config) + log.info(f"LoRA setup: {lora_config}") + + if load_weights is False: + log.info("Randomly initialized model") + else: + + if "int8" in str(Path(path)): + logger.info("Using int8 weight-only quantization!") + from ...tools.llama.quantize import WeightOnlyInt8QuantHandler + + simple_quantizer = WeightOnlyInt8QuantHandler(model) + model = simple_quantizer.convert_for_runtime() + + if "int4" in str(Path(path)): + logger.info("Using int4 quantization!") + path_comps = path.name.split("-") + assert path_comps[-2].startswith("g") + groupsize = int(path_comps[-2][1:]) + from ...tools.llama.quantize import WeightOnlyInt4QuantHandler + + simple_quantizer = WeightOnlyInt4QuantHandler(model, groupsize) + model = simple_quantizer.convert_for_runtime() + + weights = torch.load( + Path(path) / "model.pth", map_location="cpu", mmap=True + ) + + if "state_dict" in weights: + logger.warning( + "Using a TextToSemantic LightningModule checkpoint, " + "please make sure it is a full model, not a LoRA model." + ) + weights = weights["state_dict"] + + if next(iter(weights.keys())).startswith("model."): + logger.info( + f"Remove prefix 'model.' created by TextToSemantic LightningModule from keys" + ) + new_weights = OrderedDict() + for k, v in weights.items(): + new_weights[k.replace("model.", "")] = v + weights = new_weights + + # Verify the name and shape of parameters since strict=False in load_state_dict. + for k, v in model.named_parameters(): + if k not in weights: + logger.warning(f"No weight for {k}") + elif v.shape != weights[k].shape: + logger.warning( + f"Shape mismatch for {k}: {v.shape} vs {weights[k].shape}" + ) + + err = model.load_state_dict(weights, strict=False, assign=True) + log.info(f"Loaded weights with error: {err}") + + return model + + def save_pretrained(self, path: str, drop_lora: bool = False): + path = Path(path) + path.mkdir(parents=True, exist_ok=True) + + self.config.save(path / "config.json") + state_dict = self.state_dict() + + if drop_lora: + for key in list(state_dict.keys()): + if "lora" not in key: + continue + + state_dict.pop(key) + log.info(f"Drop LoRA parameter: {key}") + + torch.save(state_dict, path / "model.pth") + self.tokenizer.save_pretrained(path) + + +class NaiveTransformer(BaseTransformer): + def __init__(self, config: NaiveModelArgs, tokenizer: AutoTokenizer) -> None: + super().__init__(config, init_weights=False, tokenizer=tokenizer) + + self.codebook_norm = RMSNorm(config.dim, eps=config.norm_eps) + self.codebook_output = nn.Linear( + config.dim, + config.codebook_size * config.num_codebooks, + bias=False, + ) + + self.apply(self._init_weights) + + def decode(self, result: BaseTransformerForwardResult) -> TransformerForwardResult: + token_logits = result.logits + x = result.hidden_states + + # Codebook + codebook_logits = self.codebook_output(self.codebook_norm(x)) + codebook_logits = rearrange( + codebook_logits, "b n (c d) -> b n c d", c=self.config.num_codebooks + ) + + return TransformerForwardResult( + token_logits=token_logits, + codebook_logits=codebook_logits, + ) + + def forward( + self, + inp: Tensor, + key_padding_mask: Optional[Tensor] = None, + ) -> TransformerForwardResult: + result = super().forward( + inp=inp, + key_padding_mask=key_padding_mask, + ) + return self.decode(result) + + def forward_generate( + self, x: Tensor, input_pos: Optional[Tensor] = None + ) -> TransformerForwardResult: + result = super().forward_generate(x, input_pos) + return self.decode(result) + + +class DualARTransformer(BaseTransformer): + def __init__(self, config: NaiveModelArgs, tokenizer: AutoTokenizer) -> None: + super().__init__(config, init_weights=False, tokenizer=tokenizer) + + # Fast transformer + self.fast_embeddings = nn.Embedding(config.codebook_size, config.dim) + + # The equivalent bs is so large that sdpa doesn't work + self.fast_layers = nn.ModuleList( + TransformerBlock(config, use_sdpa=False) for _ in range(config.n_fast_layer) + ) + self.fast_norm = RMSNorm(config.dim, eps=config.norm_eps) + self.fast_output = nn.Linear( + config.dim, + config.codebook_size, + bias=False, + ) + + self.apply(self._init_weights) + + def setup_caches( + self, max_batch_size: int, max_seq_len: int, dtype: torch.dtype = torch.bfloat16 + ): + super().setup_caches(max_batch_size, max_seq_len, dtype) + + head_dim = self.config.dim // self.config.n_head + + # Fast transformer + # The max seq len here is the number of codebooks + for b in self.fast_layers: + b.attention.kv_cache = KVCache( + max_batch_size, + self.config.num_codebooks, + self.config.n_local_heads, + head_dim, + dtype=dtype, + ) + + def forward( + self, + inp: Tensor, + key_padding_mask: Optional[Tensor] = None, + ) -> TransformerForwardResult: + parent_result = super().forward(inp, key_padding_mask) + token_logits = parent_result.logits + x = parent_result.hidden_states + + # Fast transformer + fast_seq_len = self.config.num_codebooks + fast_mask = self.causal_mask[ + None, None, :fast_seq_len, :fast_seq_len + ] # (B, N, Q, K) + fast_freqs_cis = self.freqs_cis[:fast_seq_len] + + # Drop the last token and rotate left + codebooks = inp[:, 1:-1, 1:] + codebooks = F.pad(codebooks, (0, 1), value=0) + codebook_embeddings = self.fast_embeddings(codebooks) + x = torch.cat([x[:, None], codebook_embeddings], dim=1) + b, s = x.size(0), x.size(2) + x = rearrange(x, "b n s d -> (b s) n d") # flatten the batch and seq_len + + # Remove padded part + codebooks = rearrange(codebooks, "b n s -> (b s) n") + codebook_mask = (codebooks == 0).all(dim=-1) + + if torch.all(codebook_mask): + # If all codebooks are padded, we keep first 8 to make sure the model runs + codebook_mask[:8] = False + + x_bs, x_len = x.size(0), x.size(1) + x = x[~codebook_mask] + + for layer in self.fast_layers: + if self.config.use_gradient_checkpointing and self.training: + x = checkpoint(layer, x, fast_freqs_cis, fast_mask, use_reentrant=True) + else: + x = layer(x, fast_freqs_cis, fast_mask) + + # unflatten the batch and num_codebooks + fast_out = self.fast_norm(x) + codebook_logits = self.fast_output(fast_out) + + # Re-pad the codebook_logits + buffer = torch.zeros( + x_bs, + x_len, + codebook_logits.size(-1), + device=codebook_logits.device, + dtype=codebook_logits.dtype, + ) + buffer[~codebook_mask] = codebook_logits + codebook_logits = buffer + + assert codebook_logits.shape[1] == self.config.num_codebooks + codebook_logits = rearrange( + codebook_logits, + "(b s) n d -> b s n d", + b=b, + s=s, + n=self.config.num_codebooks, + ) + + return TransformerForwardResult( + token_logits=token_logits, + codebook_logits=codebook_logits, + ) + + def forward_generate_fast( + self, x: Tensor, input_pos: Optional[Tensor] = None + ) -> Tensor: + # Fast transformer + x = x.view(1, 1, -1) + + fast_mask = self.causal_mask[ + None, None, input_pos, : self.config.num_codebooks + ] # (B, N, Q, K) + fast_freqs_cis = self.freqs_cis[input_pos] + + for layer in self.fast_layers: + x = layer(x, fast_freqs_cis, fast_mask, input_pos=input_pos) + + # unflatten the batch and num_codebooks + fast_out = self.fast_norm(x) # only take the last token + codebook_logits = self.fast_output(fast_out) + + return codebook_logits + + +class TransformerBlock(nn.Module): + def __init__(self, config: BaseModelArgs, use_sdpa: bool = True) -> None: + super().__init__() + self.attention = Attention(config, use_sdpa=use_sdpa) + self.feed_forward = FeedForward(config) + self.ffn_norm = RMSNorm(config.dim, config.norm_eps) + self.attention_norm = RMSNorm(config.dim, config.norm_eps) + + def forward( + self, x: Tensor, freqs_cis: Tensor, mask: Tensor, input_pos: Tensor = None + ) -> Tensor: + h = x + self.attention(self.attention_norm(x), freqs_cis, mask, input_pos) + out = h + self.feed_forward(self.ffn_norm(h)) + return out + + +class Attention(nn.Module): + def __init__(self, config: BaseModelArgs, use_sdpa: bool = True): + super().__init__() + assert config.dim % config.n_head == 0 + + total_head_dim = (config.n_head + 2 * config.n_local_heads) * config.head_dim + # key, query, value projections for all heads, but in a batch + self.wqkv = nn.Linear( + config.dim, total_head_dim, bias=config.attention_qkv_bias + ) + self.wo = nn.Linear(config.dim, config.dim, bias=False) + self.kv_cache = None + + self.dropout = config.dropout + self.n_head = config.n_head + self.head_dim = config.head_dim + self.n_local_heads = config.n_local_heads + self.dim = config.dim + self.use_sdpa = use_sdpa + self._register_load_state_dict_pre_hook(self.load_hook) + + def load_hook(self, state_dict, prefix, *args): + if prefix + "wq.weight" in state_dict: + wq = state_dict.pop(prefix + "wq.weight") + wk = state_dict.pop(prefix + "wk.weight") + wv = state_dict.pop(prefix + "wv.weight") + state_dict[prefix + "wqkv.weight"] = torch.cat([wq, wk, wv]) + + def forward( + self, + x: Tensor, + freqs_cis: Tensor, + mask: Tensor, + input_pos: Optional[Tensor] = None, + ) -> Tensor: + bsz, seqlen, _ = x.shape + + kv_size = self.n_local_heads * self.head_dim + q, k, v = self.wqkv(x).split([self.dim, kv_size, kv_size], dim=-1) + + q = q.view(bsz, seqlen, self.n_head, self.head_dim) + k = k.view(bsz, seqlen, self.n_local_heads, self.head_dim) + v = v.view(bsz, seqlen, self.n_local_heads, self.head_dim) + + q = apply_rotary_emb(q, freqs_cis) + k = apply_rotary_emb(k, freqs_cis) + + q, k, v = map(lambda x: x.transpose(1, 2), (q, k, v)) + + if self.kv_cache is not None: + k, v = self.kv_cache.update(input_pos, k, v) + + k = k.repeat_interleave(self.n_head // self.n_local_heads, dim=1) + v = v.repeat_interleave(self.n_head // self.n_local_heads, dim=1) + + if self.use_sdpa: + if mask is None: + with sdpa_kernel(SDPBackend.FLASH_ATTENTION): + y = F.scaled_dot_product_attention( + q, + k, + v, + dropout_p=self.dropout if self.training else 0.0, + is_causal=True, + # No third party attn_mask here to use flash_attention + ) + else: + y = F.scaled_dot_product_attention( + q, + k, + v, + attn_mask=mask, + dropout_p=self.dropout if self.training else 0.0, + ) + else: + y = self.eq_scaled_dot_product_attention( + q, + k, + v, + attn_mask=mask, + dropout_p=self.dropout if self.training else 0.0, + ) + + y = y.transpose(1, 2).contiguous().view(bsz, seqlen, self.dim) + + return self.wo(y) + + def eq_scaled_dot_product_attention( + self, + query, + key, + value, + attn_mask=None, + dropout_p=0.0, + ) -> torch.Tensor: + # This is a standard scaled dot product attention + # It's low efficient, but it doesn't raise cuda error + + L, S = query.size(-2), key.size(-2) + scale_factor = 1 / math.sqrt(query.size(-1)) + attn_bias = torch.zeros(1, 1, L, S, dtype=query.dtype, device=query.device) + + if attn_mask is not None: + if attn_mask.dtype == torch.bool: + attn_bias.masked_fill_(attn_mask.logical_not(), float("-inf")) + else: + attn_bias += attn_mask + + attn_weight = query @ key.transpose(-2, -1) * scale_factor + attn_weight += attn_bias + attn_weight = torch.softmax(attn_weight, dim=-1) + attn_weight = torch.dropout(attn_weight, dropout_p, train=True) + + return attn_weight @ value + + +class FeedForward(nn.Module): + def __init__(self, config: BaseModelArgs) -> None: + super().__init__() + self.w1 = nn.Linear(config.dim, config.intermediate_size, bias=False) + self.w3 = nn.Linear(config.dim, config.intermediate_size, bias=False) + self.w2 = nn.Linear(config.intermediate_size, config.dim, bias=False) + + def forward(self, x: Tensor) -> Tensor: + return self.w2(F.silu(self.w1(x)) * self.w3(x)) + + +class RMSNorm(nn.Module): + def __init__(self, dim: int, eps: float = 1e-5): + super().__init__() + self.eps = eps + self.weight = nn.Parameter(torch.ones(dim)) + + def _norm(self, x): + return x * torch.rsqrt(torch.mean(x * x, dim=-1, keepdim=True) + self.eps) + + def forward(self, x: Tensor) -> Tensor: + output = self._norm(x.float()).type_as(x) + return output * self.weight + + +def precompute_freqs_cis(seq_len: int, n_elem: int, base: int = 10000) -> Tensor: + freqs = 1.0 / ( + base ** (torch.arange(0, n_elem, 2)[: (n_elem // 2)].float() / n_elem) + ) + t = torch.arange(seq_len, device=freqs.device) + freqs = torch.outer(t, freqs) + freqs_cis = torch.polar(torch.ones_like(freqs), freqs) + cache = torch.stack([freqs_cis.real, freqs_cis.imag], dim=-1) + return cache.to(dtype=torch.bfloat16) + + +def apply_rotary_emb(x: Tensor, freqs_cis: Tensor) -> Tensor: + xshaped = x.float().reshape(*x.shape[:-1], -1, 2) + freqs_cis = freqs_cis.view(1, xshaped.size(1), 1, xshaped.size(3), 2) + x_out2 = torch.stack( + [ + xshaped[..., 0] * freqs_cis[..., 0] - xshaped[..., 1] * freqs_cis[..., 1], + xshaped[..., 1] * freqs_cis[..., 0] + xshaped[..., 0] * freqs_cis[..., 1], + ], + -1, + ) + + x_out2 = x_out2.flatten(3) + return x_out2.type_as(x) diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/lora.py b/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/lora.py new file mode 100644 index 0000000000..647ca6fccc --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/text2semantic/lora.py @@ -0,0 +1,92 @@ +from dataclasses import dataclass + +import loralib as lora + + +@dataclass +class LoraConfig: + r: int + lora_alpha: float + lora_dropout: float = 0.0 + + +def setup_lora(model, lora_config): + # Replace the embedding layer with a LoRA layer + model.embeddings = lora.Embedding( + num_embeddings=model.embeddings.num_embeddings, + embedding_dim=model.embeddings.embedding_dim, + padding_idx=model.embeddings.padding_idx, + r=lora_config.r, + lora_alpha=lora_config.lora_alpha, + ) + + model.codebook_embeddings = lora.Embedding( + num_embeddings=model.codebook_embeddings.num_embeddings, + embedding_dim=model.codebook_embeddings.embedding_dim, + padding_idx=model.codebook_embeddings.padding_idx, + r=lora_config.r, + lora_alpha=lora_config.lora_alpha, + ) + + # Replace output layer with a LoRA layer + linears = [(model, "output")] + + # Replace all linear layers with LoRA layers + for layer in model.layers: + linears.extend([(layer.attention, "wqkv"), (layer.attention, "wo")]) + linears.extend( + [ + (layer.feed_forward, "w1"), + (layer.feed_forward, "w2"), + (layer.feed_forward, "w3"), + ] + ) + + if hasattr(model, "fast_layers"): + model.fast_embeddings = lora.Embedding( + num_embeddings=model.fast_embeddings.num_embeddings, + embedding_dim=model.fast_embeddings.embedding_dim, + padding_idx=model.fast_embeddings.padding_idx, + r=lora_config.r, + lora_alpha=lora_config.lora_alpha, + ) + + # Dual-AR model + linears.append((model, "fast_output")) + + for layer in model.fast_layers: + linears.extend([(layer.attention, "wqkv"), (layer.attention, "wo")]) + linears.extend( + [ + (layer.feed_forward, "w1"), + (layer.feed_forward, "w2"), + (layer.feed_forward, "w3"), + ] + ) + + for module, layer in linears: + updated_linear = lora.Linear( + in_features=getattr(module, layer).in_features, + out_features=getattr(module, layer).out_features, + bias=getattr(module, layer).bias, + r=lora_config.r, + lora_alpha=lora_config.lora_alpha, + lora_dropout=lora_config.lora_dropout, + ) + setattr(module, layer, updated_linear) + + # Mark only the LoRA layers as trainable + lora.mark_only_lora_as_trainable(model, bias="none") + + +def get_merged_state_dict(model): + # This line will merge the state dict of the model and the LoRA parameters + model.eval() + + # Then we need to remove the LoRA parameters from the state dict + state_dict = model.state_dict() + for name in list(state_dict.keys()): + if "lora" in name: + state_dict.pop(name) + + return state_dict diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/__init__.py new file mode 100644 index 0000000000..401c6df468 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/__init__.py @@ -0,0 +1,3 @@ +from .lit_module import VQGAN + +__all__ = ["VQGAN"] diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/lit_module.py b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/lit_module.py new file mode 100644 index 0000000000..d5fa2ccabb --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/lit_module.py @@ -0,0 +1,442 @@ +import itertools +import math +from typing import Any, Callable + +import lightning as L +import torch +import torch.nn.functional as F +# import wandb +from lightning.pytorch.loggers import TensorBoardLogger, WandbLogger +from matplotlib import pyplot as plt +from torch import nn + +from fish_speech.models.vqgan.modules.discriminator import Discriminator +from fish_speech.models.vqgan.modules.wavenet import WaveNet +from fish_speech.models.vqgan.utils import avg_with_mask, plot_mel, sequence_mask + + +class VQGAN(L.LightningModule): + def __init__( + self, + optimizer: Callable, + lr_scheduler: Callable, + encoder: WaveNet, + quantizer: nn.Module, + decoder: WaveNet, + discriminator: Discriminator, + vocoder: nn.Module, + encode_mel_transform: nn.Module, + gt_mel_transform: nn.Module, + weight_adv: float = 1.0, + weight_vq: float = 1.0, + weight_mel: float = 1.0, + sampling_rate: int = 44100, + freeze_encoder: bool = False, + ): + super().__init__() + + # Model parameters + self.optimizer_builder = optimizer + self.lr_scheduler_builder = lr_scheduler + + # Modules + self.encoder = encoder + self.quantizer = quantizer + self.decoder = decoder + self.vocoder = vocoder + self.discriminator = discriminator + self.encode_mel_transform = encode_mel_transform + self.gt_mel_transform = gt_mel_transform + + # A simple linear layer to project quality to condition channels + self.quality_projection = nn.Linear(1, 768) + + # Freeze vocoder + for param in self.vocoder.parameters(): + param.requires_grad = False + + # Loss weights + self.weight_adv = weight_adv + self.weight_vq = weight_vq + self.weight_mel = weight_mel + + # Other parameters + self.sampling_rate = sampling_rate + + # Disable strict loading + self.strict_loading = False + + # If encoder is frozen + if freeze_encoder: + for param in self.encoder.parameters(): + param.requires_grad = False + + for param in self.quantizer.parameters(): + param.requires_grad = False + + self.automatic_optimization = False + + def on_save_checkpoint(self, checkpoint): + # Do not save vocoder + state_dict = checkpoint["state_dict"] + for name in list(state_dict.keys()): + if "vocoder" in name: + state_dict.pop(name) + + def configure_optimizers(self): + optimizer_generator = self.optimizer_builder( + itertools.chain( + self.encoder.parameters(), + self.quantizer.parameters(), + self.decoder.parameters(), + self.quality_projection.parameters(), + ) + ) + optimizer_discriminator = self.optimizer_builder( + self.discriminator.parameters() + ) + + lr_scheduler_generator = self.lr_scheduler_builder(optimizer_generator) + lr_scheduler_discriminator = self.lr_scheduler_builder(optimizer_discriminator) + + return ( + { + "optimizer": optimizer_generator, + "lr_scheduler": { + "scheduler": lr_scheduler_generator, + "interval": "step", + "name": "optimizer/generator", + }, + }, + { + "optimizer": optimizer_discriminator, + "lr_scheduler": { + "scheduler": lr_scheduler_discriminator, + "interval": "step", + "name": "optimizer/discriminator", + }, + }, + ) + + def training_step(self, batch, batch_idx): + optim_g, optim_d = self.optimizers() + + audios, audio_lengths = batch["audios"], batch["audio_lengths"] + + audios = audios.float() + audios = audios[:, None, :] + + with torch.no_grad(): + encoded_mels = self.encode_mel_transform(audios) + gt_mels = self.gt_mel_transform(audios) + quality = ((gt_mels.mean(-1) > -8).sum(-1) - 90) / 10 + quality = quality.unsqueeze(-1) + + mel_lengths = audio_lengths // self.gt_mel_transform.hop_length + mel_masks = sequence_mask(mel_lengths, gt_mels.shape[2]) + mel_masks_float_conv = mel_masks[:, None, :].float() + gt_mels = gt_mels * mel_masks_float_conv + encoded_mels = encoded_mels * mel_masks_float_conv + + # Encode + encoded_features = self.encoder(encoded_mels) * mel_masks_float_conv + + # Quantize + vq_result = self.quantizer(encoded_features) + loss_vq = getattr("vq_result", "loss", 0.0) + vq_recon_features = vq_result.z * mel_masks_float_conv + vq_recon_features = ( + vq_recon_features + self.quality_projection(quality)[:, :, None] + ) + + # VQ Decode + gen_mel = ( + self.decoder( + torch.randn_like(vq_recon_features) * mel_masks_float_conv, + condition=vq_recon_features, + ) + * mel_masks_float_conv + ) + + # Discriminator + real_logits = self.discriminator(gt_mels) + fake_logits = self.discriminator(gen_mel.detach()) + d_mask = F.interpolate( + mel_masks_float_conv, size=(real_logits.shape[2],), mode="nearest" + ) + + loss_real = avg_with_mask((real_logits - 1) ** 2, d_mask) + loss_fake = avg_with_mask(fake_logits**2, d_mask) + + loss_d = loss_real + loss_fake + + self.log( + "train/discriminator/loss", + loss_d, + on_step=True, + on_epoch=False, + prog_bar=True, + logger=True, + ) + + # Discriminator backward + optim_d.zero_grad() + self.manual_backward(loss_d) + self.clip_gradients( + optim_d, gradient_clip_val=1000.0, gradient_clip_algorithm="norm" + ) + optim_d.step() + + # Mel Loss, applying l1, using a weighted sum + mel_distance = ( + gen_mel - gt_mels + ).abs() # * 0.5 + self.ssim(gen_mel, gt_mels) * 0.5 + loss_mel_low_freq = avg_with_mask(mel_distance[:, :40, :], mel_masks_float_conv) + loss_mel_mid_freq = avg_with_mask( + mel_distance[:, 40:70, :], mel_masks_float_conv + ) + loss_mel_high_freq = avg_with_mask( + mel_distance[:, 70:, :], mel_masks_float_conv + ) + loss_mel = ( + loss_mel_low_freq * 0.6 + loss_mel_mid_freq * 0.3 + loss_mel_high_freq * 0.1 + ) + + # Adversarial Loss + fake_logits = self.discriminator(gen_mel) + loss_adv = avg_with_mask((fake_logits - 1) ** 2, d_mask) + + # Total loss + loss = ( + self.weight_vq * loss_vq + + self.weight_mel * loss_mel + + self.weight_adv * loss_adv + ) + + # Log losses + self.log( + "train/generator/loss", + loss, + on_step=True, + on_epoch=False, + prog_bar=True, + logger=True, + ) + self.log( + "train/generator/loss_vq", + loss_vq, + on_step=True, + on_epoch=False, + prog_bar=False, + logger=True, + ) + self.log( + "train/generator/loss_mel", + loss_mel, + on_step=True, + on_epoch=False, + prog_bar=False, + logger=True, + ) + self.log( + "train/generator/loss_adv", + loss_adv, + on_step=True, + on_epoch=False, + prog_bar=False, + logger=True, + ) + + # Generator backward + optim_g.zero_grad() + self.manual_backward(loss) + self.clip_gradients( + optim_g, gradient_clip_val=1000.0, gradient_clip_algorithm="norm" + ) + optim_g.step() + + scheduler_g, scheduler_d = self.lr_schedulers() + scheduler_g.step() + scheduler_d.step() + + def validation_step(self, batch: Any, batch_idx: int): + audios, audio_lengths = batch["audios"], batch["audio_lengths"] + + audios = audios.float() + audios = audios[:, None, :] + + encoded_mels = self.encode_mel_transform(audios) + gt_mels = self.gt_mel_transform(audios) + + mel_lengths = audio_lengths // self.gt_mel_transform.hop_length + mel_masks = sequence_mask(mel_lengths, gt_mels.shape[2]) + mel_masks_float_conv = mel_masks[:, None, :].float() + gt_mels = gt_mels * mel_masks_float_conv + encoded_mels = encoded_mels * mel_masks_float_conv + + # Encode + encoded_features = self.encoder(encoded_mels) * mel_masks_float_conv + + # Quantize + vq_recon_features = self.quantizer(encoded_features).z * mel_masks_float_conv + vq_recon_features = ( + vq_recon_features + + self.quality_projection( + torch.ones( + vq_recon_features.shape[0], 1, device=vq_recon_features.device + ) + * 2 + )[:, :, None] + ) + + # VQ Decode + gen_aux_mels = ( + self.decoder( + torch.randn_like(vq_recon_features) * mel_masks_float_conv, + condition=vq_recon_features, + ) + * mel_masks_float_conv + ) + loss_mel = avg_with_mask((gen_aux_mels - gt_mels).abs(), mel_masks_float_conv) + + self.log( + "val/loss_mel", + loss_mel, + on_step=False, + on_epoch=True, + prog_bar=False, + logger=True, + sync_dist=True, + ) + + recon_audios = self.vocoder(gt_mels) + gen_aux_audios = self.vocoder(gen_aux_mels) + + # only log the first batch + if batch_idx != 0: + return + + for idx, ( + gt_mel, + gen_aux_mel, + audio, + gen_aux_audio, + recon_audio, + audio_len, + ) in enumerate( + zip( + gt_mels, + gen_aux_mels, + audios.cpu().float(), + gen_aux_audios.cpu().float(), + recon_audios.cpu().float(), + audio_lengths, + ) + ): + if idx > 4: + break + + mel_len = audio_len // self.gt_mel_transform.hop_length + + image_mels = plot_mel( + [ + gt_mel[:, :mel_len], + gen_aux_mel[:, :mel_len], + ], + [ + "Ground-Truth", + "Auxiliary", + ], + ) + + if isinstance(self.logger, WandbLogger): + self.logger.experiment.log( + { + "reconstruction_mel": wandb.Image(image_mels, caption="mels"), + "wavs": [ + wandb.Audio( + audio[0, :audio_len], + sample_rate=self.sampling_rate, + caption="gt", + ), + wandb.Audio( + gen_aux_audio[0, :audio_len], + sample_rate=self.sampling_rate, + caption="aux", + ), + wandb.Audio( + recon_audio[0, :audio_len], + sample_rate=self.sampling_rate, + caption="recon", + ), + ], + }, + ) + + if isinstance(self.logger, TensorBoardLogger): + self.logger.experiment.add_figure( + f"sample-{idx}/mels", + image_mels, + global_step=self.global_step, + ) + self.logger.experiment.add_audio( + f"sample-{idx}/wavs/gt", + audio[0, :audio_len], + self.global_step, + sample_rate=self.sampling_rate, + ) + self.logger.experiment.add_audio( + f"sample-{idx}/wavs/gen", + gen_aux_audio[0, :audio_len], + self.global_step, + sample_rate=self.sampling_rate, + ) + self.logger.experiment.add_audio( + f"sample-{idx}/wavs/recon", + recon_audio[0, :audio_len], + self.global_step, + sample_rate=self.sampling_rate, + ) + + plt.close(image_mels) + + def encode(self, audios, audio_lengths): + audios = audios.float() + + mels = self.encode_mel_transform(audios) + mel_lengths = audio_lengths // self.encode_mel_transform.hop_length + mel_masks = sequence_mask(mel_lengths, mels.shape[2]) + mel_masks_float_conv = mel_masks[:, None, :].float() + mels = mels * mel_masks_float_conv + + # Encode + encoded_features = self.encoder(mels) * mel_masks_float_conv + feature_lengths = mel_lengths // math.prod(self.quantizer.downsample_factor) + + return self.quantizer.encode(encoded_features), feature_lengths + + def decode(self, indices, feature_lengths, return_audios=False): + factor = math.prod(self.quantizer.downsample_factor) + mel_masks = sequence_mask(feature_lengths * factor, indices.shape[2] * factor) + mel_masks_float_conv = mel_masks[:, None, :].float() + + z = self.quantizer.decode(indices) * mel_masks_float_conv + z = ( + z + + self.quality_projection(torch.ones(z.shape[0], 1, device=z.device) * 2)[ + :, :, None + ] + ) + + gen_mel = ( + self.decoder( + torch.randn_like(z) * mel_masks_float_conv, + condition=z, + ) + * mel_masks_float_conv + ) + + if return_audios: + return self.vocoder(gen_mel) + + return gen_mel diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/discriminator.py b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/discriminator.py new file mode 100644 index 0000000000..69c7df4103 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/discriminator.py @@ -0,0 +1,44 @@ +import torch +from torch import nn +from torch.nn.utils.parametrizations import weight_norm + + +class Discriminator(nn.Module): + def __init__(self): + super().__init__() + + blocks = [] + convs = [ + (1, 64, (3, 9), 1, (1, 4)), + (64, 128, (3, 9), (1, 2), (1, 4)), + (128, 256, (3, 9), (1, 2), (1, 4)), + (256, 512, (3, 9), (1, 2), (1, 4)), + (512, 1024, (3, 3), 1, (1, 1)), + (1024, 1, (3, 3), 1, (1, 1)), + ] + + for idx, (in_channels, out_channels, kernel_size, stride, padding) in enumerate( + convs + ): + blocks.append( + weight_norm( + nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding) + ) + ) + + if idx != len(convs) - 1: + blocks.append(nn.SiLU(inplace=True)) + + self.blocks = nn.Sequential(*blocks) + + def forward(self, x): + return self.blocks(x[:, None])[:, 0] + + +if __name__ == "__main__": + model = Discriminator() + print(sum(p.numel() for p in model.parameters()) / 1_000_000) + x = torch.randn(1, 128, 1024) + y = model(x) + print(y.shape) + print(y) diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/firefly.py b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/firefly.py new file mode 100644 index 0000000000..4ca0ff5882 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/firefly.py @@ -0,0 +1,625 @@ +# A inference only version of the FireflyGAN model + +import math +from functools import partial +from math import prod +from typing import Callable + +import numpy as np +import torch +import torch.nn.functional as F +from torch import nn +from torch.nn import Conv1d +from torch.nn.utils.parametrizations import weight_norm +from torch.nn.utils.parametrize import remove_parametrizations +from torch.utils.checkpoint import checkpoint + +from fish_speech.models.vqgan.utils import sequence_mask + + +def init_weights(m, mean=0.0, std=0.01): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) + + +def get_padding(kernel_size, dilation=1): + return (kernel_size * dilation - dilation) // 2 + + +class ResBlock1(torch.nn.Module): + def __init__(self, channels, kernel_size=3, dilation=(1, 3, 5)): + super().__init__() + + self.convs1 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[2], + padding=get_padding(kernel_size, dilation[2]), + ) + ), + ] + ) + self.convs1.apply(init_weights) + + self.convs2 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + ] + ) + self.convs2.apply(init_weights) + + def forward(self, x): + for c1, c2 in zip(self.convs1, self.convs2): + xt = F.silu(x) + xt = c1(xt) + xt = F.silu(xt) + xt = c2(xt) + x = xt + x + return x + + def remove_parametrizations(self): + for conv in self.convs1: + remove_parametrizations(conv, tensor_name="weight") + for conv in self.convs2: + remove_parametrizations(conv, tensor_name="weight") + + +class ParralelBlock(nn.Module): + def __init__( + self, + channels: int, + kernel_sizes: tuple[int] = (3, 7, 11), + dilation_sizes: tuple[tuple[int]] = ((1, 3, 5), (1, 3, 5), (1, 3, 5)), + ): + super().__init__() + + assert len(kernel_sizes) == len(dilation_sizes) + + self.blocks = nn.ModuleList() + for k, d in zip(kernel_sizes, dilation_sizes): + self.blocks.append(ResBlock1(channels, k, d)) + + def forward(self, x): + return torch.stack([block(x) for block in self.blocks], dim=0).mean(dim=0) + + def remove_parametrizations(self): + for block in self.blocks: + block.remove_parametrizations() + + +class HiFiGANGenerator(nn.Module): + def __init__( + self, + *, + hop_length: int = 512, + upsample_rates: tuple[int] = (8, 8, 2, 2, 2), + upsample_kernel_sizes: tuple[int] = (16, 16, 8, 2, 2), + resblock_kernel_sizes: tuple[int] = (3, 7, 11), + resblock_dilation_sizes: tuple[tuple[int]] = ((1, 3, 5), (1, 3, 5), (1, 3, 5)), + num_mels: int = 128, + upsample_initial_channel: int = 512, + use_template: bool = True, + pre_conv_kernel_size: int = 7, + post_conv_kernel_size: int = 7, + post_activation: Callable = partial(nn.SiLU, inplace=True), + ): + super().__init__() + + assert ( + prod(upsample_rates) == hop_length + ), f"hop_length must be {prod(upsample_rates)}" + + self.conv_pre = weight_norm( + nn.Conv1d( + num_mels, + upsample_initial_channel, + pre_conv_kernel_size, + 1, + padding=get_padding(pre_conv_kernel_size), + ) + ) + + self.num_upsamples = len(upsample_rates) + self.num_kernels = len(resblock_kernel_sizes) + + self.noise_convs = nn.ModuleList() + self.use_template = use_template + self.ups = nn.ModuleList() + + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + c_cur = upsample_initial_channel // (2 ** (i + 1)) + self.ups.append( + weight_norm( + nn.ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + if not use_template: + continue + + if i + 1 < len(upsample_rates): + stride_f0 = np.prod(upsample_rates[i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + self.resblocks.append( + ParralelBlock(ch, resblock_kernel_sizes, resblock_dilation_sizes) + ) + + self.activation_post = post_activation() + self.conv_post = weight_norm( + nn.Conv1d( + ch, + 1, + post_conv_kernel_size, + 1, + padding=get_padding(post_conv_kernel_size), + ) + ) + self.ups.apply(init_weights) + self.conv_post.apply(init_weights) + + def forward(self, x, template=None): + x = self.conv_pre(x) + + for i in range(self.num_upsamples): + x = F.silu(x, inplace=True) + x = self.ups[i](x) + + if self.use_template: + x = x + self.noise_convs[i](template) + + if self.training: + x = checkpoint( + self.resblocks[i], + x, + use_reentrant=False, + ) + else: + x = self.resblocks[i](x) + + x = self.activation_post(x) + x = self.conv_post(x) + x = torch.tanh(x) + + return x + + def remove_parametrizations(self): + for up in self.ups: + remove_parametrizations(up, tensor_name="weight") + for block in self.resblocks: + block.remove_parametrizations() + remove_parametrizations(self.conv_pre, tensor_name="weight") + remove_parametrizations(self.conv_post, tensor_name="weight") + + +# DropPath copied from timm library +def drop_path( + x, drop_prob: float = 0.0, training: bool = False, scale_by_keep: bool = True +): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + + This is the same as the DropConnect impl I created for EfficientNet, etc networks, however, + the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper... + See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for + changing the layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use + 'survival rate' as the argument. + + """ # noqa: E501 + + if drop_prob == 0.0 or not training: + return x + keep_prob = 1 - drop_prob + shape = (x.shape[0],) + (1,) * ( + x.ndim - 1 + ) # work with diff dim tensors, not just 2D ConvNets + random_tensor = x.new_empty(shape).bernoulli_(keep_prob) + if keep_prob > 0.0 and scale_by_keep: + random_tensor.div_(keep_prob) + return x * random_tensor + + +class DropPath(nn.Module): + """Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).""" # noqa: E501 + + def __init__(self, drop_prob: float = 0.0, scale_by_keep: bool = True): + super(DropPath, self).__init__() + self.drop_prob = drop_prob + self.scale_by_keep = scale_by_keep + + def forward(self, x): + return drop_path(x, self.drop_prob, self.training, self.scale_by_keep) + + def extra_repr(self): + return f"drop_prob={round(self.drop_prob,3):0.3f}" + + +class LayerNorm(nn.Module): + r"""LayerNorm that supports two data formats: channels_last (default) or channels_first. + The ordering of the dimensions in the inputs. channels_last corresponds to inputs with + shape (batch_size, height, width, channels) while channels_first corresponds to inputs + with shape (batch_size, channels, height, width). + """ # noqa: E501 + + def __init__(self, normalized_shape, eps=1e-6, data_format="channels_last"): + super().__init__() + self.weight = nn.Parameter(torch.ones(normalized_shape)) + self.bias = nn.Parameter(torch.zeros(normalized_shape)) + self.eps = eps + self.data_format = data_format + if self.data_format not in ["channels_last", "channels_first"]: + raise NotImplementedError + self.normalized_shape = (normalized_shape,) + + def forward(self, x): + if self.data_format == "channels_last": + return F.layer_norm( + x, self.normalized_shape, self.weight, self.bias, self.eps + ) + elif self.data_format == "channels_first": + u = x.mean(1, keepdim=True) + s = (x - u).pow(2).mean(1, keepdim=True) + x = (x - u) / torch.sqrt(s + self.eps) + x = self.weight[:, None] * x + self.bias[:, None] + return x + + +# ConvNeXt Block copied from https://github.com/fishaudio/fish-diffusion/blob/main/fish_diffusion/modules/convnext.py +class ConvNeXtBlock(nn.Module): + r"""ConvNeXt Block. There are two equivalent implementations: + (1) DwConv -> LayerNorm (channels_first) -> 1x1 Conv -> GELU -> 1x1 Conv; all in (N, C, H, W) + (2) DwConv -> Permute to (N, H, W, C); LayerNorm (channels_last) -> Linear -> GELU -> Linear; Permute back + We use (2) as we find it slightly faster in PyTorch + + Args: + dim (int): Number of input channels. + drop_path (float): Stochastic depth rate. Default: 0.0 + layer_scale_init_value (float): Init value for Layer Scale. Default: 1e-6. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4.0. + kernel_size (int): Kernel size for depthwise conv. Default: 7. + dilation (int): Dilation for depthwise conv. Default: 1. + """ # noqa: E501 + + def __init__( + self, + dim: int, + drop_path: float = 0.0, + layer_scale_init_value: float = 1e-6, + mlp_ratio: float = 4.0, + kernel_size: int = 7, + dilation: int = 1, + ): + super().__init__() + + self.dwconv = nn.Conv1d( + dim, + dim, + kernel_size=kernel_size, + padding=int(dilation * (kernel_size - 1) / 2), + groups=dim, + ) # depthwise conv + self.norm = LayerNorm(dim, eps=1e-6) + self.pwconv1 = nn.Linear( + dim, int(mlp_ratio * dim) + ) # pointwise/1x1 convs, implemented with linear layers + self.act = nn.GELU() + self.pwconv2 = nn.Linear(int(mlp_ratio * dim), dim) + self.gamma = ( + nn.Parameter(layer_scale_init_value * torch.ones((dim)), requires_grad=True) + if layer_scale_init_value > 0 + else None + ) + self.drop_path = DropPath(drop_path) if drop_path > 0.0 else nn.Identity() + + def forward(self, x, apply_residual: bool = True): + input = x + + x = self.dwconv(x) + x = x.permute(0, 2, 1) # (N, C, L) -> (N, L, C) + x = self.norm(x) + x = self.pwconv1(x) + x = self.act(x) + x = self.pwconv2(x) + + if self.gamma is not None: + x = self.gamma * x + + x = x.permute(0, 2, 1) # (N, L, C) -> (N, C, L) + x = self.drop_path(x) + + if apply_residual: + x = input + x + + return x + + +class ConvNeXtEncoder(nn.Module): + def __init__( + self, + input_channels: int = 3, + depths: list[int] = [3, 3, 9, 3], + dims: list[int] = [96, 192, 384, 768], + drop_path_rate: float = 0.0, + layer_scale_init_value: float = 1e-6, + kernel_size: int = 7, + ): + super().__init__() + assert len(depths) == len(dims) + + self.downsample_layers = nn.ModuleList() + stem = nn.Sequential( + nn.Conv1d( + input_channels, + dims[0], + kernel_size=kernel_size, + padding=kernel_size // 2, + padding_mode="zeros", + ), + LayerNorm(dims[0], eps=1e-6, data_format="channels_first"), + ) + self.downsample_layers.append(stem) + + for i in range(len(depths) - 1): + mid_layer = nn.Sequential( + LayerNorm(dims[i], eps=1e-6, data_format="channels_first"), + nn.Conv1d(dims[i], dims[i + 1], kernel_size=1), + ) + self.downsample_layers.append(mid_layer) + + self.stages = nn.ModuleList() + dp_rates = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] + + cur = 0 + for i in range(len(depths)): + stage = nn.Sequential( + *[ + ConvNeXtBlock( + dim=dims[i], + drop_path=dp_rates[cur + j], + layer_scale_init_value=layer_scale_init_value, + kernel_size=kernel_size, + ) + for j in range(depths[i]) + ] + ) + self.stages.append(stage) + cur += depths[i] + + self.norm = LayerNorm(dims[-1], eps=1e-6, data_format="channels_first") + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, (nn.Conv1d, nn.Linear)): + nn.init.trunc_normal_(m.weight, std=0.02) + nn.init.constant_(m.bias, 0) + + def forward( + self, + x: torch.Tensor, + ) -> torch.Tensor: + for i in range(len(self.downsample_layers)): + x = self.downsample_layers[i](x) + x = self.stages[i](x) + + return self.norm(x) + + +class FireflyArchitecture(nn.Module): + def __init__( + self, + backbone: nn.Module, + head: nn.Module, + quantizer: nn.Module, + spec_transform: nn.Module, + ): + super().__init__() + + self.backbone = backbone + self.head = head + self.quantizer = quantizer + self.spec_transform = spec_transform + + def forward(self, x: torch.Tensor, template=None, mask=None) -> torch.Tensor: + if self.spec_transform is not None: + x = self.spec_transform(x) + + x = self.backbone(x) + if mask is not None: + x = x * mask + + if self.quantizer is not None: + vq_result = self.quantizer(x) + x = vq_result.z + + if mask is not None: + x = x * mask + + x = self.head(x, template=template) + + if x.ndim == 2: + x = x[:, None, :] + + if self.quantizer is not None: + return x, vq_result + + return x + + def encode(self, audios, audio_lengths): + audios = audios.float() + + mels = self.spec_transform(audios) + mel_lengths = audio_lengths // self.spec_transform.hop_length + mel_masks = sequence_mask(mel_lengths, mels.shape[2]) + mel_masks_float_conv = mel_masks[:, None, :].float() + mels = mels * mel_masks_float_conv + + # Encode + encoded_features = self.backbone(mels) * mel_masks_float_conv + feature_lengths = mel_lengths // math.prod(self.quantizer.downsample_factor) + + return self.quantizer.encode(encoded_features), feature_lengths + + def decode(self, indices, feature_lengths) -> torch.Tensor: + factor = math.prod(self.quantizer.downsample_factor) + mel_masks = sequence_mask(feature_lengths * factor, indices.shape[2] * factor) + mel_masks_float_conv = mel_masks[:, None, :].float() + + audio_masks = sequence_mask( + feature_lengths * factor * self.spec_transform.hop_length, + indices.shape[2] * factor * self.spec_transform.hop_length, + ) + audio_masks_float_conv = audio_masks[:, None, :].float() + + z = self.quantizer.decode(indices) * mel_masks_float_conv + x = self.head(z) * audio_masks_float_conv + + return x + + def remove_parametrizations(self): + if hasattr(self.backbone, "remove_parametrizations"): + self.backbone.remove_parametrizations() + + if hasattr(self.head, "remove_parametrizations"): + self.head.remove_parametrizations() + + @property + def device(self): + return next(self.parameters()).device + + +class FireflyBase(nn.Module): + def __init__(self, ckpt_path: str = None, pretrained: bool = True): + super().__init__() + + self.backbone = ConvNeXtEncoder( + input_channels=128, + depths=[3, 3, 9, 3], + dims=[128, 256, 384, 512], + drop_path_rate=0.2, + kernel_size=7, + ) + + self.head = HiFiGANGenerator( + hop_length=512, + upsample_rates=[8, 8, 2, 2, 2], + upsample_kernel_sizes=[16, 16, 4, 4, 4], + resblock_kernel_sizes=[3, 7, 11], + resblock_dilation_sizes=[[1, 3, 5], [1, 3, 5], [1, 3, 5]], + num_mels=512, + upsample_initial_channel=512, + use_template=False, + pre_conv_kernel_size=13, + post_conv_kernel_size=13, + ) + + if ckpt_path is not None: + state_dict = torch.load(ckpt_path, map_location="cpu") + elif pretrained: + state_dict = torch.hub.load_state_dict_from_url( + "https://github.com/fishaudio/vocoder/releases/download/1.0.0/firefly-gan-base-generator.ckpt", + map_location="cpu", + model_dir="checkpoints", + ) + + if "state_dict" in state_dict: + state_dict = state_dict["state_dict"] + + if any("generator." in k for k in state_dict): + state_dict = { + k.replace("generator.", ""): v + for k, v in state_dict.items() + if "generator." in k + } + + self.load_state_dict(state_dict, strict=True) + self.head.remove_parametrizations() + + @torch.no_grad() + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = self.backbone(x) + x = self.head(x) + if x.ndim == 2: + x = x[:, None, :] + return x + + +if __name__ == "__main__": + model = FireflyBase() + model.eval() + x = torch.randn(1, 128, 128) + with torch.no_grad(): + y = model(x) + print(y.shape) diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/fsq.py b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/fsq.py new file mode 100644 index 0000000000..c837d6aee5 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/fsq.py @@ -0,0 +1,139 @@ +from dataclasses import dataclass + +import torch +import torch.nn as nn +import torch.nn.functional as F +from einops import rearrange +from vector_quantize_pytorch import GroupedResidualFSQ + +from .firefly import ConvNeXtBlock + + +@dataclass +class FSQResult: + z: torch.Tensor + codes: torch.Tensor + latents: torch.Tensor + + +class DownsampleFiniteScalarQuantize(nn.Module): + def __init__( + self, + input_dim: int = 512, + n_codebooks: int = 1, + n_groups: int = 1, + levels: tuple[int] = (8, 5, 5, 5), # Approximate 2**10 + downsample_factor: tuple[int] = (2, 2), + downsample_dims: tuple[int] | None = None, + ): + super().__init__() + + if downsample_dims is None: + downsample_dims = [input_dim for _ in range(len(downsample_factor))] + + all_dims = (input_dim,) + tuple(downsample_dims) + + self.residual_fsq = GroupedResidualFSQ( + dim=all_dims[-1], + levels=levels, + num_quantizers=n_codebooks, + groups=n_groups, + ) + + self.downsample_factor = downsample_factor + self.downsample_dims = downsample_dims + + self.downsample = nn.Sequential( + *[ + nn.Sequential( + nn.Conv1d( + all_dims[idx], + all_dims[idx + 1], + kernel_size=factor, + stride=factor, + ), + ConvNeXtBlock(dim=all_dims[idx + 1]), + ) + for idx, factor in enumerate(downsample_factor) + ] + ) + + self.upsample = nn.Sequential( + *[ + nn.Sequential( + nn.ConvTranspose1d( + all_dims[idx + 1], + all_dims[idx], + kernel_size=factor, + stride=factor, + ), + ConvNeXtBlock(dim=all_dims[idx]), + ) + for idx, factor in reversed(list(enumerate(downsample_factor))) + ] + ) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, (nn.Conv1d, nn.Linear)): + nn.init.trunc_normal_(m.weight, std=0.02) + nn.init.constant_(m.bias, 0) + + def forward(self, z) -> FSQResult: + original_shape = z.shape + z = self.downsample(z) + quantized, indices = self.residual_fsq(z.mT) + result = FSQResult( + z=quantized.mT, + codes=indices.mT, + latents=z, + ) + result.z = self.upsample(result.z) + + # Pad or crop z to match original shape + diff = original_shape[-1] - result.z.shape[-1] + left = diff // 2 + right = diff - left + + if diff > 0: + result.z = F.pad(result.z, (left, right)) + elif diff < 0: + result.z = result.z[..., left:-right] + + return result + + def encode(self, z): + z = self.downsample(z) + _, indices = self.residual_fsq(z.mT) + indices = rearrange(indices, "g b l r -> b (g r) l") + return indices + + def decode(self, indices: torch.Tensor): + indices = rearrange(indices, "b (g r) l -> g b l r", g=self.residual_fsq.groups) + z_q = self.residual_fsq.get_output_from_indices(indices) + z_q = self.upsample(z_q.mT) + return z_q + + # def from_latents(self, latents: torch.Tensor): + # z_q, z_p, codes = super().from_latents(latents) + # z_q = self.upsample(z_q) + # return z_q, z_p, codes + + +if __name__ == "__main__": + rvq = DownsampleFiniteScalarQuantize( + n_codebooks=1, + downsample_factor=(2, 2), + ) + x = torch.randn(16, 512, 80) + + result = rvq(x) + print(rvq) + print(result.latents.shape, result.codes.shape, result.z.shape) + + # y = rvq.from_codes(result.codes) + # print(y[0].shape) + + # y = rvq.from_latents(result.latents) + # print(y[0].shape) diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/reference.py b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/reference.py new file mode 100644 index 0000000000..0d9c8c8359 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/reference.py @@ -0,0 +1,115 @@ +from typing import Optional + +import torch +import torch.nn.functional as F +from torch import nn + +from fish_speech.utils import autocast_exclude_mps + +from .wavenet import WaveNet + + +class ReferenceEncoder(WaveNet): + def __init__( + self, + input_channels: Optional[int] = None, + output_channels: Optional[int] = None, + residual_channels: int = 512, + residual_layers: int = 20, + dilation_cycle: Optional[int] = 4, + num_heads: int = 8, + latent_len: int = 4, + ): + super().__init__( + input_channels=input_channels, + residual_channels=residual_channels, + residual_layers=residual_layers, + dilation_cycle=dilation_cycle, + ) + + self.head_dim = residual_channels // num_heads + self.num_heads = num_heads + + self.latent_len = latent_len + self.latent = nn.Parameter(torch.zeros(1, self.latent_len, residual_channels)) + + self.q = nn.Linear(residual_channels, residual_channels, bias=True) + self.kv = nn.Linear(residual_channels, residual_channels * 2, bias=True) + self.q_norm = nn.LayerNorm(self.head_dim) + self.k_norm = nn.LayerNorm(self.head_dim) + self.proj = nn.Linear(residual_channels, residual_channels) + self.proj_drop = nn.Dropout(0.1) + + self.norm = nn.LayerNorm(residual_channels) + self.mlp = nn.Sequential( + nn.Linear(residual_channels, residual_channels * 4), + nn.SiLU(), + nn.Linear(residual_channels * 4, residual_channels), + ) + self.output_projection_attn = nn.Linear(residual_channels, output_channels) + + torch.nn.init.trunc_normal_(self.latent, std=0.02) + self.apply(self.init_weights) + + def init_weights(self, m): + if isinstance(m, nn.Linear): + torch.nn.init.trunc_normal_(m.weight, std=0.02) + if m.bias is not None: + torch.nn.init.constant_(m.bias, 0) + + def forward(self, x, attn_mask=None): + x = super().forward(x).mT + B, N, C = x.shape + + # Calculate mask + if attn_mask is not None: + assert attn_mask.shape == (B, N) and attn_mask.dtype == torch.bool + + attn_mask = attn_mask[:, None, None, :].expand( + B, self.num_heads, self.latent_len, N + ) + + q_latent = self.latent.expand(B, -1, -1) + q = ( + self.q(q_latent) + .reshape(B, self.latent_len, self.num_heads, self.head_dim) + .transpose(1, 2) + ) + + kv = ( + self.kv(x) + .reshape(B, N, 2, self.num_heads, self.head_dim) + .permute(2, 0, 3, 1, 4) + ) + k, v = kv.unbind(0) + + q, k = self.q_norm(q), self.k_norm(k) + x = F.scaled_dot_product_attention(q, k, v, attn_mask=attn_mask) + + x = x.transpose(1, 2).reshape(B, self.latent_len, C) + x = self.proj(x) + x = self.proj_drop(x) + + x = x + self.mlp(self.norm(x)) + x = self.output_projection_attn(x) + x = x.mean(1) + + return x + + +if __name__ == "__main__": + with autocast_exclude_mps(device_type="cpu", dtype=torch.bfloat16): + model = ReferenceEncoder( + input_channels=128, + output_channels=64, + residual_channels=384, + residual_layers=20, + dilation_cycle=4, + num_heads=8, + ) + x = torch.randn(4, 128, 64) + mask = torch.ones(4, 64, dtype=torch.bool) + y = model(x, mask) + print(y.shape) + loss = F.mse_loss(y, torch.randn(4, 64)) + loss.backward() diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/wavenet.py b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/wavenet.py new file mode 100644 index 0000000000..e7cc011c3e --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/modules/wavenet.py @@ -0,0 +1,225 @@ +import math +from typing import Optional + +import torch +import torch.nn.functional as F +from torch import nn + + +class Mish(nn.Module): + def forward(self, x): + return x * torch.tanh(F.softplus(x)) + + +class DiffusionEmbedding(nn.Module): + """Diffusion Step Embedding""" + + def __init__(self, d_denoiser): + super(DiffusionEmbedding, self).__init__() + self.dim = d_denoiser + + def forward(self, x): + device = x.device + half_dim = self.dim // 2 + emb = math.log(10000) / (half_dim - 1) + emb = torch.exp(torch.arange(half_dim, device=device) * -emb) + emb = x[:, None] * emb[None, :] + emb = torch.cat((emb.sin(), emb.cos()), dim=-1) + return emb + + +class LinearNorm(nn.Module): + """LinearNorm Projection""" + + def __init__(self, in_features, out_features, bias=False): + super(LinearNorm, self).__init__() + self.linear = nn.Linear(in_features, out_features, bias) + + nn.init.xavier_uniform_(self.linear.weight) + if bias: + nn.init.constant_(self.linear.bias, 0.0) + + def forward(self, x): + x = self.linear(x) + return x + + +class ConvNorm(nn.Module): + """1D Convolution""" + + def __init__( + self, + in_channels, + out_channels, + kernel_size=1, + stride=1, + padding=None, + dilation=1, + bias=True, + w_init_gain="linear", + ): + super(ConvNorm, self).__init__() + + if padding is None: + assert kernel_size % 2 == 1 + padding = int(dilation * (kernel_size - 1) / 2) + + self.conv = nn.Conv1d( + in_channels, + out_channels, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias, + ) + nn.init.kaiming_normal_(self.conv.weight) + + def forward(self, signal): + conv_signal = self.conv(signal) + + return conv_signal + + +class ResidualBlock(nn.Module): + """Residual Block""" + + def __init__( + self, + residual_channels, + use_linear_bias=False, + dilation=1, + condition_channels=None, + ): + super(ResidualBlock, self).__init__() + self.conv_layer = ConvNorm( + residual_channels, + 2 * residual_channels, + kernel_size=3, + stride=1, + padding=dilation, + dilation=dilation, + ) + + if condition_channels is not None: + self.diffusion_projection = LinearNorm( + residual_channels, residual_channels, use_linear_bias + ) + self.condition_projection = ConvNorm( + condition_channels, 2 * residual_channels, kernel_size=1 + ) + + self.output_projection = ConvNorm( + residual_channels, 2 * residual_channels, kernel_size=1 + ) + + def forward(self, x, condition=None, diffusion_step=None): + y = x + + if diffusion_step is not None: + diffusion_step = self.diffusion_projection(diffusion_step).unsqueeze(-1) + y = y + diffusion_step + + y = self.conv_layer(y) + + if condition is not None: + condition = self.condition_projection(condition) + y = y + condition + + gate, filter = torch.chunk(y, 2, dim=1) + y = torch.sigmoid(gate) * torch.tanh(filter) + + y = self.output_projection(y) + residual, skip = torch.chunk(y, 2, dim=1) + + return (x + residual) / math.sqrt(2.0), skip + + +class WaveNet(nn.Module): + def __init__( + self, + input_channels: Optional[int] = None, + output_channels: Optional[int] = None, + residual_channels: int = 512, + residual_layers: int = 20, + dilation_cycle: Optional[int] = 4, + is_diffusion: bool = False, + condition_channels: Optional[int] = None, + ): + super().__init__() + + # Input projection + self.input_projection = None + if input_channels is not None and input_channels != residual_channels: + self.input_projection = ConvNorm( + input_channels, residual_channels, kernel_size=1 + ) + + if input_channels is None: + input_channels = residual_channels + + self.input_channels = input_channels + + # Residual layers + self.residual_layers = nn.ModuleList( + [ + ResidualBlock( + residual_channels=residual_channels, + use_linear_bias=False, + dilation=2 ** (i % dilation_cycle) if dilation_cycle else 1, + condition_channels=condition_channels, + ) + for i in range(residual_layers) + ] + ) + + # Skip projection + self.skip_projection = ConvNorm( + residual_channels, residual_channels, kernel_size=1 + ) + + # Output projection + self.output_projection = None + if output_channels is not None and output_channels != residual_channels: + self.output_projection = ConvNorm( + residual_channels, output_channels, kernel_size=1 + ) + + if is_diffusion: + self.diffusion_embedding = DiffusionEmbedding(residual_channels) + self.mlp = nn.Sequential( + LinearNorm(residual_channels, residual_channels * 4, False), + Mish(), + LinearNorm(residual_channels * 4, residual_channels, False), + ) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, (nn.Conv1d, nn.Linear)): + nn.init.trunc_normal_(m.weight, std=0.02) + if getattr(m, "bias", None) is not None: + nn.init.constant_(m.bias, 0) + + def forward(self, x, t=None, condition=None): + if self.input_projection is not None: + x = self.input_projection(x) + x = F.silu(x) + + if t is not None: + t = self.diffusion_embedding(t) + t = self.mlp(t) + + skip = [] + for layer in self.residual_layers: + x, skip_connection = layer(x, condition, t) + skip.append(skip_connection) + + x = torch.sum(torch.stack(skip), dim=0) / math.sqrt(len(self.residual_layers)) + x = self.skip_projection(x) + + if self.output_projection is not None: + x = F.silu(x) + x = self.output_projection(x) + + return x diff --git a/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/utils.py b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/utils.py new file mode 100644 index 0000000000..b90c131d21 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/models/vqgan/utils.py @@ -0,0 +1,94 @@ +import matplotlib +import torch +from matplotlib import pyplot as plt + +matplotlib.use("Agg") + + +def convert_pad_shape(pad_shape): + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape + + +def sequence_mask(length, max_length=None): + if max_length is None: + max_length = length.max() + x = torch.arange(max_length, dtype=length.dtype, device=length.device) + return x.unsqueeze(0) < length.unsqueeze(1) + + +def init_weights(m, mean=0.0, std=0.01): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) + + +def get_padding(kernel_size, dilation=1): + return int((kernel_size * dilation - dilation) / 2) + + +def plot_mel(data, titles=None): + fig, axes = plt.subplots(len(data), 1, squeeze=False) + + if titles is None: + titles = [None for i in range(len(data))] + + plt.tight_layout() + + for i in range(len(data)): + mel = data[i] + + if isinstance(mel, torch.Tensor): + mel = mel.float().detach().cpu().numpy() + + axes[i][0].imshow(mel, origin="lower") + axes[i][0].set_aspect(2.5, adjustable="box") + axes[i][0].set_ylim(0, mel.shape[0]) + axes[i][0].set_title(titles[i], fontsize="medium") + axes[i][0].tick_params(labelsize="x-small", left=False, labelleft=False) + axes[i][0].set_anchor("W") + + return fig + + +def slice_segments(x, ids_str, segment_size=4): + ret = torch.zeros_like(x[:, :, :segment_size]) + for i in range(x.size(0)): + idx_str = ids_str[i] + idx_end = idx_str + segment_size + ret[i] = x[i, :, idx_str:idx_end] + + return ret + + +def rand_slice_segments(x, x_lengths=None, segment_size=4): + b, d, t = x.size() + if x_lengths is None: + x_lengths = t + ids_str_max = torch.clamp(x_lengths - segment_size + 1, min=0) + ids_str = (torch.rand([b], device=x.device) * ids_str_max).to(dtype=torch.long) + ret = slice_segments(x, ids_str, segment_size) + return ret, ids_str + + +@torch.jit.script +def fused_add_tanh_sigmoid_multiply(in_act, n_channels): + n_channels_int = n_channels[0] + t_act = torch.tanh(in_act[:, :n_channels_int, :]) + s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) + acts = t_act * s_act + + return acts + + +def avg_with_mask(x, mask): + assert mask.dtype == torch.float, "Mask should be float" + + if mask.ndim == 2: + mask = mask.unsqueeze(1) + + if mask.shape[1] == 1: + mask = mask.expand_as(x) + + return (x * mask).sum() / mask.sum() diff --git a/xinference/thirdparty/fish_speech/fish_speech/scheduler.py b/xinference/thirdparty/fish_speech/fish_speech/scheduler.py new file mode 100644 index 0000000000..43bed6a221 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/scheduler.py @@ -0,0 +1,40 @@ +import math + + +def get_cosine_schedule_with_warmup_lr_lambda( + current_step: int, + *, + num_warmup_steps: int | float, + num_training_steps: int, + num_cycles: float = 0.5, + final_lr_ratio: float = 0.0, +): + if 0 < num_warmup_steps < 1: # float mode + num_warmup_steps = int(num_warmup_steps * num_training_steps) + + if current_step < num_warmup_steps: + return float(current_step) / float(max(1, num_warmup_steps)) + + progress = float(current_step - num_warmup_steps) / float( + max(1, num_training_steps - num_warmup_steps) + ) + + return max( + final_lr_ratio, + 0.5 * (1.0 + math.cos(math.pi * float(num_cycles) * 2.0 * progress)), + ) + + +def get_constant_schedule_with_warmup_lr_lambda( + current_step: int, + *, + num_warmup_steps: int | float, + num_training_steps: int | None = None, +): + if 0 < num_warmup_steps < 1: # float mode + num_warmup_steps = int(num_warmup_steps * num_training_steps) + + if current_step < num_warmup_steps: + return float(current_step) / float(max(1, num_warmup_steps)) + + return 1.0 diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/text/__init__.py new file mode 100644 index 0000000000..d740bd8eed --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/__init__.py @@ -0,0 +1,4 @@ +from .clean import clean_text +from .spliter import split_text + +__all__ = ["clean_text", "split_text"] diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/.gitignore b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/.gitignore new file mode 100644 index 0000000000..75ea58fa4a --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/.gitignore @@ -0,0 +1,114 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# JetBrains PyCharm +.idea + +# Customize +references +url.txt + +# Git +.git diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/README.md b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/README.md new file mode 100644 index 0000000000..8450a2c6c0 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/README.md @@ -0,0 +1,36 @@ +# This account is no longer in use, see [Atomicoo](https://github.com/atomicoo) for my latest works. + +# Chn Text Norm + +this is a repository for chinese text normalization (no longer maintained). + +## Quick Start ## + +### Git Clone Repo ### + +git clone this repo to the root directory of your project which need to use it. + + cd /path/to/proj + git clone https://github.com/Joee1995/chn-text-norm.git + +after that, your doc tree should be: +``` +proj # root of your project +|--- chn_text_norm # this chn-text-norm tool + |--- text.py + |--- ... +|--- text_normalize.py # your text normalization code +|--- ... +``` + +### How to Use ? ### + + # text_normalize.py + from chn_text_norm.text import * + + raw_text = 'your raw text' + text = Text(raw_text=raw_text).normalize() + +### How to add quantums ### + +打开test.py,然后你就知道怎么做了。 diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_class.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_class.py new file mode 100644 index 0000000000..58d8f8eb7f --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_class.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +"""基本类 +中文字符类 +中文数字/数位类 +中文数字类 +中文数位类 +中文数字系统类 +中文数学符号类 +*中文其他符号类 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-02" + +from fish_speech.text.chn_text_norm.basic_constant import NUMBERING_TYPES + + +class ChineseChar(object): + """ + 中文字符 + 每个字符对应简体和繁体, + e.g. 简体 = '负', 繁体 = '負' + 转换时可转换为简体或繁体 + """ + + def __init__(self, simplified, traditional): + self.simplified = simplified + self.traditional = traditional + self.__repr__ = self.__str__ + + def __str__(self): + return self.simplified or self.traditional or None + + def __repr__(self): + return self.__str__() + + +class ChineseNumberUnit(ChineseChar): + """ + 中文数字/数位字符 + 每个字符除繁简体外还有一个额外的大写字符 + e.g. '陆' 和 '陸' + """ + + def __init__(self, power, simplified, traditional, big_s, big_t): + super(ChineseNumberUnit, self).__init__(simplified, traditional) + self.power = power + self.big_s = big_s + self.big_t = big_t + + def __str__(self): + return "10^{}".format(self.power) + + @classmethod + def create(cls, index, value, numbering_type=NUMBERING_TYPES[1], small_unit=False): + + if small_unit: + return ChineseNumberUnit( + power=index + 1, + simplified=value[0], + traditional=value[1], + big_s=value[1], + big_t=value[1], + ) + elif numbering_type == NUMBERING_TYPES[0]: + return ChineseNumberUnit( + power=index + 8, + simplified=value[0], + traditional=value[1], + big_s=value[0], + big_t=value[1], + ) + elif numbering_type == NUMBERING_TYPES[1]: + return ChineseNumberUnit( + power=(index + 2) * 4, + simplified=value[0], + traditional=value[1], + big_s=value[0], + big_t=value[1], + ) + elif numbering_type == NUMBERING_TYPES[2]: + return ChineseNumberUnit( + power=pow(2, index + 3), + simplified=value[0], + traditional=value[1], + big_s=value[0], + big_t=value[1], + ) + else: + raise ValueError( + "Counting type should be in {0} ({1} provided).".format( + NUMBERING_TYPES, numbering_type + ) + ) + + +class ChineseNumberDigit(ChineseChar): + """ + 中文数字字符 + """ + + def __init__( + self, value, simplified, traditional, big_s, big_t, alt_s=None, alt_t=None + ): + super(ChineseNumberDigit, self).__init__(simplified, traditional) + self.value = value + self.big_s = big_s + self.big_t = big_t + self.alt_s = alt_s + self.alt_t = alt_t + + def __str__(self): + return str(self.value) + + @classmethod + def create(cls, i, v): + return ChineseNumberDigit(i, v[0], v[1], v[2], v[3]) + + +class ChineseMath(ChineseChar): + """ + 中文数位字符 + """ + + def __init__(self, simplified, traditional, symbol, expression=None): + super(ChineseMath, self).__init__(simplified, traditional) + self.symbol = symbol + self.expression = expression + self.big_s = simplified + self.big_t = traditional + + +CC, CNU, CND, CM = ChineseChar, ChineseNumberUnit, ChineseNumberDigit, ChineseMath + + +class NumberSystem(object): + """ + 中文数字系统 + """ + + pass + + +class MathSymbol(object): + """ + 用于中文数字系统的数学符号 (繁/简体), e.g. + positive = ['正', '正'] + negative = ['负', '負'] + point = ['点', '點'] + """ + + def __init__(self, positive, negative, point): + self.positive = positive + self.negative = negative + self.point = point + + def __iter__(self): + for v in self.__dict__.values(): + yield v + + +# class OtherSymbol(object): +# """ +# 其他符号 +# """ +# +# def __init__(self, sil): +# self.sil = sil +# +# def __iter__(self): +# for v in self.__dict__.values(): +# yield v diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_constant.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_constant.py new file mode 100644 index 0000000000..9a65991b9a --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_constant.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +"""基本常量 +中文数字/数位/符号字符常量 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-02" + +CHINESE_DIGIS = "零一二三四五六七八九" +BIG_CHINESE_DIGIS_SIMPLIFIED = "零壹贰叁肆伍陆柒捌玖" +BIG_CHINESE_DIGIS_TRADITIONAL = "零壹貳參肆伍陸柒捌玖" +SMALLER_BIG_CHINESE_UNITS_SIMPLIFIED = "十百千万" +SMALLER_BIG_CHINESE_UNITS_TRADITIONAL = "拾佰仟萬" +LARGER_CHINESE_NUMERING_UNITS_SIMPLIFIED = "亿兆京垓秭穰沟涧正载" +LARGER_CHINESE_NUMERING_UNITS_TRADITIONAL = "億兆京垓秭穰溝澗正載" +SMALLER_CHINESE_NUMERING_UNITS_SIMPLIFIED = "十百千万" +SMALLER_CHINESE_NUMERING_UNITS_TRADITIONAL = "拾佰仟萬" + +ZERO_ALT = "〇" +ONE_ALT = "幺" +TWO_ALTS = ["两", "兩"] + +POSITIVE = ["正", "正"] +NEGATIVE = ["负", "負"] +POINT = ["点", "點"] +# PLUS = [u'加', u'加'] +# SIL = [u'杠', u'槓'] + +# 中文数字系统类型 +NUMBERING_TYPES = ["low", "mid", "high"] diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_util.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_util.py new file mode 100644 index 0000000000..dbf6130be8 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/basic_util.py @@ -0,0 +1,342 @@ +# -*- coding: utf-8 -*- +"""基本方法 +创建中文数字系统 方法 +中文字符串 <=> 数字串 方法 +数字串 <=> 中文字符串 方法 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-02" + +from fish_speech.text.chn_text_norm.basic_class import * +from fish_speech.text.chn_text_norm.basic_constant import * + + +def create_system(numbering_type=NUMBERING_TYPES[1]): + """ + 根据数字系统类型返回创建相应的数字系统,默认为 mid + NUMBERING_TYPES = ['low', 'mid', 'high']: 中文数字系统类型 + low: '兆' = '亿' * '十' = $10^{9}$, '京' = '兆' * '十', etc. + mid: '兆' = '亿' * '万' = $10^{12}$, '京' = '兆' * '万', etc. + high: '兆' = '亿' * '亿' = $10^{16}$, '京' = '兆' * '兆', etc. + 返回对应的数字系统 + """ + + # chinese number units of '亿' and larger + all_larger_units = zip( + LARGER_CHINESE_NUMERING_UNITS_SIMPLIFIED, + LARGER_CHINESE_NUMERING_UNITS_TRADITIONAL, + ) + larger_units = [ + CNU.create(i, v, numbering_type, False) for i, v in enumerate(all_larger_units) + ] + # chinese number units of '十, 百, 千, 万' + all_smaller_units = zip( + SMALLER_CHINESE_NUMERING_UNITS_SIMPLIFIED, + SMALLER_CHINESE_NUMERING_UNITS_TRADITIONAL, + ) + smaller_units = [ + CNU.create(i, v, small_unit=True) for i, v in enumerate(all_smaller_units) + ] + # digis + chinese_digis = zip( + CHINESE_DIGIS, + CHINESE_DIGIS, + BIG_CHINESE_DIGIS_SIMPLIFIED, + BIG_CHINESE_DIGIS_TRADITIONAL, + ) + digits = [CND.create(i, v) for i, v in enumerate(chinese_digis)] + digits[0].alt_s, digits[0].alt_t = ZERO_ALT, ZERO_ALT + digits[1].alt_s, digits[1].alt_t = ONE_ALT, ONE_ALT + digits[2].alt_s, digits[2].alt_t = TWO_ALTS[0], TWO_ALTS[1] + + # symbols + positive_cn = CM(POSITIVE[0], POSITIVE[1], "+", lambda x: x) + negative_cn = CM(NEGATIVE[0], NEGATIVE[1], "-", lambda x: -x) + point_cn = CM(POINT[0], POINT[1], ".", lambda x, y: float(str(x) + "." + str(y))) + # sil_cn = CM(SIL[0], SIL[1], '-', lambda x, y: float(str(x) + '-' + str(y))) + system = NumberSystem() + system.units = smaller_units + larger_units + system.digits = digits + system.math = MathSymbol(positive_cn, negative_cn, point_cn) + # system.symbols = OtherSymbol(sil_cn) + return system + + +def chn2num(chinese_string, numbering_type=NUMBERING_TYPES[1]): + + def get_symbol(char, system): + for u in system.units: + if char in [u.traditional, u.simplified, u.big_s, u.big_t]: + return u + for d in system.digits: + if char in [ + d.traditional, + d.simplified, + d.big_s, + d.big_t, + d.alt_s, + d.alt_t, + ]: + return d + for m in system.math: + if char in [m.traditional, m.simplified]: + return m + + def string2symbols(chinese_string, system): + int_string, dec_string = chinese_string, "" + for p in [system.math.point.simplified, system.math.point.traditional]: + if p in chinese_string: + int_string, dec_string = chinese_string.split(p) + break + return [get_symbol(c, system) for c in int_string], [ + get_symbol(c, system) for c in dec_string + ] + + def correct_symbols(integer_symbols, system): + """ + 一百八 to 一百八十 + 一亿一千三百万 to 一亿 一千万 三百万 + """ + + if integer_symbols and isinstance(integer_symbols[0], CNU): + if integer_symbols[0].power == 1: + integer_symbols = [system.digits[1]] + integer_symbols + + if len(integer_symbols) > 1: + if isinstance(integer_symbols[-1], CND) and isinstance( + integer_symbols[-2], CNU + ): + integer_symbols.append( + CNU(integer_symbols[-2].power - 1, None, None, None, None) + ) + + result = [] + unit_count = 0 + for s in integer_symbols: + if isinstance(s, CND): + result.append(s) + unit_count = 0 + elif isinstance(s, CNU): + current_unit = CNU(s.power, None, None, None, None) + unit_count += 1 + + if unit_count == 1: + result.append(current_unit) + elif unit_count > 1: + for i in range(len(result)): + if ( + isinstance(result[-i - 1], CNU) + and result[-i - 1].power < current_unit.power + ): + result[-i - 1] = CNU( + result[-i - 1].power + current_unit.power, + None, + None, + None, + None, + ) + return result + + def compute_value(integer_symbols): + """ + Compute the value. + When current unit is larger than previous unit, current unit * all previous units will be used as all previous units. + e.g. '两千万' = 2000 * 10000 not 2000 + 10000 + """ + value = [0] + last_power = 0 + for s in integer_symbols: + if isinstance(s, CND): + value[-1] = s.value + elif isinstance(s, CNU): + value[-1] *= pow(10, s.power) + if s.power > last_power: + value[:-1] = list(map(lambda v: v * pow(10, s.power), value[:-1])) + last_power = s.power + value.append(0) + return sum(value) + + system = create_system(numbering_type) + int_part, dec_part = string2symbols(chinese_string, system) + int_part = correct_symbols(int_part, system) + int_str = str(compute_value(int_part)) + dec_str = "".join([str(d.value) for d in dec_part]) + if dec_part: + return "{0}.{1}".format(int_str, dec_str) + else: + return int_str + + +def num2chn( + number_string, + numbering_type=NUMBERING_TYPES[1], + big=False, + traditional=False, + alt_zero=False, + alt_one=False, + alt_two=True, + use_zeros=True, + use_units=True, +): + + def get_value(value_string, use_zeros=True): + + striped_string = value_string.lstrip("0") + + # record nothing if all zeros + if not striped_string: + return [] + + # record one digits + elif len(striped_string) == 1: + if use_zeros and len(value_string) != len(striped_string): + return [system.digits[0], system.digits[int(striped_string)]] + else: + return [system.digits[int(striped_string)]] + + # recursively record multiple digits + else: + result_unit = next( + u for u in reversed(system.units) if u.power < len(striped_string) + ) + result_string = value_string[: -result_unit.power] + return ( + get_value(result_string) + + [result_unit] + + get_value(striped_string[-result_unit.power :]) + ) + + system = create_system(numbering_type) + + int_dec = number_string.split(".") + if len(int_dec) == 1: + int_string = int_dec[0] + dec_string = "" + elif len(int_dec) == 2: + int_string = int_dec[0] + dec_string = int_dec[1] + else: + raise ValueError( + "invalid input num string with more than one dot: {}".format(number_string) + ) + + if use_units and len(int_string) > 1: + result_symbols = get_value(int_string) + else: + result_symbols = [system.digits[int(c)] for c in int_string] + dec_symbols = [system.digits[int(c)] for c in dec_string] + if dec_string: + result_symbols += [system.math.point] + dec_symbols + + if alt_two: + liang = CND( + 2, + system.digits[2].alt_s, + system.digits[2].alt_t, + system.digits[2].big_s, + system.digits[2].big_t, + ) + for i, v in enumerate(result_symbols): + if isinstance(v, CND) and v.value == 2: + next_symbol = ( + result_symbols[i + 1] if i < len(result_symbols) - 1 else None + ) + previous_symbol = result_symbols[i - 1] if i > 0 else None + if isinstance(next_symbol, CNU) and isinstance( + previous_symbol, (CNU, type(None)) + ): + if next_symbol.power != 1 and ( + (previous_symbol is None) or (previous_symbol.power != 1) + ): + result_symbols[i] = liang + + # if big is True, '两' will not be used and `alt_two` has no impact on output + if big: + attr_name = "big_" + if traditional: + attr_name += "t" + else: + attr_name += "s" + else: + if traditional: + attr_name = "traditional" + else: + attr_name = "simplified" + + result = "".join([getattr(s, attr_name) for s in result_symbols]) + + # if not use_zeros: + # result = result.strip(getattr(system.digits[0], attr_name)) + + if alt_zero: + result = result.replace( + getattr(system.digits[0], attr_name), system.digits[0].alt_s + ) + + if alt_one: + result = result.replace( + getattr(system.digits[1], attr_name), system.digits[1].alt_s + ) + + for i, p in enumerate(POINT): + if result.startswith(p): + return CHINESE_DIGIS[0] + result + + # ^10, 11, .., 19 + if ( + len(result) >= 2 + and result[1] + in [ + SMALLER_CHINESE_NUMERING_UNITS_SIMPLIFIED[0], + SMALLER_CHINESE_NUMERING_UNITS_TRADITIONAL[0], + ] + and result[0] + in [ + CHINESE_DIGIS[1], + BIG_CHINESE_DIGIS_SIMPLIFIED[1], + BIG_CHINESE_DIGIS_TRADITIONAL[1], + ] + ): + result = result[1:] + + return result + + +if __name__ == "__main__": + + # 测试程序 + all_chinese_number_string = ( + CHINESE_DIGIS + + BIG_CHINESE_DIGIS_SIMPLIFIED + + BIG_CHINESE_DIGIS_TRADITIONAL + + LARGER_CHINESE_NUMERING_UNITS_SIMPLIFIED + + LARGER_CHINESE_NUMERING_UNITS_TRADITIONAL + + SMALLER_CHINESE_NUMERING_UNITS_SIMPLIFIED + + SMALLER_CHINESE_NUMERING_UNITS_TRADITIONAL + + ZERO_ALT + + ONE_ALT + + "".join(TWO_ALTS + POSITIVE + NEGATIVE + POINT) + ) + + print("num:", chn2num("一万零四百零三点八零五")) + print("num:", chn2num("一亿六点三")) + print("num:", chn2num("一亿零六点三")) + print("num:", chn2num("两千零一亿六点三")) + # print('num:', chn2num('一零零八六')) + print("txt:", num2chn("10260.03", alt_zero=True)) + print("txt:", num2chn("20037.090", numbering_type="low", traditional=True)) + print("txt:", num2chn("100860001.77", numbering_type="high", big=True)) + print( + "txt:", + num2chn( + "059523810880", + alt_one=True, + alt_two=False, + use_lzeros=True, + use_rzeros=True, + use_units=False, + ), + ) + + print(all_chinese_number_string) diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/cardinal.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/cardinal.py new file mode 100644 index 0000000000..ace9f5ad8e --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/cardinal.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +"""CARDINAL类 (包含小数DECIMAL类) +纯数 <=> 中文字符串 方法 +中文字符串 <=> 纯数 方法 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-03" + +from fish_speech.text.chn_text_norm.basic_util import * + + +class Cardinal: + """ + CARDINAL类 + """ + + def __init__(self, cardinal=None, chntext=None): + self.cardinal = cardinal + self.chntext = chntext + + def chntext2cardinal(self): + return chn2num(self.chntext) + + def cardinal2chntext(self): + return num2chn(self.cardinal) + + +if __name__ == "__main__": + + # 测试程序 + print(Cardinal(cardinal="21357.230").cardinal2chntext()) diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/date.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/date.py new file mode 100644 index 0000000000..77acfdb9a9 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/date.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +"""DATE类 +日期 <=> 中文字符串 方法 +中文字符串 <=> 日期 方法 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-07" + +from fish_speech.text.chn_text_norm.cardinal import Cardinal +from fish_speech.text.chn_text_norm.digit import Digit + + +class Date: + """ + DATE类 + """ + + def __init__(self, date=None, chntext=None): + self.date = date + self.chntext = chntext + + # def chntext2date(self): + # chntext = self.chntext + # try: + # year, other = chntext.strip().split('年', maxsplit=1) + # year = Digit(chntext=year).digit2chntext() + '年' + # except ValueError: + # other = chntext + # year = '' + # if other: + # try: + # month, day = other.strip().split('月', maxsplit=1) + # month = Cardinal(chntext=month).chntext2cardinal() + '月' + # except ValueError: + # day = chntext + # month = '' + # if day: + # day = Cardinal(chntext=day[:-1]).chntext2cardinal() + day[-1] + # else: + # month = '' + # day = '' + # date = year + month + day + # self.date = date + # return self.date + + def date2chntext(self): + date = self.date + try: + year, other = date.strip().split("年", maxsplit=1) + year = Digit(digit=year).digit2chntext() + "年" + except ValueError: + other = date + year = "" + if other: + try: + month, day = other.strip().split("月", maxsplit=1) + month = Cardinal(cardinal=month).cardinal2chntext() + "月" + except ValueError: + day = date + month = "" + if day: + day = Cardinal(cardinal=day[:-1]).cardinal2chntext() + day[-1] + else: + month = "" + day = "" + chntext = year + month + day + self.chntext = chntext + return self.chntext + + +if __name__ == "__main__": + + # 测试 + print(Date(date="09年3月16日").date2chntext()) diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/digit.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/digit.py new file mode 100644 index 0000000000..47c0cd4ad0 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/digit.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +"""DIGIT类 +数字串 <=> 中文字符串 方法 +中文字符串 <=> 数字串 方法 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-03" + +from fish_speech.text.chn_text_norm.basic_util import * + + +class Digit: + """ + DIGIT类 + """ + + def __init__(self, digit=None, chntext=None): + self.digit = digit + self.chntext = chntext + + # def chntext2digit(self): + # return chn2num(self.chntext) + + def digit2chntext(self): + return num2chn(self.digit, alt_two=False, use_units=False) + + +if __name__ == "__main__": + + # 测试程序 + print(Digit(digit="2016").digit2chntext()) diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/fraction.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/fraction.py new file mode 100644 index 0000000000..b43b6a7feb --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/fraction.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +"""FRACTION类 +分数 <=> 中文字符串 方法 +中文字符串 <=> 分数 方法 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-03" + +from fish_speech.text.chn_text_norm.basic_util import * + + +class Fraction: + """ + FRACTION类 + """ + + def __init__(self, fraction=None, chntext=None): + self.fraction = fraction + self.chntext = chntext + + def chntext2fraction(self): + denominator, numerator = self.chntext.split("分之") + return chn2num(numerator) + "/" + chn2num(denominator) + + def fraction2chntext(self): + numerator, denominator = self.fraction.split("/") + return num2chn(denominator) + "分之" + num2chn(numerator) + + +if __name__ == "__main__": + + # 测试程序 + print(Fraction(fraction="2135/7230").fraction2chntext()) + print(Fraction(chntext="五百八十一分之三百六十九").chntext2fraction()) diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/money.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/money.py new file mode 100644 index 0000000000..b4c980d321 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/money.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +"""MONEY类 +金钱 <=> 中文字符串 方法 +中文字符串 <=> 金钱 方法 +""" +import re + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-08" + +from fish_speech.text.chn_text_norm.cardinal import Cardinal + + +class Money: + """ + MONEY类 + """ + + def __init__(self, money=None, chntext=None): + self.money = money + self.chntext = chntext + + # def chntext2money(self): + # return self.money + + def money2chntext(self): + money = self.money + pattern = re.compile(r"(\d+(\.\d+)?)") + matchers = pattern.findall(money) + if matchers: + for matcher in matchers: + money = money.replace( + matcher[0], Cardinal(cardinal=matcher[0]).cardinal2chntext() + ) + self.chntext = money + return self.chntext + + +if __name__ == "__main__": + + # 测试 + print(Money(money="21.5万元").money2chntext()) + print(Money(money="230块5毛").money2chntext()) diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/percentage.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/percentage.py new file mode 100644 index 0000000000..46abbf545a --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/percentage.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +"""PERCENTAGE类 +百分数 <=> 中文字符串 方法 +中文字符串 <=> 百分数 方法 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-06" + +from fish_speech.text.chn_text_norm.basic_util import * + + +class Percentage: + """ + PERCENTAGE类 + """ + + def __init__(self, percentage=None, chntext=None): + self.percentage = percentage + self.chntext = chntext + + def chntext2percentage(self): + return chn2num(self.chntext.strip().strip("百分之")) + "%" + + def percentage2chntext(self): + return "百分之" + num2chn(self.percentage.strip().strip("%")) + + +if __name__ == "__main__": + + # 测试程序 + print(Percentage(chntext="百分之五十六点零三").chntext2percentage()) + print(Percentage(percentage="65.3%").percentage2chntext()) diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/telephone.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/telephone.py new file mode 100644 index 0000000000..e72b546db6 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/telephone.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +"""TELEPHONE类 +电话号码 <=> 中文字符串 方法 +中文字符串 <=> 电话号码 方法 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-03" + +from fish_speech.text.chn_text_norm.basic_util import * + + +class TelePhone: + """ + TELEPHONE类 + """ + + def __init__(self, telephone=None, raw_chntext=None, chntext=None): + self.telephone = telephone + self.raw_chntext = raw_chntext + self.chntext = chntext + + # def chntext2telephone(self): + # sil_parts = self.raw_chntext.split('<SIL>') + # self.telephone = '-'.join([ + # str(chn2num(p)) for p in sil_parts + # ]) + # return self.telephone + + def telephone2chntext(self, fixed=False): + + if fixed: + sil_parts = self.telephone.split("-") + self.raw_chntext = "<SIL>".join( + [num2chn(part, alt_two=False, use_units=False) for part in sil_parts] + ) + self.chntext = self.raw_chntext.replace("<SIL>", "") + else: + sp_parts = self.telephone.strip("+").split() + self.raw_chntext = "<SP>".join( + [num2chn(part, alt_two=False, use_units=False) for part in sp_parts] + ) + self.chntext = self.raw_chntext.replace("<SP>", "") + return self.chntext + + +if __name__ == "__main__": + + # 测试程序 + print(TelePhone(telephone="0595-23980880").telephone2chntext()) + # print(TelePhone(raw_chntext='零五九五杠二三八六五零九八').chntext2telephone()) diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/text.py b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/text.py new file mode 100644 index 0000000000..54086fd933 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/chn_text_norm/text.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +""" +TEXT类 +""" + +__author__ = "Zhiyang Zhou <zyzhou@stu.xmu.edu.cn>" +__data__ = "2019-05-03" + +import re + +from fish_speech.text.chn_text_norm.cardinal import Cardinal +from fish_speech.text.chn_text_norm.date import Date +from fish_speech.text.chn_text_norm.digit import Digit +from fish_speech.text.chn_text_norm.fraction import Fraction +from fish_speech.text.chn_text_norm.money import Money +from fish_speech.text.chn_text_norm.percentage import Percentage +from fish_speech.text.chn_text_norm.telephone import TelePhone + +CURRENCY_NAMES = ( + "(人民币|美元|日元|英镑|欧元|马克|法郎|加拿大元|澳元|港币|先令|芬兰马克|爱尔兰镑|" + "里拉|荷兰盾|埃斯库多|比塞塔|印尼盾|林吉特|新西兰元|比索|卢布|新加坡元|韩元|泰铢)" +) +CURRENCY_UNITS = "((亿|千万|百万|万|千|百)|(亿|千万|百万|万|千|百|)元|(亿|千万|百万|万|千|百|)块|角|毛|分)" +COM_QUANTIFIERS = ( + "(匹|张|座|回|场|尾|条|个|首|阙|阵|网|炮|顶|丘|棵|只|支|袭|辆|挑|担|颗|壳|窠|曲|墙|群|腔|" + "砣|座|客|贯|扎|捆|刀|令|打|手|罗|坡|山|岭|江|溪|钟|队|单|双|对|出|口|头|脚|板|跳|枝|件|贴|" + "针|线|管|名|位|身|堂|课|本|页|家|户|层|丝|毫|厘|分|钱|两|斤|担|铢|石|钧|锱|忽|(千|毫|微)克|" + "毫|厘|分|寸|尺|丈|里|寻|常|铺|程|(千|分|厘|毫|微)米|撮|勺|合|升|斗|石|盘|碗|碟|叠|桶|笼|盆|" + "盒|杯|钟|斛|锅|簋|篮|盘|桶|罐|瓶|壶|卮|盏|箩|箱|煲|啖|袋|钵|年|月|日|季|刻|时|周|天|秒|分|旬|" + "纪|岁|世|更|夜|春|夏|秋|冬|代|伏|辈|丸|泡|粒|颗|幢|堆|条|根|支|道|面|片|张|颗|块|人|抽)" +) + + +class Text: + """ + Text类 + """ + + def __init__(self, raw_text, norm_text=None): + self.raw_text = "^" + raw_text + "$" + self.norm_text = norm_text + + def _particular(self): + text = self.norm_text + pattern = re.compile(r"(([a-zA-Z]+)二([a-zA-Z]+))") + matchers = pattern.findall(text) + if matchers: + # print('particular') + for matcher in matchers: + text = text.replace(matcher[0], matcher[1] + "2" + matcher[2], 1) + self.norm_text = text + return self.norm_text + + def normalize(self): + text = self.raw_text + + # 规范化日期 + pattern = re.compile( + r"\D+((([089]\d|(19|20)\d{2})年)?(\d{1,2}月(\d{1,2}[日号])?)?)" + ) + matchers = pattern.findall(text) + if matchers: + # print('date') + for matcher in matchers: + text = text.replace(matcher[0], Date(date=matcher[0]).date2chntext(), 1) + + # 规范化金钱 + pattern = re.compile( + r"\D+((\d+(\.\d+)?)[多余几]?" + + CURRENCY_UNITS + + "(\d" + + CURRENCY_UNITS + + "?)?)" + ) + matchers = pattern.findall(text) + if matchers: + # print('money') + for matcher in matchers: + text = text.replace( + matcher[0], Money(money=matcher[0]).money2chntext(), 1 + ) + + # 规范化固话/手机号码 + # 手机 + # http://www.jihaoba.com/news/show/13680 + # 移动:139、138、137、136、135、134、159、158、157、150、151、152、188、187、182、183、184、178、198 + # 联通:130、131、132、156、155、186、185、176 + # 电信:133、153、189、180、181、177 + pattern = re.compile(r"\D((\+?86 ?)?1([38]\d|5[0-35-9]|7[678]|9[89])\d{8})\D") + matchers = pattern.findall(text) + if matchers: + # print('telephone') + for matcher in matchers: + text = text.replace( + matcher[0], TelePhone(telephone=matcher[0]).telephone2chntext(), 1 + ) + # 固话 + pattern = re.compile(r"\D((0(10|2[1-3]|[3-9]\d{2})-?)?[1-9]\d{6,7})\D") + matchers = pattern.findall(text) + if matchers: + # print('fixed telephone') + for matcher in matchers: + text = text.replace( + matcher[0], + TelePhone(telephone=matcher[0]).telephone2chntext(fixed=True), + 1, + ) + + # 规范化分数 + pattern = re.compile(r"(\d+/\d+)") + matchers = pattern.findall(text) + if matchers: + # print('fraction') + for matcher in matchers: + text = text.replace( + matcher, Fraction(fraction=matcher).fraction2chntext(), 1 + ) + + # 规范化百分数 + text = text.replace("%", "%") + pattern = re.compile(r"(\d+(\.\d+)?%)") + matchers = pattern.findall(text) + if matchers: + # print('percentage') + for matcher in matchers: + text = text.replace( + matcher[0], + Percentage(percentage=matcher[0]).percentage2chntext(), + 1, + ) + + # 规范化纯数+量词 + pattern = re.compile(r"(\d+(\.\d+)?)[多余几]?" + COM_QUANTIFIERS) + matchers = pattern.findall(text) + if matchers: + # print('cardinal+quantifier') + for matcher in matchers: + text = text.replace( + matcher[0], Cardinal(cardinal=matcher[0]).cardinal2chntext(), 1 + ) + + # 规范化数字编号 + pattern = re.compile(r"(\d{4,32})") + matchers = pattern.findall(text) + if matchers: + # print('digit') + for matcher in matchers: + text = text.replace(matcher, Digit(digit=matcher).digit2chntext(), 1) + + # 规范化纯数 + pattern = re.compile(r"(\d+(\.\d+)?)") + matchers = pattern.findall(text) + if matchers: + # print('cardinal') + for matcher in matchers: + text = text.replace( + matcher[0], Cardinal(cardinal=matcher[0]).cardinal2chntext(), 1 + ) + + self.norm_text = text + self._particular() + + return self.norm_text.lstrip("^").rstrip("$") + + +if __name__ == "__main__": + + # 测试程序 + print(Text(raw_text="固话:0595-23865596或23880880。").normalize()) + print(Text(raw_text="手机:+86 19859213959或15659451527。").normalize()) + print(Text(raw_text="分数:32477/76391。").normalize()) + print(Text(raw_text="百分数:80.03%。").normalize()) + print(Text(raw_text="编号:31520181154418。").normalize()) + print(Text(raw_text="纯数:2983.07克或12345.60米。").normalize()) + print(Text(raw_text="日期:1999年2月20日或09年3月15号。").normalize()) + print(Text(raw_text="金钱:12块5,34.5元,20.1万").normalize()) + print(Text(raw_text="特殊:O2O或B2C。").normalize()) diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/clean.py b/xinference/thirdparty/fish_speech/fish_speech/text/clean.py new file mode 100644 index 0000000000..76d9dc9033 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/clean.py @@ -0,0 +1,69 @@ +import itertools +import re + +LANGUAGE_UNICODE_RANGE_MAP = { + "ZH": [(0x4E00, 0x9FFF)], + "JP": [(0x4E00, 0x9FFF), (0x3040, 0x309F), (0x30A0, 0x30FF), (0x31F0, 0x31FF)], + "EN": [(0x0000, 0x007F)], +} + +SYMBOLS_MAPPING = { + ":": ",", + ";": ",", + ",": ",", + "。": ".", + "!": "!", + "?": "?", + "\n": ".", + "·": ",", + "、": ",", + "...": "…", + "“": "'", + "”": "'", + "‘": "'", + "’": "'", + "(": "'", + ")": "'", + "(": "'", + ")": "'", + "《": "'", + "》": "'", + "【": "'", + "】": "'", + "[": "'", + "]": "'", + "—": "-", + "~": "-", + "~": "-", + "・": "-", + "「": "'", + "」": "'", + ";": ",", + ":": ",", +} + +REPLACE_SYMBOL_REGEX = re.compile( + "|".join(re.escape(p) for p in SYMBOLS_MAPPING.keys()) +) +ALL_KNOWN_UTF8_RANGE = list( + itertools.chain.from_iterable(LANGUAGE_UNICODE_RANGE_MAP.values()) +) +REMOVE_UNKNOWN_SYMBOL_REGEX = re.compile( + "[^" + + "".join( + f"{re.escape(chr(start))}-{re.escape(chr(end))}" + for start, end in ALL_KNOWN_UTF8_RANGE + ) + + "]" +) + + +def clean_text(text): + # Clean the text + text = text.strip() + + # Replace all chinese symbols with their english counterparts + text = REPLACE_SYMBOL_REGEX.sub(lambda x: SYMBOLS_MAPPING[x.group()], text) + text = REMOVE_UNKNOWN_SYMBOL_REGEX.sub("", text) + + return text diff --git a/xinference/thirdparty/fish_speech/fish_speech/text/spliter.py b/xinference/thirdparty/fish_speech/fish_speech/text/spliter.py new file mode 100644 index 0000000000..5528cd3a63 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/text/spliter.py @@ -0,0 +1,130 @@ +import re +import string + +from fish_speech.text.clean import clean_text + + +def utf_8_len(text): + return len(text.encode("utf-8")) + + +def break_text(texts, length, splits: set): + for text in texts: + if utf_8_len(text) <= length: + yield text + continue + + curr = "" + for char in text: + curr += char + + if char in splits: + yield curr + curr = "" + + if curr: + yield curr + + +def break_text_by_length(texts, length): + for text in texts: + if utf_8_len(text) <= length: + yield text + continue + + curr = "" + for char in text: + curr += char + + if utf_8_len(curr) >= length: + yield curr + curr = "" + + if curr: + yield curr + + +def add_cleaned(curr, segments): + curr = curr.strip() + if curr and not all(c.isspace() or c in string.punctuation for c in curr): + segments.append(curr) + + +def protect_float(text): + # Turns 3.14 into <3_f_14> to prevent splitting + return re.sub(r"(\d+)\.(\d+)", r"<\1_f_\2>", text) + + +def unprotect_float(text): + # Turns <3_f_14> into 3.14 + return re.sub(r"<(\d+)_f_(\d+)>", r"\1.\2", text) + + +def split_text(text, length): + text = clean_text(text) + + # Break the text into pieces with following rules: + # 1. Split the text at ".", "!", "?" if text is NOT a float + # 2. If the text is longer than length, split at "," + # 3. If the text is still longer than length, split at " " + # 4. If the text is still longer than length, split at any character to length + + texts = [text] + texts = map(protect_float, texts) + texts = break_text(texts, length, {".", "!", "?"}) + texts = map(unprotect_float, texts) + texts = break_text(texts, length, {","}) + texts = break_text(texts, length, {" "}) + texts = list(break_text_by_length(texts, length)) + + # Then, merge the texts into segments with length <= length + segments = [] + curr = "" + + for text in texts: + if utf_8_len(curr) + utf_8_len(text) <= length: + curr += text + else: + add_cleaned(curr, segments) + curr = text + + if curr: + add_cleaned(curr, segments) + + return segments + + +if __name__ == "__main__": + # Test the split_text function + + text = "This is a test sentence. This is another test sentence. And a third one." + + assert split_text(text, 50) == [ + "This is a test sentence.", + "This is another test sentence. And a third one.", + ] + assert split_text("a,aaaaaa3.14", 10) == ["a,", "aaaaaa3.14"] + assert split_text(" ", 10) == [] + assert split_text("a", 10) == ["a"] + + text = "This is a test sentence with only commas, and no dots, and no exclamation marks, and no question marks, and no newlines." + assert split_text(text, 50) == [ + "This is a test sentence with only commas,", + "and no dots, and no exclamation marks,", + "and no question marks, and no newlines.", + ] + + text = "This is a test sentence This is a test sentence This is a test sentence. This is a test sentence, This is a test sentence, This is a test sentence." + # First half split at " ", second half split at "," + assert split_text(text, 50) == [ + "This is a test sentence This is a test sentence", + "This is a test sentence. This is a test sentence,", + "This is a test sentence, This is a test sentence.", + ] + + text = "这是一段很长的中文文本,而且没有句号,也没有感叹号,也没有问号,也没有换行符。" + assert split_text(text, 50) == [ + "这是一段很长的中文文本,", + "而且没有句号,也没有感叹号,", + "也没有问号,也没有换行符.", + ] diff --git a/xinference/thirdparty/fish_speech/fish_speech/train.py b/xinference/thirdparty/fish_speech/fish_speech/train.py new file mode 100644 index 0000000000..a6a344097a --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/train.py @@ -0,0 +1,139 @@ +import os +import sys +from typing import Optional + +import hydra +import lightning as L +# import pyrootutils +import torch +from lightning import Callback, LightningDataModule, LightningModule, Trainer +from lightning.pytorch.loggers import Logger +from lightning.pytorch.strategies import DDPStrategy +from omegaconf import DictConfig, OmegaConf + +os.environ.pop("SLURM_NTASKS", None) +os.environ.pop("SLURM_JOB_NAME", None) +os.environ.pop("SLURM_NTASKS_PER_NODE", None) + +# register eval resolver and root +# pyrootutils.setup_root(__file__, indicator=".project-root", pythonpath=True) + +# Allow TF32 on Ampere GPUs +torch.set_float32_matmul_precision("high") +torch.backends.cudnn.allow_tf32 = True + +# register eval resolver +OmegaConf.register_new_resolver("eval", eval) + +import fish_speech.utils as utils + +log = utils.RankedLogger(__name__, rank_zero_only=True) + + +@utils.task_wrapper +def train(cfg: DictConfig) -> tuple[dict, dict]: + """Trains the model. Can additionally evaluate on a testset, using best weights obtained during + training. + This method is wrapped in optional @task_wrapper decorator, that controls the behavior during + failure. Useful for multiruns, saving info about the crash, etc. + Args: + cfg (DictConfig): Configuration composed by Hydra. + Returns: + Tuple[dict, dict]: Dict with metrics and dict with all instantiated objects. + """ # noqa: E501 + + # set seed for random number generators in pytorch, numpy and python.random + if cfg.get("seed"): + L.seed_everything(cfg.seed, workers=False) + + if cfg.get("deterministic"): + torch.use_deterministic_algorithms(True) + + log.info(f"Instantiating datamodule <{cfg.data._target_}>") + datamodule: LightningDataModule = hydra.utils.instantiate(cfg.data) + + log.info(f"Instantiating model <{cfg.model._target_}>") + model: LightningModule = hydra.utils.instantiate(cfg.model) + + log.info("Instantiating callbacks...") + callbacks: list[Callback] = utils.instantiate_callbacks(cfg.get("callbacks")) + + log.info("Instantiating loggers...") + logger: list[Logger] = utils.instantiate_loggers(cfg.get("logger")) + + log.info(f"Instantiating trainer <{cfg.trainer._target_}>") + trainer: Trainer = hydra.utils.instantiate( + cfg.trainer, + callbacks=callbacks, + logger=logger, + ) + + object_dict = { + "cfg": cfg, + "datamodule": datamodule, + "model": model, + "callbacks": callbacks, + "logger": logger, + "trainer": trainer, + } + + if logger: + log.info("Logging hyperparameters!") + utils.log_hyperparameters(object_dict) + + if cfg.get("train"): + log.info("Starting training!") + + ckpt_path = cfg.get("ckpt_path") + auto_resume = False + + resume_ckpt_path = utils.get_latest_checkpoint(cfg.paths.ckpt_dir) + if resume_ckpt_path is not None: + ckpt_path = resume_ckpt_path + auto_resume = True + + if ckpt_path is not None: + log.info(f"Resuming from checkpoint: {ckpt_path}") + + # resume weights only is disabled for auto-resume + if cfg.get("resume_weights_only") and auto_resume is False: + log.info("Resuming weights only!") + ckpt = torch.load(ckpt_path, map_location=model.device) + if "state_dict" in ckpt: + ckpt = ckpt["state_dict"] + err = model.load_state_dict(ckpt, strict=False) + log.info(f"Error loading state dict: {err}") + ckpt_path = None + + trainer.fit(model=model, datamodule=datamodule, ckpt_path=ckpt_path) + + train_metrics = trainer.callback_metrics + + if cfg.get("test"): + log.info("Starting testing!") + ckpt_path = trainer.checkpoint_callback.best_model_path + if ckpt_path == "": + log.warning("Best ckpt not found! Using current weights for testing...") + ckpt_path = cfg.get("ckpt_path") + + trainer.test(model=model, datamodule=datamodule, ckpt_path=ckpt_path) + log.info(f"Best ckpt path: {ckpt_path}") + + test_metrics = trainer.callback_metrics + + # merge train and test metrics + metric_dict = {**train_metrics, **test_metrics} + + return metric_dict, object_dict + + +@hydra.main( + version_base="1.3", config_path="./configs", config_name="llama_pretrain.yaml" +) +def main(cfg: DictConfig) -> Optional[float]: + # train the model + train(cfg) + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/utils/__init__.py new file mode 100644 index 0000000000..05378519db --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/__init__.py @@ -0,0 +1,23 @@ +from .braceexpand import braceexpand +from .context import autocast_exclude_mps +from .file import get_latest_checkpoint +from .instantiators import instantiate_callbacks, instantiate_loggers +from .logger import RankedLogger +from .logging_utils import log_hyperparameters +from .rich_utils import enforce_tags, print_config_tree +from .utils import extras, get_metric_value, task_wrapper + +__all__ = [ + "enforce_tags", + "extras", + "get_metric_value", + "RankedLogger", + "instantiate_callbacks", + "instantiate_loggers", + "log_hyperparameters", + "print_config_tree", + "task_wrapper", + "braceexpand", + "get_latest_checkpoint", + "autocast_exclude_mps", +] diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/braceexpand.py b/xinference/thirdparty/fish_speech/fish_speech/utils/braceexpand.py new file mode 100644 index 0000000000..f3ac739f01 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/braceexpand.py @@ -0,0 +1,217 @@ +""" +Bash-style brace expansion +Copied from: https://github.com/trendels/braceexpand/blob/main/src/braceexpand/__init__.py +License: MIT +""" + +import re +import string +from itertools import chain, product +from typing import Iterable, Iterator, Optional + +__all__ = ["braceexpand", "alphabet", "UnbalancedBracesError"] + + +class UnbalancedBracesError(ValueError): + pass + + +alphabet = string.ascii_uppercase + string.ascii_lowercase + +int_range_re = re.compile(r"^(-?\d+)\.\.(-?\d+)(?:\.\.-?(\d+))?$") +char_range_re = re.compile(r"^([A-Za-z])\.\.([A-Za-z])(?:\.\.-?(\d+))?$") +escape_re = re.compile(r"\\(.)") + + +def braceexpand(pattern: str, escape: bool = True) -> Iterator[str]: + """braceexpand(pattern) -> iterator over generated strings + + Returns an iterator over the strings resulting from brace expansion + of pattern. This function implements Brace Expansion as described in + bash(1), with the following limitations: + + * A pattern containing unbalanced braces will raise an + UnbalancedBracesError exception. In bash, unbalanced braces will either + be partly expanded or ignored. + + * A mixed-case character range like '{Z..a}' or '{a..Z}' will not + include the characters '[]^_`' between 'Z' and 'a'. + + When escape is True (the default), characters in pattern can be + prefixed with a backslash to cause them not to be interpreted as + special characters for brace expansion (such as '{', '}', ','). + To pass through a a literal backslash, double it ('\\\\'). + + When escape is False, backslashes in pattern have no special + meaning and will be preserved in the output. + + Examples: + + >>> from braceexpand import braceexpand + + # Integer range + >>> list(braceexpand('item{1..3}')) + ['item1', 'item2', 'item3'] + + # Character range + >>> list(braceexpand('{a..c}')) + ['a', 'b', 'c'] + + # Sequence + >>> list(braceexpand('index.html{,.backup}')) + ['index.html', 'index.html.backup'] + + # Nested patterns + >>> list(braceexpand('python{2.{5..7},3.{2,3}}')) + ['python2.5', 'python2.6', 'python2.7', 'python3.2', 'python3.3'] + + # Prefixing an integer with zero causes all numbers to be padded to + # the same width. + >>> list(braceexpand('{07..10}')) + ['07', '08', '09', '10'] + + # An optional increment can be specified for ranges. + >>> list(braceexpand('{a..g..2}')) + ['a', 'c', 'e', 'g'] + + # Ranges can go in both directions. + >>> list(braceexpand('{4..1}')) + ['4', '3', '2', '1'] + + # Numbers can be negative + >>> list(braceexpand('{2..-1}')) + ['2', '1', '0', '-1'] + + # Unbalanced braces raise an exception. + >>> list(braceexpand('{1{2,3}')) + Traceback (most recent call last): + ... + UnbalancedBracesError: Unbalanced braces: '{1{2,3}' + + # By default, the backslash is the escape character. + >>> list(braceexpand(r'{1\\{2,3}')) + ['1{2', '3'] + + # Setting 'escape' to False disables backslash escaping. + >>> list(braceexpand(r'\\{1,2}', escape=False)) + ['\\\\1', '\\\\2'] + + """ + return ( + escape_re.sub(r"\1", s) if escape else s for s in parse_pattern(pattern, escape) + ) + + +def parse_pattern(pattern: str, escape: bool) -> Iterator[str]: + start = 0 + pos = 0 + bracketdepth = 0 + items: list[Iterable[str]] = [] + + # print 'pattern:', pattern + while pos < len(pattern): + if escape and pattern[pos] == "\\": + pos += 2 + continue + elif pattern[pos] == "{": + if bracketdepth == 0 and pos > start: + # print 'literal:', pattern[start:pos] + items.append([pattern[start:pos]]) + start = pos + bracketdepth += 1 + elif pattern[pos] == "}": + bracketdepth -= 1 + if bracketdepth == 0: + # print 'expression:', pattern[start+1:pos] + expr = pattern[start + 1 : pos] + item = parse_expression(expr, escape) + if item is None: # not a range or sequence + items.extend([["{"], parse_pattern(expr, escape), ["}"]]) + else: + items.append(item) + start = pos + 1 # skip the closing brace + pos += 1 + + if bracketdepth != 0: # unbalanced braces + raise UnbalancedBracesError("Unbalanced braces: '%s'" % pattern) + + if start < pos: + items.append([pattern[start:]]) + + return ("".join(item) for item in product(*items)) + + +def parse_expression(expr: str, escape: bool) -> Optional[Iterable[str]]: + int_range_match = int_range_re.match(expr) + if int_range_match: + return make_int_range(*int_range_match.groups()) + + char_range_match = char_range_re.match(expr) + if char_range_match: + return make_char_range(*char_range_match.groups()) + + return parse_sequence(expr, escape) + + +def parse_sequence(seq: str, escape: bool) -> Optional[Iterator[str]]: + # sequence -> chain(*sequence_items) + start = 0 + pos = 0 + bracketdepth = 0 + items: list[Iterable[str]] = [] + + # print 'sequence:', seq + while pos < len(seq): + if escape and seq[pos] == "\\": + pos += 2 + continue + elif seq[pos] == "{": + bracketdepth += 1 + elif seq[pos] == "}": + bracketdepth -= 1 + elif seq[pos] == "," and bracketdepth == 0: + items.append(parse_pattern(seq[start:pos], escape)) + start = pos + 1 # skip the comma + pos += 1 + + if bracketdepth != 0: + raise UnbalancedBracesError + if not items: + return None + + # part after the last comma (may be the empty string) + items.append(parse_pattern(seq[start:], escape)) + return chain(*items) + + +def make_int_range(left: str, right: str, incr: Optional[str] = None) -> Iterator[str]: + if any([s.startswith(("0", "-0")) for s in (left, right) if s not in ("0", "-0")]): + padding = max(len(left), len(right)) + else: + padding = 0 + step = (int(incr) or 1) if incr else 1 + start = int(left) + end = int(right) + r = range(start, end + 1, step) if start < end else range(start, end - 1, -step) + fmt = "%0{}d".format(padding) + return (fmt % i for i in r) + + +def make_char_range(left: str, right: str, incr: Optional[str] = None) -> str: + step = (int(incr) or 1) if incr else 1 + start = alphabet.index(left) + end = alphabet.index(right) + if start < end: + return alphabet[start : end + 1 : step] + else: + end = end or -len(alphabet) + return alphabet[start : end - 1 : -step] + + +if __name__ == "__main__": + import doctest + import sys + + failed, _ = doctest.testmod(optionflags=doctest.IGNORE_EXCEPTION_DETAIL) + if failed: + sys.exit(1) diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/context.py b/xinference/thirdparty/fish_speech/fish_speech/utils/context.py new file mode 100644 index 0000000000..f04a99290a --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/context.py @@ -0,0 +1,13 @@ +from contextlib import nullcontext + +import torch + + +def autocast_exclude_mps( + device_type: str, dtype: torch.dtype +) -> nullcontext | torch.autocast: + return ( + nullcontext() + if torch.backends.mps.is_available() + else torch.autocast(device_type, dtype) + ) diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/file.py b/xinference/thirdparty/fish_speech/fish_speech/utils/file.py new file mode 100644 index 0000000000..78c82640a9 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/file.py @@ -0,0 +1,16 @@ +import os +from pathlib import Path + + +def get_latest_checkpoint(path: Path | str) -> Path | None: + # Find the latest checkpoint + ckpt_dir = Path(path) + + if ckpt_dir.exists() is False: + return None + + ckpts = sorted(ckpt_dir.glob("*.ckpt"), key=os.path.getmtime) + if len(ckpts) == 0: + return None + + return ckpts[-1] diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/instantiators.py b/xinference/thirdparty/fish_speech/fish_speech/utils/instantiators.py new file mode 100644 index 0000000000..f6ee463924 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/instantiators.py @@ -0,0 +1,50 @@ +from typing import List + +import hydra +from omegaconf import DictConfig +from pytorch_lightning import Callback +from pytorch_lightning.loggers import Logger + +from .logger import RankedLogger + +log = RankedLogger(__name__, rank_zero_only=True) + + +def instantiate_callbacks(callbacks_cfg: DictConfig) -> List[Callback]: + """Instantiates callbacks from config.""" + + callbacks: List[Callback] = [] + + if not callbacks_cfg: + log.warning("No callback configs found! Skipping..") + return callbacks + + if not isinstance(callbacks_cfg, DictConfig): + raise TypeError("Callbacks config must be a DictConfig!") + + for _, cb_conf in callbacks_cfg.items(): + if isinstance(cb_conf, DictConfig) and "_target_" in cb_conf: + log.info(f"Instantiating callback <{cb_conf._target_}>") + callbacks.append(hydra.utils.instantiate(cb_conf)) + + return callbacks + + +def instantiate_loggers(logger_cfg: DictConfig) -> List[Logger]: + """Instantiates loggers from config.""" + + logger: List[Logger] = [] + + if not logger_cfg: + log.warning("No logger configs found! Skipping...") + return logger + + if not isinstance(logger_cfg, DictConfig): + raise TypeError("Logger config must be a DictConfig!") + + for _, lg_conf in logger_cfg.items(): + if isinstance(lg_conf, DictConfig) and "_target_" in lg_conf: + log.info(f"Instantiating logger <{lg_conf._target_}>") + logger.append(hydra.utils.instantiate(lg_conf)) + + return logger diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/logger.py b/xinference/thirdparty/fish_speech/fish_speech/utils/logger.py new file mode 100644 index 0000000000..94f94f738d --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/logger.py @@ -0,0 +1,55 @@ +import logging +from typing import Mapping, Optional + +from lightning_utilities.core.rank_zero import rank_prefixed_message, rank_zero_only + + +class RankedLogger(logging.LoggerAdapter): + """A multi-GPU-friendly python command line logger.""" + + def __init__( + self, + name: str = __name__, + rank_zero_only: bool = True, + extra: Optional[Mapping[str, object]] = None, + ) -> None: + """Initializes a multi-GPU-friendly python command line logger that logs on all processes + with their rank prefixed in the log message. + + :param name: The name of the logger. Default is ``__name__``. + :param rank_zero_only: Whether to force all logs to only occur on the rank zero process. Default is `False`. + :param extra: (Optional) A dict-like object which provides contextual information. See `logging.LoggerAdapter`. + """ + logger = logging.getLogger(name) + super().__init__(logger=logger, extra=extra) + self.rank_zero_only = rank_zero_only + + def log( + self, level: int, msg: str, rank: Optional[int] = None, *args, **kwargs + ) -> None: + """Delegate a log call to the underlying logger, after prefixing its message with the rank + of the process it's being logged from. If `'rank'` is provided, then the log will only + occur on that rank/process. + + :param level: The level to log at. Look at `logging.__init__.py` for more information. + :param msg: The message to log. + :param rank: The rank to log at. + :param args: Additional args to pass to the underlying logging function. + :param kwargs: Any additional keyword args to pass to the underlying logging function. + """ + if self.isEnabledFor(level): + msg, kwargs = self.process(msg, kwargs) + current_rank = getattr(rank_zero_only, "rank", None) + if current_rank is None: + raise RuntimeError( + "The `rank_zero_only.rank` needs to be set before use" + ) + msg = rank_prefixed_message(msg, current_rank) + if self.rank_zero_only: + if current_rank == 0: + self.logger.log(level, msg, *args, **kwargs) + else: + if rank is None: + self.logger.log(level, msg, *args, **kwargs) + elif current_rank == rank: + self.logger.log(level, msg, *args, **kwargs) diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/logging_utils.py b/xinference/thirdparty/fish_speech/fish_speech/utils/logging_utils.py new file mode 100644 index 0000000000..8e3b0a2519 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/logging_utils.py @@ -0,0 +1,48 @@ +from lightning.pytorch.utilities import rank_zero_only + +from fish_speech.utils import logger as log + + +@rank_zero_only +def log_hyperparameters(object_dict: dict) -> None: + """Controls which config parts are saved by lightning loggers. + + Additionally saves: + - Number of model parameters + """ + + hparams = {} + + cfg = object_dict["cfg"] + model = object_dict["model"] + trainer = object_dict["trainer"] + + if not trainer.logger: + log.warning("Logger not found! Skipping hyperparameter logging...") + return + + hparams["model"] = cfg["model"] + + # save number of model parameters + hparams["model/params/total"] = sum(p.numel() for p in model.parameters()) + hparams["model/params/trainable"] = sum( + p.numel() for p in model.parameters() if p.requires_grad + ) + hparams["model/params/non_trainable"] = sum( + p.numel() for p in model.parameters() if not p.requires_grad + ) + + hparams["data"] = cfg["data"] + hparams["trainer"] = cfg["trainer"] + + hparams["callbacks"] = cfg.get("callbacks") + hparams["extras"] = cfg.get("extras") + + hparams["task_name"] = cfg.get("task_name") + hparams["tags"] = cfg.get("tags") + hparams["ckpt_path"] = cfg.get("ckpt_path") + hparams["seed"] = cfg.get("seed") + + # send hparams to all loggers + for logger in trainer.loggers: + logger.log_hyperparams(hparams) diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/rich_utils.py b/xinference/thirdparty/fish_speech/fish_speech/utils/rich_utils.py new file mode 100644 index 0000000000..6a465f54d6 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/rich_utils.py @@ -0,0 +1,100 @@ +from pathlib import Path +from typing import Sequence + +import rich +import rich.syntax +import rich.tree +from hydra.core.hydra_config import HydraConfig +from lightning.pytorch.utilities import rank_zero_only +from omegaconf import DictConfig, OmegaConf, open_dict +from rich.prompt import Prompt + +from fish_speech.utils import logger as log + + +@rank_zero_only +def print_config_tree( + cfg: DictConfig, + print_order: Sequence[str] = ( + "data", + "model", + "callbacks", + "logger", + "trainer", + "paths", + "extras", + ), + resolve: bool = False, + save_to_file: bool = False, +) -> None: + """Prints content of DictConfig using Rich library and its tree structure. + + Args: + cfg (DictConfig): Configuration composed by Hydra. + print_order (Sequence[str], optional): Determines in what order config components are printed. + resolve (bool, optional): Whether to resolve reference fields of DictConfig. + save_to_file (bool, optional): Whether to export config to the hydra output folder. + """ # noqa: E501 + + style = "dim" + tree = rich.tree.Tree("CONFIG", style=style, guide_style=style) + + queue = [] + + # add fields from `print_order` to queue + for field in print_order: + ( + queue.append(field) + if field in cfg + else log.warning( + f"Field '{field}' not found in config. " + + f"Skipping '{field}' config printing..." + ) + ) + + # add all the other fields to queue (not specified in `print_order`) + for field in cfg: + if field not in queue: + queue.append(field) + + # generate config tree from queue + for field in queue: + branch = tree.add(field, style=style, guide_style=style) + + config_group = cfg[field] + if isinstance(config_group, DictConfig): + branch_content = OmegaConf.to_yaml(config_group, resolve=resolve) + else: + branch_content = str(config_group) + + branch.add(rich.syntax.Syntax(branch_content, "yaml")) + + # print config tree + rich.print(tree) + + # save config tree to file + if save_to_file: + with open(Path(cfg.paths.output_dir, "config_tree.log"), "w") as file: + rich.print(tree, file=file) + + +@rank_zero_only +def enforce_tags(cfg: DictConfig, save_to_file: bool = False) -> None: + """Prompts user to input tags from command line if no tags are provided in config.""" # noqa: E501 + + if not cfg.get("tags"): + if "id" in HydraConfig().cfg.hydra.job: + raise ValueError("Specify tags before launching a multirun!") + + log.warning("No tags provided in config. Prompting user to input tags...") + tags = Prompt.ask("Enter a list of comma separated tags", default="dev") + tags = [t.strip() for t in tags.split(",") if t != ""] + + with open_dict(cfg): + cfg.tags = tags + + log.info(f"Tags: {cfg.tags}") + + if save_to_file: + with open(Path(cfg.paths.output_dir, "tags.log"), "w") as file: + rich.print(cfg.tags, file=file) diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/spectrogram.py b/xinference/thirdparty/fish_speech/fish_speech/utils/spectrogram.py new file mode 100644 index 0000000000..01c3d7a2ab --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/spectrogram.py @@ -0,0 +1,122 @@ +import torch +import torchaudio.functional as F +from torch import Tensor, nn +from torchaudio.transforms import MelScale + + +class LinearSpectrogram(nn.Module): + def __init__( + self, + n_fft=2048, + win_length=2048, + hop_length=512, + center=False, + mode="pow2_sqrt", + ): + super().__init__() + + self.n_fft = n_fft + self.win_length = win_length + self.hop_length = hop_length + self.center = center + self.mode = mode + + self.register_buffer("window", torch.hann_window(win_length), persistent=False) + + def forward(self, y: Tensor) -> Tensor: + if y.ndim == 3: + y = y.squeeze(1) + + y = torch.nn.functional.pad( + y.unsqueeze(1), + ( + (self.win_length - self.hop_length) // 2, + (self.win_length - self.hop_length + 1) // 2, + ), + mode="reflect", + ).squeeze(1) + + spec = torch.stft( + y, + self.n_fft, + hop_length=self.hop_length, + win_length=self.win_length, + window=self.window, + center=self.center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=True, + ) + + spec = torch.view_as_real(spec) + + if self.mode == "pow2_sqrt": + spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) + + return spec + + +class LogMelSpectrogram(nn.Module): + def __init__( + self, + sample_rate=44100, + n_fft=2048, + win_length=2048, + hop_length=512, + n_mels=128, + center=False, + f_min=0.0, + f_max=None, + ): + super().__init__() + + self.sample_rate = sample_rate + self.n_fft = n_fft + self.win_length = win_length + self.hop_length = hop_length + self.center = center + self.n_mels = n_mels + self.f_min = f_min + self.f_max = f_max or float(sample_rate // 2) + + self.spectrogram = LinearSpectrogram(n_fft, win_length, hop_length, center) + + fb = F.melscale_fbanks( + n_freqs=self.n_fft // 2 + 1, + f_min=self.f_min, + f_max=self.f_max, + n_mels=self.n_mels, + sample_rate=self.sample_rate, + norm="slaney", + mel_scale="slaney", + ) + self.register_buffer( + "fb", + fb, + persistent=False, + ) + + def compress(self, x: Tensor) -> Tensor: + return torch.log(torch.clamp(x, min=1e-5)) + + def decompress(self, x: Tensor) -> Tensor: + return torch.exp(x) + + def apply_mel_scale(self, x: Tensor) -> Tensor: + return torch.matmul(x.transpose(-1, -2), self.fb).transpose(-1, -2) + + def forward( + self, x: Tensor, return_linear: bool = False, sample_rate: int = None + ) -> Tensor: + if sample_rate is not None and sample_rate != self.sample_rate: + x = F.resample(x, orig_freq=sample_rate, new_freq=self.sample_rate) + + linear = self.spectrogram(x) + x = self.apply_mel_scale(linear) + x = self.compress(x) + + if return_linear: + return x, self.compress(linear) + + return x diff --git a/xinference/thirdparty/fish_speech/fish_speech/utils/utils.py b/xinference/thirdparty/fish_speech/fish_speech/utils/utils.py new file mode 100644 index 0000000000..c546bfa1ed --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/utils/utils.py @@ -0,0 +1,114 @@ +import warnings +from importlib.util import find_spec +from typing import Callable + +from omegaconf import DictConfig + +from .logger import RankedLogger +from .rich_utils import enforce_tags, print_config_tree + +log = RankedLogger(__name__, rank_zero_only=True) + + +def extras(cfg: DictConfig) -> None: + """Applies optional utilities before the task is started. + + Utilities: + - Ignoring python warnings + - Setting tags from command line + - Rich config printing + """ + + # return if no `extras` config + if not cfg.get("extras"): + log.warning("Extras config not found! <cfg.extras=null>") + return + + # disable python warnings + if cfg.extras.get("ignore_warnings"): + log.info("Disabling python warnings! <cfg.extras.ignore_warnings=True>") + warnings.filterwarnings("ignore") + + # prompt user to input tags from command line if none are provided in the config + if cfg.extras.get("enforce_tags"): + log.info("Enforcing tags! <cfg.extras.enforce_tags=True>") + enforce_tags(cfg, save_to_file=True) + + # pretty print config tree using Rich library + if cfg.extras.get("print_config"): + log.info("Printing config tree with Rich! <cfg.extras.print_config=True>") + print_config_tree(cfg, resolve=True, save_to_file=True) + + +def task_wrapper(task_func: Callable) -> Callable: + """Optional decorator that controls the failure behavior when executing the task function. + + This wrapper can be used to: + - make sure loggers are closed even if the task function raises an exception (prevents multirun failure) + - save the exception to a `.log` file + - mark the run as failed with a dedicated file in the `logs/` folder (so we can find and rerun it later) + - etc. (adjust depending on your needs) + + Example: + ``` + @utils.task_wrapper + def train(cfg: DictConfig) -> Tuple[dict, dict]: + + ... + + return metric_dict, object_dict + ``` + """ # noqa: E501 + + def wrap(cfg: DictConfig): + # execute the task + try: + metric_dict, object_dict = task_func(cfg=cfg) + + # things to do if exception occurs + except Exception as ex: + # save exception to `.log` file + log.exception("") + + # some hyperparameter combinations might be invalid or + # cause out-of-memory errors so when using hparam search + # plugins like Optuna, you might want to disable + # raising the below exception to avoid multirun failure + raise ex + + # things to always do after either success or exception + finally: + # display output dir path in terminal + log.info(f"Output dir: {cfg.paths.run_dir}") + + # always close wandb run (even if exception occurs so multirun won't fail) + if find_spec("wandb"): # check if wandb is installed + import wandb + + if wandb.run: + log.info("Closing wandb!") + wandb.finish() + + return metric_dict, object_dict + + return wrap + + +def get_metric_value(metric_dict: dict, metric_name: str) -> float: + """Safely retrieves value of the metric logged in LightningModule.""" + + if not metric_name: + log.info("Metric name is None! Skipping metric value retrieval...") + return None + + if metric_name not in metric_dict: + raise Exception( + f"Metric value not found! <metric_name={metric_name}>\n" + "Make sure metric name logged in LightningModule is correct!\n" + "Make sure `optimized_metric` name in `hparams_search` config is correct!" + ) + + metric_value = metric_dict[metric_name].item() + log.info(f"Retrieved metric value! <{metric_name}={metric_value}>") + + return metric_value diff --git a/xinference/thirdparty/fish_speech/fish_speech/webui/__init__.py b/xinference/thirdparty/fish_speech/fish_speech/webui/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/fish_speech/webui/css/style.css b/xinference/thirdparty/fish_speech/fish_speech/webui/css/style.css new file mode 100644 index 0000000000..3c7a22ecc3 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/webui/css/style.css @@ -0,0 +1,161 @@ +:root { + --my-200: #80eeee; + --my-50: #ecfdf5; + --water-width: 300px; + --water-heigh: 300px; +} + + +/* general styled components */ +.tools { + align-items: center; + justify-content: center; +} + +.gradio-button { + max-width: 2.2em; + min-width: 2.2em !important; + height: 2.4em; + align-self: end; + line-height: 1em; + border-radius: 0.5em; + +} + +.gradio-button.secondary-down, .gradio-button.secondary-down:hover{ + box-shadow: 1px 1px 1px rgba(0,0,0,0.25) inset, 0px 0px 3px rgba(0,0,0,0.15) inset; +} + +/* replace original footer with ours */ +a{ + font-weight: bold; + cursor: pointer; + color: #030C14 !important; +} + +footer { + display: none !important; +} + +#footer{ + text-align: center; +} + +#footer div{ + display: inline-block; +} + +#footer .versions{ + font-size: 85%; + opacity: 0.85; +} + +/*@keyframes moveBackground {*/ +/* 0% {*/ +/* background-position: 0 0;*/ +/* }*/ +/* 100% {*/ +/* background-position: -100px 100px;*/ +/* }*/ +/*}*/ +@keyframes moveJellyBackground { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +.gradio-container { + position: absolute; + z-index: 10; +} + + +.quan { + position: absolute; + bottom: 0; + width: var(--water-width); + height: var(--water-heigh); + border-radius: 0; + /*border: 3px solid rgb(246, 247, 248);*/ + /*box-shadow: 0 0 0 3px rgb(41, 134, 196);*/ + z-index: 0; + +} + +.quan:last-child { + margin-right: 0; +} + +.shui { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgb(23, 106, 201); + border-radius: 0; + overflow: hidden; + z-index: 0; +} + +.shui::after { + + content: ''; + position: absolute; + top: 20%; + left: 50%; + width: 150%; + height: 150%; + border-radius: 40%; + background-image: radial-gradient(circle at 0% 50%, #dcfcf1, var(--my-50) 50%); + animation: shi 5s linear infinite; +} + +@keyframes shi { + 0% { + transform: translate(-50%, -65%) rotate(0deg); + } + 100% { + transform: translate(-50%, -65%) rotate(360deg); + } +} + +.shui::before { + content: ''; + position: absolute; + top: 20%; + left: 50%; + width: 150%; + height: 150%; + border-radius: 42%; + background-color: rgb(240, 228, 228, 0.2); + animation: xu 7s linear infinite; +} + +@keyframes xu { + 0% { + transform: translate(-50%, -60%) rotate(0deg); + } + 100% { + transform: translate(-50%, -60%) rotate(360deg); + } +} + +fieldset.data_src div.wrap label { + background: #f8bffee0 !important; +} + +.scrollable-component { + max-height: 100px; + overflow-y: auto; +} + +#file_accordion { + max-height: 220px !important; +} diff --git a/xinference/thirdparty/fish_speech/fish_speech/webui/html/footer.html b/xinference/thirdparty/fish_speech/fish_speech/webui/html/footer.html new file mode 100644 index 0000000000..ac1745aa6f --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/webui/html/footer.html @@ -0,0 +1,11 @@ +<div style="color: rgba(25,255,205,0.7) !important;"> + <a href="{api_docs}">API</a> +  •  + <a href="https://github.com/fishaudio/fish-speech">Github</a> +  •  + <a href="https://gradio.app">Gradio</a> +</div> +<br /> +<div class="versions" style="color: rgba(25,255,205,0.7) !important;"> +{versions} +</div> diff --git a/xinference/thirdparty/fish_speech/fish_speech/webui/js/animate.js b/xinference/thirdparty/fish_speech/fish_speech/webui/js/animate.js new file mode 100644 index 0000000000..0637a541a8 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/webui/js/animate.js @@ -0,0 +1,69 @@ + +function createGradioAnimation() { + const params = new URLSearchParams(window.location.search); + if (!params.has('__theme')) { + params.set('__theme', 'light'); + window.location.search = params.toString(); + } + + var gradioApp = document.querySelector('gradio-app'); + if (gradioApp) { + + document.documentElement.style.setProperty('--my-200', '#80eeee'); + document.documentElement.style.setProperty('--my-50', '#ecfdf5'); + + // gradioApp.style.position = 'relative'; + // gradioApp.style.backgroundSize = '200% 200%'; + // gradioApp.style.animation = 'moveJellyBackground 10s ease infinite'; + // gradioApp.style.backgroundImage = 'radial-gradient(circle at 0% 50%, var(--my-200), var(--my-50) 50%)'; + // gradioApp.style.display = 'flex'; + // gradioApp.style.justifyContent = 'flex-start'; + // gradioApp.style.flexWrap = 'nowrap'; + // gradioApp.style.overflowX = 'auto'; + + // for (let i = 0; i < 6; i++) { + // var quan = document.createElement('div'); + // quan.className = 'quan'; + // gradioApp.insertBefore(quan, gradioApp.firstChild); + // quan.id = 'quan' + i.toString(); + // quan.style.left = 'calc(var(--water-width) * ' + i.toString() + ')'; + // var quanContainer = document.querySelector('.quan'); + // if (quanContainer) { + // var shui = document.createElement('div'); + // shui.className = 'shui'; + // quanContainer.insertBefore(shui, quanContainer.firstChild) + // } + // } + } + + var container = document.createElement('div'); + container.id = 'gradio-animation'; + container.style.fontSize = '2em'; + container.style.fontFamily = 'Maiandra GD, ui-monospace, monospace'; + container.style.fontWeight = 'bold'; + container.style.textAlign = 'center'; + container.style.marginBottom = '20px'; + + var text = 'Welcome to Fish-Speech!'; + for (var i = 0; i < text.length; i++) { + (function(i){ + setTimeout(function(){ + var letter = document.createElement('span'); + letter.style.opacity = '0'; + letter.style.transition = 'opacity 0.5s'; + letter.innerText = text[i]; + + container.appendChild(letter); + + setTimeout(function() { + letter.style.opacity = '1'; + }, 50); + }, i * 200); + })(i); + } + + var gradioContainer = document.querySelector('.gradio-container'); + gradioContainer.insertBefore(container, gradioContainer.firstChild); + + return 'Animation created'; +} diff --git a/xinference/thirdparty/fish_speech/fish_speech/webui/launch_utils.py b/xinference/thirdparty/fish_speech/fish_speech/webui/launch_utils.py new file mode 100644 index 0000000000..2f57b595a2 --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/webui/launch_utils.py @@ -0,0 +1,120 @@ +import importlib.util +import os +import subprocess +import sys +from functools import lru_cache +from pathlib import Path +from typing import Iterable + +import gradio as gr +from gradio.themes.base import Base +from gradio.themes.utils import colors, fonts, sizes + +GIT = ( + (Path(os.environ.get("GIT_HOME", "")) / "git").resolve() + if sys.platform == "win32" + else "git" +) +GIT = str(GIT) + + +def is_module_installed(module_name: str) -> bool: + spec = importlib.util.find_spec(module_name) + return spec is not None + + +@lru_cache() +def commit_hash(): + try: + return subprocess.check_output( + [GIT, "log", "-1", "--format='%h %s'"], shell=False, encoding="utf8" + ).strip() + except Exception: + return "<none>" + + +def versions_html(): + import torch + + python_version = ".".join([str(x) for x in sys.version_info[0:3]]) + commit = commit_hash() + hash = commit.strip("'").split(" ")[0] + + return f""" +version: <a href="https://github.com/fishaudio/fish-speech/commit/{hash}">{hash}</a> + •  +python: <span title="{sys.version}">{python_version}</span> + •  +torch: {getattr(torch, '__long_version__',torch.__version__)} + •  +gradio: {gr.__version__} + •  +author: <a href="https://github.com/fishaudio">fishaudio</a> +""" + + +def version_check(commit): + try: + import requests + + commits = requests.get( + "https://api.github.com/repos/fishaudio/fish-speech/branches/main" + ).json() + if commit != "<none>" and commits["commit"]["sha"] != commit: + print("--------------------------------------------------------") + print("| You are not up to date with the most recent release. |") + print("| Consider running `git pull` to update. |") + print("--------------------------------------------------------") + elif commits["commit"]["sha"] == commit: + print("You are up to date with the most recent release.") + else: + print("Not a git clone, can't perform version check.") + except Exception as e: + print("version check failed", e) + + +class Seafoam(Base): + def __init__( + self, + *, + primary_hue: colors.Color | str = colors.emerald, + secondary_hue: colors.Color | str = colors.blue, + neutral_hue: colors.Color | str = colors.blue, + spacing_size: sizes.Size | str = sizes.spacing_md, + radius_size: sizes.Size | str = sizes.radius_md, + text_size: sizes.Size | str = sizes.text_lg, + font: fonts.Font | str | Iterable[fonts.Font | str] = ( + fonts.GoogleFont("Quicksand"), + "ui-sans-serif", + "sans-serif", + ), + font_mono: fonts.Font | str | Iterable[fonts.Font | str] = ( + fonts.GoogleFont("IBM Plex Mono"), + "ui-monospace", + "monospace", + ), + ): + super().__init__( + primary_hue=primary_hue, + secondary_hue=secondary_hue, + neutral_hue=neutral_hue, + spacing_size=spacing_size, + radius_size=radius_size, + text_size=text_size, + font=font, + font_mono=font_mono, + ) + super().set( + button_primary_background_fill="linear-gradient(90deg, *primary_300, *secondary_400)", + button_primary_background_fill_hover="linear-gradient(90deg, *primary_200, *secondary_300)", + button_primary_text_color="white", + button_primary_background_fill_dark="linear-gradient(90deg, *primary_600, *secondary_800)", + slider_color="*secondary_300", + slider_color_dark="*secondary_600", + block_title_text_weight="600", + block_border_width="3px", + block_shadow="*shadow_drop_lg", + button_shadow="*shadow_drop_lg", + button_small_padding="0px", + button_large_padding="3px", + ) diff --git a/xinference/thirdparty/fish_speech/fish_speech/webui/manage.py b/xinference/thirdparty/fish_speech/fish_speech/webui/manage.py new file mode 100644 index 0000000000..9c183acd7c --- /dev/null +++ b/xinference/thirdparty/fish_speech/fish_speech/webui/manage.py @@ -0,0 +1,1237 @@ +from __future__ import annotations + +import datetime +import html +import json +import os +import platform +import shutil +import signal +import subprocess +import sys +from pathlib import Path + +import gradio as gr +import psutil +import yaml +from loguru import logger +from tqdm import tqdm + +PYTHON = os.path.join(os.environ.get("PYTHON_FOLDERPATH", ""), "python") +sys.path.insert(0, "") +print(sys.path) +cur_work_dir = Path(os.getcwd()).resolve() +print("You are in ", str(cur_work_dir)) + +from fish_speech.i18n import i18n +from fish_speech.webui.launch_utils import Seafoam, is_module_installed, versions_html + +config_path = cur_work_dir / "fish_speech" / "configs" +vqgan_yml_path = config_path / "firefly_gan_vq.yaml" +llama_yml_path = config_path / "text2semantic_finetune.yaml" + +env = os.environ.copy() +env["no_proxy"] = "127.0.0.1, localhost, 0.0.0.0" + +seafoam = Seafoam() + + +def build_html_error_message(error): + return f""" + <div style="color: red; font-weight: bold;"> + {html.escape(error)} + </div> + """ + + +def build_html_ok_message(msg): + return f""" + <div style="color: green; font-weight: bold;"> + {html.escape(msg)} + </div> + """ + + +def build_html_href(link, desc, msg): + return f""" + <span style="color: green; font-weight: bold; display: inline-block"> + {html.escape(msg)} + <a href="{link}">{desc}</a> + </span> + """ + + +def load_data_in_raw(path): + with open(path, "r", encoding="utf-8") as file: + data = file.read() + return str(data) + + +def kill_proc_tree(pid, including_parent=True): + try: + parent = psutil.Process(pid) + except psutil.NoSuchProcess: + # Process already terminated + return + + children = parent.children(recursive=True) + for child in children: + try: + os.kill(child.pid, signal.SIGTERM) # or signal.SIGKILL + except OSError: + pass + if including_parent: + try: + os.kill(parent.pid, signal.SIGTERM) # or signal.SIGKILL + except OSError: + pass + + +system = platform.system() +p_label = None +p_infer = None +p_tensorboard = None + + +def kill_process(pid): + if system == "Windows": + cmd = "taskkill /t /f /pid %s" % pid + # os.system(cmd) + subprocess.run(cmd) + else: + kill_proc_tree(pid) + + +def change_label(if_label): + global p_label + if if_label == True and p_label is None: + url = "http://localhost:3000" + remote_url = "https://text-labeler.pages.dev/" + try: + p_label = subprocess.Popen( + [ + ( + "asr-label-linux-x64" + if sys.platform == "linux" + else "asr-label-win-x64.exe" + ) + ] + ) + except FileNotFoundError: + logger.warning("asr-label execution not found!") + + yield build_html_href( + link=remote_url, + desc=i18n("Optional online ver"), + msg=i18n("Opened labeler in browser"), + ) + + elif if_label == False and p_label is not None: + kill_process(p_label.pid) + p_label = None + yield build_html_ok_message("Nothing") + + +def clean_infer_cache(): + import tempfile + + temp_dir = Path(tempfile.gettempdir()) + gradio_dir = str(temp_dir / "gradio") + try: + shutil.rmtree(gradio_dir) + logger.info(f"Deleted cached audios: {gradio_dir}") + except PermissionError: + logger.info(f"Permission denied: Unable to delete {gradio_dir}") + except FileNotFoundError: + logger.info(f"{gradio_dir} was not found") + except Exception as e: + logger.info(f"An error occurred: {e}") + + +def change_infer( + if_infer, + host, + port, + infer_decoder_model, + infer_decoder_config, + infer_llama_model, + infer_compile, +): + global p_infer + if if_infer == True and p_infer == None: + env = os.environ.copy() + + env["GRADIO_SERVER_NAME"] = host + env["GRADIO_SERVER_PORT"] = port + # 启动第二个进程 + url = f"http://{host}:{port}" + yield build_html_ok_message( + i18n("Inferring interface is launched at {}").format(url) + ) + + clean_infer_cache() + + p_infer = subprocess.Popen( + [ + PYTHON, + "tools/webui.py", + "--decoder-checkpoint-path", + infer_decoder_model, + "--decoder-config-name", + infer_decoder_config, + "--llama-checkpoint-path", + infer_llama_model, + ] + + (["--compile"] if infer_compile == "Yes" else []), + env=env, + ) + + elif if_infer == False and p_infer is not None: + kill_process(p_infer.pid) + p_infer = None + yield build_html_error_message(i18n("Infer interface is closed")) + + +js = load_data_in_raw("fish_speech/webui/js/animate.js") +css = load_data_in_raw("fish_speech/webui/css/style.css") + +data_pre_output = (cur_work_dir / "data").resolve() +default_model_output = (cur_work_dir / "results").resolve() +default_filelist = data_pre_output / "detect.list" +data_pre_output.mkdir(parents=True, exist_ok=True) + +items = [] +dict_items = {} + + +def load_yaml_data_in_fact(yml_path): + with open(yml_path, "r", encoding="utf-8") as file: + yml = yaml.safe_load(file) + return yml + + +def write_yaml_data_in_fact(yml, yml_path): + with open(yml_path, "w", encoding="utf-8") as file: + yaml.safe_dump(yml, file, allow_unicode=True) + return yml + + +def generate_tree(directory, depth=0, max_depth=None, prefix=""): + if max_depth is not None and depth > max_depth: + return "" + + tree_str = "" + files = [] + directories = [] + for item in os.listdir(directory): + if os.path.isdir(os.path.join(directory, item)): + directories.append(item) + else: + files.append(item) + + entries = directories + files + for i, entry in enumerate(entries): + connector = "├── " if i < len(entries) - 1 else "└── " + tree_str += f"{prefix}{connector}{entry}<br />" + if i < len(directories): + extension = "│ " if i < len(entries) - 1 else " " + tree_str += generate_tree( + os.path.join(directory, entry), + depth + 1, + max_depth, + prefix=prefix + extension, + ) + return tree_str + + +def new_explorer(data_path, max_depth): + return gr.Markdown( + elem_classes=["scrollable-component"], + value=generate_tree(data_path, max_depth=max_depth), + ) + + +def add_item( + folder: str, + method: str, + label_lang: str, + if_initial_prompt: bool, + initial_prompt: str | None, +): + folder = folder.strip(" ").strip('"') + + folder_path = Path(folder) + + if folder and folder not in items and data_pre_output not in folder_path.parents: + if folder_path.is_dir(): + items.append(folder) + dict_items[folder] = dict( + type="folder", + method=method, + label_lang=label_lang, + initial_prompt=initial_prompt if if_initial_prompt else None, + ) + elif folder: + err = folder + return gr.Checkboxgroup(choices=items), build_html_error_message( + i18n("Invalid path: {}").format(err) + ) + + formatted_data = json.dumps(dict_items, ensure_ascii=False, indent=4) + logger.info("After Adding: " + formatted_data) + gr.Info(formatted_data) + return gr.Checkboxgroup(choices=items), build_html_ok_message( + i18n("Added path successfully!") + ) + + +def remove_items(selected_items): + global items, dict_items + to_remove = [item for item in items if item in selected_items] + for item in to_remove: + del dict_items[item] + items = [item for item in items if item in dict_items.keys()] + formatted_data = json.dumps(dict_items, ensure_ascii=False, indent=4) + logger.info(formatted_data) + gr.Warning("After Removing: " + formatted_data) + return gr.Checkboxgroup(choices=items, value=[]), build_html_ok_message( + i18n("Removed path successfully!") + ) + + +def show_selected(options): + selected_options = ", ".join(options) + + if options: + return i18n("Selected: {}").format(selected_options) + else: + return i18n("No selected options") + + +from pydub import AudioSegment + + +def convert_to_mono_in_place(audio_path: Path): + audio = AudioSegment.from_file(audio_path) + if audio.channels > 1: + mono_audio = audio.set_channels(1) + mono_audio.export(audio_path, format=audio_path.suffix[1:]) + logger.info(f"Convert {audio_path} successfully") + + +def list_copy(list_file_path, method): + wav_root = data_pre_output + lst = [] + with list_file_path.open("r", encoding="utf-8") as file: + for line in tqdm(file, desc="Processing audio/transcript"): + wav_path, speaker_name, language, text = line.strip().split("|") + original_wav_path = Path(wav_path) + target_wav_path = ( + wav_root / original_wav_path.parent.name / original_wav_path.name + ) + lst.append(f"{target_wav_path}|{speaker_name}|{language}|{text}") + if target_wav_path.is_file(): + continue + target_wav_path.parent.mkdir(parents=True, exist_ok=True) + if method == i18n("Copy"): + shutil.copy(original_wav_path, target_wav_path) + else: + shutil.move(original_wav_path, target_wav_path.parent) + convert_to_mono_in_place(target_wav_path) + original_lab_path = original_wav_path.with_suffix(".lab") + target_lab_path = ( + wav_root + / original_wav_path.parent.name + / original_wav_path.with_suffix(".lab").name + ) + if target_lab_path.is_file(): + continue + if method == i18n("Copy"): + shutil.copy(original_lab_path, target_lab_path) + else: + shutil.move(original_lab_path, target_lab_path.parent) + + if method == i18n("Move"): + with list_file_path.open("w", encoding="utf-8") as file: + file.writelines("\n".join(lst)) + + del lst + return build_html_ok_message(i18n("Use filelist")) + + +def check_files(data_path: str, max_depth: int, label_model: str, label_device: str): + global dict_items + data_path = Path(data_path) + gr.Warning("Pre-processing begins...") + for item, content in dict_items.items(): + item_path = Path(item) + tar_path = data_path / item_path.name + + if content["type"] == "folder" and item_path.is_dir(): + if content["method"] == i18n("Copy"): + os.makedirs(tar_path, exist_ok=True) + shutil.copytree( + src=str(item_path), dst=str(tar_path), dirs_exist_ok=True + ) + elif not tar_path.is_dir(): + shutil.move(src=str(item_path), dst=str(tar_path)) + + for suf in ["wav", "flac", "mp3"]: + for audio_path in tar_path.glob(f"**/*.{suf}"): + convert_to_mono_in_place(audio_path) + + cur_lang = content["label_lang"] + initial_prompt = content["initial_prompt"] + + transcribe_cmd = [ + PYTHON, + "tools/whisper_asr.py", + "--model-size", + label_model, + "--device", + label_device, + "--audio-dir", + tar_path, + "--save-dir", + tar_path, + "--language", + cur_lang, + ] + + if initial_prompt is not None: + transcribe_cmd += ["--initial-prompt", initial_prompt] + + if cur_lang != "IGNORE": + try: + gr.Warning("Begin To Transcribe") + subprocess.run( + transcribe_cmd, + env=env, + ) + except Exception: + print("Transcription error occurred") + + elif content["type"] == "file" and item_path.is_file(): + list_copy(item_path, content["method"]) + + return build_html_ok_message(i18n("Move files successfully")), new_explorer( + data_path, max_depth=max_depth + ) + + +def generate_folder_name(): + now = datetime.datetime.now() + folder_name = now.strftime("%Y%m%d_%H%M%S") + return folder_name + + +def train_process( + data_path: str, + option: str, + # llama config + llama_ckpt, + llama_base_config, + llama_lr, + llama_maxsteps, + llama_data_num_workers, + llama_data_batch_size, + llama_data_max_length, + llama_precision, + llama_check_interval, + llama_grad_batches, + llama_use_speaker, + llama_use_lora, +): + + backend = "nccl" if sys.platform == "linux" else "gloo" + + new_project = generate_folder_name() + print("New Project Name: ", new_project) + + if option == "VQGAN": + msg = "Skipped VQGAN Training." + gr.Warning(msg) + logger.info(msg) + + if option == "LLAMA": + msg = "LLAMA Training begins..." + gr.Warning(msg) + logger.info(msg) + subprocess.run( + [ + PYTHON, + "tools/vqgan/extract_vq.py", + str(data_pre_output), + "--num-workers", + "1", + "--batch-size", + "16", + "--config-name", + "firefly_gan_vq", + "--checkpoint-path", + "checkpoints/fish-speech-1.2-sft/firefly-gan-vq-fsq-4x1024-42hz-generator.pth", + ] + ) + + subprocess.run( + [ + PYTHON, + "tools/llama/build_dataset.py", + "--input", + str(data_pre_output), + "--text-extension", + ".lab", + "--num-workers", + "16", + ] + ) + ckpt_path = "checkpoints/fish-speech-1.2-sft/model.pth" + lora_prefix = "lora_" if llama_use_lora else "" + llama_name = lora_prefix + "text2semantic_" + new_project + latest = next( + iter( + sorted( + [ + str(p.relative_to("results")) + for p in Path("results").glob(lora_prefix + "text2sem*/") + ], + reverse=True, + ) + ), + llama_name, + ) + project = ( + llama_name + if llama_ckpt == i18n("new") + else ( + latest + if llama_ckpt == i18n("latest") + else Path(llama_ckpt).relative_to("results") + ) + ) + logger.info(project) + + if llama_check_interval > llama_maxsteps: + llama_check_interval = llama_maxsteps + + train_cmd = [ + PYTHON, + "fish_speech/train.py", + "--config-name", + "text2semantic_finetune", + f"project={project}", + f"trainer.strategy.process_group_backend={backend}", + f"train_dataset.proto_files={str(['data/quantized-dataset-ft'])}", + f"val_dataset.proto_files={str(['data/quantized-dataset-ft'])}", + f"model.optimizer.lr={llama_lr}", + f"trainer.max_steps={llama_maxsteps}", + f"data.num_workers={llama_data_num_workers}", + f"data.batch_size={llama_data_batch_size}", + f"max_length={llama_data_max_length}", + f"trainer.precision={llama_precision}", + f"trainer.val_check_interval={llama_check_interval}", + f"trainer.accumulate_grad_batches={llama_grad_batches}", + f"train_dataset.interactive_prob={llama_use_speaker}", + ] + ([f"+lora@model.model.lora_config=r_8_alpha_16"] if llama_use_lora else []) + logger.info(train_cmd) + subprocess.run(train_cmd) + + return build_html_ok_message(i18n("Training stopped")) + + +def tensorboard_process( + if_tensorboard: bool, + tensorboard_dir: str, + host: str, + port: str, +): + global p_tensorboard + if if_tensorboard == True and p_tensorboard == None: + url = f"http://{host}:{port}" + yield build_html_ok_message( + i18n("Tensorboard interface is launched at {}").format(url) + ) + prefix = ["tensorboard"] + if Path("fishenv").exists(): + prefix = ["fishenv/env/python.exe", "fishenv/env/Scripts/tensorboard.exe"] + + p_tensorboard = subprocess.Popen( + prefix + + [ + "--logdir", + tensorboard_dir, + "--host", + host, + "--port", + port, + "--reload_interval", + "120", + ] + ) + elif if_tensorboard == False and p_tensorboard != None: + kill_process(p_tensorboard.pid) + p_tensorboard = None + yield build_html_error_message(i18n("Tensorboard interface is closed")) + + +def fresh_tb_dir(): + return gr.Dropdown( + choices=[str(p) for p in Path("results").glob("**/tensorboard/")] + ) + + +def list_decoder_models(): + paths = [str(p) for p in Path("checkpoints").glob("fish*/firefly*.pth")] + if not paths: + logger.warning("No decoder model found") + return paths + + +def list_llama_models(): + choices = [str(p.parent) for p in Path("checkpoints").glob("merged*/*model*.pth")] + choices += [str(p.parent) for p in Path("checkpoints").glob("fish*/*model*.pth")] + choices += [str(p.parent) for p in Path("checkpoints").glob("fs*/*model*.pth")] + choices = sorted(choices, reverse=True) + if not choices: + logger.warning("No LLaMA model found") + return choices + + +def list_lora_llama_models(): + choices = sorted( + [str(p) for p in Path("results").glob("lora*/**/*.ckpt")], reverse=True + ) + if not choices: + logger.warning("No LoRA LLaMA model found") + return choices + + +def fresh_decoder_model(): + return gr.Dropdown(choices=list_decoder_models()) + + +def fresh_llama_ckpt(llama_use_lora): + return gr.Dropdown( + choices=[i18n("latest"), i18n("new")] + + ( + [str(p) for p in Path("results").glob("text2sem*/")] + if not llama_use_lora + else [str(p) for p in Path("results").glob("lora_*/")] + ) + ) + + +def fresh_llama_model(): + return gr.Dropdown(choices=list_llama_models()) + + +def llama_lora_merge(llama_weight, lora_llama_config, lora_weight, llama_lora_output): + if ( + lora_weight is None + or not Path(lora_weight).exists() + or not Path(llama_weight).exists() + ): + return build_html_error_message( + i18n( + "Path error, please check the model file exists in the corresponding path" + ) + ) + gr.Warning("Merging begins...") + merge_cmd = [ + PYTHON, + "tools/llama/merge_lora.py", + "--lora-config", + "r_8_alpha_16", + "--lora-weight", + lora_weight, + "--output", + llama_lora_output + "_" + generate_folder_name(), + ] + logger.info(merge_cmd) + subprocess.run(merge_cmd) + return build_html_ok_message(i18n("Merge successfully")) + + +def llama_quantify(llama_weight, quantify_mode): + if llama_weight is None or not Path(llama_weight).exists(): + return build_html_error_message( + i18n( + "Path error, please check the model file exists in the corresponding path" + ) + ) + + gr.Warning("Quantifying begins...") + + now = generate_folder_name() + quantify_cmd = [ + PYTHON, + "tools/llama/quantize.py", + "--checkpoint-path", + llama_weight, + "--mode", + quantify_mode, + "--timestamp", + now, + ] + logger.info(quantify_cmd) + subprocess.run(quantify_cmd) + if quantify_mode == "int8": + quantize_path = str( + Path(os.getcwd()) / "checkpoints" / f"fs-1.2-{quantify_mode}-{now}" + ) + else: + quantize_path = str( + Path(os.getcwd()) / "checkpoints" / f"fs-1.2-{quantify_mode}-g128-{now}" + ) + return build_html_ok_message( + i18n("Quantify successfully") + f"Path: {quantize_path}" + ) + + +init_vqgan_yml = load_yaml_data_in_fact(vqgan_yml_path) +init_llama_yml = load_yaml_data_in_fact(llama_yml_path) + +with gr.Blocks( + head="<style>\n" + css + "\n</style>", + js=js, + theme=seafoam, + analytics_enabled=False, + title="Fish Speech", +) as demo: + with gr.Row(): + with gr.Column(): + with gr.Tab("\U0001F4D6 " + i18n("Data Preprocessing")): + with gr.Row(): + textbox = gr.Textbox( + label="\U0000270F " + + i18n("Input Audio & Source Path for Transcription"), + info=i18n("Speaker is identified by the folder name"), + interactive=True, + ) + with gr.Row(equal_height=False): + with gr.Column(): + output_radio = gr.Radio( + label="\U0001F4C1 " + + i18n("Select source file processing method"), + choices=[i18n("Copy"), i18n("Move")], + value=i18n("Copy"), + interactive=True, + ) + with gr.Column(): + error = gr.HTML(label=i18n("Error Message")) + if_label = gr.Checkbox( + label=i18n("Open Labeler WebUI"), scale=0, show_label=True + ) + + with gr.Row(): + label_device = gr.Dropdown( + label=i18n("Labeling Device"), + info=i18n( + "It is recommended to use CUDA, if you have low configuration, use CPU" + ), + choices=["cpu", "cuda"], + value="cuda", + interactive=True, + ) + label_model = gr.Dropdown( + label=i18n("Whisper Model"), + info=i18n("Faster Whisper, Up to 5g GPU memory usage"), + choices=["large-v3", "medium"], + value="large-v3", + interactive=True, + ) + label_radio = gr.Dropdown( + label=i18n("Optional Label Language"), + info=i18n( + "If there is no corresponding text for the audio, apply ASR for assistance, support .txt or .lab format" + ), + choices=[ + (i18n("Chinese"), "zh"), + (i18n("English"), "en"), + (i18n("Japanese"), "ja"), + (i18n("Disabled"), "IGNORE"), + (i18n("auto"), "auto"), + ], + value="IGNORE", + interactive=True, + ) + + with gr.Row(): + if_initial_prompt = gr.Checkbox( + value=False, + label=i18n("Enable Initial Prompt"), + min_width=120, + scale=0, + ) + initial_prompt = gr.Textbox( + label=i18n("Initial Prompt"), + info=i18n( + "Initial prompt can provide contextual or vocabulary-specific guidance to the model." + ), + placeholder="This audio introduces the basic concepts and applications of artificial intelligence and machine learning.", + interactive=False, + ) + + with gr.Row(): + add_button = gr.Button( + "\U000027A1 " + i18n("Add to Processing Area"), + variant="primary", + ) + remove_button = gr.Button( + "\U000026D4 " + i18n("Remove Selected Data") + ) + + with gr.Tab("\U0001F6E0 " + i18n("Training Configuration")): + with gr.Row(): + model_type_radio = gr.Radio( + label=i18n( + "Select the model to be trained (Depending on the Tab page you are on)" + ), + interactive=False, + choices=["VQGAN", "LLAMA"], + value="VQGAN", + ) + with gr.Row(): + with gr.Tabs(): + with gr.Tab(label=i18n("VQGAN Configuration")) as vqgan_page: + gr.HTML("You don't need to train this model!") + + with gr.Tab(label=i18n("LLAMA Configuration")) as llama_page: + with gr.Row(equal_height=False): + llama_use_lora = gr.Checkbox( + label=i18n("Use LoRA"), + info=i18n( + "Use LoRA can save GPU memory, but may reduce the quality of the model" + ), + value=True, + interactive=True, + ) + llama_ckpt = gr.Dropdown( + label=i18n("Select LLAMA ckpt"), + choices=[i18n("latest"), i18n("new")] + + [ + str(p) + for p in Path("results").glob("text2sem*/") + ] + + [str(p) for p in Path("results").glob("lora*/")], + value=i18n("latest"), + interactive=True, + ) + with gr.Row(equal_height=False): + llama_lr_slider = gr.Slider( + label=i18n("Initial Learning Rate"), + info=i18n( + "lr smaller -> usually train slower but more stable" + ), + interactive=True, + minimum=1e-5, + maximum=1e-4, + step=1e-5, + value=5e-5, + ) + llama_maxsteps_slider = gr.Slider( + label=i18n("Maximum Training Steps"), + info=i18n( + "recommend: max_steps = num_audios // batch_size * (2 to 5)" + ), + interactive=True, + minimum=1, + maximum=10000, + step=1, + value=50, + ) + with gr.Row(equal_height=False): + llama_base_config = gr.Dropdown( + label=i18n("Model Size"), + choices=[ + "text2semantic_finetune", + ], + value="text2semantic_finetune", + ) + llama_data_num_workers_slider = gr.Slider( + label=i18n("Number of Workers"), + minimum=1, + maximum=32, + step=1, + value=4, + ) + with gr.Row(equal_height=False): + llama_data_batch_size_slider = gr.Slider( + label=i18n("Batch Size"), + interactive=True, + minimum=1, + maximum=32, + step=1, + value=4, + ) + llama_data_max_length_slider = gr.Slider( + label=i18n("Maximum Length per Sample"), + interactive=True, + minimum=1024, + maximum=4096, + step=128, + value=1024, + ) + with gr.Row(equal_height=False): + llama_precision_dropdown = gr.Dropdown( + label=i18n("Precision"), + info=i18n( + "bf16-true is recommended for 30+ series GPU, 16-mixed is recommended for 10+ series GPU" + ), + interactive=True, + choices=["32", "bf16-true", "16-mixed"], + value="bf16-true", + ) + llama_check_interval_slider = gr.Slider( + label=i18n("Save model every n steps"), + info=i18n( + "make sure that it's not greater than max_steps" + ), + interactive=True, + minimum=1, + maximum=1000, + step=1, + value=50, + ) + with gr.Row(equal_height=False): + llama_grad_batches = gr.Slider( + label=i18n("Accumulate Gradient Batches"), + interactive=True, + minimum=1, + maximum=20, + step=1, + value=init_llama_yml["trainer"][ + "accumulate_grad_batches" + ], + ) + llama_use_speaker = gr.Slider( + label=i18n( + "Probability of applying Speaker Condition" + ), + interactive=True, + minimum=0.1, + maximum=1.0, + step=0.05, + value=init_llama_yml["train_dataset"][ + "interactive_prob" + ], + ) + + with gr.Tab(label=i18n("Merge LoRA"), id=4): + with gr.Row(equal_height=False): + llama_weight = gr.Dropdown( + label=i18n("Base LLAMA Model"), + info=i18n( + "Type the path or select from the dropdown" + ), + choices=[ + "checkpoints/fish-speech-1.2-sft/model.pth", + ], + value="checkpoints/fish-speech-1.2-sft/model.pth", + allow_custom_value=True, + interactive=True, + ) + with gr.Row(equal_height=False): + lora_weight = gr.Dropdown( + label=i18n("LoRA Model to be merged"), + info=i18n( + "Type the path or select from the dropdown" + ), + choices=[ + str(p) + for p in Path("results").glob("lora*/**/*.ckpt") + ], + allow_custom_value=True, + interactive=True, + ) + lora_llama_config = gr.Dropdown( + label=i18n("LLAMA Model Config"), + info=i18n( + "Type the path or select from the dropdown" + ), + choices=[ + "text2semantic_finetune", + ], + value="text2semantic_finetune", + allow_custom_value=True, + ) + with gr.Row(equal_height=False): + llama_lora_output = gr.Dropdown( + label=i18n("Output Path"), + info=i18n( + "Type the path or select from the dropdown" + ), + value="checkpoints/merged", + choices=["checkpoints/merged"], + allow_custom_value=True, + interactive=True, + ) + with gr.Row(equal_height=False): + llama_lora_merge_btn = gr.Button( + value=i18n("Merge"), variant="primary" + ) + + with gr.Tab(label=i18n("Model Quantization"), id=5): + with gr.Row(equal_height=False): + llama_weight_to_quantify = gr.Dropdown( + label=i18n("Base LLAMA Model"), + info=i18n( + "Type the path or select from the dropdown" + ), + choices=list_llama_models(), + value="checkpoints/fish-speech-1.2-sft", + allow_custom_value=True, + interactive=True, + ) + quantify_mode = gr.Dropdown( + label=i18n("Post-quantification Precision"), + info=i18n( + "The lower the quantitative precision, the more the effectiveness may decrease, but the greater the efficiency will increase" + ), + choices=["int8", "int4"], + value="int8", + allow_custom_value=False, + interactive=True, + ) + with gr.Row(equal_height=False): + llama_quantify_btn = gr.Button( + value=i18n("Quantify"), variant="primary" + ) + + with gr.Tab(label="Tensorboard", id=6): + with gr.Row(equal_height=False): + tb_host = gr.Textbox( + label=i18n("Tensorboard Host"), value="127.0.0.1" + ) + tb_port = gr.Textbox( + label=i18n("Tensorboard Port"), value="11451" + ) + with gr.Row(equal_height=False): + tb_dir = gr.Dropdown( + label=i18n("Tensorboard Log Path"), + allow_custom_value=True, + choices=[ + str(p) + for p in Path("results").glob("**/tensorboard/") + ], + ) + with gr.Row(equal_height=False): + if_tb = gr.Checkbox( + label=i18n("Open Tensorboard"), + ) + + with gr.Tab("\U0001F9E0 " + i18n("Inference Configuration")): + with gr.Column(): + with gr.Row(): + with gr.Accordion( + label="\U0001F5A5 " + + i18n("Inference Server Configuration"), + open=False, + ): + with gr.Row(): + infer_host_textbox = gr.Textbox( + label=i18n("WebUI Host"), value="127.0.0.1" + ) + infer_port_textbox = gr.Textbox( + label=i18n("WebUI Port"), value="7862" + ) + with gr.Row(): + infer_decoder_model = gr.Dropdown( + label=i18n("Decoder Model Path"), + info=i18n( + "Type the path or select from the dropdown" + ), + choices=list_decoder_models(), + value="checkpoints/fish-speech-1.2-sft/firefly-gan-vq-fsq-4x1024-42hz-generator.pth", + allow_custom_value=True, + ) + infer_decoder_config = gr.Dropdown( + label=i18n("Decoder Model Config"), + info=i18n("Changing with the Model Path"), + value="firefly_gan_vq", + choices=[ + "firefly_gan_vq", + ], + allow_custom_value=True, + ) + with gr.Row(): + infer_llama_model = gr.Dropdown( + label=i18n("LLAMA Model Path"), + info=i18n( + "Type the path or select from the dropdown" + ), + value="checkpoints/fish-speech-1.2-sft", + choices=list_llama_models(), + allow_custom_value=True, + ) + + with gr.Row(): + infer_compile = gr.Radio( + label=i18n("Compile Model"), + info=i18n( + "Compile the model can significantly reduce the inference time, but will increase cold start time" + ), + choices=["Yes", "No"], + value=( + "Yes" if (sys.platform == "linux") else "No" + ), + interactive=is_module_installed("triton"), + ) + + with gr.Row(): + infer_checkbox = gr.Checkbox( + label=i18n("Open Inference Server") + ) + infer_error = gr.HTML(label=i18n("Inference Server Error")) + + with gr.Column(): + train_error = gr.HTML(label=i18n("Training Error")) + checkbox_group = gr.CheckboxGroup( + label="\U0001F4CA " + i18n("Data Source"), + info=i18n( + "The path of the input folder on the left or the filelist. Whether checked or not, it will be used for subsequent training in this list." + ), + elem_classes=["data_src"], + ) + train_box = gr.Textbox( + label=i18n("Data Preprocessing Path"), + value=str(data_pre_output), + interactive=False, + ) + model_box = gr.Textbox( + label="\U0001F4BE " + i18n("Model Output Path"), + value=str(default_model_output), + interactive=False, + ) + + with gr.Accordion( + i18n( + "View the status of the preprocessing folder (use the slider to control the depth of the tree)" + ), + elem_classes=["scrollable-component"], + elem_id="file_accordion", + ): + tree_slider = gr.Slider( + minimum=0, + maximum=3, + value=0, + step=1, + show_label=False, + container=False, + ) + file_markdown = new_explorer(str(data_pre_output), 0) + with gr.Row(equal_height=False): + admit_btn = gr.Button( + "\U00002705 " + i18n("File Preprocessing"), + variant="primary", + ) + fresh_btn = gr.Button("\U0001F503", scale=0, min_width=80) + help_button = gr.Button("\U00002753", scale=0, min_width=80) # question + train_btn = gr.Button(i18n("Start Training"), variant="primary") + + footer = load_data_in_raw("fish_speech/webui/html/footer.html") + footer = footer.format( + versions=versions_html(), + api_docs="https://speech.fish.audio/inference/#http-api", + ) + gr.HTML(footer, elem_id="footer") + vqgan_page.select(lambda: "VQGAN", None, model_type_radio) + llama_page.select(lambda: "LLAMA", None, model_type_radio) + add_button.click( + fn=add_item, + inputs=[textbox, output_radio, label_radio, if_initial_prompt, initial_prompt], + outputs=[checkbox_group, error], + ) + remove_button.click( + fn=remove_items, inputs=[checkbox_group], outputs=[checkbox_group, error] + ) + checkbox_group.change(fn=show_selected, inputs=checkbox_group, outputs=[error]) + help_button.click( + fn=None, + js='() => { window.open("https://speech.fish.audio/", "newwindow", "height=100, width=400, ' + 'toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")}', + ) + if_label.change(fn=change_label, inputs=[if_label], outputs=[error]) + if_initial_prompt.change( + fn=lambda x: gr.Textbox(value="", interactive=x), + inputs=[if_initial_prompt], + outputs=[initial_prompt], + ) + train_btn.click( + fn=train_process, + inputs=[ + train_box, + model_type_radio, + # llama config + llama_ckpt, + llama_base_config, + llama_lr_slider, + llama_maxsteps_slider, + llama_data_num_workers_slider, + llama_data_batch_size_slider, + llama_data_max_length_slider, + llama_precision_dropdown, + llama_check_interval_slider, + llama_grad_batches, + llama_use_speaker, + llama_use_lora, + ], + outputs=[train_error], + ) + if_tb.change( + fn=tensorboard_process, + inputs=[if_tb, tb_dir, tb_host, tb_port], + outputs=[train_error], + ) + tb_dir.change(fn=fresh_tb_dir, inputs=[], outputs=[tb_dir]) + infer_decoder_model.change( + fn=fresh_decoder_model, inputs=[], outputs=[infer_decoder_model] + ) + infer_llama_model.change( + fn=fresh_llama_model, inputs=[], outputs=[infer_llama_model] + ) + llama_weight.change(fn=fresh_llama_model, inputs=[], outputs=[llama_weight]) + admit_btn.click( + fn=check_files, + inputs=[train_box, tree_slider, label_model, label_device], + outputs=[error, file_markdown], + ) + fresh_btn.click( + fn=new_explorer, inputs=[train_box, tree_slider], outputs=[file_markdown] + ) + llama_use_lora.change( + fn=fresh_llama_ckpt, inputs=[llama_use_lora], outputs=[llama_ckpt] + ) + llama_ckpt.change( + fn=fresh_llama_ckpt, inputs=[llama_use_lora], outputs=[llama_ckpt] + ) + lora_weight.change( + fn=lambda: gr.Dropdown(choices=list_lora_llama_models()), + inputs=[], + outputs=[lora_weight], + ) + llama_lora_merge_btn.click( + fn=llama_lora_merge, + inputs=[llama_weight, lora_llama_config, lora_weight, llama_lora_output], + outputs=[train_error], + ) + llama_quantify_btn.click( + fn=llama_quantify, + inputs=[llama_weight_to_quantify, quantify_mode], + outputs=[train_error], + ) + infer_checkbox.change( + fn=change_infer, + inputs=[ + infer_checkbox, + infer_host_textbox, + infer_port_textbox, + infer_decoder_model, + infer_decoder_config, + infer_llama_model, + infer_compile, + ], + outputs=[infer_error], + ) + +demo.launch(inbrowser=True) diff --git a/xinference/thirdparty/fish_speech/tools/__init__.py b/xinference/thirdparty/fish_speech/tools/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/tools/api.py b/xinference/thirdparty/fish_speech/tools/api.py new file mode 100644 index 0000000000..a11d30b227 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/api.py @@ -0,0 +1,495 @@ +import base64 +import io +import json +import queue +import random +import sys +import traceback +import wave +from argparse import ArgumentParser +from http import HTTPStatus +from pathlib import Path +from typing import Annotated, Literal, Optional + +import numpy as np +# import pyrootutils +import soundfile as sf +import torch +import torchaudio +# from kui.asgi import ( +# Body, +# HTTPException, +# HttpView, +# JSONResponse, +# Kui, +# OpenAPI, +# StreamResponse, +# ) +# from kui.asgi.routing import MultimethodRoutes +from loguru import logger +from pydantic import BaseModel, Field + +# pyrootutils.setup_root(__file__, indicator=".project-root", pythonpath=True) + +# from fish_speech.models.vqgan.lit_module import VQGAN +from fish_speech.models.vqgan.modules.firefly import FireflyArchitecture +from fish_speech.utils import autocast_exclude_mps +from tools.auto_rerank import batch_asr, calculate_wer, is_chinese, load_model +from tools.llama.generate import ( + GenerateRequest, + GenerateResponse, + WrappedGenerateResponse, + launch_thread_safe_queue, +) +from tools.vqgan.inference import load_model as load_decoder_model + + +def wav_chunk_header(sample_rate=44100, bit_depth=16, channels=1): + buffer = io.BytesIO() + + with wave.open(buffer, "wb") as wav_file: + wav_file.setnchannels(channels) + wav_file.setsampwidth(bit_depth // 8) + wav_file.setframerate(sample_rate) + + wav_header_bytes = buffer.getvalue() + buffer.close() + return wav_header_bytes + + +# Define utils for web server +# async def http_execption_handler(exc: HTTPException): +# return JSONResponse( +# dict( +# statusCode=exc.status_code, +# message=exc.content, +# error=HTTPStatus(exc.status_code).phrase, +# ), +# exc.status_code, +# exc.headers, +# ) + + +async def other_exception_handler(exc: "Exception"): + traceback.print_exc() + + status = HTTPStatus.INTERNAL_SERVER_ERROR + return JSONResponse( + dict(statusCode=status, message=str(exc), error=status.phrase), + status, + ) + + +def load_audio(reference_audio, sr): + if len(reference_audio) > 255 or not Path(reference_audio).exists(): + try: + audio_data = base64.b64decode(reference_audio) + reference_audio = io.BytesIO(audio_data) + except base64.binascii.Error: + raise ValueError("Invalid path or base64 string") + + waveform, original_sr = torchaudio.load( + reference_audio, backend="sox" if sys.platform == "linux" else "soundfile" + ) + + if waveform.shape[0] > 1: + waveform = torch.mean(waveform, dim=0, keepdim=True) + + if original_sr != sr: + resampler = torchaudio.transforms.Resample(orig_freq=original_sr, new_freq=sr) + waveform = resampler(waveform) + + audio = waveform.squeeze().numpy() + return audio + + +def encode_reference(*, decoder_model, reference_audio, enable_reference_audio): + if enable_reference_audio and reference_audio is not None: + # Load audios, and prepare basic info here + reference_audio_content = load_audio( + reference_audio, decoder_model.spec_transform.sample_rate + ) + + audios = torch.from_numpy(reference_audio_content).to(decoder_model.device)[ + None, None, : + ] + audio_lengths = torch.tensor( + [audios.shape[2]], device=decoder_model.device, dtype=torch.long + ) + logger.info( + f"Loaded audio with {audios.shape[2] / decoder_model.spec_transform.sample_rate:.2f} seconds" + ) + + # VQ Encoder + if isinstance(decoder_model, FireflyArchitecture): + prompt_tokens = decoder_model.encode(audios, audio_lengths)[0][0] + + logger.info(f"Encoded prompt: {prompt_tokens.shape}") + else: + prompt_tokens = None + logger.info("No reference audio provided") + + return prompt_tokens + + +def decode_vq_tokens( + *, + decoder_model, + codes, +): + feature_lengths = torch.tensor([codes.shape[1]], device=decoder_model.device) + logger.info(f"VQ features: {codes.shape}") + + if isinstance(decoder_model, FireflyArchitecture): + # VQGAN Inference + return decoder_model.decode( + indices=codes[None], + feature_lengths=feature_lengths, + ).squeeze() + + raise ValueError(f"Unknown model type: {type(decoder_model)}") + + +# routes = MultimethodRoutes(base_class=HttpView) + + +def get_random_paths(base_path, data, speaker, emotion): + if base_path and data and speaker and emotion and (Path(base_path).exists()): + if speaker in data and emotion in data[speaker]: + files = data[speaker][emotion] + lab_files = [f for f in files if f.endswith(".lab")] + wav_files = [f for f in files if f.endswith(".wav")] + + if lab_files and wav_files: + selected_lab = random.choice(lab_files) + selected_wav = random.choice(wav_files) + + lab_path = Path(base_path) / speaker / emotion / selected_lab + wav_path = Path(base_path) / speaker / emotion / selected_wav + if lab_path.exists() and wav_path.exists(): + return lab_path, wav_path + + return None, None + + +def load_json(json_file): + if not json_file: + logger.info("Not using a json file") + return None + try: + with open(json_file, "r", encoding="utf-8") as file: + data = json.load(file) + except FileNotFoundError: + logger.warning(f"ref json not found: {json_file}") + data = None + except Exception as e: + logger.warning(f"Loading json failed: {e}") + data = None + return data + + +class InvokeRequest(BaseModel): + text: str = "你说的对, 但是原神是一款由米哈游自主研发的开放世界手游." + reference_text: Optional[str] = None + reference_audio: Optional[str] = None + max_new_tokens: int = 1024 + chunk_length: Annotated[int, Field(ge=0, le=500, strict=True)] = 100 + top_p: Annotated[float, Field(ge=0.1, le=1.0, strict=True)] = 0.7 + repetition_penalty: Annotated[float, Field(ge=0.9, le=2.0, strict=True)] = 1.2 + temperature: Annotated[float, Field(ge=0.1, le=1.0, strict=True)] = 0.7 + emotion: Optional[str] = None + format: Literal["wav", "mp3", "flac"] = "wav" + streaming: bool = False + ref_json: Optional[str] = "ref_data.json" + ref_base: Optional[str] = "ref_data" + speaker: Optional[str] = None + + +def get_content_type(audio_format): + if audio_format == "wav": + return "audio/wav" + elif audio_format == "flac": + return "audio/flac" + elif audio_format == "mp3": + return "audio/mpeg" + else: + return "application/octet-stream" + + +@torch.inference_mode() +def inference(req: InvokeRequest): + # Parse reference audio aka prompt + prompt_tokens = None + + ref_data = load_json(req.ref_json) + ref_base = req.ref_base + + lab_path, wav_path = get_random_paths(ref_base, ref_data, req.speaker, req.emotion) + + if lab_path and wav_path: + with open(lab_path, "r", encoding="utf-8") as lab_file: + ref_text = lab_file.read() + req.reference_audio = wav_path + req.reference_text = ref_text + logger.info("ref_path: " + str(wav_path)) + logger.info("ref_text: " + ref_text) + + # Parse reference audio aka prompt + prompt_tokens = encode_reference( + decoder_model=decoder_model, + reference_audio=req.reference_audio, + enable_reference_audio=req.reference_audio is not None, + ) + logger.info(f"ref_text: {req.reference_text}") + # LLAMA Inference + request = dict( + device=decoder_model.device, + max_new_tokens=req.max_new_tokens, + text=req.text, + top_p=req.top_p, + repetition_penalty=req.repetition_penalty, + temperature=req.temperature, + compile=args.compile, + iterative_prompt=req.chunk_length > 0, + chunk_length=req.chunk_length, + max_length=2048, + prompt_tokens=prompt_tokens, + prompt_text=req.reference_text, + ) + + response_queue = queue.Queue() + llama_queue.put( + GenerateRequest( + request=request, + response_queue=response_queue, + ) + ) + + if req.streaming: + yield wav_chunk_header() + + segments = [] + while True: + result: WrappedGenerateResponse = response_queue.get() + if result.status == "error": + raise result.response + break + + result: GenerateResponse = result.response + if result.action == "next": + break + + with autocast_exclude_mps( + device_type=decoder_model.device.type, dtype=args.precision + ): + fake_audios = decode_vq_tokens( + decoder_model=decoder_model, + codes=result.codes, + ) + + fake_audios = fake_audios.float().cpu().numpy() + + if req.streaming: + yield (fake_audios * 32768).astype(np.int16).tobytes() + else: + segments.append(fake_audios) + + if req.streaming: + return + + if len(segments) == 0: + raise HTTPException( + HTTPStatus.INTERNAL_SERVER_ERROR, + content="No audio generated, please check the input text.", + ) + + fake_audios = np.concatenate(segments, axis=0) + yield fake_audios + + +def auto_rerank_inference(req: InvokeRequest, use_auto_rerank: bool = True): + if not use_auto_rerank: + # 如果不使用 auto_rerank,直接调用原始的 inference 函数 + return inference(req) + + zh_model, en_model = load_model() + max_attempts = 5 + best_wer = float("inf") + best_audio = None + + for attempt in range(max_attempts): + # 调用原始的 inference 函数 + audio_generator = inference(req) + fake_audios = next(audio_generator) + + asr_result = batch_asr( + zh_model if is_chinese(req.text) else en_model, [fake_audios], 44100 + )[0] + wer = calculate_wer(req.text, asr_result["text"]) + + if wer <= 0.1 and not asr_result["huge_gap"]: + return fake_audios + + if wer < best_wer: + best_wer = wer + best_audio = fake_audios + + if attempt == max_attempts - 1: + break + + return best_audio + + +async def inference_async(req: InvokeRequest): + for chunk in inference(req): + yield chunk + + +async def buffer_to_async_generator(buffer): + yield buffer + + +# @routes.http.post("/v1/invoke") +# async def api_invoke_model( +# req: Annotated[InvokeRequest, Body(exclusive=True)], +# ): +# """ +# Invoke model and generate audio +# """ +# +# if args.max_text_length > 0 and len(req.text) > args.max_text_length: +# raise HTTPException( +# HTTPStatus.BAD_REQUEST, +# content=f"Text is too long, max length is {args.max_text_length}", +# ) +# +# if req.streaming and req.format != "wav": +# raise HTTPException( +# HTTPStatus.BAD_REQUEST, +# content="Streaming only supports WAV format", +# ) +# +# if req.streaming: +# return StreamResponse( +# iterable=inference_async(req), +# headers={ +# "Content-Disposition": f"attachment; filename=audio.{req.format}", +# }, +# content_type=get_content_type(req.format), +# ) +# else: +# fake_audios = next(inference(req)) +# buffer = io.BytesIO() +# sf.write( +# buffer, +# fake_audios, +# decoder_model.spec_transform.sample_rate, +# format=req.format, +# ) +# +# return StreamResponse( +# iterable=buffer_to_async_generator(buffer.getvalue()), +# headers={ +# "Content-Disposition": f"attachment; filename=audio.{req.format}", +# }, +# content_type=get_content_type(req.format), +# ) +# +# +# @routes.http.post("/v1/health") +# async def api_health(): +# """ +# Health check +# """ +# +# return JSONResponse({"status": "ok"}) + + +def parse_args(): + parser = ArgumentParser() + parser.add_argument( + "--llama-checkpoint-path", + type=str, + default="checkpoints/fish-speech-1.2-sft", + ) + parser.add_argument( + "--decoder-checkpoint-path", + type=str, + default="checkpoints/fish-speech-1.2-sft/firefly-gan-vq-fsq-4x1024-42hz-generator.pth", + ) + parser.add_argument("--decoder-config-name", type=str, default="firefly_gan_vq") + parser.add_argument("--device", type=str, default="cuda") + parser.add_argument("--half", action="store_true") + parser.add_argument("--compile", action="store_true") + parser.add_argument("--max-text-length", type=int, default=0) + parser.add_argument("--listen", type=str, default="127.0.0.1:8000") + parser.add_argument("--workers", type=int, default=1) + parser.add_argument("--use-auto-rerank", type=bool, default=True) + + return parser.parse_args() + + +# Define Kui app +# openapi = OpenAPI( +# { +# "title": "Fish Speech API", +# }, +# ).routes +# +# app = Kui( +# routes=routes + openapi[1:], # Remove the default route +# exception_handlers={ +# HTTPException: http_execption_handler, +# Exception: other_exception_handler, +# }, +# cors_config={}, +# ) + + +if __name__ == "__main__": + import threading + + import uvicorn + + args = parse_args() + args.precision = torch.half if args.half else torch.bfloat16 + + logger.info("Loading Llama model...") + llama_queue = launch_thread_safe_queue( + checkpoint_path=args.llama_checkpoint_path, + device=args.device, + precision=args.precision, + compile=args.compile, + ) + logger.info("Llama model loaded, loading VQ-GAN model...") + + decoder_model = load_decoder_model( + config_name=args.decoder_config_name, + checkpoint_path=args.decoder_checkpoint_path, + device=args.device, + ) + + logger.info("VQ-GAN model loaded, warming up...") + + # Dry run to check if the model is loaded correctly and avoid the first-time latency + list( + inference( + InvokeRequest( + text="Hello world.", + reference_text=None, + reference_audio=None, + max_new_tokens=0, + top_p=0.7, + repetition_penalty=1.2, + temperature=0.7, + emotion=None, + format="wav", + ref_base=None, + ref_json=None, + ) + ) + ) + + logger.info(f"Warming up done, starting server at http://{args.listen}") + host, port = args.listen.split(":") + uvicorn.run(app, host=host, port=int(port), workers=args.workers, log_level="info") diff --git a/xinference/thirdparty/fish_speech/tools/auto_rerank.py b/xinference/thirdparty/fish_speech/tools/auto_rerank.py new file mode 100644 index 0000000000..0297d63d77 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/auto_rerank.py @@ -0,0 +1,159 @@ +import os + +os.environ["MODELSCOPE_CACHE"] = ".cache/" + +import string +import time +from threading import Lock + +import librosa +import numpy as np +import opencc +import torch +from faster_whisper import WhisperModel + +t2s_converter = opencc.OpenCC("t2s") + + +def load_model(*, device="cuda"): + model = WhisperModel( + "medium", + device=device, + compute_type="float16", + download_root="faster_whisper", + ) + print("faster_whisper loaded!") + return model + + +@torch.no_grad() +def batch_asr_internal(model: WhisperModel, audios, sr): + resampled_audios = [] + for audio in audios: + + if isinstance(audio, np.ndarray): + audio = torch.from_numpy(audio).float() + + if audio.dim() > 1: + audio = audio.squeeze() + + assert audio.dim() == 1 + audio_np = audio.numpy() + resampled_audio = librosa.resample(audio_np, orig_sr=sr, target_sr=16000) + resampled_audios.append(resampled_audio) + + trans_results = [] + + for resampled_audio in resampled_audios: + segments, info = model.transcribe( + resampled_audio, + language=None, + beam_size=5, + initial_prompt="Punctuation is needed in any language.", + ) + trans_results.append(list(segments)) + + results = [] + for trans_res, audio in zip(trans_results, audios): + + duration = len(audio) / sr * 1000 + huge_gap = False + max_gap = 0.0 + + text = None + last_tr = None + + for tr in trans_res: + delta = tr.text.strip() + if tr.id > 1: + max_gap = max(tr.start - last_tr.end, max_gap) + text += delta + else: + text = delta + + last_tr = tr + if max_gap > 3.0: + huge_gap = True + break + + sim_text = t2s_converter.convert(text) + results.append( + { + "text": sim_text, + "duration": duration, + "huge_gap": huge_gap, + } + ) + + return results + + +global_lock = Lock() + + +def batch_asr(model, audios, sr): + return batch_asr_internal(model, audios, sr) + + +def is_chinese(text): + return True + + +def calculate_wer(text1, text2, debug=False): + chars1 = remove_punctuation(text1) + chars2 = remove_punctuation(text2) + + m, n = len(chars1), len(chars2) + + if m > n: + chars1, chars2 = chars2, chars1 + m, n = n, m + + prev = list(range(m + 1)) # row 0 distance: [0, 1, 2, ...] + curr = [0] * (m + 1) + + for j in range(1, n + 1): + curr[0] = j + for i in range(1, m + 1): + if chars1[i - 1] == chars2[j - 1]: + curr[i] = prev[i - 1] + else: + curr[i] = min(prev[i], curr[i - 1], prev[i - 1]) + 1 + prev, curr = curr, prev + + edits = prev[m] + tot = max(len(chars1), len(chars2)) + wer = edits / tot + + if debug: + print(" gt: ", chars1) + print(" pred: ", chars2) + print(" edits/tot = wer: ", edits, "/", tot, "=", wer) + + return wer + + +def remove_punctuation(text): + chinese_punctuation = ( + " \n\t”“!?。。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃《》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—" + '‛""„‟…‧﹏' + ) + all_punctuation = string.punctuation + chinese_punctuation + translator = str.maketrans("", "", all_punctuation) + text_without_punctuation = text.translate(translator) + return text_without_punctuation + + +if __name__ == "__main__": + model = load_model() + audios = [ + librosa.load("44100.wav", sr=44100)[0], + librosa.load("lengyue.wav", sr=44100)[0], + ] + print(np.array(audios[0])) + print(batch_asr(model, audios, 44100)) + + start_time = time.time() + for _ in range(10): + print(batch_asr(model, audios, 44100)) + print("Time taken:", time.time() - start_time) diff --git a/xinference/thirdparty/fish_speech/tools/download_models.py b/xinference/thirdparty/fish_speech/tools/download_models.py new file mode 100644 index 0000000000..480f3be0f4 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/download_models.py @@ -0,0 +1,55 @@ +import os + +from huggingface_hub import hf_hub_download + + +# Download +def check_and_download_files(repo_id, file_list, local_dir): + os.makedirs(local_dir, exist_ok=True) + for file in file_list: + file_path = os.path.join(local_dir, file) + if not os.path.exists(file_path): + print(f"{file} 不存在,从 Hugging Face 仓库下载...") + hf_hub_download( + repo_id=repo_id, + filename=file, + resume_download=True, + local_dir=local_dir, + local_dir_use_symlinks=False, + ) + else: + print(f"{file} 已存在,跳过下载。") + + +# 1st +repo_id_1 = "fishaudio/fish-speech-1.2-sft" +local_dir_1 = "./checkpoints/fish-speech-1.2-sft" +files_1 = [ + "model.pth", + "README.md", + "special_tokens_map.json", + "tokenizer_config.json", + "tokenizer.json", + "config.json", + "firefly-gan-vq-fsq-4x1024-42hz-generator.pth", +] + +# 3rd +repo_id_3 = "fishaudio/fish-speech-1" +local_dir_3 = "./" +files_3 = [ + "ffmpeg.exe", + "ffprobe.exe", +] + +# 4th +repo_id_4 = "SpicyqSama007/fish-speech-packed" +local_dir_4 = "./" +files_4 = [ + "asr-label-win-x64.exe", +] + +check_and_download_files(repo_id_1, files_1, local_dir_1) + +check_and_download_files(repo_id_3, files_3, local_dir_3) +check_and_download_files(repo_id_4, files_4, local_dir_4) diff --git a/xinference/thirdparty/fish_speech/tools/extract_model.py b/xinference/thirdparty/fish_speech/tools/extract_model.py new file mode 100644 index 0000000000..97fe62507b --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/extract_model.py @@ -0,0 +1,21 @@ +import click +import torch +from loguru import logger + + +@click.command() +@click.argument("model_path") +@click.argument("output_path") +def main(model_path, output_path): + if model_path == output_path: + logger.error("Model path and output path are the same") + return + + logger.info(f"Loading model from {model_path}") + state_dict = torch.load(model_path, map_location="cpu")["state_dict"] + torch.save(state_dict, output_path) + logger.info(f"Model saved to {output_path}") + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/fish_speech/tools/file.py b/xinference/thirdparty/fish_speech/tools/file.py new file mode 100644 index 0000000000..b4b8051d6f --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/file.py @@ -0,0 +1,108 @@ +from pathlib import Path +from typing import Union + +from loguru import logger +from natsort import natsorted + +AUDIO_EXTENSIONS = { + ".mp3", + ".wav", + ".flac", + ".ogg", + ".m4a", + ".wma", + ".aac", + ".aiff", + ".aif", + ".aifc", +} + +VIDEO_EXTENSIONS = { + ".mp4", + ".avi", +} + + +def list_files( + path: Union[Path, str], + extensions: set[str] = None, + recursive: bool = False, + sort: bool = True, +) -> list[Path]: + """List files in a directory. + + Args: + path (Path): Path to the directory. + extensions (set, optional): Extensions to filter. Defaults to None. + recursive (bool, optional): Whether to search recursively. Defaults to False. + sort (bool, optional): Whether to sort the files. Defaults to True. + + Returns: + list: List of files. + """ + + if isinstance(path, str): + path = Path(path) + + if not path.exists(): + raise FileNotFoundError(f"Directory {path} does not exist.") + + files = [file for ext in extensions for file in path.rglob(f"*{ext}")] + + if sort: + files = natsorted(files) + + return files + + +def load_filelist(path: Path | str) -> list[tuple[Path, str, str, str]]: + """ + Load a Bert-VITS2 style filelist. + """ + + files = set() + results = [] + count_duplicated, count_not_found = 0, 0 + + LANGUAGE_TO_LANGUAGES = { + "zh": ["zh", "en"], + "jp": ["jp", "en"], + "en": ["en"], + } + + with open(path, "r", encoding="utf-8") as f: + for line in f.readlines(): + splits = line.strip().split("|", maxsplit=3) + if len(splits) != 4: + logger.warning(f"Invalid line: {line}") + continue + + filename, speaker, language, text = splits + file = Path(filename) + language = language.strip().lower() + + if language == "ja": + language = "jp" + + assert language in ["zh", "jp", "en"], f"Invalid language {language}" + languages = LANGUAGE_TO_LANGUAGES[language] + + if file in files: + logger.warning(f"Duplicated file: {file}") + count_duplicated += 1 + continue + + if not file.exists(): + logger.warning(f"File not found: {file}") + count_not_found += 1 + continue + + results.append((file, speaker, languages, text)) + + if count_duplicated > 0: + logger.warning(f"Total duplicated files: {count_duplicated}") + + if count_not_found > 0: + logger.warning(f"Total files not found: {count_not_found}") + + return results diff --git a/xinference/thirdparty/fish_speech/tools/gen_ref.py b/xinference/thirdparty/fish_speech/tools/gen_ref.py new file mode 100644 index 0000000000..a771903b02 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/gen_ref.py @@ -0,0 +1,36 @@ +import json +from pathlib import Path + + +def scan_folder(base_path): + wav_lab_pairs = {} + + base = Path(base_path) + for suf in ["wav", "lab"]: + for f in base.rglob(f"*.{suf}"): + relative_path = f.relative_to(base) + parts = relative_path.parts + print(parts) + if len(parts) >= 3: + character = parts[0] + emotion = parts[1] + + if character not in wav_lab_pairs: + wav_lab_pairs[character] = {} + if emotion not in wav_lab_pairs[character]: + wav_lab_pairs[character][emotion] = [] + wav_lab_pairs[character][emotion].append(str(f.name)) + + return wav_lab_pairs + + +def save_to_json(data, output_file): + with open(output_file, "w", encoding="utf-8") as file: + json.dump(data, file, ensure_ascii=False, indent=2) + + +base_path = "ref_data" +out_ref_file = "ref_data.json" + +wav_lab_pairs = scan_folder(base_path) +save_to_json(wav_lab_pairs, out_ref_file) diff --git a/xinference/thirdparty/fish_speech/tools/llama/__init__.py b/xinference/thirdparty/fish_speech/tools/llama/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/tools/llama/build_dataset.py b/xinference/thirdparty/fish_speech/tools/llama/build_dataset.py new file mode 100644 index 0000000000..20e2219956 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/llama/build_dataset.py @@ -0,0 +1,169 @@ +import itertools +import os +import re +from collections import defaultdict +from functools import partial +from multiprocessing import Pool +from pathlib import Path + +import click +import numpy as np +from loguru import logger +from tqdm import tqdm + +from fish_speech.datasets.protos.text_data_pb2 import Semantics, Sentence, TextData +from fish_speech.datasets.protos.text_data_stream import pack_pb_stream +from fish_speech.utils.file import load_filelist + +# To avoid CPU overload +os.environ["MKL_NUM_THREADS"] = "1" +os.environ["OMP_NUM_THREADS"] = "1" + + +def task_generator_folder(root: Path, text_extension: str): + files = list(tqdm(Path(root).rglob("*.npy"), desc=f"Loading {root}")) + files = sorted(files) + + grouped_files = defaultdict(list) + for file in tqdm(files, desc=f"Grouping {root}"): + p = str(file.parent) + speaker = file.parent.name + + try: + if isinstance(text_extension, str): + texts = [file.with_suffix(text_extension).read_text(encoding="utf-8")] + else: + texts = [ + file.with_suffix(ext).read_text(encoding="utf-8") + for ext in text_extension + ] + except Exception as e: + logger.error(f"Failed to read text {file}: {e}") + continue + + grouped_files[p].append((speaker, file, texts)) + + logger.info( + f"Found {len(grouped_files)} groups in {root}, {list(grouped_files.keys())[:5]}..." + ) + + for i in grouped_files.values(): + subset = [(f, t) for _, f, t in i] + yield i[0][0], subset, "folder" + + +def task_generator_filelist(filelist): + grouped_files = defaultdict(list) + for filename, speaker, _, text in load_filelist(filelist): + grouped_files[speaker].append((Path(filename), [text])) + + logger.info(f"Found {len(grouped_files)} groups in {filelist}") + for speaker, values in grouped_files.items(): + yield speaker, values, "filelist" + + +def run_task(task): + name, subset, source = task + + # Parse the files + sentences = [] + for file, texts in subset: + np_file = file.with_suffix(".npy") + if np_file.exists() is False: + logger.warning(f"Can't find {np_file}") + continue + + new_texts = [] + + for text in texts: + # Simple cleaning: replace { xxx } and < xxx > with space + text = re.sub(r"\{.*?\}", " ", text) + text = re.sub(r"<.*?>", " ", text) + text = re.sub(r"\s+", " ", text) + new_texts.append(text) + + try: + semantics = np.load(np_file) + except Exception as e: + logger.error(f"Failed to parse {file}: {e}") + continue + + if isinstance(semantics, np.ndarray): + semantics = semantics.tolist() + + sentences.append( + Sentence( + texts=new_texts, + semantics=[Semantics(values=s) for s in semantics], + ) + ) + + # Pack the sentences + return pack_pb_stream( + TextData( + source=source, + name=name, + sentences=sentences, + ) + ) + + +@click.command() +@click.option( + "--input", + type=click.Path(path_type=Path), + required=True, + help="A folder containing the dataset or a filelist", + multiple=True, +) +@click.option( + "--output", type=click.Path(path_type=Path), default="data/quantized-dataset-ft" +) +@click.option("--num-workers", type=int, default=16) +@click.option("--text-extension", type=str, default=[".txt"], multiple=True) +@click.option( + "--shard-size", type=int, default=10, help="The maximum size of each shard in mb" +) +def main(input, output, num_workers, text_extension, shard_size): + generator_fns = [] + + for f in input: + assert f.exists(), f"{f} not found" + + if f.is_dir(): + generator_fn = task_generator_folder(f, text_extension) + else: + generator_fn = task_generator_filelist(f) + + generator_fns.append(generator_fn) + + generator_fn = itertools.chain(*generator_fns) + output.mkdir(parents=True, exist_ok=True) + + dataset_fp = None + tar_idx = 0 + written_size = 0 + + with Pool(num_workers) as p: + for result in tqdm(p.imap_unordered(run_task, generator_fn)): + if dataset_fp is None: + dataset_fp = open(Path(output) / f"{tar_idx:08d}.protos", "wb") + + dataset_fp.write(result) + written_size += len(result) + + if written_size > shard_size * 1024 * 1024: + logger.info(f"Finished writing {tar_idx} shards to {output}") + dataset_fp.close() + dataset_fp = None + written_size = 0 + tar_idx += 1 + + if dataset_fp is not None: + dataset_fp.close() + + logger.info(f"Finished writing {tar_idx + 1} shards to {output}") + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/fish_speech/tools/llama/eval_in_context.py b/xinference/thirdparty/fish_speech/tools/llama/eval_in_context.py new file mode 100644 index 0000000000..f3fb3f969e --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/llama/eval_in_context.py @@ -0,0 +1,171 @@ +# import pyrootutils +import torch +import torch.nn.functional as F +from matplotlib import pyplot as plt +from transformers import AutoTokenizer + +# register eval resolver and root +# pyrootutils.setup_root(__file__, indicator=".project-root", pythonpath=True) + +from torch.utils.data import DataLoader + +from fish_speech.datasets.semantic import AutoAugTextDataset, TextDataCollator +from tools.llama.generate import load_model + + +def smooth( + scalars: list[float], weight: float +) -> list[float]: # Weight between 0 and 1 + last = scalars[0] # First value in the plot (first timestep) + smoothed = list() + for point in scalars: + smoothed_val = last * weight + (1 - weight) * point # Calculate smoothed value + smoothed.append(smoothed_val) # Save it + last = smoothed_val # Anchor the last smoothed value + + return smoothed + + +@torch.inference_mode() +def analyze_one_model(loader, config, weight, max_length): + device = "cuda" if torch.cuda.is_available() else "cpu" + model = load_model( + config, + weight, + device, + torch.bfloat16, + max_length, + compile=False, + )[0] + + current_step = 0 + model.eval() + + semantic_loss_sum = torch.zeros( + max_length, + dtype=torch.float32, + device=device, + ) + counter = torch.zeros( + max_length, + dtype=torch.long, + device=device, + ) + + for batch in loader: + batch = {k: v.to(device) for k, v in batch.items()} + + labels = batch["labels"] + outputs = model( + inp=batch["inputs"], + key_padding_mask=batch["attention_masks"], + ) + + token_logits = outputs.token_logits + codebook_logits = outputs.codebook_logits + + # Generate labels + base_loss = F.cross_entropy( + token_logits.reshape(-1, token_logits.size(-1)), + labels[:, 0].reshape(-1), + ignore_index=-100, + reduction="none", + ) + + codebook_labels = labels[:, 1 : 1 + model.config.num_codebooks].mT + semantic_loss = F.cross_entropy( + codebook_logits.reshape(-1, codebook_logits.size(-1)), + codebook_labels.reshape(-1), + ignore_index=-100, + reduction="none", + ) + + base_loss = base_loss.reshape(labels[:, 0].shape) + semantic_loss = semantic_loss.reshape(codebook_labels.shape) + + semantic_loss_frame = semantic_loss.mean(-1) + pad_pos = codebook_labels.sum(-1) == -100 * model.config.num_codebooks + + for loss_sample, pad in zip(semantic_loss_frame, pad_pos): + semantic_loss_sum[~pad] += loss_sample[~pad] + counter[~pad] += 1 + + current_step += 1 + if current_step == 10: + break + + semantic_loss = semantic_loss.cpu() + counter = counter.cpu() + xs, ys = [], [] + + for i, (loss, count) in enumerate(zip(semantic_loss_sum, counter)): + if count > 0: + xs.append(i) + ys.append((loss / count).item()) # for better loss visualization + + smoothed_ys = smooth(ys, 0.95) + + # Unload model + del model + torch.cuda.empty_cache() + + return xs, ys, smoothed_ys + + +def main(): + tokenizer = AutoTokenizer.from_pretrained("fishaudio/fish-speech-1") + max_length = 4096 + + ds = AutoAugTextDataset( + ["data/protos/sft/云天河"], + tokenizer=tokenizer, + use_speaker=False, + interactive_prob=1.0, + max_length=max_length, + ) + + loader = DataLoader( + ds, + batch_size=8, + collate_fn=TextDataCollator(tokenizer, max_length=max_length), + num_workers=0, + shuffle=False, + ) + + plt.figure(figsize=(10, 5), dpi=200) + + plt.xlabel("Frame") + plt.ylabel("Loss") + plt.yscale("log") + plt.title("Semantic Loss") + plt.grid(which="both", axis="both") + plt.xlim(0, max_length) + + tests = [ + ( + "pertrain-medium", + "dual_ar_2_codebook_medium", + "checkpoints/text2semantic-pretrain-medium-2k-v1.pth", + ), + ( + "sft-medium", + "dual_ar_2_codebook_medium", + "checkpoints/text2semantic-sft-medium-v1.1-4k.pth", + ), + ( + "sft-large", + "dual_ar_2_codebook_large", + "checkpoints/text2semantic-sft-large-v1.1-4k.pth", + ), + ] + + for name, config, weight in tests: + xs, _, smoothed_ys = analyze_one_model(loader, config, weight, max_length) + plt.plot(xs, smoothed_ys, label=name) + + plt.legend() + plt.savefig("semantic_loss.png") + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/fish_speech/tools/llama/generate.py b/xinference/thirdparty/fish_speech/tools/llama/generate.py new file mode 100644 index 0000000000..934c185145 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/llama/generate.py @@ -0,0 +1,698 @@ +import os +import queue +import threading +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Literal, Optional, Tuple, Union + +import click +import hydra +import numpy as np +import torch +import torch._dynamo.config +import torch._inductor.config +from loguru import logger +from tqdm import tqdm + +from fish_speech.conversation import CODEBOOK_PAD_TOKEN_ID +from fish_speech.text import clean_text, split_text + +os.environ["TOKENIZERS_PARALLELISM"] = "false" +torch._inductor.config.coordinate_descent_tuning = True +torch._inductor.config.triton.unique_kernel_names = True + +if hasattr(torch._inductor.config, "fx_graph_cache"): + # Experimental feature to reduce compilation times, will be on by default in future + torch._inductor.config.fx_graph_cache = True + + +from fish_speech.models.text2semantic.llama import ( + BaseTransformer, + DualARTransformer, + NaiveTransformer, +) + + +def multinomial_sample_one_no_sync( + probs_sort, +): # Does multinomial sampling without a cuda synchronization + q = torch.empty_like(probs_sort).exponential_(1) + return torch.argmax(probs_sort / q, dim=-1, keepdim=True).to(dtype=torch.int) + + +def logits_to_probs( + logits, + previous_tokens: Optional[torch.Tensor] = None, + temperature: torch.Tensor = 1.0, + top_p: torch.Tensor = 1.0, + repetition_penalty: torch.Tensor = 1.0, +) -> torch.Tensor: + # Apply repetition penalty + if previous_tokens is not None: + previous_tokens = previous_tokens.long() + score = torch.gather(logits, dim=0, index=previous_tokens) + score = torch.where( + score < 0, score * repetition_penalty, score / repetition_penalty + ) + logits.scatter_(dim=0, index=previous_tokens, src=score) + + # Apply top-p sampling + sorted_logits, sorted_indices = torch.sort(logits, descending=True) + cum_probs = torch.cumsum(torch.nn.functional.softmax(sorted_logits, dim=-1), dim=-1) + sorted_indices_to_remove = cum_probs > top_p + sorted_indices_to_remove[0] = False # keep at least one option + indices_to_remove = sorted_indices_to_remove.scatter( + dim=0, index=sorted_indices, src=sorted_indices_to_remove + ) + logits = logits.masked_fill(indices_to_remove, -float("Inf")) + + logits = logits / max(temperature, 1e-5) + + probs = torch.nn.functional.softmax(logits, dim=-1) + return probs + + +def sample( + logits, + previous_tokens: Optional[torch.Tensor] = None, + **sampling_kwargs, +) -> Tuple[torch.Tensor, torch.Tensor]: + probs = logits_to_probs( + logits=logits[0, -1], previous_tokens=previous_tokens, **sampling_kwargs + ) + idx_next = multinomial_sample_one_no_sync(probs) + return idx_next, probs + + +def decode_one_token_ar( + model: DualARTransformer, + x: torch.Tensor, + input_pos: torch.Tensor, + previous_tokens: torch.Tensor = None, + **sampling_kwargs, +) -> torch.Tensor: + x = model.forward_generate(x, input_pos) + codebooks = [ + sample( + x.logits, + previous_tokens=( + previous_tokens[0] if previous_tokens is not None else None + ), # Disable repetition penalty for the token codebook + **sampling_kwargs, + )[0] + ] + x = x.hidden_states + + # Cleanup the cache + for layer in model.fast_layers: + layer.attention.kv_cache.k_cache.fill_(0) + layer.attention.kv_cache.v_cache.fill_(0) + + for codebook_idx in range(model.config.num_codebooks): + input_pos = torch.tensor([codebook_idx], device=x.device, dtype=torch.long) + logits = model.forward_generate_fast(x, input_pos) + a = sample( + logits, + previous_tokens=( + previous_tokens[codebook_idx + 1] + if previous_tokens is not None + else None + ), + **sampling_kwargs, + )[0] + x = model.fast_embeddings(a) + codebooks.append(a) + + return torch.stack(codebooks, dim=0) + + +def decode_one_token_naive( + model: NaiveTransformer, + x: torch.Tensor, + input_pos: torch.Tensor, + previous_tokens: torch.Tensor = None, + **sampling_kwargs, +) -> torch.Tensor: + x = model.forward_generate(x, input_pos) + + codebooks = [ + sample( + x.token_logits, + previous_tokens=None, # Disable repetition penalty for the token codebook + **sampling_kwargs, + )[0] + ] + + for i in range(model.config.num_codebooks): + codebooks.append( + sample( + x.codebook_logits[:, :, i], + previous_tokens=( + previous_tokens[i + 1] if previous_tokens is not None else None + ), + **sampling_kwargs, + )[0] + ) + + return torch.stack(codebooks, dim=0) + + +def decode_n_tokens( + model: NaiveTransformer, + cur_token: torch.Tensor, + input_pos: torch.Tensor, + num_new_tokens: int, + im_end_id: int = 4, + decode_one_token=decode_one_token_naive, + **sampling_kwargs, +): + previous_tokens = torch.zeros( + (model.config.num_codebooks + 1, model.config.max_seq_len), + dtype=torch.int, + device=cur_token.device, + ) + + for i in tqdm(range(num_new_tokens)): + # We need to get windowed repeat penalty + win_size = 16 + if i < win_size: + window = previous_tokens[:, :win_size] + else: + window = previous_tokens[:, i - win_size : i] + + with torch.backends.cuda.sdp_kernel( + enable_flash=False, enable_mem_efficient=False, enable_math=True + ): # Actually better for Inductor to codegen attention here + next_token = decode_one_token( + model=model, + x=cur_token, + input_pos=input_pos, + previous_tokens=window, + **sampling_kwargs, + ) + + input_pos += 1 + cur_token = next_token.view(1, model.config.num_codebooks + 1, -1) + previous_tokens[:, i : i + 1] = next_token.view( + model.config.num_codebooks + 1, -1 + ) + + if cur_token[0, 0, -1] == im_end_id: + break + + return previous_tokens[:, : i + 1] + + +@torch.no_grad() +@torch.inference_mode() +def generate( + *, + model: NaiveTransformer, + prompt: torch.Tensor, + max_new_tokens: int, + im_end_id: int = 4, + decode_one_token=decode_one_token_naive, + **sampling_kwargs, +) -> torch.Tensor: + """ + Takes a conditioning sequence (prompt) as input and continues to generate as many tokens as requested. + """ + + # create an empty tensor of the expected final shape and fill in the current tokens + T = prompt.size(1) + + if max_new_tokens: + if T + max_new_tokens > model.config.max_seq_len: + max_new_tokens = model.config.max_seq_len - T + logger.info(f"Truncating max_new_tokens to {max_new_tokens}") + + T_new = T + max_new_tokens + else: + T_new = model.config.max_seq_len + max_new_tokens = T_new - T + + device, dtype = prompt.device, prompt.dtype + with torch.device(device): + model.setup_caches( + max_batch_size=1, max_seq_len=T_new, dtype=next(model.parameters()).dtype + ) + + codebook_dim = 1 + model.config.num_codebooks + # create an empty tensor of the expected final shape and fill in the current tokens + empty = torch.empty((codebook_dim, T_new), dtype=dtype, device=device) + empty[:, :T] = prompt + seq = empty + input_pos = torch.arange(0, T, device=device) + + # Use non-accelerated version for now, to avoid compilation overhead + prefill_decode = ( + decode_one_token_naive + if isinstance(model, NaiveTransformer) + else decode_one_token_ar + ) + + next_token = prefill_decode( + model, prompt.view(1, codebook_dim, -1), input_pos, **sampling_kwargs + ) + seq[:, T : T + 1] = next_token + + input_pos = torch.tensor([T], device=device, dtype=torch.int) + x = decode_n_tokens( + model, + next_token.view(1, codebook_dim, -1), + input_pos, + max_new_tokens - 1, + im_end_id=im_end_id, + decode_one_token=decode_one_token, + **sampling_kwargs, + ) + # x = torch.cat(generated_tokens, dim=1) + seq = seq[:, : T + 1 + x.size(1)] + seq[:, T + 1 :] = x + + return seq + + +def encode_tokens( + tokenizer, + string, + device="cuda", + prompt_tokens=None, + num_codebooks=4, +): + string = clean_text(string) + string = f"<|im_start|>user\n{string}<|im_end|><|im_start|>assistant\n" + + new_tokens = tokenizer.encode( + string, + add_special_tokens=False, + max_length=10**6, + truncation=False, + ) + tokens = torch.tensor([new_tokens], dtype=torch.int, device=device) + + # Codebooks + zeros = ( + torch.ones((num_codebooks, tokens.size(1)), dtype=torch.int, device=device) + * CODEBOOK_PAD_TOKEN_ID + ) + prompt = torch.cat((tokens, zeros), dim=0) + + if prompt_tokens is None: + return prompt + + # Get prompt tokens + if prompt_tokens.ndim == 3: + assert ( + prompt_tokens.shape[0] == 1 + ), f"3 dim prompt tokens should have shape (1, num_codebooks, seq_len)" + prompt_tokens = prompt_tokens[0] + + assert prompt_tokens.ndim == 2 + data = prompt_tokens + 1 + + if prompt_tokens.shape[0] > num_codebooks: + logger.warning( + f"Prompt tokens shape {prompt_tokens.shape} is larger than num_codebooks {num_codebooks}, getting first {num_codebooks} codebooks" + ) + data = data[:num_codebooks] + + # Add pad token for each codebook + data = torch.cat( + (data, torch.zeros((data.size(0), 1), dtype=torch.int, device=device)), + dim=1, + ) + + # Since 1.0, we use <|semantic|> + s0_token_id = tokenizer.convert_tokens_to_ids("<|semantic|>") + end_token_id = tokenizer.convert_tokens_to_ids("<|im_end|>") + main_token_ids = ( + torch.ones((1, data.size(1)), dtype=torch.int, device=device) * s0_token_id + ) + main_token_ids[0, -1] = end_token_id + + data = torch.cat((main_token_ids, data), dim=0) + prompt = torch.cat((prompt, data), dim=1) + + return prompt + + +def load_model(checkpoint_path, device, precision, compile=False): + model: Union[NaiveTransformer, DualARTransformer] = BaseTransformer.from_pretrained( + checkpoint_path, load_weights=True + ) + + model = model.to(device=device, dtype=precision) + logger.info(f"Restored model from checkpoint") + + if isinstance(model, DualARTransformer): + decode_one_token = decode_one_token_ar + logger.info("Using DualARTransformer") + else: + decode_one_token = decode_one_token_naive + logger.info("Using NaiveTransformer") + + if compile: + logger.info("Compiling function...") + decode_one_token = torch.compile( + decode_one_token, + fullgraph=True, + backend="inductor" if torch.cuda.is_available() else "aot_eager", + mode="reduce-overhead" if torch.cuda.is_available() else None, + ) + + return model.eval(), decode_one_token + + +@dataclass +class GenerateResponse: + action: Literal["sample", "next"] + codes: Optional[torch.Tensor] = None + text: Optional[str] = None + + +def generate_long( + *, + model, + device: str | torch.device, + decode_one_token: callable, + text: str, + num_samples: int = 1, + max_new_tokens: int = 0, + top_p: int = 0.7, + repetition_penalty: float = 1.5, + temperature: float = 0.7, + compile: bool = False, + iterative_prompt: bool = True, + max_length: int = 2048, + chunk_length: int = 150, + prompt_text: Optional[str | list[str]] = None, + prompt_tokens: Optional[torch.Tensor | list[torch.Tensor]] = None, +): + assert 0 < top_p <= 1, "top_p must be in (0, 1]" + assert 0 < repetition_penalty < 2, "repetition_penalty must be in (0, 2)" + assert 0 < temperature < 2, "temperature must be in (0, 2)" + + use_prompt = prompt_text is not None and prompt_tokens is not None + if use_prompt and isinstance(prompt_text, str): + prompt_text = [prompt_text] + prompt_tokens = [prompt_tokens] + + assert use_prompt is False or len(prompt_text) == len( + prompt_tokens + ), "Prompt text and tokens must have the same length" + + model_size = sum(p.numel() for p in model.parameters() if p.requires_grad) + tokenizer = model.tokenizer + im_end_id = tokenizer.convert_tokens_to_ids("<|im_end|>") + + encoded = [] + texts = split_text(text, chunk_length) if iterative_prompt else [text] + encoded_prompts = [] + + if use_prompt: + for idx, (t, c) in enumerate(zip(prompt_text, prompt_tokens)): + encoded_prompts.append( + encode_tokens( + tokenizer, + string=t, + device=device, + prompt_tokens=c, + num_codebooks=model.config.num_codebooks, + ) + ) + + for idx, text in enumerate(texts): + encoded.append( + encode_tokens( + tokenizer, + string=text, + device=device, + num_codebooks=model.config.num_codebooks, + ) + ) + logger.info(f"Encoded text: {text}") + + # Move temperature, top_p, repetition_penalty to device + # This is important so that changing params doesn't trigger recompile + temperature = torch.tensor(temperature, device=device, dtype=torch.float) + top_p = torch.tensor(top_p, device=device, dtype=torch.float) + repetition_penalty = torch.tensor( + repetition_penalty, device=device, dtype=torch.float + ) + + for sample_idx in range(num_samples): + if torch.cuda.is_available(): + torch.cuda.synchronize() + + global_encoded = [] + seg_idx = 0 + + while seg_idx < len(encoded): + logger.info( + f"Generating sentence {seg_idx + 1}/{len(encoded)} of sample {sample_idx + 1}/{num_samples}" + ) + + seg = encoded[seg_idx] + global_encoded.append(seg) + + lengths = reversed([seg.size(1) for seg in global_encoded]) + + # Pick last 2000 tokens + count = 0 + for i, length in enumerate(lengths): + count += length + if count + length > max_length - 1024 - sum( + t.shape[1] for t in encoded_prompts + ): + break + + if i != 0 and i % 2 == 0: + i -= 1 + + # Rotate the list, always make sure first segment is included to avoid drift + if i < len(global_encoded) - 2: + partial_encoded = global_encoded[:2] + global_encoded[-i:] + else: + partial_encoded = global_encoded + + if use_prompt: + partial_encoded = encoded_prompts + partial_encoded + + cat_encoded = torch.cat(partial_encoded, dim=1) + prompt_length = cat_encoded.size(1) + + t0 = time.perf_counter() + y = generate( + model=model, + prompt=cat_encoded, + max_new_tokens=max_new_tokens, + im_end_id=im_end_id, + decode_one_token=decode_one_token, + temperature=temperature, + top_p=top_p, + repetition_penalty=repetition_penalty, + ) + + if sample_idx == 0 and seg_idx == 0 and compile: + logger.info(f"Compilation time: {time.perf_counter() - t0:.2f} seconds") + + if torch.cuda.is_available(): + torch.cuda.synchronize() + + t = time.perf_counter() - t0 + + tokens_generated = y.size(1) - prompt_length + tokens_sec = tokens_generated / t + logger.info( + f"Generated {tokens_generated} tokens in {t:.02f} seconds, {tokens_sec:.02f} tokens/sec" + ) + logger.info( + f"Bandwidth achieved: {model_size * tokens_sec / 1e9:.02f} GB/s" + ) + + if torch.cuda.is_available(): + logger.info( + f"GPU Memory used: {torch.cuda.max_memory_reserved() / 1e9:.02f} GB" + ) + + # Put the generated tokens + # since there is <im_end> and <eos> tokens, we remove last 2 tokens + codes = y[1:, prompt_length:-1].clone() + codes = codes - 1 + assert (codes >= 0).all(), f"Negative code found" + + decoded = y[:, prompt_length:-1].clone() + # But for global encoding, we should keep the <im_end> token + + global_encoded.append(decoded) + assert (codes >= 0).all(), f"Negative code found: {codes}" + yield GenerateResponse(action="sample", codes=codes, text=texts[seg_idx]) + seg_idx += 1 + + # This indicates the end of the current sample + yield GenerateResponse(action="next") + + +@dataclass +class WrappedGenerateResponse: + status: Literal["success", "error"] + response: Optional[GenerateResponse | Exception] = None + + +@dataclass +class GenerateRequest: + request: dict + response_queue: queue.Queue + + +def launch_thread_safe_queue( + checkpoint_path, + device, + precision, + compile: bool = False, +): + input_queue = queue.Queue() + init_event = threading.Event() + + def worker(): + model, decode_one_token = load_model( + checkpoint_path, device, precision, compile=compile + ) + init_event.set() + + while True: + item: GenerateRequest | None = input_queue.get() + if item is None: + break + + kwargs = item.request + response_queue = item.response_queue + + try: + for chunk in generate_long( + model=model, decode_one_token=decode_one_token, **kwargs + ): + response_queue.put( + WrappedGenerateResponse(status="success", response=chunk) + ) + except Exception as e: + response_queue.put(WrappedGenerateResponse(status="error", response=e)) + + threading.Thread(target=worker, daemon=True).start() + init_event.wait() + + return input_queue + + +@click.command() +@click.option( + "--text", + type=str, + default="你说的对, 但是原神是一款由米哈游自主研发的开放世界手游.", +) +@click.option("--prompt-text", type=str, default=None, multiple=True) +@click.option( + "--prompt-tokens", + type=click.Path(path_type=Path, exists=True), + default=None, + multiple=True, +) +@click.option("--num-samples", type=int, default=1) +@click.option("--max-new-tokens", type=int, default=0) +@click.option("--top-p", type=float, default=0.7) +@click.option("--repetition-penalty", type=float, default=1.2) +@click.option("--temperature", type=float, default=0.7) +@click.option( + "--checkpoint-path", + type=click.Path(path_type=Path, exists=True), + default="checkpoints/fish-speech-1.2-sft", +) +@click.option("--device", type=str, default="cuda") +@click.option("--compile/--no-compile", default=False) +@click.option("--seed", type=int, default=42) +@click.option("--half/--no-half", default=False) +@click.option("--iterative-prompt/--no-iterative-prompt", default=True) +@click.option("--chunk-length", type=int, default=100) +def main( + text: str, + prompt_text: Optional[list[str]], + prompt_tokens: Optional[list[Path]], + num_samples: int, + max_new_tokens: int, + top_p: int, + repetition_penalty: float, + temperature: float, + checkpoint_path: Path, + device: str, + compile: bool, + seed: int, + half: bool, + iterative_prompt: bool, + chunk_length: int, +) -> None: + + precision = torch.half if half else torch.bfloat16 + + if prompt_text is not None and len(prompt_text) != len(prompt_tokens): + raise ValueError( + f"Number of prompt text ({len(prompt_text)}) and prompt tokens ({len(prompt_tokens)}) should be the same" + ) + + logger.info("Loading model ...") + t0 = time.time() + model, decode_one_token = load_model( + checkpoint_path, device, precision, compile=compile + ) + + if torch.cuda.is_available(): + torch.cuda.synchronize() + + logger.info(f"Time to load model: {time.time() - t0:.02f} seconds") + + if prompt_tokens is not None: + prompt_tokens = [torch.from_numpy(np.load(p)).to(device) for p in prompt_tokens] + + torch.manual_seed(seed) + + if torch.cuda.is_available(): + torch.cuda.manual_seed(seed) + + generator = generate_long( + model=model, + device=device, + decode_one_token=decode_one_token, + text=text, + num_samples=num_samples, + max_new_tokens=max_new_tokens, + top_p=top_p, + repetition_penalty=repetition_penalty, + temperature=temperature, + compile=compile, + iterative_prompt=iterative_prompt, + chunk_length=chunk_length, + prompt_text=prompt_text, + prompt_tokens=prompt_tokens, + ) + + idx = 0 + codes = [] + + for response in generator: + if response.action == "sample": + codes.append(response.codes) + logger.info(f"Sampled text: {response.text}") + elif response.action == "next": + if codes: + np.save(f"codes_{idx}.npy", torch.cat(codes, dim=1).cpu().numpy()) + logger.info(f"Saved codes to codes_{idx}.npy") + logger.info(f"Next sample") + codes = [] + idx += 1 + else: + logger.error(f"Error: {response}") + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/fish_speech/tools/llama/merge_lora.py b/xinference/thirdparty/fish_speech/tools/llama/merge_lora.py new file mode 100644 index 0000000000..f12eece8d2 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/llama/merge_lora.py @@ -0,0 +1,95 @@ +import shutil +from copy import deepcopy +from pathlib import Path + +import click +import hydra +import torch +from hydra import compose, initialize +from hydra.utils import instantiate +from loguru import logger + +from fish_speech.models.text2semantic.llama import BaseTransformer +from fish_speech.models.text2semantic.lora import get_merged_state_dict + + +@click.command() +@click.option("--lora-config", type=str, default="r_8_alpha_16") +@click.option("--base-weight", type=str, default="checkpoints/fish-speech-1.2-sft") +@click.option("--lora-weight", type=str, required=True) +@click.option("--output", type=str, required=True) +def merge(lora_config, base_weight, lora_weight, output): + output = Path(output) + logger.info( + f"Merging {base_weight} and {lora_weight} into {output} with {lora_config}" + ) + + with initialize(version_base="1.3", config_path="../../fish_speech/configs/lora"): + cfg = compose(config_name=lora_config) + + lora_config = instantiate(cfg) + logger.info(f"Loaded lora model with config {lora_config}") + + llama_model = BaseTransformer.from_pretrained( + path=base_weight, + load_weights=True, + lora_config=lora_config, + ) + logger.info(f"Loaded llama model") + + llama_state_dict = llama_model.state_dict() + llama_state_dict = {k: v for k, v in llama_state_dict.items() if "lora" not in k} + llama_state_dict_copy = deepcopy(llama_state_dict) + lora_state_dict = torch.load(lora_weight, map_location="cpu") + + if "state_dict" in llama_state_dict: + llama_state_dict = llama_state_dict["state_dict"] + + if "state_dict" in lora_state_dict: + lora_state_dict = lora_state_dict["state_dict"] + + # remove prefix model. + if any(k.startswith("model.") for k in llama_state_dict.keys()): + llama_state_dict = { + k.replace("model.", ""): v + for k, v in llama_state_dict.items() + if k.startswith("model.") + } + if any(k.startswith("model.") for k in lora_state_dict.keys()): + lora_state_dict = { + k.replace("model.", ""): v + for k, v in lora_state_dict.items() + if k.startswith("model.") + } + + logger.info(f"Found {len(llama_state_dict)} keys in llama model") + logger.info(f"Found {len(lora_state_dict)} keys in lora model") + + merged_state_dict = llama_state_dict | lora_state_dict + llama_model.load_state_dict(merged_state_dict, strict=True) + logger.info(f"Merged model loaded") + + # Trigger eval mode to merge lora + llama_model.eval() + llama_model.save_pretrained(output, drop_lora=True) + logger.info(f"Saved merged model to {output}, validating") + + new_state_dict = torch.load(output / "model.pth", map_location="cpu") + original_keys = set(llama_state_dict_copy.keys()) + merged_keys = set(new_state_dict.keys()) + + assert original_keys == merged_keys, "Keys should be same" + + for key in original_keys: + diff_l1 = (new_state_dict[key] - llama_state_dict_copy[key]).abs().sum().item() + if diff_l1 != 0: + break + else: + logger.error("Merged model is same as the original model") + exit(1) + + logger.info("Merged model is different from the original model, check passed") + + +if __name__ == "__main__": + merge() diff --git a/xinference/thirdparty/fish_speech/tools/llama/quantize.py b/xinference/thirdparty/fish_speech/tools/llama/quantize.py new file mode 100644 index 0000000000..aae32fcce7 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/llama/quantize.py @@ -0,0 +1,497 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +import datetime +import shutil + +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +import time +from pathlib import Path + +import click +import torch +import torch.nn as nn +import torch.nn.functional as F + +from fish_speech.models.text2semantic.llama import find_multiple +from tools.llama.generate import load_model + +##### Quantization Primitives ###### + + +def dynamically_quantize_per_channel(x, quant_min, quant_max, target_dtype): + # assumes symmetric quantization + # assumes axis == 0 + # assumes dense memory format + # TODO(future): relax ^ as needed + + # default setup for affine quantization of activations + eps = torch.finfo(torch.float32).eps + + # get min and max + min_val, max_val = torch.aminmax(x, dim=1) + + # calculate scales and zero_points based on min and max + # reference: https://fburl.com/code/srbiybme + min_val_neg = torch.min(min_val, torch.zeros_like(min_val)) + max_val_pos = torch.max(max_val, torch.zeros_like(max_val)) + device = min_val_neg.device + + # reference: https://fburl.com/code/4wll53rk + max_val_pos = torch.max(-min_val_neg, max_val_pos) + scales = max_val_pos / (float(quant_max - quant_min) / 2) + # ensure scales is the same dtype as the original tensor + scales = torch.clamp(scales, min=eps).to(x.dtype) + zero_points = torch.zeros(min_val_neg.size(), dtype=torch.int64, device=device) + + # quantize based on qmin/qmax/scales/zp + # reference: https://www.internalfb.com/code/fbsource/[8edc275012b1]/fbcode/caffe2/torch/ao/quantization/fx/_decomposed.py?lines=63 + x_div = x / scales.unsqueeze(-1) + x_round = torch.round(x_div) + x_zp = x_round + zero_points.unsqueeze(-1) + quant = torch.clamp(x_zp, quant_min, quant_max).to(target_dtype) + + return quant, scales, zero_points + + +def get_group_qparams(w, n_bit=4, groupsize=128): + # needed for GPTQ with padding + if groupsize > w.shape[-1]: + groupsize = w.shape[-1] + assert groupsize > 1 + assert w.shape[-1] % groupsize == 0 + assert w.dim() == 2 + + to_quant = w.reshape(-1, groupsize) + assert torch.isnan(to_quant).sum() == 0 + + max_val = to_quant.amax(dim=1, keepdim=True) + min_val = to_quant.amin(dim=1, keepdim=True) + max_int = 2**n_bit - 1 + scales = (max_val - min_val).clamp(min=1e-6) / max_int + zeros = min_val + scales * (2 ** (n_bit - 1)) + return scales.to(torch.bfloat16).reshape(w.shape[0], -1), zeros.to( + torch.bfloat16 + ).reshape(w.shape[0], -1) + + +def pack_scales_and_zeros(scales, zeros): + assert scales.shape == zeros.shape + assert scales.dtype == torch.bfloat16 + assert zeros.dtype == torch.bfloat16 + return ( + torch.cat( + [ + scales.reshape(scales.size(0), scales.size(1), 1), + zeros.reshape(zeros.size(0), zeros.size(1), 1), + ], + 2, + ) + .transpose(0, 1) + .contiguous() + ) + + +def unpack_scales_and_zeros(scales_and_zeros): + assert len(scales_and_zeros.shape) == 3 and scales_and_zeros.shape[2] == 2 + assert scales_and_zeros.dtype == torch.float + return torch.split(scales_and_zeros.transpose(0, 1), 1, 2) + + +def group_quantize_tensor_from_qparams(w, scales, zeros, n_bit=4, groupsize=128): + assert groupsize > 1 + # needed for GPTQ single column quantize + if groupsize > w.shape[-1] and scales.shape[-1] == 1: + groupsize = w.shape[-1] + + assert w.shape[-1] % groupsize == 0 + assert w.dim() == 2 + + to_quant = w.reshape(-1, groupsize) + assert torch.isnan(to_quant).sum() == 0 + + scales = scales.reshape(-1, 1) + zeros = zeros.reshape(-1, 1) + min_val = zeros - scales * (2 ** (n_bit - 1)) + max_int = 2**n_bit - 1 + min_int = 0 + w_int32 = ( + to_quant.sub(min_val) + .div(scales) + .round() + .clamp_(min_int, max_int) + .to(torch.int32) + .reshape_as(w) + ) + + return w_int32 + + +def group_quantize_tensor(w, n_bit=4, groupsize=128): + scales, zeros = get_group_qparams(w, n_bit, groupsize) + w_int32 = group_quantize_tensor_from_qparams(w, scales, zeros, n_bit, groupsize) + scales_and_zeros = pack_scales_and_zeros(scales, zeros) + return w_int32, scales_and_zeros + + +def group_dequantize_tensor_from_qparams( + w_int32, scales, zeros, n_bit=4, groupsize=128 +): + assert groupsize > 1 + # needed for GPTQ single column dequantize + if groupsize > w_int32.shape[-1] and scales.shape[-1] == 1: + groupsize = w_int32.shape[-1] + assert w_int32.shape[-1] % groupsize == 0 + assert w_int32.dim() == 2 + + w_int32_grouped = w_int32.reshape(-1, groupsize) + scales = scales.reshape(-1, 1) + zeros = zeros.reshape(-1, 1) + + w_dq = ( + w_int32_grouped.sub(2 ** (n_bit - 1)).mul(scales).add(zeros).reshape_as(w_int32) + ) + return w_dq + + +def group_dequantize_tensor(w_int32, scales_and_zeros, n_bit=4, groupsize=128): + scales, zeros = unpack_scales_and_zeros(scales_and_zeros) + return group_dequantize_tensor_from_qparams( + w_int32, scales, zeros, n_bit, groupsize + ) + + +class QuantHandler: + def __init__(self, mod): + self.mod = mod + + def create_quantized_state_dict(self) -> "StateDict": + pass + + def convert_for_runtime(self) -> "nn.Module": + pass + + +##### Weight-only int8 per-channel quantized code ###### + + +def replace_linear_weight_only_int8_per_channel(module): + for name, child in module.named_children(): + if isinstance(child, nn.Linear): + setattr( + module, + name, + WeightOnlyInt8Linear(child.in_features, child.out_features), + ) + else: + replace_linear_weight_only_int8_per_channel(child) + + +class WeightOnlyInt8QuantHandler: + def __init__(self, mod): + self.mod = mod + + @torch.no_grad() + def create_quantized_state_dict(self): + cur_state_dict = self.mod.state_dict() + for fqn, mod in self.mod.named_modules(): + if isinstance(mod, torch.nn.Linear): + int8_weight, scales, _ = dynamically_quantize_per_channel( + mod.weight.float(), -128, 127, torch.int8 + ) + cur_state_dict[f"{fqn}.weight"] = int8_weight + cur_state_dict[f"{fqn}.scales"] = scales.to(mod.weight.dtype) + + return cur_state_dict + + def convert_for_runtime(self): + replace_linear_weight_only_int8_per_channel(self.mod) + return self.mod + + +class WeightOnlyInt8Linear(torch.nn.Module): + __constants__ = ["in_features", "out_features"] + in_features: int + out_features: int + weight: torch.Tensor + + def __init__( + self, + in_features: int, + out_features: int, + bias: bool = True, + device=None, + dtype=None, + ) -> None: + factory_kwargs = {"device": device, "dtype": dtype} + super().__init__() + self.in_features = in_features + self.out_features = out_features + self.register_buffer( + "weight", torch.empty((out_features, in_features), dtype=torch.int8) + ) + self.register_buffer("scales", torch.ones(out_features, dtype=torch.bfloat16)) + + def forward(self, input: torch.Tensor) -> torch.Tensor: + return F.linear(input, self.weight.to(dtype=input.dtype)) * self.scales + + +##### weight only int4 per channel groupwise quantized code ###### + + +def prepare_int4_weight_and_scales_and_zeros(weight_bf16, groupsize, inner_k_tiles): + weight_int32, scales_and_zeros = group_quantize_tensor( + weight_bf16, n_bit=4, groupsize=groupsize + ) + weight_int4pack = torch.ops.aten._convert_weight_to_int4pack( + weight_int32, inner_k_tiles + ) + return weight_int4pack, scales_and_zeros + + +def linear_forward_int4(x, weight_int4pack, scales_and_zeros, out_features, groupsize): + origin_x_size = x.size() + x = x.reshape(-1, origin_x_size[-1]) + c = torch.ops.aten._weight_int4pack_mm( + x, weight_int4pack, groupsize, scales_and_zeros + ) + new_shape = origin_x_size[:-1] + (out_features,) + c = c.reshape(new_shape) + return c + + +def _check_linear_int4_k(k, groupsize=1, inner_k_tiles=1): + return k % groupsize == 0 and k % (inner_k_tiles * 16) == 0 + + +def replace_linear_int4(module, groupsize, inner_k_tiles, padding): + for name, child in module.named_children(): + if isinstance(child, nn.Linear): + if _check_linear_int4_k(child.in_features, groupsize, inner_k_tiles): + setattr( + module, + name, + WeightOnlyInt4Linear( + child.in_features, + child.out_features, + bias=False, + groupsize=groupsize, + inner_k_tiles=inner_k_tiles, + padding=False, + ), + ) + elif padding: + setattr( + module, + name, + WeightOnlyInt4Linear( + child.in_features, + child.out_features, + bias=False, + groupsize=groupsize, + inner_k_tiles=inner_k_tiles, + padding=True, + ), + ) + else: + replace_linear_int4(child, groupsize, inner_k_tiles, padding) + + +class WeightOnlyInt4QuantHandler: + def __init__(self, mod, groupsize=128, inner_k_tiles=8, padding=True): + self.mod = mod + self.groupsize = groupsize + self.inner_k_tiles = inner_k_tiles + self.padding = padding + assert groupsize in [32, 64, 128, 256] + assert inner_k_tiles in [2, 4, 8] + + @torch.no_grad() + def create_quantized_state_dict(self): + cur_state_dict = self.mod.state_dict() + for fqn, mod in self.mod.named_modules(): + if isinstance(mod, torch.nn.Linear): + assert not mod.bias + out_features = mod.out_features + in_features = mod.in_features + assert out_features % 8 == 0, "require out_features % 8 == 0" + print(f"linear: {fqn}, in={in_features}, out={out_features}") + + weight = mod.weight.data + if not _check_linear_int4_k( + in_features, self.groupsize, self.inner_k_tiles + ): + if self.padding: + import torch.nn.functional as F + + print( + f"warning: {fqn} is padded to satisfy in_features % 1024 == 0" + ) + padded_in_features = find_multiple(in_features, 1024) + weight = F.pad( + weight, pad=(0, padded_in_features - in_features) + ) + else: + print( + f"warning: {fqn} is skipped, int4 requires that in_features is 32, 64, or is divisible by 1024, " + + "and that groupsize and inner_k_tiles*16 evenly divide into it" + ) + continue + ( + weight_int4pack, + scales_and_zeros, + ) = prepare_int4_weight_and_scales_and_zeros( + weight.to(torch.bfloat16).to("cuda"), + self.groupsize, + self.inner_k_tiles, + ) + cur_state_dict[f"{fqn}.weight"] = weight_int4pack.to("cpu") + cur_state_dict[f"{fqn}.scales_and_zeros"] = scales_and_zeros.to("cpu") + + return cur_state_dict + + def convert_for_runtime(self): + replace_linear_int4(self.mod, self.groupsize, self.inner_k_tiles, self.padding) + return self.mod + + +class WeightOnlyInt4Linear(torch.nn.Module): + __constants__ = ["in_features", "out_features"] + in_features: int + out_features: int + weight: torch.Tensor + + def __init__( + self, + in_features: int, + out_features: int, + bias=True, + device=None, + dtype=None, + groupsize: int = 128, + inner_k_tiles: int = 8, + padding: bool = True, + ) -> None: + super().__init__() + self.padding = padding + if padding: + self.origin_in_features = in_features + in_features = find_multiple(in_features, 1024) + + self.in_features = in_features + self.out_features = out_features + assert not bias, "require bias=False" + self.groupsize = groupsize + self.inner_k_tiles = inner_k_tiles + + assert out_features % 8 == 0, "require out_features % 8 == 0" + assert ( + in_features % (inner_k_tiles * 16) == 0 + ), "require in_features % (innerKTiles * 16) == 0" + self.register_buffer( + "weight", + torch.empty( + ( + out_features // 8, + in_features // (inner_k_tiles * 16), + 32, + inner_k_tiles // 2, + ), + dtype=torch.int32, + ), + ) + self.register_buffer( + "scales_and_zeros", + torch.empty( + (in_features // groupsize, out_features, 2), dtype=torch.bfloat16 + ), + ) + + def forward(self, input: torch.Tensor) -> torch.Tensor: + input = input.to(torch.bfloat16) + if self.padding: + import torch.nn.functional as F + + input = F.pad(input, pad=(0, self.in_features - self.origin_in_features)) + return linear_forward_int4( + input, self.weight, self.scales_and_zeros, self.out_features, self.groupsize + ) + + +def generate_folder_name(): + now = datetime.datetime.now() + folder_name = now.strftime("%Y%m%d_%H%M%S") + return folder_name + + +@click.command() +@click.option( + "--checkpoint-path", + type=click.Path(path_type=Path, exists=True), + default="checkpoints/fish-speech-1.2-sft", +) +@click.option( + "--mode", type=str, default="int8", help="type of quantization to perform" +) +@click.option( + "--groupsize", type=int, default=128, help="Group size for int4 quantization." +) +@click.option("--timestamp", type=str, default="None", help="When to do quantization") +def quantize(checkpoint_path: Path, mode: str, groupsize: int, timestamp: str) -> None: + + device = "cpu" + precision = torch.bfloat16 + + print("Loading model ...") + t0 = time.time() + + model, _ = load_model( + checkpoint_path=checkpoint_path, + device=device, + precision=precision, + compile=False, + ) + vq_model = "firefly-gan-vq-fsq-4x1024-42hz-generator.pth" + now = timestamp if timestamp != "None" else generate_folder_name() + + if mode == "int8": + print( + "Quantizing model weights for int8 weight-only symmetric per-channel quantization" + ) + quant_handler = WeightOnlyInt8QuantHandler(model) + quantized_state_dict = quant_handler.create_quantized_state_dict() + + dir_name = checkpoint_path + dst_name = Path(f"checkpoints/fs-1.2-int8-{now}") + shutil.copytree(str(dir_name.resolve()), str(dst_name.resolve())) + if (dst_name / vq_model).exists(): + (dst_name / vq_model).unlink() + quantize_path = dst_name / "model.pth" + + elif mode == "int4": + print( + "Quantizing model weights for int4 weight-only affine per-channel groupwise quantization" + ) + quant_handler = WeightOnlyInt4QuantHandler(model, groupsize) + quantized_state_dict = quant_handler.create_quantized_state_dict() + + dir_name = checkpoint_path + dst_name = Path(f"checkpoints/fs-1.2-int4-g{groupsize}-{now}") + shutil.copytree(str(dir_name.resolve()), str(dst_name.resolve())) + if (dst_name / vq_model).exists(): + (dst_name / vq_model).unlink() + quantize_path = dst_name / "model.pth" + + else: + raise ValueError( + f"Invalid quantization mode {mode} needs to be one of [int8, int4, int4-gpptq]" + ) + + print(f"Writing quantized weights to {quantize_path}") + quantize_path.unlink(missing_ok=True) # remove existing file if one already there + torch.save(quantized_state_dict, quantize_path) + print(f"Quantization complete took {time.time() - t0:.02f} seconds") + + +if __name__ == "__main__": + quantize() diff --git a/xinference/thirdparty/fish_speech/tools/llama/rebuild_tokenizer.py b/xinference/thirdparty/fish_speech/tools/llama/rebuild_tokenizer.py new file mode 100644 index 0000000000..ea64fa6788 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/llama/rebuild_tokenizer.py @@ -0,0 +1,57 @@ +from tokenizers import Tokenizer, decoders, models, pre_tokenizers, processors, trainers +from transformers import PreTrainedTokenizer, PreTrainedTokenizerFast + +# Initialize a tokenizer +tokenizer = Tokenizer(models.BPE()) + +# Customize pre-tokenization and decoding +tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=False) +tokenizer.decoder = decoders.ByteLevel() +tokenizer.post_processor = processors.ByteLevel(trim_offsets=False) + +# Don't train the tokenizer +trainer = trainers.BpeTrainer( + vocab_size=0, + min_frequency=2, + initial_alphabet=pre_tokenizers.ByteLevel.alphabet(), + special_tokens=[ + "<|begin_of_sequence|>", + "<|end_of_sequence|>", + "<|im_start|>", + "<|im_sep|>", # system, user, assistant, etc. + "<|im_end|>", + "<|semantic|>", # audio features + "<|pad|>", + ], +) + +# <|im_start|>user<|im_sep|>...<|im_end|> +# <|im_start|>assistant<|im_sep|><|semantic|><|semantic|><|semantic|><|semantic|><|semantic|><|im_end|> +tokenizer.train_from_iterator([], trainer=trainer) + +print(len(tokenizer.get_vocab())) +x = tokenizer.encode( + "Hello, how are you? dfgnviadfjoiviouajeiodfjv 你好世界 🈶<|semantic|>" +).ids +print(x, len(x)) +print(tokenizer.decode(x, skip_special_tokens=True)) + + +tokenizer = PreTrainedTokenizerFast( + tokenizer_object=tokenizer, + pad_token="<|pad|>", + bos_token="<|begin_of_sequence|>", + eos_token="<|end_of_sequence|>", +) + +# Try tokenizing a new sequence +sequence = "All around, too, lay vast quantities of the costliest merchandise, and treasures were heaped in every cranny of the rocks, but all these things only added to the desolation of the scene. 测试中文, 你好世界 🈶<|semantic|>" +encoded = tokenizer(sequence).input_ids + +print("Test encoding....") +print(f"\tSentence: {sequence}") +print(f"\tEncoded: {encoded}") +print(f"\tDecoded: {tokenizer.batch_decode(encoded)}") +print(f"\tDecoded: {tokenizer.decode(encoded)}") + +tokenizer.push_to_hub("fishaudio/fish-speech-1", private=True) diff --git a/xinference/thirdparty/fish_speech/tools/merge_asr_files.py b/xinference/thirdparty/fish_speech/tools/merge_asr_files.py new file mode 100644 index 0000000000..cc12062095 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/merge_asr_files.py @@ -0,0 +1,55 @@ +import os +from pathlib import Path + +from pydub import AudioSegment +from tqdm import tqdm + +from tools.file import AUDIO_EXTENSIONS, list_files + + +def merge_and_delete_files(save_dir, original_files): + save_path = Path(save_dir) + audio_slice_files = list_files( + path=save_dir, extensions=AUDIO_EXTENSIONS.union([".lab"]), recursive=True + ) + audio_files = {} + label_files = {} + for file_path in tqdm(audio_slice_files, desc="Merging audio files"): + rel_path = Path(file_path).relative_to(save_path) + (save_path / rel_path.parent).mkdir(parents=True, exist_ok=True) + if file_path.suffix == ".wav": + prefix = rel_path.parent / file_path.stem.rsplit("-", 1)[0] + if prefix == rel_path.parent / file_path.stem: + continue + audio = AudioSegment.from_wav(file_path) + if prefix in audio_files.keys(): + audio_files[prefix] = audio_files[prefix] + audio + else: + audio_files[prefix] = audio + + elif file_path.suffix == ".lab": + prefix = rel_path.parent / file_path.stem.rsplit("-", 1)[0] + if prefix == rel_path.parent / file_path.stem: + continue + with open(file_path, "r", encoding="utf-8") as f: + label = f.read() + if prefix in label_files.keys(): + label_files[prefix] = label_files[prefix] + ", " + label + else: + label_files[prefix] = label + + for prefix, audio in audio_files.items(): + output_audio_path = save_path / f"{prefix}.wav" + audio.export(output_audio_path, format="wav") + + for prefix, label in label_files.items(): + output_label_path = save_path / f"{prefix}.lab" + with open(output_label_path, "w", encoding="utf-8") as f: + f.write(label) + + for file_path in original_files: + os.remove(file_path) + + +if __name__ == "__main__": + merge_and_delete_files("/made/by/spicysama/laziman", [__file__]) diff --git a/xinference/thirdparty/fish_speech/tools/post_api.py b/xinference/thirdparty/fish_speech/tools/post_api.py new file mode 100644 index 0000000000..153893078e --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/post_api.py @@ -0,0 +1,164 @@ +import argparse +import base64 +import json +import wave +from pathlib import Path + +import pyaudio +import requests + + +def wav_to_base64(file_path): + if not file_path or not Path(file_path).exists(): + return None + with open(file_path, "rb") as wav_file: + wav_content = wav_file.read() + base64_encoded = base64.b64encode(wav_content) + return base64_encoded.decode("utf-8") + + +def read_ref_text(ref_text): + path = Path(ref_text) + if path.exists() and path.is_file(): + with path.open("r", encoding="utf-8") as file: + return file.read() + return ref_text + + +def play_audio(audio_content, format, channels, rate): + p = pyaudio.PyAudio() + stream = p.open(format=format, channels=channels, rate=rate, output=True) + stream.write(audio_content) + stream.stop_stream() + stream.close() + p.terminate() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Send a WAV file and text to a server and receive synthesized audio." + ) + + parser.add_argument( + "--url", + "-u", + type=str, + default="http://127.0.0.1:8080/v1/invoke", + help="URL of the server", + ) + parser.add_argument( + "--text", "-t", type=str, required=True, help="Text to be synthesized" + ) + parser.add_argument( + "--reference_audio", + "-ra", + type=str, + default=None, + help="Path to the WAV file", + ) + parser.add_argument( + "--reference_text", + "-rt", + type=str, + default=None, + help="Reference text for voice synthesis", + ) + parser.add_argument( + "--max_new_tokens", + type=int, + default=1024, + help="Maximum new tokens to generate", + ) + parser.add_argument( + "--chunk_length", type=int, default=100, help="Chunk length for synthesis" + ) + parser.add_argument( + "--top_p", type=float, default=0.7, help="Top-p sampling for synthesis" + ) + parser.add_argument( + "--repetition_penalty", + type=float, + default=1.2, + help="Repetition penalty for synthesis", + ) + parser.add_argument( + "--temperature", type=float, default=0.7, help="Temperature for sampling" + ) + parser.add_argument( + "--speaker", type=str, default=None, help="Speaker ID for voice synthesis" + ) + parser.add_argument("--emotion", type=str, default=None, help="Speaker's Emotion") + parser.add_argument("--format", type=str, default="wav", help="Audio format") + parser.add_argument( + "--streaming", type=bool, default=False, help="Enable streaming response" + ) + parser.add_argument( + "--channels", type=int, default=1, help="Number of audio channels" + ) + parser.add_argument("--rate", type=int, default=44100, help="Sample rate for audio") + + args = parser.parse_args() + + base64_audio = wav_to_base64(args.reference_audio) + + ref_text = args.reference_text + if ref_text: + ref_text = read_ref_text(ref_text) + + data = { + "text": args.text, + "reference_text": ref_text, + "reference_audio": base64_audio, + "max_new_tokens": args.max_new_tokens, + "chunk_length": args.chunk_length, + "top_p": args.top_p, + "repetition_penalty": args.repetition_penalty, + "temperature": args.temperature, + "speaker": args.speaker, + "emotion": args.emotion, + "format": args.format, + "streaming": args.streaming, + } + + response = requests.post(args.url, json=data, stream=args.streaming) + + audio_format = pyaudio.paInt16 # Assuming 16-bit PCM format + + if response.status_code == 200: + if args.streaming: + p = pyaudio.PyAudio() + stream = p.open( + format=audio_format, channels=args.channels, rate=args.rate, output=True + ) + + wf = wave.open("generated_audio.wav", "wb") + wf.setnchannels(args.channels) + wf.setsampwidth(p.get_sample_size(audio_format)) + wf.setframerate(args.rate) + + stream_stopped_flag = False + + try: + for chunk in response.iter_content(chunk_size=1024): + if chunk: + stream.write(chunk) + wf.writeframesraw(chunk) + else: + if not stream_stopped_flag: + stream.stop_stream() + stream_stopped_flag = True + finally: + stream.close() + p.terminate() + wf.close() + else: + audio_content = response.content + + with open("generated_audio.wav", "wb") as audio_file: + audio_file.write(audio_content) + + play_audio(audio_content, audio_format, args.channels, args.rate) + print("Audio has been saved to 'generated_audio.wav'.") + else: + print(f"Request failed with status code {response.status_code}") + print(response.json()) diff --git a/xinference/thirdparty/fish_speech/tools/sensevoice/README.md b/xinference/thirdparty/fish_speech/tools/sensevoice/README.md new file mode 100644 index 0000000000..9a2078aa2d --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/sensevoice/README.md @@ -0,0 +1,59 @@ +# FunASR Command Line Interface + +This tool provides a command-line interface for separating vocals from instrumental tracks, converting videos to audio, and performing speech-to-text transcription on the resulting audio files. + +## Requirements + +- Python >= 3.10 +- PyTorch <= 2.3.1 +- ffmpeg, pydub, audio-separator[gpu]. + +## Installation + +Install the required packages: + +```bash +pip install -e .[stable] +``` + +Make sure you have `ffmpeg` installed and available in your `PATH`. + +## Usage + +### Basic Usage + +To run the tool with default settings: + +```bash +python tools/sensevoice/fun_asr.py --audio-dir <audio_directory> --save-dir <output_directory> +``` + +## Options + +| Option | Description | +| :-----------------------: | :---------------------------------------------------------------------------: | +| --audio-dir | Directory containing audio or video files. | +| --save-dir | Directory to save processed audio files. | +| --device | Device to use for processing. Options: cuda (default) or cpu. | +| --language | Language of the transcription. Default is auto. | +| --max_single_segment_time | Maximum duration of a single audio segment in milliseconds. Default is 20000. | +| --punc | Enable punctuation prediction. | +| --denoise | Enable noise reduction (vocal separation). | + +## Example + +To process audio files in the directory `path/to/audio` and save the output to `path/to/output`, with punctuation and noise reduction enabled: + +```bash +python tools/sensevoice/fun_asr.py --audio-dir path/to/audio --save-dir path/to/output --punc --denoise +``` + +## Additional Notes + +- The tool supports `both audio and video files`. Videos will be converted to audio automatically. +- If the `--denoise` option is used, the tool will perform vocal separation to isolate the vocals from the instrumental tracks. +- The script will automatically create necessary directories in the `--save-dir`. + +## Troubleshooting + +If you encounter any issues, make sure all dependencies are correctly installed and configured. For more detailed troubleshooting, refer to the documentation of each dependency. diff --git a/xinference/thirdparty/fish_speech/tools/sensevoice/__init__.py b/xinference/thirdparty/fish_speech/tools/sensevoice/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/tools/sensevoice/auto_model.py b/xinference/thirdparty/fish_speech/tools/sensevoice/auto_model.py new file mode 100644 index 0000000000..dd2e186617 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/sensevoice/auto_model.py @@ -0,0 +1,573 @@ +#!/usr/bin/env python3 +# -*- encoding: utf-8 -*- +# Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights Reserved. +# MIT License (https://opensource.org/licenses/MIT) + +import copy +import json +import logging +import os.path +import random +import re +import string +import time + +import numpy as np +import torch +from funasr.download.download_model_from_hub import download_model +from funasr.download.file import download_from_url +from funasr.register import tables +from funasr.train_utils.load_pretrained_model import load_pretrained_model +from funasr.train_utils.set_all_random_seed import set_all_random_seed +from funasr.utils import export_utils, misc +from funasr.utils.load_utils import load_audio_text_image_video, load_bytes +from funasr.utils.misc import deep_update +from funasr.utils.timestamp_tools import timestamp_sentence, timestamp_sentence_en +from tqdm import tqdm + +from .vad_utils import merge_vad, slice_padding_audio_samples + +try: + from funasr.models.campplus.cluster_backend import ClusterBackend + from funasr.models.campplus.utils import distribute_spk, postprocess, sv_chunk +except: + pass + + +def prepare_data_iterator(data_in, input_len=None, data_type=None, key=None): + """ """ + data_list = [] + key_list = [] + filelist = [".scp", ".txt", ".json", ".jsonl", ".text"] + + chars = string.ascii_letters + string.digits + if isinstance(data_in, str): + if data_in.startswith("http://") or data_in.startswith("https://"): # url + data_in = download_from_url(data_in) + + if isinstance(data_in, str) and os.path.exists( + data_in + ): # wav_path; filelist: wav.scp, file.jsonl;text.txt; + _, file_extension = os.path.splitext(data_in) + file_extension = file_extension.lower() + if file_extension in filelist: # filelist: wav.scp, file.jsonl;text.txt; + with open(data_in, encoding="utf-8") as fin: + for line in fin: + key = "rand_key_" + "".join(random.choice(chars) for _ in range(13)) + if data_in.endswith( + ".jsonl" + ): # file.jsonl: json.dumps({"source": data}) + lines = json.loads(line.strip()) + data = lines["source"] + key = data["key"] if "key" in data else key + else: # filelist, wav.scp, text.txt: id \t data or data + lines = line.strip().split(maxsplit=1) + data = lines[1] if len(lines) > 1 else lines[0] + key = lines[0] if len(lines) > 1 else key + + data_list.append(data) + key_list.append(key) + else: + if key is None: + # key = "rand_key_" + "".join(random.choice(chars) for _ in range(13)) + key = misc.extract_filename_without_extension(data_in) + data_list = [data_in] + key_list = [key] + elif isinstance(data_in, (list, tuple)): + if data_type is not None and isinstance( + data_type, (list, tuple) + ): # mutiple inputs + data_list_tmp = [] + for data_in_i, data_type_i in zip(data_in, data_type): + key_list, data_list_i = prepare_data_iterator( + data_in=data_in_i, data_type=data_type_i + ) + data_list_tmp.append(data_list_i) + data_list = [] + for item in zip(*data_list_tmp): + data_list.append(item) + else: + # [audio sample point, fbank, text] + data_list = data_in + key_list = [] + for data_i in data_in: + if isinstance(data_i, str) and os.path.exists(data_i): + key = misc.extract_filename_without_extension(data_i) + else: + if key is None: + key = "rand_key_" + "".join( + random.choice(chars) for _ in range(13) + ) + key_list.append(key) + + else: # raw text; audio sample point, fbank; bytes + if isinstance(data_in, bytes): # audio bytes + data_in = load_bytes(data_in) + if key is None: + key = "rand_key_" + "".join(random.choice(chars) for _ in range(13)) + data_list = [data_in] + key_list = [key] + + return key_list, data_list + + +class AutoModel: + + def __init__(self, **kwargs): + + try: + from funasr.utils.version_checker import check_for_update + + print( + "Check update of funasr, and it would cost few times. You may disable it by set `disable_update=True` in AutoModel" + ) + check_for_update(disable=kwargs.get("disable_update", False)) + except: + pass + + log_level = getattr(logging, kwargs.get("log_level", "INFO").upper()) + logging.basicConfig(level=log_level) + + model, kwargs = self.build_model(**kwargs) + + # if vad_model is not None, build vad model else None + vad_model = kwargs.get("vad_model", None) + vad_kwargs = ( + {} if kwargs.get("vad_kwargs", {}) is None else kwargs.get("vad_kwargs", {}) + ) + if vad_model is not None: + logging.info("Building VAD model.") + vad_kwargs["model"] = vad_model + vad_kwargs["model_revision"] = kwargs.get("vad_model_revision", "master") + vad_kwargs["device"] = kwargs["device"] + vad_model, vad_kwargs = self.build_model(**vad_kwargs) + + # if punc_model is not None, build punc model else None + punc_model = kwargs.get("punc_model", None) + punc_kwargs = ( + {} + if kwargs.get("punc_kwargs", {}) is None + else kwargs.get("punc_kwargs", {}) + ) + if punc_model is not None: + logging.info("Building punc model.") + punc_kwargs["model"] = punc_model + punc_kwargs["model_revision"] = kwargs.get("punc_model_revision", "master") + punc_kwargs["device"] = kwargs["device"] + punc_model, punc_kwargs = self.build_model(**punc_kwargs) + + # if spk_model is not None, build spk model else None + spk_model = kwargs.get("spk_model", None) + spk_kwargs = ( + {} if kwargs.get("spk_kwargs", {}) is None else kwargs.get("spk_kwargs", {}) + ) + if spk_model is not None: + logging.info("Building SPK model.") + spk_kwargs["model"] = spk_model + spk_kwargs["model_revision"] = kwargs.get("spk_model_revision", "master") + spk_kwargs["device"] = kwargs["device"] + spk_model, spk_kwargs = self.build_model(**spk_kwargs) + self.cb_model = ClusterBackend().to(kwargs["device"]) + spk_mode = kwargs.get("spk_mode", "punc_segment") + if spk_mode not in ["default", "vad_segment", "punc_segment"]: + logging.error( + "spk_mode should be one of default, vad_segment and punc_segment." + ) + self.spk_mode = spk_mode + + self.kwargs = kwargs + self.model = model + self.vad_model = vad_model + self.vad_kwargs = vad_kwargs + self.punc_model = punc_model + self.punc_kwargs = punc_kwargs + self.spk_model = spk_model + self.spk_kwargs = spk_kwargs + self.model_path = kwargs.get("model_path") + + @staticmethod + def build_model(**kwargs): + assert "model" in kwargs + if "model_conf" not in kwargs: + logging.info( + "download models from model hub: {}".format(kwargs.get("hub", "ms")) + ) + kwargs = download_model(**kwargs) + + set_all_random_seed(kwargs.get("seed", 0)) + + device = kwargs.get("device", "cuda") + if not torch.cuda.is_available() or kwargs.get("ngpu", 1) == 0: + device = "cpu" + kwargs["batch_size"] = 1 + kwargs["device"] = device + + torch.set_num_threads(kwargs.get("ncpu", 4)) + + # build tokenizer + tokenizer = kwargs.get("tokenizer", None) + if tokenizer is not None: + tokenizer_class = tables.tokenizer_classes.get(tokenizer) + tokenizer = tokenizer_class(**kwargs.get("tokenizer_conf", {})) + kwargs["token_list"] = ( + tokenizer.token_list if hasattr(tokenizer, "token_list") else None + ) + kwargs["token_list"] = ( + tokenizer.get_vocab() + if hasattr(tokenizer, "get_vocab") + else kwargs["token_list"] + ) + vocab_size = ( + len(kwargs["token_list"]) if kwargs["token_list"] is not None else -1 + ) + if vocab_size == -1 and hasattr(tokenizer, "get_vocab_size"): + vocab_size = tokenizer.get_vocab_size() + else: + vocab_size = -1 + kwargs["tokenizer"] = tokenizer + + # build frontend + frontend = kwargs.get("frontend", None) + kwargs["input_size"] = None + if frontend is not None: + frontend_class = tables.frontend_classes.get(frontend) + frontend = frontend_class(**kwargs.get("frontend_conf", {})) + kwargs["input_size"] = ( + frontend.output_size() if hasattr(frontend, "output_size") else None + ) + kwargs["frontend"] = frontend + # build model + model_class = tables.model_classes.get(kwargs["model"]) + assert model_class is not None, f'{kwargs["model"]} is not registered' + model_conf = {} + deep_update(model_conf, kwargs.get("model_conf", {})) + deep_update(model_conf, kwargs) + model = model_class(**model_conf, vocab_size=vocab_size) + + # init_param + init_param = kwargs.get("init_param", None) + if init_param is not None: + if os.path.exists(init_param): + logging.info(f"Loading pretrained params from {init_param}") + load_pretrained_model( + model=model, + path=init_param, + ignore_init_mismatch=kwargs.get("ignore_init_mismatch", True), + oss_bucket=kwargs.get("oss_bucket", None), + scope_map=kwargs.get("scope_map", []), + excludes=kwargs.get("excludes", None), + ) + else: + print(f"error, init_param does not exist!: {init_param}") + + # fp16 + if kwargs.get("fp16", False): + model.to(torch.float16) + elif kwargs.get("bf16", False): + model.to(torch.bfloat16) + model.to(device) + + if not kwargs.get("disable_log", True): + tables.print() + + return model, kwargs + + def __call__(self, *args, **cfg): + kwargs = self.kwargs + deep_update(kwargs, cfg) + res = self.model(*args, kwargs) + return res + + def generate(self, input, input_len=None, **cfg): + if self.vad_model is None: + return self.inference(input, input_len=input_len, **cfg) + + else: + return self.inference_with_vad(input, input_len=input_len, **cfg) + + def inference( + self, input, input_len=None, model=None, kwargs=None, key=None, **cfg + ): + kwargs = self.kwargs if kwargs is None else kwargs + if "cache" in kwargs: + kwargs.pop("cache") + deep_update(kwargs, cfg) + model = self.model if model is None else model + model.eval() + + batch_size = kwargs.get("batch_size", 1) + # if kwargs.get("device", "cpu") == "cpu": + # batch_size = 1 + + key_list, data_list = prepare_data_iterator( + input, input_len=input_len, data_type=kwargs.get("data_type", None), key=key + ) + + speed_stats = {} + asr_result_list = [] + num_samples = len(data_list) + disable_pbar = self.kwargs.get("disable_pbar", False) + pbar = ( + tqdm(colour="blue", total=num_samples, dynamic_ncols=True) + if not disable_pbar + else None + ) + time_speech_total = 0.0 + time_escape_total = 0.0 + for beg_idx in range(0, num_samples, batch_size): + end_idx = min(num_samples, beg_idx + batch_size) + data_batch = data_list[beg_idx:end_idx] + key_batch = key_list[beg_idx:end_idx] + batch = {"data_in": data_batch, "key": key_batch} + + if (end_idx - beg_idx) == 1 and kwargs.get( + "data_type", None + ) == "fbank": # fbank + batch["data_in"] = data_batch[0] + batch["data_lengths"] = input_len + + time1 = time.perf_counter() + with torch.no_grad(): + res = model.inference(**batch, **kwargs) + if isinstance(res, (list, tuple)): + results = res[0] if len(res) > 0 else [{"text": ""}] + meta_data = res[1] if len(res) > 1 else {} + time2 = time.perf_counter() + + asr_result_list.extend(results) + + # batch_data_time = time_per_frame_s * data_batch_i["speech_lengths"].sum().item() + batch_data_time = meta_data.get("batch_data_time", -1) + time_escape = time2 - time1 + speed_stats["load_data"] = meta_data.get("load_data", 0.0) + speed_stats["extract_feat"] = meta_data.get("extract_feat", 0.0) + speed_stats["forward"] = f"{time_escape:0.3f}" + speed_stats["batch_size"] = f"{len(results)}" + speed_stats["rtf"] = f"{(time_escape) / batch_data_time:0.3f}" + description = f"{speed_stats}, " + if pbar: + pbar.update(end_idx - beg_idx) + pbar.set_description(description) + time_speech_total += batch_data_time + time_escape_total += time_escape + + if pbar: + # pbar.update(1) + pbar.set_description(f"rtf_avg: {time_escape_total/time_speech_total:0.3f}") + torch.cuda.empty_cache() + return asr_result_list + + def vad(self, input, input_len=None, **cfg): + kwargs = self.kwargs + # step.1: compute the vad model + deep_update(self.vad_kwargs, cfg) + beg_vad = time.time() + res = self.inference( + input, + input_len=input_len, + model=self.vad_model, + kwargs=self.vad_kwargs, + **cfg, + ) + end_vad = time.time() + # FIX(gcf): concat the vad clips for sense vocie model for better aed + if cfg.get("merge_vad", False): + for i in range(len(res)): + res[i]["value"] = merge_vad( + res[i]["value"], kwargs.get("merge_length_s", 15) * 1000 + ) + elapsed = end_vad - beg_vad + return elapsed, res + + def inference_with_vadres(self, input, vad_res, input_len=None, **cfg): + + kwargs = self.kwargs + + # step.2 compute asr model + model = self.model + deep_update(kwargs, cfg) + batch_size = max(int(kwargs.get("batch_size_s", 300)) * 1000, 1) + batch_size_threshold_ms = int(kwargs.get("batch_size_threshold_s", 60)) * 1000 + kwargs["batch_size"] = batch_size + + key_list, data_list = prepare_data_iterator( + input, input_len=input_len, data_type=kwargs.get("data_type", None) + ) + results_ret_list = [] + time_speech_total_all_samples = 1e-6 + + beg_total = time.time() + pbar_total = ( + tqdm(colour="red", total=len(vad_res), dynamic_ncols=True) + if not kwargs.get("disable_pbar", False) + else None + ) + + for i in range(len(vad_res)): + key = vad_res[i]["key"] + vadsegments = vad_res[i]["value"] + input_i = data_list[i] + fs = kwargs["frontend"].fs if hasattr(kwargs["frontend"], "fs") else 16000 + speech = load_audio_text_image_video( + input_i, fs=fs, audio_fs=kwargs.get("fs", 16000) + ) + speech_lengths = len(speech) + n = len(vadsegments) + data_with_index = [(vadsegments[i], i) for i in range(n)] + sorted_data = sorted(data_with_index, key=lambda x: x[0][1] - x[0][0]) + results_sorted = [] + + if not len(sorted_data): + results_ret_list.append({"key": key, "text": "", "timestamp": []}) + logging.info("decoding, utt: {}, empty speech".format(key)) + continue + + if len(sorted_data) > 0 and len(sorted_data[0]) > 0: + batch_size = max( + batch_size, sorted_data[0][0][1] - sorted_data[0][0][0] + ) + + if kwargs["device"] == "cpu": + batch_size = 0 + + beg_idx = 0 + beg_asr_total = time.time() + time_speech_total_per_sample = speech_lengths / 16000 + time_speech_total_all_samples += time_speech_total_per_sample + + # pbar_sample = tqdm(colour="blue", total=n, dynamic_ncols=True) + + all_segments = [] + max_len_in_batch = 0 + end_idx = 1 + + for j, _ in enumerate(range(0, n)): + # pbar_sample.update(1) + sample_length = sorted_data[j][0][1] - sorted_data[j][0][0] + potential_batch_length = max(max_len_in_batch, sample_length) * ( + j + 1 - beg_idx + ) + # batch_size_ms_cum += sorted_data[j][0][1] - sorted_data[j][0][0] + if ( + j < n - 1 + and sample_length < batch_size_threshold_ms + and potential_batch_length < batch_size + ): + max_len_in_batch = max(max_len_in_batch, sample_length) + end_idx += 1 + continue + + speech_j, speech_lengths_j, intervals = slice_padding_audio_samples( + speech, speech_lengths, sorted_data[beg_idx:end_idx] + ) + results = self.inference( + speech_j, input_len=None, model=model, kwargs=kwargs, **cfg + ) + + for _b in range(len(speech_j)): + results[_b]["interval"] = intervals[_b] + + if self.spk_model is not None: + # compose vad segments: [[start_time_sec, end_time_sec, speech], [...]] + for _b in range(len(speech_j)): + vad_segments = [ + [ + sorted_data[beg_idx:end_idx][_b][0][0] / 1000.0, + sorted_data[beg_idx:end_idx][_b][0][1] / 1000.0, + np.array(speech_j[_b]), + ] + ] + segments = sv_chunk(vad_segments) + all_segments.extend(segments) + speech_b = [i[2] for i in segments] + spk_res = self.inference( + speech_b, + input_len=None, + model=self.spk_model, + kwargs=kwargs, + **cfg, + ) + results[_b]["spk_embedding"] = spk_res[0]["spk_embedding"] + + beg_idx = end_idx + end_idx += 1 + max_len_in_batch = sample_length + if len(results) < 1: + continue + results_sorted.extend(results) + + # end_asr_total = time.time() + # time_escape_total_per_sample = end_asr_total - beg_asr_total + # pbar_sample.update(1) + # pbar_sample.set_description(f"rtf_avg_per_sample: {time_escape_total_per_sample / time_speech_total_per_sample:0.3f}, " + # f"time_speech_total_per_sample: {time_speech_total_per_sample: 0.3f}, " + # f"time_escape_total_per_sample: {time_escape_total_per_sample:0.3f}") + + restored_data = [0] * n + for j in range(n): + index = sorted_data[j][1] + cur = results_sorted[j] + pattern = r"<\|([^|]+)\|>" + emotion_string = re.findall(pattern, cur["text"]) + cur["text"] = re.sub(pattern, "", cur["text"]) + cur["emo"] = "".join([f"<|{t}|>" for t in emotion_string]) + if self.punc_model is not None and len(cur["text"].strip()) > 0: + deep_update(self.punc_kwargs, cfg) + punc_res = self.inference( + cur["text"], + model=self.punc_model, + kwargs=self.punc_kwargs, + **cfg, + ) + cur["text"] = punc_res[0]["text"] + + restored_data[index] = cur + + end_asr_total = time.time() + time_escape_total_per_sample = end_asr_total - beg_asr_total + if pbar_total: + pbar_total.update(1) + pbar_total.set_description( + f"rtf_avg: {time_escape_total_per_sample / time_speech_total_per_sample:0.3f}, " + f"time_speech: {time_speech_total_per_sample: 0.3f}, " + f"time_escape: {time_escape_total_per_sample:0.3f}" + ) + + # end_total = time.time() + # time_escape_total_all_samples = end_total - beg_total + # print(f"rtf_avg_all: {time_escape_total_all_samples / time_speech_total_all_samples:0.3f}, " + # f"time_speech_all: {time_speech_total_all_samples: 0.3f}, " + # f"time_escape_all: {time_escape_total_all_samples:0.3f}") + return restored_data + + def export(self, input=None, **cfg): + """ + + :param input: + :param type: + :param quantize: + :param fallback_num: + :param calib_num: + :param opset_version: + :param cfg: + :return: + """ + + device = cfg.get("device", "cpu") + model = self.model.to(device=device) + kwargs = self.kwargs + deep_update(kwargs, cfg) + kwargs["device"] = device + del kwargs["model"] + model.eval() + + type = kwargs.get("type", "onnx") + + key_list, data_list = prepare_data_iterator( + input, input_len=None, data_type=kwargs.get("data_type", None), key=None + ) + + with torch.no_grad(): + export_dir = export_utils.export(model=model, data_in=data_list, **kwargs) + + return export_dir diff --git a/xinference/thirdparty/fish_speech/tools/sensevoice/fun_asr.py b/xinference/thirdparty/fish_speech/tools/sensevoice/fun_asr.py new file mode 100644 index 0000000000..02c15a5976 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/sensevoice/fun_asr.py @@ -0,0 +1,332 @@ +import gc +import os +import re + +from audio_separator.separator import Separator + +os.environ["MODELSCOPE_CACHE"] = "./.cache/funasr" +os.environ["UVR5_CACHE"] = "./.cache/uvr5-models" +import json +import subprocess +from pathlib import Path + +import click +import torch +from loguru import logger +from pydub import AudioSegment +from silero_vad import get_speech_timestamps, load_silero_vad, read_audio +from tqdm import tqdm + +from tools.file import AUDIO_EXTENSIONS, VIDEO_EXTENSIONS, list_files +from tools.sensevoice.auto_model import AutoModel + + +def uvr5_cli( + audio_dir: Path, + output_folder: Path, + audio_files: list[Path] | None = None, + output_format: str = "flac", + model: str = "BS-Roformer-Viperx-1296.ckpt", +): + # ["BS-Roformer-Viperx-1297.ckpt", "BS-Roformer-Viperx-1296.ckpt", "BS-Roformer-Viperx-1053.ckpt", "Mel-Roformer-Viperx-1143.ckpt"] + sepr = Separator( + model_file_dir=os.environ["UVR5_CACHE"], + output_dir=output_folder, + output_format=output_format, + ) + dictmodel = { + "BS-Roformer-Viperx-1297.ckpt": "model_bs_roformer_ep_317_sdr_12.9755.ckpt", + "BS-Roformer-Viperx-1296.ckpt": "model_bs_roformer_ep_368_sdr_12.9628.ckpt", + "BS-Roformer-Viperx-1053.ckpt": "model_bs_roformer_ep_937_sdr_10.5309.ckpt", + "Mel-Roformer-Viperx-1143.ckpt": "model_mel_band_roformer_ep_3005_sdr_11.4360.ckpt", + } + roformer_model = dictmodel[model] + sepr.load_model(roformer_model) + if audio_files is None: + audio_files = list_files( + path=audio_dir, extensions=AUDIO_EXTENSIONS, recursive=True + ) + total_files = len(audio_files) + + print(f"{total_files} audio files found") + + res = [] + for audio in tqdm(audio_files, desc="Denoising: "): + file_path = str(audio_dir / audio) + sep_out = sepr.separate(file_path) + if isinstance(sep_out, str): + res.append(sep_out) + elif isinstance(sep_out, list): + res.extend(sep_out) + del sepr + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + return res, roformer_model + + +def get_sample_rate(media_path: Path): + result = subprocess.run( + [ + "ffprobe", + "-v", + "quiet", + "-print_format", + "json", + "-show_streams", + str(media_path), + ], + capture_output=True, + text=True, + check=True, + ) + media_info = json.loads(result.stdout) + for stream in media_info.get("streams", []): + if stream.get("codec_type") == "audio": + return stream.get("sample_rate") + return "44100" # Default sample rate if not found + + +def convert_to_mono(src_path: Path, out_path: Path, out_fmt: str = "wav"): + sr = get_sample_rate(src_path) + out_path.parent.mkdir(parents=True, exist_ok=True) + if src_path.resolve() == out_path.resolve(): + output = str(out_path.with_stem(out_path.stem + f"_{sr}")) + else: + output = str(out_path) + subprocess.run( + [ + "ffmpeg", + "-loglevel", + "error", + "-i", + str(src_path), + "-acodec", + "pcm_s16le" if out_fmt == "wav" else "flac", + "-ar", + sr, + "-ac", + "1", + "-y", + output, + ], + check=True, + ) + return out_path + + +def convert_video_to_audio(video_path: Path, audio_dir: Path): + cur_dir = audio_dir / video_path.relative_to(audio_dir).parent + vocals = [ + p + for p in cur_dir.glob(f"{video_path.stem}_(Vocals)*.*") + if p.suffix in AUDIO_EXTENSIONS + ] + if len(vocals) > 0: + return vocals[0] + audio_path = cur_dir / f"{video_path.stem}.wav" + convert_to_mono(video_path, audio_path) + return audio_path + + +@click.command() +@click.option("--audio-dir", required=True, help="Directory containing audio files") +@click.option( + "--save-dir", required=True, help="Directory to save processed audio files" +) +@click.option("--device", default="cuda", help="Device to use [cuda / cpu]") +@click.option("--language", default="auto", help="Language of the transcription") +@click.option( + "--max_single_segment_time", + default=20000, + type=int, + help="Maximum of Output single audio duration(ms)", +) +@click.option("--fsmn-vad/--silero-vad", default=False) +@click.option("--punc/--no-punc", default=False) +@click.option("--denoise/--no-denoise", default=False) +@click.option("--save_emo/--no_save_emo", default=False) +def main( + audio_dir: str, + save_dir: str, + device: str, + language: str, + max_single_segment_time: int, + fsmn_vad: bool, + punc: bool, + denoise: bool, + save_emo: bool, +): + + audios_path = Path(audio_dir) + save_path = Path(save_dir) + save_path.mkdir(parents=True, exist_ok=True) + + video_files = list_files( + path=audio_dir, extensions=VIDEO_EXTENSIONS, recursive=True + ) + v2a_files = [convert_video_to_audio(p, audio_dir) for p in video_files] + + if denoise: + VOCAL = "_(Vocals)" + original_files = [ + p + for p in audios_path.glob("**/*") + if p.suffix in AUDIO_EXTENSIONS and VOCAL not in p.stem + ] + + _, cur_model = uvr5_cli( + audio_dir=audio_dir, output_folder=audio_dir, audio_files=original_files + ) + need_remove = [p for p in audios_path.glob("**/*(Instrumental)*")] + need_remove.extend(original_files) + for _ in need_remove: + _.unlink() + vocal_files = [ + p + for p in audios_path.glob("**/*") + if p.suffix in AUDIO_EXTENSIONS and VOCAL in p.stem + ] + for f in vocal_files: + fn, ext = f.stem, f.suffix + + v_pos = fn.find(VOCAL + "_" + cur_model.split(".")[0]) + if v_pos != -1: + new_fn = fn[: v_pos + len(VOCAL)] + new_f = f.with_name(new_fn + ext) + f = f.rename(new_f) + convert_to_mono(f, f, "flac") + f.unlink() + + audio_files = list_files( + path=audio_dir, extensions=AUDIO_EXTENSIONS, recursive=True + ) + + logger.info("Loading / Downloading Funasr model...") + + model_dir = "iic/SenseVoiceSmall" + + vad_model = "fsmn-vad" if fsmn_vad else None + vad_kwargs = {"max_single_segment_time": max_single_segment_time} + punc_model = "ct-punc" if punc else None + + manager = AutoModel( + model=model_dir, + trust_remote_code=False, + vad_model=vad_model, + vad_kwargs=vad_kwargs, + punc_model=punc_model, + device=device, + ) + + if not fsmn_vad and vad_model is None: + vad_model = load_silero_vad() + + logger.info("Model loaded.") + + pattern = re.compile(r"_\d{3}\.") + + for file_path in tqdm(audio_files, desc="Processing audio file"): + + if pattern.search(file_path.name): + # logger.info(f"Skipping {file_path} as it has already been processed.") + continue + + file_stem = file_path.stem + file_suffix = file_path.suffix + + rel_path = Path(file_path).relative_to(audio_dir) + (save_path / rel_path.parent).mkdir(parents=True, exist_ok=True) + + audio = AudioSegment.from_file(file_path) + + cfg = dict( + cache={}, + language=language, # "zh", "en", "yue", "ja", "ko", "nospeech" + use_itn=False, + batch_size_s=60, + ) + + if fsmn_vad: + elapsed, vad_res = manager.vad(input=str(file_path), **cfg) + else: + wav = read_audio( + str(file_path) + ) # backend (sox, soundfile, or ffmpeg) required! + audio_key = file_path.stem + audio_val = [] + speech_timestamps = get_speech_timestamps( + wav, + vad_model, + max_speech_duration_s=max_single_segment_time // 1000, + return_seconds=True, + ) + + audio_val = [ + [int(timestamp["start"] * 1000), int(timestamp["end"] * 1000)] + for timestamp in speech_timestamps + ] + vad_res = [] + vad_res.append(dict(key=audio_key, value=audio_val)) + + res = manager.inference_with_vadres( + input=str(file_path), vad_res=vad_res, **cfg + ) + + for i, info in enumerate(res): + [start_ms, end_ms] = info["interval"] + text = info["text"] + emo = info["emo"] + sliced_audio = audio[start_ms:end_ms] + audio_save_path = ( + save_path / rel_path.parent / f"{file_stem}_{i:03d}{file_suffix}" + ) + sliced_audio.export(audio_save_path, format=file_suffix[1:]) + print(f"Exported {audio_save_path}: {text}") + + transcript_save_path = ( + save_path / rel_path.parent / f"{file_stem}_{i:03d}.lab" + ) + with open( + transcript_save_path, + "w", + encoding="utf-8", + ) as f: + f.write(text) + + if save_emo: + emo_save_path = save_path / rel_path.parent / f"{file_stem}_{i:03d}.emo" + with open( + emo_save_path, + "w", + encoding="utf-8", + ) as f: + f.write(emo) + + if audios_path.resolve() == save_path.resolve(): + file_path.unlink() + + +if __name__ == "__main__": + main() + exit(0) + from funasr.utils.postprocess_utils import rich_transcription_postprocess + + # Load the audio file + audio_path = Path(r"D:\PythonProject\ok\1_output_(Vocals).wav") + model_dir = "iic/SenseVoiceSmall" + m, kwargs = SenseVoiceSmall.from_pretrained(model=model_dir, device="cuda:0") + m.eval() + + res = m.inference( + data_in=f"{kwargs['model_path']}/example/zh.mp3", + language="auto", # "zh", "en", "yue", "ja", "ko", "nospeech" + use_itn=False, + ban_emo_unk=False, + **kwargs, + ) + + print(res) + text = rich_transcription_postprocess(res[0][0]["text"]) + print(text) diff --git a/xinference/thirdparty/fish_speech/tools/sensevoice/vad_utils.py b/xinference/thirdparty/fish_speech/tools/sensevoice/vad_utils.py new file mode 100644 index 0000000000..3bef75ed8c --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/sensevoice/vad_utils.py @@ -0,0 +1,61 @@ +import torch +from torch.nn.utils.rnn import pad_sequence + + +def slice_padding_fbank(speech, speech_lengths, vad_segments): + speech_list = [] + speech_lengths_list = [] + for i, segment in enumerate(vad_segments): + + bed_idx = int(segment[0][0] * 16) + end_idx = min(int(segment[0][1] * 16), speech_lengths[0]) + speech_i = speech[0, bed_idx:end_idx] + speech_lengths_i = end_idx - bed_idx + speech_list.append(speech_i) + speech_lengths_list.append(speech_lengths_i) + feats_pad = pad_sequence(speech_list, batch_first=True, padding_value=0.0) + speech_lengths_pad = torch.Tensor(speech_lengths_list).int() + return feats_pad, speech_lengths_pad + + +def slice_padding_audio_samples(speech, speech_lengths, vad_segments): + speech_list = [] + speech_lengths_list = [] + intervals = [] + for i, segment in enumerate(vad_segments): + bed_idx = int(segment[0][0] * 16) + end_idx = min(int(segment[0][1] * 16), speech_lengths) + speech_i = speech[bed_idx:end_idx] + speech_lengths_i = end_idx - bed_idx + speech_list.append(speech_i) + speech_lengths_list.append(speech_lengths_i) + intervals.append([bed_idx // 16, end_idx // 16]) + + return speech_list, speech_lengths_list, intervals + + +def merge_vad(vad_result, max_length=15000, min_length=0): + new_result = [] + if len(vad_result) <= 1: + return vad_result + time_step = [t[0] for t in vad_result] + [t[1] for t in vad_result] + time_step = sorted(list(set(time_step))) + if len(time_step) == 0: + return [] + bg = 0 + for i in range(len(time_step) - 1): + time = time_step[i] + if time_step[i + 1] - bg < max_length: + continue + if time - bg > min_length: + new_result.append([bg, time]) + # if time - bg < max_length * 1.5: + # new_result.append([bg, time]) + # else: + # split_num = int(time - bg) // max_length + 1 + # spl_l = int(time - bg) // split_num + # for j in range(split_num): + # new_result.append([bg + j * spl_l, bg + (j + 1) * spl_l]) + bg = time + new_result.append([bg, time_step[-1]]) + return new_result diff --git a/xinference/thirdparty/fish_speech/tools/smart_pad.py b/xinference/thirdparty/fish_speech/tools/smart_pad.py new file mode 100644 index 0000000000..9772168f51 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/smart_pad.py @@ -0,0 +1,47 @@ +import random +from multiprocessing import Pool +from pathlib import Path + +import click +import librosa +import torch.nn.functional as F +import torchaudio +from tqdm import tqdm + +from tools.file import AUDIO_EXTENSIONS, list_files + +threshold = 10 ** (-50 / 20.0) + + +def process(file): + waveform, sample_rate = torchaudio.load(str(file), backend="sox") + loudness = librosa.feature.rms( + y=waveform.numpy().squeeze(), frame_length=2048, hop_length=512, center=True + )[0] + for i in range(len(loudness) - 1, 0, -1): + if loudness[i] > threshold: + break + + silent_time = (len(loudness) - i) * 512 / sample_rate + + if silent_time <= 0.3: + random_time = random.uniform(0.3, 0.7) + waveform = F.pad( + waveform, (0, int(random_time * sample_rate)), mode="constant", value=0 + ) + + torchaudio.save(uri=str(file), src=waveform, sample_rate=sample_rate) + + +@click.command() +@click.argument("source", type=Path) +@click.option("--num-workers", type=int, default=12) +def main(source, num_workers): + files = list(list_files(source, AUDIO_EXTENSIONS, recursive=True)) + + with Pool(num_workers) as p: + list(tqdm(p.imap_unordered(process, files), total=len(files))) + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/fish_speech/tools/vqgan/__init__.py b/xinference/thirdparty/fish_speech/tools/vqgan/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/fish_speech/tools/vqgan/create_train_split.py b/xinference/thirdparty/fish_speech/tools/vqgan/create_train_split.py new file mode 100644 index 0000000000..d24a5f3956 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/vqgan/create_train_split.py @@ -0,0 +1,83 @@ +import math +from pathlib import Path +from random import Random + +import click +from loguru import logger +from pydub import AudioSegment +from tqdm import tqdm + +from tools.file import AUDIO_EXTENSIONS, list_files, load_filelist + + +@click.command() +@click.argument("root", type=click.Path(exists=True, path_type=Path)) +@click.option("--val-ratio", type=float, default=None) +@click.option("--val-count", type=int, default=None) +@click.option("--filelist", default=None, type=Path) +@click.option("--min-duration", default=None, type=float) +@click.option("--max-duration", default=None, type=float) +def main(root, val_ratio, val_count, filelist, min_duration, max_duration): + if filelist: + files = [i[0] for i in load_filelist(filelist)] + else: + files = list_files(root, AUDIO_EXTENSIONS, recursive=True, sort=True) + + if min_duration is None and max_duration is None: + filtered_files = list(map(str, [file.relative_to(root) for file in files])) + else: + filtered_files = [] + for file in tqdm(files): + try: + audio = AudioSegment.from_file(str(file)) + duration = len(audio) / 1000.0 + + if min_duration is not None and duration < min_duration: + logger.info( + f"Skipping {file} due to duration {duration:.2f} < {min_duration:.2f}" + ) + continue + + if max_duration is not None and duration > max_duration: + logger.info( + f"Skipping {file} due to duration {duration:.2f} > {max_duration:.2f}" + ) + continue + + filtered_files.append(str(file.relative_to(root))) + except Exception as e: + logger.info(f"Error processing {file}: {e}") + + logger.info( + f"Found {len(files)} files, remaining {len(filtered_files)} files after filtering" + ) + + Random(42).shuffle(filtered_files) + + if val_count is None and val_ratio is None: + logger.info("Validation ratio and count not specified, using min(20%, 100)") + val_size = min(100, math.ceil(len(filtered_files) * 0.2)) + elif val_count is not None and val_ratio is not None: + logger.error("Cannot specify both val_count and val_ratio") + return + elif val_count is not None: + if val_count < 1 or val_count > len(filtered_files): + logger.error("val_count must be between 1 and number of files") + return + val_size = val_count + else: + val_size = math.ceil(len(filtered_files) * val_ratio) + + logger.info(f"Using {val_size} files for validation") + + with open(root / "vq_train_filelist.txt", "w", encoding="utf-8") as f: + f.write("\n".join(filtered_files[val_size:])) + + with open(root / "vq_val_filelist.txt", "w", encoding="utf-8") as f: + f.write("\n".join(filtered_files[:val_size])) + + logger.info("Done") + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/fish_speech/tools/vqgan/extract_vq.py b/xinference/thirdparty/fish_speech/tools/vqgan/extract_vq.py new file mode 100644 index 0000000000..bc6bc40830 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/vqgan/extract_vq.py @@ -0,0 +1,227 @@ +import os +import subprocess as sp +import sys +import time +from datetime import timedelta +from functools import lru_cache +from pathlib import Path +from random import Random + +import click +import numpy as np +import torch +import torchaudio +from hydra import compose, initialize +from hydra.utils import instantiate +from lightning import LightningModule +from loguru import logger +from omegaconf import OmegaConf + +from tools.file import AUDIO_EXTENSIONS, list_files, load_filelist + +# register eval resolver +OmegaConf.register_new_resolver("eval", eval) +# This file is used to convert the audio files to text files using the Whisper model. +# It's mainly used to generate the training data for the VQ model. + + +RANK = int(os.environ.get("SLURM_PROCID", 0)) +WORLD_SIZE = int(os.environ.get("SLURM_NTASKS", 1)) + +logger_format = ( + "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | " + "<level>{level: <8}</level> | " + "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | " + "{extra[rank]} - <level>{message}</level>" +) +logger.configure(extra={"rank": f"RANK: {RANK} / {WORLD_SIZE}"}) +logger.remove() +logger.add(sys.stderr, format=logger_format) + + +@lru_cache(maxsize=1) +def get_model( + config_name: str = "firefly_gan_vq", + checkpoint_path: str = "checkpoints/fish-speech-1.2-sft/firefly-gan-vq-fsq-4x1024-42hz-generator.pth", + device: str | torch.device = "cuda", +): + with initialize(version_base="1.3", config_path="../../fish_speech/configs"): + cfg = compose(config_name=config_name) + + model = instantiate(cfg) + state_dict = torch.load( + checkpoint_path, + map_location=device, + ) + if "state_dict" in state_dict: + state_dict = state_dict["state_dict"] + + if any("generator" in k for k in state_dict): + state_dict = { + k.replace("generator.", ""): v + for k, v in state_dict.items() + if "generator." in k + } + + model.load_state_dict(state_dict, strict=False) + model.eval() + model.to(device) + + logger.info(f"Loaded model") + return model + + +@torch.inference_mode() +def process_batch(files: list[Path], model) -> float: + wavs = [] + audio_lengths = [] + new_files = [] + max_length = total_time = 0 + + for file in files: + try: + wav, sr = torchaudio.load( + str(file), backend="sox" if sys.platform == "linux" else "soundfile" + ) # Need to install libsox-dev + except Exception as e: + logger.error(f"Error reading {file}: {e}") + continue + + if wav.shape[0] > 1: + wav = wav.mean(dim=0, keepdim=True) + + wav = torchaudio.functional.resample( + wav.cuda(), sr, model.spec_transform.sample_rate + )[0] + total_time += len(wav) / model.spec_transform.sample_rate + max_length = max(max_length, len(wav)) + + wavs.append(wav) + audio_lengths.append(len(wav)) + new_files.append(file) + + files = new_files + + # Pad to max length + for i, wav in enumerate(wavs): + wavs[i] = torch.nn.functional.pad(wav, (0, max_length - len(wav)), "constant") + + audios = torch.stack(wavs, dim=0)[:, None] + audio_lengths = torch.tensor(audio_lengths, device=model.device, dtype=torch.long) + + # Calculate lengths + indices, feature_lengths = model.encode(audios, audio_lengths) + + # Save to disk + outputs = indices.cpu().numpy() + + for file, length, feature, audio_length in zip( + files, feature_lengths, outputs, audio_lengths + ): + feature = feature[:, :length] + + # (T,) + with open(file.with_suffix(".npy"), "wb") as f: + np.save(f, feature) + + return total_time + + +@click.command() +@click.argument("folder") +@click.option("--num-workers", default=1) +@click.option("--config-name", default="firefly_gan_vq") +@click.option( + "--checkpoint-path", + default="checkpoints/fish-speech-1.2-sft/firefly-gan-vq-fsq-4x1024-42hz-generator.pth", +) +@click.option("--batch-size", default=64) +@click.option("--filelist", default=None, type=Path) +def main( + folder: str, + num_workers: int, + config_name: str, + checkpoint_path: str, + batch_size: int, + filelist: Path, +): + if num_workers > 1 and WORLD_SIZE != num_workers: + assert WORLD_SIZE == 1, "You should either use SLURM or this launcher, not both" + + logger.info(f"Spawning {num_workers} workers") + + if torch.cuda.is_available(): + visible_devices = os.environ.get("CUDA_VISIBLE_DEVICES", None) + if visible_devices is None: + visible_devices = list(range(torch.cuda.device_count())) + else: + visible_devices = visible_devices.split(",") + else: + # Set to empty string to avoid using GPU + visible_devices = [""] + + processes = [] + for i in range(num_workers): + env = os.environ.copy() + env["CUDA_VISIBLE_DEVICES"] = str(visible_devices[i % len(visible_devices)]) + env["SLURM_PROCID"] = str(i) + env["SLURM_NTASKS"] = str(num_workers) + + processes.append( + sp.Popen( + [sys.executable] + sys.argv.copy(), + env=env, + ) + ) + + for p in processes: + p.wait() + + logger.info(f"All workers finished") + return + + # This is a worker + logger.info(f"Starting worker") + if filelist: + files = [i[0] for i in load_filelist(filelist)] + else: + files = list_files(folder, AUDIO_EXTENSIONS, recursive=True, sort=False) + + print(f"Found {len(files)} files") + files = [Path(f) for f in files if not Path(f).with_suffix(".npy").exists()] + + total_files = len(files) + files = files[RANK::WORLD_SIZE] + logger.info(f"Processing {len(files)}/{total_files} files") + + # Batch processing + total_time = 0 + begin_time = time.time() + processed_files = 0 + model = get_model(config_name, checkpoint_path) + + for n_batch, idx in enumerate(range(0, len(files), batch_size)): + batch = files[idx : idx + batch_size] + batch_time = process_batch(batch, model) + + total_time += batch_time + processed_files += len(batch) + + if (n_batch + 1) % 10 == 0: + eta = ( + (time.time() - begin_time) + / processed_files + * (len(files) - processed_files) + ) + logger.info( + f"Processed {processed_files} files, {total_time / 3600:.2f} hours of audio, " + + f"ETA: {timedelta(seconds=round(eta))}s" + ) + + logger.info( + f"Finished processing {len(files)} files, {total_time / 3600:.2f} hours of audio" + ) + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/fish_speech/tools/vqgan/inference.py b/xinference/thirdparty/fish_speech/tools/vqgan/inference.py new file mode 100644 index 0000000000..17c9034d7b --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/vqgan/inference.py @@ -0,0 +1,120 @@ +from pathlib import Path + +import click +import hydra +import numpy as np +import soundfile as sf +import torch +import torchaudio +from hydra import compose, initialize +from hydra.utils import instantiate +from loguru import logger +from omegaconf import OmegaConf + +from tools.file import AUDIO_EXTENSIONS + +# register eval resolver +OmegaConf.register_new_resolver("eval", eval) + + +def load_model(config_name, checkpoint_path, device="cuda"): + hydra.core.global_hydra.GlobalHydra.instance().clear() + with initialize(version_base="1.3", config_path="../../fish_speech/configs"): + cfg = compose(config_name=config_name) + + model = instantiate(cfg) + state_dict = torch.load( + checkpoint_path, + map_location=device, + ) + if "state_dict" in state_dict: + state_dict = state_dict["state_dict"] + + if any("generator" in k for k in state_dict): + state_dict = { + k.replace("generator.", ""): v + for k, v in state_dict.items() + if "generator." in k + } + + result = model.load_state_dict(state_dict, strict=False) + model.eval() + model.to(device) + + logger.info(f"Loaded model: {result}") + return model + + +@torch.no_grad() +@click.command() +@click.option( + "--input-path", + "-i", + default="test.wav", + type=click.Path(exists=True, path_type=Path), +) +@click.option( + "--output-path", "-o", default="fake.wav", type=click.Path(path_type=Path) +) +@click.option("--config-name", default="firefly_gan_vq") +@click.option( + "--checkpoint-path", + default="checkpoints/fish-speech-1.2-sft/firefly-gan-vq-fsq-4x1024-42hz-generator.pth", +) +@click.option( + "--device", + "-d", + default="cuda", +) +def main(input_path, output_path, config_name, checkpoint_path, device): + model = load_model(config_name, checkpoint_path, device=device) + + if input_path.suffix in AUDIO_EXTENSIONS: + logger.info(f"Processing in-place reconstruction of {input_path}") + + # Load audio + audio, sr = torchaudio.load(str(input_path)) + if audio.shape[0] > 1: + audio = audio.mean(0, keepdim=True) + audio = torchaudio.functional.resample( + audio, sr, model.spec_transform.sample_rate + ) + + audios = audio[None].to(device) + logger.info( + f"Loaded audio with {audios.shape[2] / model.spec_transform.sample_rate:.2f} seconds" + ) + + # VQ Encoder + audio_lengths = torch.tensor([audios.shape[2]], device=device, dtype=torch.long) + indices = model.encode(audios, audio_lengths)[0][0] + + logger.info(f"Generated indices of shape {indices.shape}") + + # Save indices + np.save(output_path.with_suffix(".npy"), indices.cpu().numpy()) + elif input_path.suffix == ".npy": + logger.info(f"Processing precomputed indices from {input_path}") + indices = np.load(input_path) + indices = torch.from_numpy(indices).to(device).long() + assert indices.ndim == 2, f"Expected 2D indices, got {indices.ndim}" + else: + raise ValueError(f"Unknown input type: {input_path}") + + # Restore + feature_lengths = torch.tensor([indices.shape[1]], device=device) + fake_audios = model.decode(indices=indices[None], feature_lengths=feature_lengths) + audio_time = fake_audios.shape[-1] / model.spec_transform.sample_rate + + logger.info( + f"Generated audio of shape {fake_audios.shape}, equivalent to {audio_time:.2f} seconds from {indices.shape[1]} features, features/second: {indices.shape[1] / audio_time:.2f}" + ) + + # Save audio + fake_audio = fake_audios[0, 0].float().cpu().numpy() + sf.write(output_path, fake_audio, model.spec_transform.sample_rate) + logger.info(f"Saved audio to {output_path}") + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/fish_speech/tools/webui.py b/xinference/thirdparty/fish_speech/tools/webui.py new file mode 100644 index 0000000000..f64ff923b0 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/webui.py @@ -0,0 +1,619 @@ +import gc +import html +import io +import os +import queue +import wave +from argparse import ArgumentParser +from functools import partial +from pathlib import Path + +import gradio as gr +import librosa +import numpy as np +# import pyrootutils +import torch +from loguru import logger +from transformers import AutoTokenizer + +# pyrootutils.setup_root(__file__, indicator=".project-root", pythonpath=True) + + +from fish_speech.i18n import i18n +from fish_speech.text.chn_text_norm.text import Text as ChnNormedText +from fish_speech.utils import autocast_exclude_mps +from tools.api import decode_vq_tokens, encode_reference +from tools.auto_rerank import batch_asr, calculate_wer, is_chinese, load_model +from tools.llama.generate import ( + GenerateRequest, + GenerateResponse, + WrappedGenerateResponse, + launch_thread_safe_queue, +) +from tools.vqgan.inference import load_model as load_decoder_model + +# Make einx happy +os.environ["EINX_FILTER_TRACEBACK"] = "false" + + +HEADER_MD = f"""# Fish Speech + +{i18n("A text-to-speech model based on VQ-GAN and Llama developed by [Fish Audio](https://fish.audio).")} + +{i18n("You can find the source code [here](https://github.com/fishaudio/fish-speech) and models [here](https://huggingface.co/fishaudio/fish-speech-1).")} + +{i18n("Related code are released under BSD-3-Clause License, and weights are released under CC BY-NC-SA 4.0 License.")} + +{i18n("We are not responsible for any misuse of the model, please consider your local laws and regulations before using it.")} +""" + +TEXTBOX_PLACEHOLDER = i18n("Put your text here.") +SPACE_IMPORTED = False + + +def build_html_error_message(error): + return f""" + <div style="color: red; + font-weight: bold;"> + {html.escape(str(error))} + </div> + """ + + +@torch.inference_mode() +def inference( + text, + enable_reference_audio, + reference_audio, + reference_text, + max_new_tokens, + chunk_length, + top_p, + repetition_penalty, + temperature, + streaming=False, +): + if args.max_gradio_length > 0 and len(text) > args.max_gradio_length: + return ( + None, + None, + i18n("Text is too long, please keep it under {} characters.").format( + args.max_gradio_length + ), + ) + + # Parse reference audio aka prompt + prompt_tokens = encode_reference( + decoder_model=decoder_model, + reference_audio=reference_audio, + enable_reference_audio=enable_reference_audio, + ) + + # LLAMA Inference + request = dict( + device=decoder_model.device, + max_new_tokens=max_new_tokens, + text=text, + top_p=top_p, + repetition_penalty=repetition_penalty, + temperature=temperature, + compile=args.compile, + iterative_prompt=chunk_length > 0, + chunk_length=chunk_length, + max_length=2048, + prompt_tokens=prompt_tokens if enable_reference_audio else None, + prompt_text=reference_text if enable_reference_audio else None, + ) + + response_queue = queue.Queue() + llama_queue.put( + GenerateRequest( + request=request, + response_queue=response_queue, + ) + ) + + if streaming: + yield wav_chunk_header(), None, None + + segments = [] + + while True: + result: WrappedGenerateResponse = response_queue.get() + if result.status == "error": + yield None, None, build_html_error_message(result.response) + break + + result: GenerateResponse = result.response + if result.action == "next": + break + + with autocast_exclude_mps( + device_type=decoder_model.device.type, dtype=args.precision + ): + fake_audios = decode_vq_tokens( + decoder_model=decoder_model, + codes=result.codes, + ) + + fake_audios = fake_audios.float().cpu().numpy() + segments.append(fake_audios) + + if streaming: + yield (fake_audios * 32768).astype(np.int16).tobytes(), None, None + + if len(segments) == 0: + return ( + None, + None, + build_html_error_message( + i18n("No audio generated, please check the input text.") + ), + ) + + # No matter streaming or not, we need to return the final audio + audio = np.concatenate(segments, axis=0) + yield None, (decoder_model.spec_transform.sample_rate, audio), None + + if torch.cuda.is_available(): + torch.cuda.empty_cache() + gc.collect() + + +def inference_with_auto_rerank( + text, + enable_reference_audio, + reference_audio, + reference_text, + max_new_tokens, + chunk_length, + top_p, + repetition_penalty, + temperature, + use_auto_rerank, + streaming=False, +): + + max_attempts = 2 if use_auto_rerank else 1 + best_wer = float("inf") + best_audio = None + best_sample_rate = None + + for attempt in range(max_attempts): + audio_generator = inference( + text, + enable_reference_audio, + reference_audio, + reference_text, + max_new_tokens, + chunk_length, + top_p, + repetition_penalty, + temperature, + streaming=False, + ) + + # 获取音频数据 + for _ in audio_generator: + pass + _, (sample_rate, audio), message = _ + + if audio is None: + return None, None, message + + if not use_auto_rerank: + return None, (sample_rate, audio), None + + asr_result = batch_asr(asr_model, [audio], sample_rate)[0] + wer = calculate_wer(text, asr_result["text"]) + if wer <= 0.3 and not asr_result["huge_gap"]: + return None, (sample_rate, audio), None + + if wer < best_wer: + best_wer = wer + best_audio = audio + best_sample_rate = sample_rate + + if attempt == max_attempts - 1: + break + + return None, (best_sample_rate, best_audio), None + + +inference_stream = partial(inference, streaming=True) + +n_audios = 4 + +global_audio_list = [] +global_error_list = [] + + +def inference_wrapper( + text, + enable_reference_audio, + reference_audio, + reference_text, + max_new_tokens, + chunk_length, + top_p, + repetition_penalty, + temperature, + batch_infer_num, + if_load_asr_model, +): + audios = [] + errors = [] + + for _ in range(batch_infer_num): + result = inference_with_auto_rerank( + text, + enable_reference_audio, + reference_audio, + reference_text, + max_new_tokens, + chunk_length, + top_p, + repetition_penalty, + temperature, + if_load_asr_model, + ) + + _, audio_data, error_message = result + + audios.append( + gr.Audio(value=audio_data if audio_data else None, visible=True), + ) + errors.append( + gr.HTML(value=error_message if error_message else None, visible=True), + ) + + for _ in range(batch_infer_num, n_audios): + audios.append( + gr.Audio(value=None, visible=False), + ) + errors.append( + gr.HTML(value=None, visible=False), + ) + + return None, *audios, *errors + + +def wav_chunk_header(sample_rate=44100, bit_depth=16, channels=1): + buffer = io.BytesIO() + + with wave.open(buffer, "wb") as wav_file: + wav_file.setnchannels(channels) + wav_file.setsampwidth(bit_depth // 8) + wav_file.setframerate(sample_rate) + + wav_header_bytes = buffer.getvalue() + buffer.close() + return wav_header_bytes + + +def normalize_text(user_input, use_normalization): + if use_normalization: + return ChnNormedText(raw_text=user_input).normalize() + else: + return user_input + + +asr_model = None + + +def change_if_load_asr_model(if_load): + global asr_model + + if if_load: + gr.Warning("Loading faster whisper model...") + if asr_model is None: + asr_model = load_model() + return gr.Checkbox(label="Unload faster whisper model", value=if_load) + + if if_load is False: + gr.Warning("Unloading faster whisper model...") + del asr_model + asr_model = None + if torch.cuda.is_available(): + torch.cuda.empty_cache() + gc.collect() + return gr.Checkbox(label="Load faster whisper model", value=if_load) + + +def change_if_auto_label(if_load, if_auto_label, enable_ref, ref_audio, ref_text): + if if_load and asr_model is not None: + if ( + if_auto_label + and enable_ref + and ref_audio is not None + and ref_text.strip() == "" + ): + data, sample_rate = librosa.load(ref_audio) + res = batch_asr(asr_model, [data], sample_rate)[0] + ref_text = res["text"] + else: + gr.Warning("Whisper model not loaded!") + + return gr.Textbox(value=ref_text) + + +def build_app(): + with gr.Blocks(theme=gr.themes.Base()) as app: + gr.Markdown(HEADER_MD) + + # Use light theme by default + app.load( + None, + None, + js="() => {const params = new URLSearchParams(window.location.search);if (!params.has('__theme')) {params.set('__theme', '%s');window.location.search = params.toString();}}" + % args.theme, + ) + + # Inference + with gr.Row(): + with gr.Column(scale=3): + text = gr.Textbox( + label=i18n("Input Text"), placeholder=TEXTBOX_PLACEHOLDER, lines=10 + ) + refined_text = gr.Textbox( + label=i18n("Realtime Transform Text"), + placeholder=i18n( + "Normalization Result Preview (Currently Only Chinese)" + ), + lines=5, + interactive=False, + ) + + with gr.Row(): + if_refine_text = gr.Checkbox( + label=i18n("Text Normalization"), + value=True, + scale=1, + ) + + if_load_asr_model = gr.Checkbox( + label=i18n("Load / Unload ASR model for auto-reranking"), + value=False, + scale=3, + ) + + with gr.Row(): + with gr.Tab(label=i18n("Advanced Config")): + chunk_length = gr.Slider( + label=i18n("Iterative Prompt Length, 0 means off"), + minimum=0, + maximum=500, + value=100, + step=8, + ) + + max_new_tokens = gr.Slider( + label=i18n("Maximum tokens per batch, 0 means no limit"), + minimum=0, + maximum=2048, + value=1024, # 0 means no limit + step=8, + ) + + top_p = gr.Slider( + label="Top-P", + minimum=0.6, + maximum=0.9, + value=0.7, + step=0.01, + ) + + repetition_penalty = gr.Slider( + label=i18n("Repetition Penalty"), + minimum=1, + maximum=1.5, + value=1.2, + step=0.01, + ) + + temperature = gr.Slider( + label="Temperature", + minimum=0.6, + maximum=0.9, + value=0.7, + step=0.01, + ) + + with gr.Tab(label=i18n("Reference Audio")): + gr.Markdown( + i18n( + "5 to 10 seconds of reference audio, useful for specifying speaker." + ) + ) + + enable_reference_audio = gr.Checkbox( + label=i18n("Enable Reference Audio"), + ) + reference_audio = gr.Audio( + label=i18n("Reference Audio"), + type="filepath", + ) + with gr.Row(): + if_auto_label = gr.Checkbox( + label=i18n("Auto Labeling"), + min_width=100, + scale=0, + value=False, + ) + reference_text = gr.Textbox( + label=i18n("Reference Text"), + lines=1, + placeholder="在一无所知中,梦里的一天结束了,一个新的「轮回」便会开始。", + value="", + ) + with gr.Tab(label=i18n("Batch Inference")): + batch_infer_num = gr.Slider( + label="Batch infer nums", + minimum=1, + maximum=n_audios, + step=1, + value=1, + ) + + with gr.Column(scale=3): + for _ in range(n_audios): + with gr.Row(): + error = gr.HTML( + label=i18n("Error Message"), + visible=True if _ == 0 else False, + ) + global_error_list.append(error) + with gr.Row(): + audio = gr.Audio( + label=i18n("Generated Audio"), + type="numpy", + interactive=False, + visible=True if _ == 0 else False, + ) + global_audio_list.append(audio) + + with gr.Row(): + stream_audio = gr.Audio( + label=i18n("Streaming Audio"), + streaming=True, + autoplay=True, + interactive=False, + show_download_button=True, + ) + with gr.Row(): + with gr.Column(scale=3): + generate = gr.Button( + value="\U0001F3A7 " + i18n("Generate"), variant="primary" + ) + generate_stream = gr.Button( + value="\U0001F3A7 " + i18n("Streaming Generate"), + variant="primary", + ) + + text.input( + fn=normalize_text, inputs=[text, if_refine_text], outputs=[refined_text] + ) + + if_load_asr_model.change( + fn=change_if_load_asr_model, + inputs=[if_load_asr_model], + outputs=[if_load_asr_model], + ) + + if_auto_label.change( + fn=lambda: gr.Textbox(value=""), + inputs=[], + outputs=[reference_text], + ).then( + fn=change_if_auto_label, + inputs=[ + if_load_asr_model, + if_auto_label, + enable_reference_audio, + reference_audio, + reference_text, + ], + outputs=[reference_text], + ) + + # # Submit + generate.click( + inference_wrapper, + [ + refined_text, + enable_reference_audio, + reference_audio, + reference_text, + max_new_tokens, + chunk_length, + top_p, + repetition_penalty, + temperature, + batch_infer_num, + if_load_asr_model, + ], + [stream_audio, *global_audio_list, *global_error_list], + concurrency_limit=1, + ) + + generate_stream.click( + inference_stream, + [ + refined_text, + enable_reference_audio, + reference_audio, + reference_text, + max_new_tokens, + chunk_length, + top_p, + repetition_penalty, + temperature, + ], + [stream_audio, global_audio_list[0], global_error_list[0]], + concurrency_limit=10, + ) + return app + + +def parse_args(): + parser = ArgumentParser() + parser.add_argument( + "--llama-checkpoint-path", + type=Path, + default="checkpoints/fish-speech-1.2-sft", + ) + parser.add_argument( + "--decoder-checkpoint-path", + type=Path, + default="checkpoints/fish-speech-1.2-sft/firefly-gan-vq-fsq-4x1024-42hz-generator.pth", + ) + parser.add_argument("--decoder-config-name", type=str, default="firefly_gan_vq") + parser.add_argument("--device", type=str, default="cuda") + parser.add_argument("--half", action="store_true") + parser.add_argument("--compile", action="store_true") + parser.add_argument("--max-gradio-length", type=int, default=0) + parser.add_argument("--theme", type=str, default="light") + + return parser.parse_args() + + +if __name__ == "__main__": + args = parse_args() + args.precision = torch.half if args.half else torch.bfloat16 + + logger.info("Loading Llama model...") + llama_queue = launch_thread_safe_queue( + checkpoint_path=args.llama_checkpoint_path, + device=args.device, + precision=args.precision, + compile=args.compile, + ) + logger.info("Llama model loaded, loading VQ-GAN model...") + + decoder_model = load_decoder_model( + config_name=args.decoder_config_name, + checkpoint_path=args.decoder_checkpoint_path, + device=args.device, + ) + + logger.info("Decoder model loaded, warming up...") + + # Dry run to check if the model is loaded correctly and avoid the first-time latency + list( + inference( + text="Hello, world!", + enable_reference_audio=False, + reference_audio=None, + reference_text="", + max_new_tokens=0, + chunk_length=100, + top_p=0.7, + repetition_penalty=1.2, + temperature=0.7, + ) + ) + + logger.info("Warming up done, launching the web UI...") + + app = build_app() + app.launch(show_api=True) diff --git a/xinference/thirdparty/fish_speech/tools/whisper_asr.py b/xinference/thirdparty/fish_speech/tools/whisper_asr.py new file mode 100644 index 0000000000..42e7de8a18 --- /dev/null +++ b/xinference/thirdparty/fish_speech/tools/whisper_asr.py @@ -0,0 +1,176 @@ +""" +Used to transcribe all audio files in one folder into another folder. +e.g. +Directory structure: +--pre_data_root +----SP_1 +------01.wav +------02.wav +------...... +----SP_2 +------01.wav +------02.wav +------...... +Use +python tools/whisper_asr.py --audio-dir pre_data_root/SP_1 --save-dir data/SP_1 +to transcribe the first speaker. + +Use +python tools/whisper_asr.py --audio-dir pre_data_root/SP_2 --save-dir data/SP_2 +to transcribe the second speaker. + +Note: Be aware of your audio sample rate, which defaults to 44.1kHz. +""" + +import re +from pathlib import Path + +import click +import soundfile as sf +from faster_whisper import WhisperModel +from loguru import logger +from pydub import AudioSegment +from tqdm import tqdm + +from tools.file import AUDIO_EXTENSIONS, list_files + + +@click.command() +@click.option("--model-size", default="large-v3", help="Size of the Whisper model") +@click.option( + "--compute-type", + default="float16", + help="Computation Precision of the Whisper model [float16 / int8_float16 / int8]", +) +@click.option("--audio-dir", required=True, help="Directory containing audio files") +@click.option( + "--save-dir", required=True, help="Directory to save processed audio files" +) +@click.option( + "--sample-rate", + default=44100, + type=int, + help="Output sample rate, default to input sample rate", +) +@click.option("--device", default="cuda", help="Device to use [cuda / cpu]") +@click.option("--language", default="auto", help="Language of the transcription") +@click.option("--initial-prompt", default=None, help="Initial prompt for transcribing") +def main( + model_size, + compute_type, + audio_dir, + save_dir, + sample_rate, + device, + language, + initial_prompt, +): + logger.info("Loading / Downloading Faster Whisper model...") + + model = WhisperModel( + model_size, + device=device, + compute_type=compute_type, + download_root="faster_whisper", + ) + + logger.info("Model loaded.") + + save_path = Path(save_dir) + save_path.mkdir(parents=True, exist_ok=True) + + audio_files = list_files( + path=audio_dir, extensions=AUDIO_EXTENSIONS, recursive=True + ) + + for file_path in tqdm(audio_files, desc="Processing audio file"): + file_stem = file_path.stem + file_suffix = file_path.suffix + + rel_path = Path(file_path).relative_to(audio_dir) + (save_path / rel_path.parent).mkdir(parents=True, exist_ok=True) + + audio = AudioSegment.from_file(file_path) + + segments, info = model.transcribe( + file_path, + beam_size=5, + language=None if language == "auto" else language, + initial_prompt=initial_prompt, + ) + + print( + "Detected language '%s' with probability %f" + % (info.language, info.language_probability) + ) + print("Total len(ms): ", len(audio)) + + whole_text = None + for segment in segments: + id, start, end, text = ( + segment.id, + segment.start, + segment.end, + segment.text, + ) + print("Segment %03d [%.2fs -> %.2fs] %s" % (id, start, end, text)) + if not whole_text: + whole_text = text + else: + whole_text += ", " + text + + whole_text += "." + + audio_save_path = save_path / rel_path.parent / f"{file_stem}{file_suffix}" + audio.export(audio_save_path, format=file_suffix[1:]) + print(f"Exported {audio_save_path}") + + transcript_save_path = save_path / rel_path.parent / f"{file_stem}.lab" + with open( + transcript_save_path, + "w", + encoding="utf-8", + ) as f: + f.write(whole_text) + + +if __name__ == "__main__": + main() + exit(0) + + audio = AudioSegment.from_wav( + r"D:\PythonProject\原神语音中文\胡桃\vo_hutao_draw_appear.wav" + ) + + model_size = "large-v3" + + model = WhisperModel( + model_size, + device="cuda", + compute_type="float16", + download_root="faster_whisper", + ) + + segments, info = model.transcribe( + r"D:\PythonProject\原神语音中文\胡桃\vo_hutao_draw_appear.wav", + beam_size=5, + ) + + print( + "Detected language '%s' with probability %f" + % (info.language, info.language_probability) + ) + print("Total len(ms): ", len(audio)) + + for i, segment in enumerate(segments): + print( + "Segment %03d [%.2fs -> %.2fs] %s" + % (i, segment.start, segment.end, segment.text) + ) + start_ms = int(segment.start * 1000) + end_ms = int(segment.end * 1000) + segment_audio = audio[start_ms:end_ms] + segment_audio.export(f"segment_{i:03d}.wav", format="wav") + print(f"Exported segment_{i:03d}.wav") + + print("All segments have been exported.") From 4d35b6f7242c230147e4db3286fd93522903e5a4 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 23 Aug 2024 12:55:56 +0800 Subject: [PATCH 275/298] ENH: support process_image with padding for image_to_image (#2109) --- setup.cfg | 10 +++---- xinference/core/image_interface.py | 9 +++++++ xinference/deploy/docker/requirements.txt | 4 +-- xinference/deploy/docker/requirements_cpu.txt | 6 ++--- .../model/image/stable_diffusion/core.py | 27 ++++++++++++++++++- 5 files changed, 45 insertions(+), 11 deletions(-) diff --git a/setup.cfg b/setup.cfg index 38b7132e2c..d664f1c5be 100644 --- a/setup.cfg +++ b/setup.cfg @@ -90,7 +90,7 @@ all = tiktoken sentence-transformers>=2.7.0 vllm>=0.2.6 ; sys_platform=='linux' - diffusers>=0.25.0 # fix conflict with matcha-tts + diffusers>=0.30.0 imageio-ffmpeg # For video controlnet_aux orjson @@ -113,7 +113,7 @@ all = torchaudio # For ChatTTS ChatTTS>0.1 HyperPyYAML # For CosyVoice - matcha-tts # For CosyVoice + matcha-tts>=0.0.7 # For CosyVoice onnxruntime==1.16.0 # For CosyVoice, use onnxruntime-gpu==1.16.0 if possible openai-whisper # For CosyVoice boto3>=1.28.55,<1.28.65 # For tensorizer @@ -160,10 +160,10 @@ embedding = rerank = FlagEmbedding image = - diffusers>=0.25.0 # fix conflict with matcha-tts + diffusers>=0.30.0 # fix conflict with matcha-tts controlnet_aux video = - diffusers + diffusers>=0.30.0 imageio-ffmpeg audio = funasr @@ -175,7 +175,7 @@ audio = torchaudio ChatTTS>0.1 HyperPyYAML # For CosyVoice - matcha-tts # For CosyVoice + matcha-tts>=0.0.7 # For CosyVoice onnxruntime==1.16.0 # For CosyVoice, use onnxruntime-gpu==1.16.0 if possible openai-whisper # For CosyVoice loguru # For Fish Speech diff --git a/xinference/core/image_interface.py b/xinference/core/image_interface.py index 3d80b72df4..e5ece5320c 100644 --- a/xinference/core/image_interface.py +++ b/xinference/core/image_interface.py @@ -163,6 +163,7 @@ def image_generate_image( size_width: int, size_height: int, num_inference_steps: int, + padding_image_to_multiple: int, ) -> PIL.Image.Image: from ..client import RESTfulClient @@ -178,6 +179,7 @@ def image_generate_image( num_inference_steps = ( None if num_inference_steps == -1 else num_inference_steps # type: ignore ) + padding_image_to_multiple = None if padding_image_to_multiple == -1 else padding_image_to_multiple # type: ignore bio = io.BytesIO() image.save(bio, format="png") @@ -190,6 +192,7 @@ def image_generate_image( size=size, response_format="b64_json", num_inference_steps=num_inference_steps, + padding_image_to_multiple=padding_image_to_multiple, ) images = [] @@ -222,9 +225,14 @@ def image_generate_image( n = gr.Number(label="Number of image", value=1) size_width = gr.Number(label="Width", value=-1) size_height = gr.Number(label="Height", value=-1) + + with gr.Row(): num_inference_steps = gr.Number( label="Inference Step Number", value=-1 ) + padding_image_to_multiple = gr.Number( + label="Padding image to multiple", value=-1 + ) with gr.Row(): with gr.Column(scale=1): @@ -242,6 +250,7 @@ def image_generate_image( size_width, size_height, num_inference_steps, + padding_image_to_multiple, ], outputs=output_gallery, ) diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index e2e38bebd5..afae31c08c 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -33,7 +33,7 @@ protobuf einops tiktoken sentence-transformers>=2.7.0 -diffusers>=0.25.0 # fix conflict with matcha-tts +diffusers>=0.30.0 controlnet_aux orjson auto-gptq @@ -52,7 +52,7 @@ torchaudio # For ChatTTS ChatTTS>0.1 xxhash # For ChatTTS HyperPyYAML # For CosyVoice -matcha-tts # For CosyVoice +matcha-tts>=0.0.7 # For CosyVoice onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice openai-whisper # For CosyVoice diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index e40a747816..2e7785ea3a 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -31,7 +31,7 @@ einops tiktoken sentence-transformers>=2.3.1 FlagEmbedding -diffusers>=0.25.0 # fix conflict with matcha-tts +diffusers>=0.30.0 controlnet_aux orjson auto-gptq @@ -49,9 +49,9 @@ torchaudio # For ChatTTS ChatTTS>0.1 xxhash # For ChatTTS HyperPyYAML # For CosyVoice -matcha-tts # For CosyVoice +matcha-tts>=0.0.7 # For CosyVoice onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice openai-whisper # For CosyVoice imageio-ffmpeg # For video -eva-decord # For video in VL \ No newline at end of file +eva-decord # For video in VL diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index 4d950bfc0d..7d5fdb5bf4 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -24,6 +24,9 @@ from io import BytesIO from typing import Dict, List, Optional, Union +import PIL.Image +from PIL import ImageOps + from ....constants import XINFERENCE_IMAGE_DIR from ....device_utils import move_model_to_available_device from ....types import Image, ImageList, LoRA @@ -157,6 +160,10 @@ def _call_model( model=None, **kwargs, ): + import gc + + from ....device_utils import empty_cache + logger.debug( "stable diffusion args: %s", kwargs, @@ -164,6 +171,11 @@ def _call_model( model = model if model is not None else self._model assert callable(model) images = model(**kwargs).images + + # clean cache + gc.collect() + empty_cache() + if response_format == "url": os.makedirs(XINFERENCE_IMAGE_DIR, exist_ok=True) image_list = [] @@ -214,9 +226,17 @@ def text_to_image( **kwargs, ) + @staticmethod + def pad_to_multiple(image, multiple=8): + x, y = image.size + padding_x = (multiple - x % multiple) % multiple + padding_y = (multiple - y % multiple) % multiple + padding = (0, 0, padding_x, padding_y) + return ImageOps.expand(image, padding) + def image_to_image( self, - image: bytes, + image: PIL.Image, prompt: Optional[Union[str, List[str]]] = None, negative_prompt: Optional[Union[str, List[str]]] = None, n: int = 1, @@ -241,6 +261,11 @@ def image_to_image( width, height = map(int, re.split(r"[^\d]+", size)) kwargs["width"] = width kwargs["height"] = height + if padding_image_to_multiple := kwargs.pop("padding_image_to_multiple", None): + # Model like SD3 image to image requires image's height and width is times of 16 + # padding the image if specified + image = self.pad_to_multiple(image, multiple=int(padding_image_to_multiple)) + self._filter_kwargs(kwargs) return self._call_model( image=image, From b66c1d46c46aa71ecaa20f5a65eece0202596853 Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Fri, 23 Aug 2024 12:59:03 +0800 Subject: [PATCH 276/298] BUG: Fix concurrent ops in worker initialization (#2125) --- xinference/core/worker.py | 85 +++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 426a75c2e4..77c2137713 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -39,9 +39,11 @@ from ..device_utils import get_available_device_env_name, gpu_count from ..model.core import ModelDescription, create_model_instance from ..types import PeftModelConfig +from .cache_tracker import CacheTrackerActor from .event import Event, EventCollectorActor, EventType from .metrics import launch_metrics_export_server, record_metrics from .resource import gather_node_info +from .status_guard import StatusGuardActor from .utils import log_async, log_sync, parse_replica_model_uid, purge_dir logger = getLogger(__name__) @@ -71,6 +73,15 @@ def __init__( self._supervisor_ref: Optional[xo.ActorRefType] = None self._main_pool = main_pool self._main_pool.recover_sub_pool = self.recover_sub_pool + self._status_guard_ref: xo.ActorRefType[ # type: ignore + "StatusGuardActor" + ] = None + self._event_collector_ref: xo.ActorRefType[ # type: ignore + EventCollectorActor + ] = None + self._cache_tracker_ref: xo.ActorRefType[ # type: ignore + CacheTrackerActor + ] = None # internal states. # temporary placeholder during model launch process: @@ -308,56 +319,50 @@ async def get_supervisor_ref(self, add_worker: bool = True) -> xo.ActorRefType: Params: add_worker: By default will call supervisor.add_worker after first connect """ - from .status_guard import StatusGuardActor from .supervisor import SupervisorActor if self._supervisor_ref is not None: return self._supervisor_ref - self._supervisor_ref: xo.ActorRefType["SupervisorActor"] = await xo.actor_ref( # type: ignore + supervisor_ref = await xo.actor_ref( # type: ignore address=self._supervisor_address, uid=SupervisorActor.uid() ) + # Prevent concurrent operations leads to double initialization, check again. + if self._supervisor_ref is not None: + return self._supervisor_ref + self._supervisor_ref = supervisor_ref if add_worker and len(self._model_uid_to_model) == 0: # Newly started (or restarted), has no model, notify supervisor await self._supervisor_ref.add_worker(self.address) logger.info("Connected to supervisor as a fresh worker") - self._status_guard_ref: xo.ActorRefType[ # type: ignore - "StatusGuardActor" - ] = await xo.actor_ref( - address=self._supervisor_address, uid=StatusGuardActor.uid() - ) - - self._event_collector_ref: xo.ActorRefType[ # type: ignore - EventCollectorActor - ] = await xo.actor_ref( - address=self._supervisor_address, uid=EventCollectorActor.uid() - ) - from .cache_tracker import CacheTrackerActor - - self._cache_tracker_ref: xo.ActorRefType[ # type: ignore - "CacheTrackerActor" - ] = await xo.actor_ref( - address=self._supervisor_address, uid=CacheTrackerActor.uid() - ) - # cache_tracker is on supervisor - from ..model.audio import get_audio_model_descriptions - from ..model.embedding import get_embedding_model_descriptions - from ..model.flexible import get_flexible_model_descriptions - from ..model.image import get_image_model_descriptions - from ..model.llm import get_llm_model_descriptions - from ..model.rerank import get_rerank_model_descriptions - - # record model version - model_version_infos: Dict[str, List[Dict]] = {} # type: ignore - model_version_infos.update(get_llm_model_descriptions()) - model_version_infos.update(get_embedding_model_descriptions()) - model_version_infos.update(get_rerank_model_descriptions()) - model_version_infos.update(get_image_model_descriptions()) - model_version_infos.update(get_audio_model_descriptions()) - model_version_infos.update(get_flexible_model_descriptions()) - await self._cache_tracker_ref.record_model_version( - model_version_infos, self.address - ) + self._status_guard_ref = await xo.actor_ref( + address=self._supervisor_address, uid=StatusGuardActor.uid() + ) + self._event_collector_ref = await xo.actor_ref( + address=self._supervisor_address, uid=EventCollectorActor.uid() + ) + self._cache_tracker_ref = await xo.actor_ref( + address=self._supervisor_address, uid=CacheTrackerActor.uid() + ) + # cache_tracker is on supervisor + from ..model.audio import get_audio_model_descriptions + from ..model.embedding import get_embedding_model_descriptions + from ..model.flexible import get_flexible_model_descriptions + from ..model.image import get_image_model_descriptions + from ..model.llm import get_llm_model_descriptions + from ..model.rerank import get_rerank_model_descriptions + + # record model version + model_version_infos: Dict[str, List[Dict]] = {} # type: ignore + model_version_infos.update(get_llm_model_descriptions()) + model_version_infos.update(get_embedding_model_descriptions()) + model_version_infos.update(get_rerank_model_descriptions()) + model_version_infos.update(get_image_model_descriptions()) + model_version_infos.update(get_audio_model_descriptions()) + model_version_infos.update(get_flexible_model_descriptions()) + await self._cache_tracker_ref.record_model_version( + model_version_infos, self.address + ) return self._supervisor_ref @staticmethod @@ -793,6 +798,7 @@ async def launch_builtin_model( logger.exception(e) raise try: + _ = await self.get_supervisor_ref() if self._event_collector_ref is not None: await self._event_collector_ref.report_event( origin_uid, @@ -914,6 +920,7 @@ async def terminate_model(self, model_uid: str): raise ValueError(f"{model_uid} is launching") origin_uid, _, __ = parse_replica_model_uid(model_uid) try: + _ = await self.get_supervisor_ref() if self._event_collector_ref is not None: await self._event_collector_ref.report_event( origin_uid, From 07f867261640e5dfad8e4a1c3741fa1fa2541b03 Mon Sep 17 00:00:00 2001 From: Minamiyama <minamiyama@qq.com> Date: Fri, 23 Aug 2024 14:35:43 +0800 Subject: [PATCH 277/298] FEAT: support CogVLM2-video (#2110) --- .github/workflows/python.yaml | 1 + setup.cfg | 2 + xinference/deploy/docker/requirements.txt | 1 + xinference/deploy/docker/requirements_cpu.txt | 1 + xinference/model/llm/__init__.py | 2 + xinference/model/llm/llm_family.json | 45 ++ .../model/llm/llm_family_modelscope.json | 46 ++ xinference/model/llm/transformers/cogvlm2.py | 2 +- .../model/llm/transformers/cogvlm2_video.py | 524 ++++++++++++++++++ xinference/model/llm/transformers/core.py | 1 + 10 files changed, 624 insertions(+), 1 deletion(-) create mode 100644 xinference/model/llm/transformers/cogvlm2_video.py diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 4eb5ae28ef..c097314a7a 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -134,6 +134,7 @@ jobs: pip install "jinja2==3.1.2" pip install tensorizer pip install eva-decord + pip install jj-pytorchvideo working-directory: . - name: Test with pytest diff --git a/setup.cfg b/setup.cfg index d664f1c5be..7b83211c84 100644 --- a/setup.cfg +++ b/setup.cfg @@ -119,6 +119,7 @@ all = boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 eva-decord # For video in VL + jj-pytorchvideo # For CogVLM2-video loguru # For Fish Speech natsort # For Fish Speech loralib # For Fish Speech @@ -147,6 +148,7 @@ transformers = torchvision # For deepseek VL peft eva-decord # For video in VL + jj-pytorchvideo # For CogVLM2-video vllm = vllm>=0.2.6 sglang = diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index afae31c08c..c265c0dc3d 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -60,6 +60,7 @@ boto3>=1.28.55,<1.28.65 # For tensorizer tensorizer~=2.9.0 imageio-ffmpeg # For video eva-decord # For video in VL +jj-pytorchvideo # For CogVLM2-video # sglang outlines>=0.0.44 diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 2e7785ea3a..ac5379ac85 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -55,3 +55,4 @@ onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # Fo openai-whisper # For CosyVoice imageio-ffmpeg # For video eva-decord # For video in VL +jj-pytorchvideo # For CogVLM2-video diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 6d06b0ecaa..8e6f0d7b5b 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -117,6 +117,7 @@ def _install(): from .sglang.core import SGLANGChatModel, SGLANGModel from .transformers.chatglm import ChatglmPytorchChatModel from .transformers.cogvlm2 import CogVLM2Model + from .transformers.cogvlm2_video import CogVLM2VideoModel from .transformers.core import PytorchChatModel, PytorchModel from .transformers.deepseek_vl import DeepSeekVLChatModel from .transformers.glm4v import Glm4VModel @@ -160,6 +161,7 @@ def _install(): InternVLChatModel, PytorchModel, CogVLM2Model, + CogVLM2VideoModel, MiniCPMV25Model, MiniCPMV26Model, Glm4VModel, diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index dafba3aa42..89c725ef4d 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -7342,6 +7342,51 @@ ] } }, + { + "version": 1, + "context_length": 8192, + "model_name": "cogvlm2-video-llama3-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "CogVLM2-Video achieves state-of-the-art performance on multiple video question answering tasks.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 12, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_id": "THUDM/cogvlm2-video-llama3-chat", + "model_revision": "f375ead7d8202ebe2c3d09f1068abdddeb2929fa" + } + ], + "prompt_style": { + "style_name": "LLAMA3", + "system_prompt": "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n\n", + "inter_message_sep": "<|eot_id|>", + "stop_token_ids": [ + 128001, + 128009 + ], + "stop": [ + "<|end_of_text|>", + "<|eot_id|>" + ] + } + }, { "version": 1, "context_length": 8192, diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index b9eae2252d..1cbcbfbfa2 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -4962,6 +4962,52 @@ ] } }, + { + "version": 1, + "context_length": 8192, + "model_name": "cogvlm2-video-llama3-chat", + "model_lang": [ + "en", + "zh" + ], + "model_ability": [ + "chat", + "vision" + ], + "model_description": "CogVLM2-Video achieves state-of-the-art performance on multiple video question answering tasks.", + "model_specs": [ + { + "model_format": "pytorch", + "model_size_in_billions": 12, + "quantizations": [ + "4-bit", + "8-bit", + "none" + ], + "model_hub": "modelscope", + "model_id": "ZhipuAI/cogvlm2-video-llama3-chat", + "model_revision": "master" + } + ], + "prompt_style": { + "style_name": "LLAMA3", + "system_prompt": "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.", + "roles": [ + "user", + "assistant" + ], + "intra_message_sep": "\n\n", + "inter_message_sep": "<|eot_id|>", + "stop_token_ids": [ + 128001, + 128009 + ], + "stop": [ + "<|end_of_text|>", + "<|eot_id|>" + ] + } + }, { "version": 1, "context_length": 8192, diff --git a/xinference/model/llm/transformers/cogvlm2.py b/xinference/model/llm/transformers/cogvlm2.py index 937e2a2a78..79b15be69c 100644 --- a/xinference/model/llm/transformers/cogvlm2.py +++ b/xinference/model/llm/transformers/cogvlm2.py @@ -72,7 +72,7 @@ def match( cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str ) -> bool: family = model_family.model_family or model_family.model_name - if "cogvlm" in family.lower(): + if "cogvlm2" in family.lower() and "video" not in family.lower(): return True return False diff --git a/xinference/model/llm/transformers/cogvlm2_video.py b/xinference/model/llm/transformers/cogvlm2_video.py new file mode 100644 index 0000000000..24f31e0b5c --- /dev/null +++ b/xinference/model/llm/transformers/cogvlm2_video.py @@ -0,0 +1,524 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging +import time +import uuid +from concurrent.futures import ThreadPoolExecutor +from typing import Dict, Iterator, List, Optional, Tuple, Union + +import torch + +from ....core.scheduler import InferenceRequest +from ....model.utils import select_device +from ....types import ( + ChatCompletion, + ChatCompletionChunk, + ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionChunk, + CompletionUsage, +) +from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import _decode_image +from .core import PytorchChatModel, PytorchGenerateConfig +from .utils import get_max_src_len + +logger = logging.getLogger(__name__) + + +LANGUAGE_TOKEN_TYPE = 0 +VISION_TOKEN_TYPE = 1 + + +def recur_move_to(item, tgt, criterion_func): + """ + This function is copied from https://github.com/THUDM/CogVLM2/blob/main/basic_demo/cli_demo_batch_inference.py + """ + if criterion_func(item): + device_copy = item.to(tgt) + return device_copy + elif isinstance(item, list): + return [recur_move_to(v, tgt, criterion_func) for v in item] + elif isinstance(item, tuple): + return tuple([recur_move_to(v, tgt, criterion_func) for v in item]) + elif isinstance(item, dict): + return {k: recur_move_to(v, tgt, criterion_func) for k, v in item.items()} + else: + return item + + +class CogVLM2VideoModel(PytorchChatModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._torch_type = None + self._device = None + self._tokenizer = None + self._model = None + + @classmethod + def match( + cls, model_family: "LLMFamilyV1", model_spec: "LLMSpecV1", quantization: str + ) -> bool: + family = model_family.model_family or model_family.model_name + if "cogvlm2" in family.lower() and "video" in family.lower(): + return True + return False + + def load(self, **kwargs): + from transformers import AutoModelForCausalLM, AutoTokenizer + from transformers.generation import GenerationConfig + + device = self._pytorch_model_config.get("device", "auto") + self._device = select_device(device) + self._torch_type = ( + torch.bfloat16 + if torch.cuda.is_available() and torch.cuda.get_device_capability()[0] >= 8 + else torch.float16 + ) + + if self._check_tensorizer_integrity(): + self._model, self._tokenizer = self._load_tensorizer() + return + + if "8-bit" in self.quantization.lower(): + kwargs["load_in_8bit"] = True + elif "4-bit" in self.quantization.lower(): + kwargs["load_in_4bit"] = True + + self._tokenizer = AutoTokenizer.from_pretrained( + self.model_path, + trust_remote_code=True, + ) + + self._model = AutoModelForCausalLM.from_pretrained( + self.model_path, + torch_dtype=self._torch_type, + trust_remote_code=True, + low_cpu_mem_usage=True, + device_map="auto", + **kwargs + ).eval() + + # Specify hyperparameters for generation + self._model.generation_config = GenerationConfig.from_pretrained( + self.model_path, + trust_remote_code=True, + ) + self._save_tensorizer() + + def _load_video(self, video_path): + import numpy as np + from decord import VideoReader, bridge, cpu + + bridge.set_bridge("torch") + num_frames = 24 + + decord_vr = VideoReader(video_path, ctx=cpu(0)) + frame_id_list = None + total_frames = len(decord_vr) + timestamps = decord_vr.get_frame_timestamp(np.arange(total_frames)) + timestamps = [i[0] for i in timestamps] + max_second = round(max(timestamps)) + 1 + frame_id_list = [] + for second in range(max_second): + closest_num = min(timestamps, key=lambda x: abs(x - second)) + index = timestamps.index(closest_num) + frame_id_list.append(index) + if len(frame_id_list) >= num_frames: + break + video_data = decord_vr.get_batch(frame_id_list) + video_data = video_data.permute(3, 0, 1, 2) + return video_data + + def _message_content_to_cogvlm2(self, content): + if not isinstance(content, str): + texts = [] + image_urls = [] + video_urls = [] + for c in content: + c_type = c.get("type") + if c_type == "text": + texts.append(c["text"]) + elif c_type == "image_url": + image_urls.append(c["image_url"]["url"]) + elif c_type == "video_url": + video_urls.append(c["video_url"]["url"]) + if len(video_urls) > 1: + raise RuntimeError("Only one video per message is supported") + image_futures = [] + video = None + with ThreadPoolExecutor() as executor: + for image_url in image_urls: + fut = executor.submit(_decode_image, image_url) + image_futures.append(fut) + images = [fut.result() for fut in image_futures] + for v in video_urls: + video = self._load_video(v) + text = " ".join(texts) + return text, images, video + return content, [], None + + def _history_content_to_cogvlm2( + self, system_prompt: str, chat_history: List[ChatCompletionMessage] + ): + query = system_prompt + history: List[Tuple] = [] + pixel_values = None + video_urls: List[str] = [] + for i in range(0, len(chat_history), 2): + user = chat_history[i]["content"] + if isinstance(user, List): + for content in user: + c_type = content.get("type") + if c_type == "text": + user = content["text"] + elif c_type == "image_url" and not pixel_values: + pixel_values = _decode_image(content["image_url"]["url"]) + elif c_type == "video_url": + video_urls.append(content["video_url"]["url"]) + assistant = chat_history[i + 1]["content"] + history.append((user, assistant)) + query = assistant # type: ignore + if len(video_urls) > 1: + raise RuntimeError("Only one video per message is supported") + video = None + for v in video_urls: + video = self._load_video(v) + return query, history, [pixel_values], video + + def get_query_and_history( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + ): + content, image, video = self._message_content_to_cogvlm2(prompt) + + history = [] + history_image = None + history_video = None + if chat_history: + ( + query, + history, + history_image, + history_video, + ) = self._history_content_to_cogvlm2( + system_prompt, chat_history # type: ignore + ) + + if image and history_image: + history = [] + query = content + else: + image = image if image else history_image + query = content + + if video is not None and history_video is not None: + history = [] + query = content + else: + video = video if video is not None else history_video + query = content + + return query, image, video, history + + def chat( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[PytorchGenerateConfig] = None, + ) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]: + system_prompt = system_prompt if system_prompt else "" + stream = generate_config.get("stream", False) if generate_config else False + + sanitized_config = { + "pad_token_id": 128002, + "max_new_tokens": generate_config.get("max_tokens", 512) + if generate_config + else 512, + } + + query, image, video, history = self.get_query_and_history( + prompt, system_prompt=system_prompt, chat_history=chat_history + ) + + if video is not None: + image = [video] + + input_by_model = self._model.build_conversation_input_ids( + self._tokenizer, + query=query, + history=history, + images=image, + template_version="chat", + ) + + inputs = { + "input_ids": input_by_model["input_ids"].unsqueeze(0).to(self._device), + "token_type_ids": input_by_model["token_type_ids"] + .unsqueeze(0) + .to(self._device), + "attention_mask": input_by_model["attention_mask"] + .unsqueeze(0) + .to(self._device), + "images": [ + [input_by_model["images"][0].to(self._device).to(self._torch_type)] + ] + if image is not None + else None, + } + + if stream: + it = self._streaming_chat_response(inputs, sanitized_config) + return self._to_chat_completion_chunks(it) + else: + with torch.no_grad(): + outputs = self._model.generate(**inputs, **sanitized_config) + outputs = outputs[:, inputs["input_ids"].shape[1] :] + response = self._tokenizer.decode(outputs[0]) + response = response.split("<|end_of_text|>")[0] + + chunk = Completion( + id=str(uuid.uuid1()), + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=response, finish_reason="stop", logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + return self._to_chat_completion(chunk) + + def _streaming_chat_response( + self, inputs: Dict, config: Dict + ) -> Iterator[CompletionChunk]: + from threading import Thread + + from transformers import TextIteratorStreamer + + streamer = TextIteratorStreamer( + self._tokenizer, skip_prompt=True, skip_special_tokens=True + ) + generation_kwargs = { + "input_ids": inputs["input_ids"], + "attention_mask": inputs["attention_mask"], + "token_type_ids": inputs["token_type_ids"], + "images": inputs["images"], + "max_new_tokens": config["max_new_tokens"], + "pad_token_id": config["pad_token_id"], + "streamer": streamer, + } + + thread = Thread(target=self._model.generate, kwargs=generation_kwargs) + thread.start() + + completion_id = str(uuid.uuid1()) + for new_text in streamer: + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=new_text, finish_reason=None, logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + yield chunk + + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + usage=CompletionUsage( + prompt_tokens=-1, completion_tokens=-1, total_tokens=-1 + ), + ) + yield chunk + + @staticmethod + def build_position_ids(x, attention_mask=None): + """ + Copied from https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B-int4/blob/main/modeling_cogvlm.py + """ + # Fix: 参考官方开源代码 + if attention_mask is not None: + tmp = x.clone() + tmp[~(attention_mask.bool())] = -1 + else: + tmp = x.clone() + # image boi eoi token as LANGUAGE_TOKEN_TYPE + is_boi_eoi = torch.zeros_like(x, dtype=torch.bool) + is_boi_eoi[:, 1:] |= (tmp[:, 1:] == VISION_TOKEN_TYPE) & ( + tmp[:, :-1] == LANGUAGE_TOKEN_TYPE + ) + is_boi_eoi[:, 0] |= tmp[:, 0] == VISION_TOKEN_TYPE + is_boi_eoi[:, :-1] |= (tmp[:, :-1] == VISION_TOKEN_TYPE) & ( + tmp[:, 1:] == LANGUAGE_TOKEN_TYPE + ) + is_boi_eoi[:, -1] |= tmp[:, -1] == VISION_TOKEN_TYPE + tmp[is_boi_eoi] = LANGUAGE_TOKEN_TYPE + # final position ids + y = torch.zeros_like(x, dtype=torch.long) + y[:, 1:] = (tmp[:, 1:] == LANGUAGE_TOKEN_TYPE) | ( + (tmp[:, 1:] == VISION_TOKEN_TYPE) & (tmp[:, :-1] == LANGUAGE_TOKEN_TYPE) + ) + y = y.cumsum(dim=-1) + return y + + def get_dtype(self): + return self._torch_type + + def _get_full_prompt(self, prompt, system_prompt, chat_history, tools): + query, image, video, history = self.get_query_and_history( + prompt, system_prompt=system_prompt, chat_history=chat_history + ) + + if video: + image = [video] + + input_by_model: dict = self._model.build_conversation_input_ids( # type: ignore + self._tokenizer, + query=query, + history=history, + images=image, + template_version="chat", + ) + return { + "input_ids": input_by_model["input_ids"], # seq_len + "token_type_ids": input_by_model["token_type_ids"], # seq_len + "attention_mask": input_by_model["attention_mask"], # seq_len + "images": input_by_model["images"], + } + + def prepare_sanitize_generate_config(self, req: InferenceRequest): + """ + See https://huggingface.co/THUDM/cogvlm2-llama3-chat-19B/blob/main/generation_config.json + """ + raw_config = req.inference_kwargs.get("raw_params", {}) + temperature = raw_config.get("temperature", None) + if temperature is None: + raw_config["temperature"] = 0.6 + top_p = raw_config.get("top_p", None) + if top_p is None: + raw_config["top_p"] = 0.9 + return raw_config + + def build_prefill_kwargs(self, prompts: List, req_list: List[InferenceRequest]): + context_len = self.get_context_len() + assert isinstance(prompts[0], dict) + images = [] + max_length = float("-inf") + for i, feature in enumerate(prompts): + req = req_list[i] + if "images" in feature: + images.append(feature.pop("images", None)) + max_src_len = get_max_src_len(context_len, req) + input_ids = feature["input_ids"][-max_src_len:] + req.prompt_tokens = input_ids.tolist() + feature["input_ids"] = input_ids + feature["token_type_ids"] = feature["token_type_ids"][-max_src_len:] + feature["attention_mask"] = feature["attention_mask"][-max_src_len:] + req.extra_kwargs["attention_mask_seq_len"] = feature[ + "attention_mask" + ].shape[0] + max_length = max(len(input_ids), max_length) + + def pad_to_max_length_internal(feature, max_len, idx): + padding_length = max_len - len(feature["input_ids"]) + req_list[idx].padding_len = padding_length + feature["input_ids"] = torch.cat( + [torch.full((padding_length,), 0), feature["input_ids"]] + ) + feature["token_type_ids"] = torch.cat( + [ + torch.zeros(padding_length, dtype=torch.long), + feature["token_type_ids"], + ] + ) + feature["attention_mask"] = torch.cat( + [ + torch.zeros(padding_length, dtype=torch.long), + feature["attention_mask"], + ] + ) + return feature + + features = [ + pad_to_max_length_internal(feature, max_length, i) + for i, feature in enumerate(prompts) + ] + batch = { + key: torch.stack([feature[key] for feature in features]) + for key in features[0].keys() + } + + position_ids = self.build_position_ids(batch["token_type_ids"]) + batch["position_ids"] = position_ids + + for i in range(len(prompts)): + req = req_list[i] + req.extra_kwargs["max_position_id"] = position_ids[i : i + 1, -1].item() + + if images: + batch["images"] = images + + batch = recur_move_to( + batch, self._device, lambda x: isinstance(x, torch.Tensor) + ) + dtype = self.get_dtype() + if dtype: + batch = recur_move_to( + batch, + dtype, + lambda x: isinstance(x, torch.Tensor) and torch.is_floating_point(x), + ) + return batch + + def build_decode_token_type_ids( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + token_type_ids = torch.full( + (batch_size, 1), fill_value=1, dtype=torch.long, device=self._device + ) + return token_type_ids + + def build_decode_position_ids( + self, batch_size: int, seq_length: int, reqs: List[InferenceRequest] + ): + tmp = [] + for r in reqs: + r.extra_kwargs["max_position_id"] += 1 + tmp.append(r.extra_kwargs["max_position_id"]) + position_ids = torch.as_tensor( + tmp, device=self._device, dtype=torch.long + ).unsqueeze(1) + return position_ids diff --git a/xinference/model/llm/transformers/core.py b/xinference/model/llm/transformers/core.py index 60d35c19d2..7b427c4918 100644 --- a/xinference/model/llm/transformers/core.py +++ b/xinference/model/llm/transformers/core.py @@ -63,6 +63,7 @@ "internvl-chat", "internvl2", "cogvlm2", + "cogvlm2-video-llama3-chat", "MiniCPM-Llama3-V-2_5", "MiniCPM-V-2.6", "glm-4v", From e6727676607da62a1daf62113f7ac93f8cf903fc Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 23 Aug 2024 16:22:36 +0800 Subject: [PATCH 278/298] Bug: fix audio ability errorwhen get instance info (#2147) --- xinference/core/worker.py | 2 +- xinference/model/audio/core.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 77c2137713..7a4f907479 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -739,7 +739,7 @@ async def _get_model_ability(self, model: Any, model_type: str) -> List[str]: elif model_type == "image": return ["text_to_image"] elif model_type == "audio": - return ["audio_to_text"] + return [model._model_spec.ability] elif model_type == "video": return ["text_to_video"] elif model_type == "flexible": diff --git a/xinference/model/audio/core.py b/xinference/model/audio/core.py index 7772a8f8ba..b6a65a572d 100644 --- a/xinference/model/audio/core.py +++ b/xinference/model/audio/core.py @@ -47,6 +47,7 @@ class AudioModelFamilyV1(CacheableModelSpec): model_id: str model_revision: str multilingual: bool + ability: str default_model_config: Optional[Dict[str, Any]] default_transcription_config: Optional[Dict[str, Any]] From 16d11939aae6c852d097a647e732b8df48b43634 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 23 Aug 2024 10:49:34 +0200 Subject: [PATCH 279/298] DOC: Add doc for fish speech and cogvlm2 video (#2149) --- .../builtin/audio/fishspeech-1.2-sft.rst | 19 ++++++++++++ doc/source/models/builtin/audio/index.rst | 2 ++ .../builtin/llm/cogvlm2-video-llama3-chat.rst | 31 +++++++++++++++++++ doc/source/models/builtin/llm/index.rst | 7 +++++ xinference/deploy/docker/requirements.txt | 5 +++ xinference/deploy/docker/requirements_cpu.txt | 5 +++ 6 files changed, 69 insertions(+) create mode 100644 doc/source/models/builtin/audio/fishspeech-1.2-sft.rst create mode 100644 doc/source/models/builtin/llm/cogvlm2-video-llama3-chat.rst diff --git a/doc/source/models/builtin/audio/fishspeech-1.2-sft.rst b/doc/source/models/builtin/audio/fishspeech-1.2-sft.rst new file mode 100644 index 0000000000..3afac1f7e3 --- /dev/null +++ b/doc/source/models/builtin/audio/fishspeech-1.2-sft.rst @@ -0,0 +1,19 @@ +.. _models_builtin_fishspeech-1.2-sft: + +================== +FishSpeech-1.2-SFT +================== + +- **Model Name:** FishSpeech-1.2-SFT +- **Model Family:** FishAudio +- **Abilities:** text-to-audio +- **Multilingual:** True + +Specifications +^^^^^^^^^^^^^^ + +- **Model ID:** fishaudio/fish-speech-1.2-sft + +Execute the following command to launch the model:: + + xinference launch --model-name FishSpeech-1.2-SFT --model-type audio \ No newline at end of file diff --git a/doc/source/models/builtin/audio/index.rst b/doc/source/models/builtin/audio/index.rst index af7521b469..8959b2b94f 100644 --- a/doc/source/models/builtin/audio/index.rst +++ b/doc/source/models/builtin/audio/index.rst @@ -25,6 +25,8 @@ The following is a list of built-in audio models in Xinference: cosyvoice-300m-sft + fishspeech-1.2-sft + sensevoicesmall whisper-base diff --git a/doc/source/models/builtin/llm/cogvlm2-video-llama3-chat.rst b/doc/source/models/builtin/llm/cogvlm2-video-llama3-chat.rst new file mode 100644 index 0000000000..0b3720c08f --- /dev/null +++ b/doc/source/models/builtin/llm/cogvlm2-video-llama3-chat.rst @@ -0,0 +1,31 @@ +.. _models_llm_cogvlm2-video-llama3-chat: + +======================================== +cogvlm2-video-llama3-chat +======================================== + +- **Context Length:** 8192 +- **Model Name:** cogvlm2-video-llama3-chat +- **Languages:** en, zh +- **Abilities:** chat, vision +- **Description:** CogVLM2-Video achieves state-of-the-art performance on multiple video question answering tasks. + +Specifications +^^^^^^^^^^^^^^ + + +Model Spec 1 (pytorch, 12 Billion) +++++++++++++++++++++++++++++++++++++++++ + +- **Model Format:** pytorch +- **Model Size (in billions):** 12 +- **Quantizations:** 4-bit, 8-bit, none +- **Engines**: Transformers +- **Model ID:** THUDM/cogvlm2-video-llama3-chat +- **Model Hubs**: `Hugging Face <https://huggingface.co/THUDM/cogvlm2-video-llama3-chat>`__, `ModelScope <https://modelscope.cn/models/ZhipuAI/cogvlm2-video-llama3-chat>`__ + +Execute the following command to launch the model, remember to replace ``${quantization}`` with your +chosen quantization method from the options listed above:: + + xinference launch --model-engine ${engine} --model-name cogvlm2-video-llama3-chat --size-in-billions 12 --model-format pytorch --quantization ${quantization} + diff --git a/doc/source/models/builtin/llm/index.rst b/doc/source/models/builtin/llm/index.rst index d7c23b977d..75745ffdc6 100644 --- a/doc/source/models/builtin/llm/index.rst +++ b/doc/source/models/builtin/llm/index.rst @@ -111,6 +111,11 @@ The following is a list of built-in LLM in Xinference: - 8192 - CogVLM2 have achieved good results in many lists compared to the previous generation of CogVLM open source models. Its excellent performance can compete with some non-open source models. + * - :ref:`cogvlm2-video-llama3-chat <models_llm_cogvlm2-video-llama3-chat>` + - chat, vision + - 8192 + - CogVLM2-Video achieves state-of-the-art performance on multiple video question answering tasks. + * - :ref:`csg-wukong-chat-v0.1 <models_llm_csg-wukong-chat-v0.1>` - chat - 32768 @@ -534,6 +539,8 @@ The following is a list of built-in LLM in Xinference: cogvlm2 + cogvlm2-video-llama3-chat + csg-wukong-chat-v0.1 deepseek diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index c265c0dc3d..5408194367 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -61,6 +61,11 @@ tensorizer~=2.9.0 imageio-ffmpeg # For video eva-decord # For video in VL jj-pytorchvideo # For CogVLM2-video +loguru # For Fish Speech +natsort # For Fish Speech +loralib # For Fish Speech +opencc==1.1.6 # For Fish Speech +faster_whisper # For Fish Speech # sglang outlines>=0.0.44 diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index ac5379ac85..00a33dae9c 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -56,3 +56,8 @@ openai-whisper # For CosyVoice imageio-ffmpeg # For video eva-decord # For video in VL jj-pytorchvideo # For CogVLM2-video +loguru # For Fish Speech +natsort # For Fish Speech +loralib # For Fish Speech +opencc==1.1.6 # For Fish Speech +faster_whisper # For Fish Speech From b5002242e04634bca7e75cac9df0cdc6c0bf407a Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 23 Aug 2024 18:14:53 +0800 Subject: [PATCH 280/298] FEAT: Support LMDeploy for internvl2 and fix finish reasion miss at internvl stream (#2145) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/core/model.py | 5 +- xinference/deploy/docker/Dockerfile | 2 + xinference/model/llm/__init__.py | 4 + xinference/model/llm/llm_family.json | 18 +- xinference/model/llm/llm_family.py | 2 + .../model/llm/llm_family_modelscope.json | 20 +- xinference/model/llm/lmdeploy/__init__.py | 0 xinference/model/llm/lmdeploy/core.py | 557 ++++++++++++++++++ .../model/llm/lmdeploy/tests/__init__.py | 13 + .../model/llm/transformers/intern_vl.py | 18 +- xinference/model/llm/utils.py | 11 +- xinference/model/llm/vllm/core.py | 2 +- 12 files changed, 629 insertions(+), 23 deletions(-) create mode 100644 xinference/model/llm/lmdeploy/__init__.py create mode 100644 xinference/model/llm/lmdeploy/core.py create mode 100644 xinference/model/llm/lmdeploy/tests/__init__.py diff --git a/xinference/core/model.py b/xinference/core/model.py index 2650266efe..602f712514 100644 --- a/xinference/core/model.py +++ b/xinference/core/model.py @@ -177,6 +177,7 @@ def __init__( request_limits: Optional[int] = None, ): super().__init__() + from ..model.llm.lmdeploy.core import LMDeployModel from ..model.llm.sglang.core import SGLANGModel from ..model.llm.transformers.core import PytorchModel from ..model.llm.vllm.core import VLLMModel @@ -192,7 +193,9 @@ def __init__( self._current_generator = lambda: None self._lock = ( None - if isinstance(self._model, (PytorchModel, VLLMModel, SGLANGModel)) + if isinstance( + self._model, (PytorchModel, VLLMModel, SGLANGModel, LMDeployModel) + ) else asyncio.locks.Lock() ) self._worker_ref = None diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 7c5f583af0..1975adb5eb 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -30,6 +30,8 @@ RUN pip install --upgrade -i "$PIP_INDEX" pip && \ pip install "llama-cpp-python>=0.2.82" -i https://abetlen.github.io/llama-cpp-python/whl/cu124 && \ pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements.txt && \ pip install -i "$PIP_INDEX" --no-deps sglang && \ + pip uninstall flashinfer -y && \ + pip install flashinfer -i https://flashinfer.ai/whl/cu124/torch2.4 && \ cd /opt/inference && \ python3 setup.py build_web && \ git restore . && \ diff --git a/xinference/model/llm/__init__.py b/xinference/model/llm/__init__.py index 8e6f0d7b5b..9909addebb 100644 --- a/xinference/model/llm/__init__.py +++ b/xinference/model/llm/__init__.py @@ -34,6 +34,7 @@ BUILTIN_MODELSCOPE_LLM_FAMILIES, LLAMA_CLASSES, LLM_ENGINES, + LMDEPLOY_CLASSES, MLX_CLASSES, SGLANG_CLASSES, SUPPORTED_ENGINES, @@ -113,6 +114,7 @@ def generate_engine_config_by_model_family(model_family): def _install(): from .llama_cpp.core import LlamaCppChatModel, LlamaCppModel + from .lmdeploy.core import LMDeployChatModel, LMDeployModel from .mlx.core import MLXChatModel, MLXModel from .sglang.core import SGLANGChatModel, SGLANGModel from .transformers.chatglm import ChatglmPytorchChatModel @@ -148,6 +150,7 @@ def _install(): SGLANG_CLASSES.extend([SGLANGModel, SGLANGChatModel]) VLLM_CLASSES.extend([VLLMModel, VLLMChatModel, VLLMVisionModel]) MLX_CLASSES.extend([MLXModel, MLXChatModel]) + LMDEPLOY_CLASSES.extend([LMDeployModel, LMDeployChatModel]) TRANSFORMERS_CLASSES.extend( [ ChatglmPytorchChatModel, @@ -176,6 +179,7 @@ def _install(): SUPPORTED_ENGINES["Transformers"] = TRANSFORMERS_CLASSES SUPPORTED_ENGINES["llama.cpp"] = LLAMA_CLASSES SUPPORTED_ENGINES["MLX"] = MLX_CLASSES + SUPPORTED_ENGINES["LMDEPLOY"] = LMDEPLOY_CLASSES json_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "llm_family.json" diff --git a/xinference/model/llm/llm_family.json b/xinference/model/llm/llm_family.json index 89c725ef4d..26f1d599a8 100644 --- a/xinference/model/llm/llm_family.json +++ b/xinference/model/llm/llm_family.json @@ -7189,15 +7189,6 @@ "model_id": "OpenGVLab/InternVL2-4B", "model_revision": "b50544dafada6c41e80bfde2f57cc9b0140fc21c" }, - { - "model_format": "awq", - "model_size_in_billions": 4, - "quantizations": [ - "Int4" - ], - "model_id": "OpenGVLab/InternVL2-8B-AWQ", - "model_revision": "9f1a4756b7ae18eb26d8a22b618dfc283e8193b3" - }, { "model_format": "pytorch", "model_size_in_billions": 8, @@ -7209,6 +7200,15 @@ "model_id": "OpenGVLab/InternVL2-8B", "model_revision": "3bfd3664dea4f3da628785f5125d30f889701253" }, + { + "model_format": "awq", + "model_size_in_billions": 8, + "quantizations": [ + "Int4" + ], + "model_id": "OpenGVLab/InternVL2-8B-AWQ", + "model_revision": "9f1a4756b7ae18eb26d8a22b618dfc283e8193b3" + }, { "model_format": "pytorch", "model_size_in_billions": 26, diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index 8618155f28..c2ea4d7b98 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -271,6 +271,8 @@ def parse_raw( MLX_CLASSES: List[Type[LLM]] = [] +LMDEPLOY_CLASSES: List[Type[LLM]] = [] + LLM_ENGINES: Dict[str, Dict[str, List[Dict[str, Any]]]] = {} SUPPORTED_ENGINES: Dict[str, List[Type[LLM]]] = {} diff --git a/xinference/model/llm/llm_family_modelscope.json b/xinference/model/llm/llm_family_modelscope.json index 1cbcbfbfa2..44ac3e7794 100644 --- a/xinference/model/llm/llm_family_modelscope.json +++ b/xinference/model/llm/llm_family_modelscope.json @@ -4778,10 +4778,10 @@ "model_revision": "master" }, { - "model_format": "pytorch", + "model_format": "awq", "model_size_in_billions": 2, "quantizations": [ - "none" + "Int4" ], "model_hub": "modelscope", "model_id": "OpenGVLab/InternVL2-2B-AWQ", @@ -4812,10 +4812,10 @@ "model_revision": "master" }, { - "model_format": "pytorch", + "model_format": "awq", "model_size_in_billions": 8, "quantizations": [ - "none" + "Int4" ], "model_hub": "modelscope", "model_id": "OpenGVLab/InternVL2-8B-AWQ", @@ -4834,10 +4834,10 @@ "model_revision": "master" }, { - "model_format": "pytorch", + "model_format": "awq", "model_size_in_billions": 26, "quantizations": [ - "none" + "Int4" ], "model_hub": "modelscope", "model_id": "OpenGVLab/InternVL2-26B-AWQ", @@ -4856,10 +4856,10 @@ "model_revision": "master" }, { - "model_format": "pytorch", + "model_format": "awq", "model_size_in_billions": 40, "quantizations": [ - "none" + "Int4" ], "model_hub": "modelscope", "model_id": "OpenGVLab/InternVL2-40B-AWQ", @@ -4878,10 +4878,10 @@ "model_revision": "master" }, { - "model_format": "pytorch", + "model_format": "awq", "model_size_in_billions": 76, "quantizations": [ - "none" + "Int4" ], "model_hub": "modelscope", "model_id": "OpenGVLab/InternVL2-Llama3-76B-AWQ", diff --git a/xinference/model/llm/lmdeploy/__init__.py b/xinference/model/llm/lmdeploy/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/model/llm/lmdeploy/core.py b/xinference/model/llm/lmdeploy/core.py new file mode 100644 index 0000000000..22fbd53e72 --- /dev/null +++ b/xinference/model/llm/lmdeploy/core.py @@ -0,0 +1,557 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging +import time +import uuid +from typing import AsyncGenerator, Dict, Iterator, List, Optional, TypedDict, Union + +import torch + +from ....types import ( + ChatCompletion, + ChatCompletionChunk, + ChatCompletionChunkChoice, + ChatCompletionMessage, + Completion, + CompletionChoice, + CompletionUsage, + LoRA, +) +from ..core import LLM +from ..llm_family import LLMFamilyV1, LLMSpecV1 +from ..utils import ChatModelMixin + +logger = logging.getLogger(__name__) + +try: + import lmdeploy # noqa: F401 + + LMDEPLOY_INSTALLED = True +except ImportError: + LMDEPLOY_INSTALLED = False + +LMDEPLOY_SUPPORTED_CHAT_MODELS = ["internvl2"] +LMDEPLOY_MODEL_CHAT_TEMPLATE_NAME = { + "internvl2": "internvl-internlm2", +} + + +class LMDeployModelConfig(TypedDict, total=False): + model_format: Optional[str] + tp: Optional[int] + session_len: Optional[int] + max_batch_size: Optional[int] + cache_max_entry_count: Optional[float] + cache_block_seq_len: Optional[int] + enable_prefix_caching: Optional[bool] + quant_policy: Optional[int] + rope_scaling_factor: Optional[float] + use_logn_attn: Optional[bool] + download_dir: Optional[str] + revision: Optional[str] + max_prefill_token_num: Optional[int] + num_tokens_per_iter: Optional[int] + max_prefill_iters: Optional[int] + + +class LMDeployGenerateConfig(TypedDict, total=False): + n: Optional[int] + max_new_tokens: Optional[int] + top_p: Optional[float] + top_k: Optional[int] + temperature: Optional[float] + repetition_penalty: Optional[float] + ignore_eos: Optional[bool] + random_seed: Optional[int] + stop_words: Optional[List[str]] + bad_words: Optional[List[str]] + min_new_tokens: Optional[int] + skip_special_tokens: Optional[bool] + logprobs: Optional[int] + + +class LMDeployModel(LLM): + def __init__( + self, + model_uid: str, + model_family: "LLMFamilyV1", + model_spec: "LLMSpecV1", + quantization: str, + model_path: str, + model_config: Optional[LMDeployModelConfig] = None, + peft_model: Optional[List[LoRA]] = None, + ): + super().__init__(model_uid, model_family, model_spec, quantization, model_path) + self._model_config: LMDeployModelConfig = self._sanitize_model_config( + model_config + ) + if peft_model is not None: + raise ValueError("LMDEPLOY engine has not supported lora yet.") + + def _sanitize_model_config( + self, model_config: Optional[LMDeployModelConfig] + ) -> LMDeployModelConfig: + if model_config is None: + model_config = LMDeployModelConfig() + model_config.setdefault("session_len", 8192) + if self.model_spec.model_format == "awq": + model_config.setdefault("model_format", "awq") + return model_config + + def load(self): + try: + import lmdeploy # noqa: F401, F811 + except ImportError: + error_message = "Failed to import module 'lmdeploy'" + installation_guide = [ + "Please make sure 'lmdeploy' is installed. ", + "You can install it by `pip install lmdeploy`\n", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + raise ValueError("LMDEPLOY engine has not supported generate yet.") + + @classmethod + def match( + cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str + ) -> bool: + return False + + def generate( + self, + prompt: str, + generate_config: Optional[Dict] = None, + ) -> Union[Completion, Iterator[ChatCompletionChunk]]: + raise NotImplementedError("LMDeploy generate ablility does not support now.") + + +class LMDeployChatModel(LMDeployModel, ChatModelMixin): + def load(self): + try: + from lmdeploy import ( + ChatTemplateConfig, + TurbomindEngineConfig, + VisionConfig, + pipeline, + ) + except ImportError: + error_message = "Failed to import module 'lmdeploy'" + installation_guide = [ + "Please make sure 'lmdeploy' is installed. ", + "You can install it by `pip install lmdeploy`\n", + ] + + raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") + + chat_temp_name = "" + family = self.model_family.model_family or self.model_family.model_name + for key in LMDEPLOY_MODEL_CHAT_TEMPLATE_NAME.keys(): + if family in key: + chat_temp_name = LMDEPLOY_MODEL_CHAT_TEMPLATE_NAME[key] + break + if chat_temp_name == "": + raise ValueError(f"Can not find correct chat template.") + + chat_template_config = ChatTemplateConfig(chat_temp_name) + chat_template_config.meta_instruction = ( + self.model_family.prompt_style.system_prompt + ) + count = torch.cuda.device_count() + if count > 1: + self._model_config.setdefault("tp", torch.cuda.device_count()) + + self._model = pipeline( + self.model_path, + chat_template_config=chat_template_config, + backend_config=TurbomindEngineConfig(**self._model_config), + vision_config=VisionConfig(thread_safe=True), + ) + + @classmethod + def match( + cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str + ) -> bool: + if llm_spec.model_format == "awq": + # Currently, only 4-bit weight quantization is supported for AWQ, but got 8 bits. + if "4" not in quantization: + return False + if llm_family.model_name not in LMDEPLOY_SUPPORTED_CHAT_MODELS: + return False + return LMDEPLOY_INSTALLED + + async def async_chat( + self, + prompt: Union[str, List[Dict]], + system_prompt: Optional[str] = None, + chat_history: Optional[List[ChatCompletionMessage]] = None, + generate_config: Optional[Dict] = None, + ) -> Union[ChatCompletion, AsyncGenerator[ChatCompletionChunk, None]]: + stream = ( + generate_config.get("stream", False) + if isinstance(generate_config, dict) + else False + ) + stream_options = ( + generate_config.get("stream_options", None) + if isinstance(generate_config, dict) + else False + ) + include_usage = ( + stream_options["include_usage"] + if isinstance(stream_options, dict) + else False + ) + + chat_history = chat_history or [] + + if stream: + chunk = self._chat_stream(prompt, chat_history, include_usage) + return self._async_to_chat_completion_chunks(chunk) + else: + chunk = await self._chat(prompt, chat_history) + return self._to_chat_completion(chunk) + + async def _chat_stream(self, prompt, chat_history, include_usage): + from lmdeploy.messages import Response + + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 + completion_id = str(uuid.uuid1()) + async for output in self._generate( + prompt, + chat_history, + session_id=-1, + stream_response=True, + ): + new_text = output.text if isinstance(output, Response) else output.response + + completion_choice = ChatCompletionChunkChoice( + text=new_text, + index=0, + logprobs=None, + finish_reason=output.finish_reason, + ) + chunk = ChatCompletionChunk( + id=completion_id, + object="chat.completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + prompt_tokens = output.input_token_len + completion_tokens = output.generate_token_len + total_tokens = prompt_tokens + completion_tokens + completion_usage = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + chunk["usage"] = completion_usage + print(chunk) + yield chunk + if include_usage: + chunk = ChatCompletionChunk( + id=completion_id, + object="chat.completion", + created=int(time.time()), + model=self.model_uid, + choices=[], + ) + chunk["usage"] = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + yield chunk + + async def _chat(self, prompt, chat_history): + from lmdeploy.messages import Response + + response, finish_reason = "", "" + prompt_tokens, completion_tokens, total_tokens = 0, 0, 0 + async for output in self._generate( + prompt, + chat_history, + session_id=-1, + stream_response=False, + ): + response += output.text if isinstance(output, Response) else output.response + prompt_tokens = output.input_token_len + completion_tokens = output.generate_token_len + total_tokens = output.input_token_len + output.generate_token_len + finish_reason = output.finish_reason + + chunk = ChatCompletion( + id=str(uuid.uuid1()), + object="chat.completion", + created=int(time.time()), + model=self.model_uid, + choices=[ + CompletionChoice( + index=0, text=response, finish_reason=finish_reason, logprobs=None + ) + ], + usage=CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ), + ) + return chunk + + # copy from lmdeploy + # Reference: lmdeploy.serve.async_engine.py + async def _generate( + self, + prompt, + chat_history, + session_id: int, + generate_config: Optional[Dict] = None, + tools: Optional[List[object]] = None, + stream_response: bool = True, + sequence_start: bool = True, + sequence_end: bool = True, # no interactive mode by default + step: int = 0, + do_preprocess: bool = False, + adapter_name: Optional[str] = None, + **kwargs, + ): + import random + + from lmdeploy.messages import EngineGenerationConfig, GenerationConfig + from lmdeploy.serve.async_engine import GenOut + from lmdeploy.tokenizer import DetokenizeState + + session_id = -1 + + if str(session_id) not in self._model.id2step: + self._model.id2step[str(session_id)] = 0 + if generate_config is None: + generate_config = GenerationConfig() + if type(generate_config) is GenerationConfig: + generate_config = EngineGenerationConfig.From( + generate_config, self._model.tokenizer + ) + if generate_config.stop_words is None: # type: ignore + generate_config.stop_words = self._model.stop_words # type: ignore + if generate_config.random_seed is None and sequence_start: # type: ignore + generate_config.random_seed = random.getrandbits(64) # type: ignore + if generate_config.n > 1: # type: ignore + logger.warning( + f"n({generate_config.n}) > 1 hasn't been supported yet. " # type: ignore + f"Fallback to 1" + ) + generate_config.n = 1 # type: ignore + + prompt_input = await self._get_prompt_input(prompt, chat_history) + prompt = prompt_input["prompt"] + input_ids = prompt_input["input_ids"] + finish_reason = None + logger.info( + f"prompt={prompt!r}, " + f"gen_config={generate_config}, " + f"prompt_token_id={input_ids}, " + f"adapter_name={adapter_name}." + ) + logger.info( + f"session_id={session_id}, " # type: ignore + f"history_tokens={self._model.id2step[str(session_id)]}, " + f"input_tokens={len(input_ids)}, " + f"max_new_tokens={generate_config.max_new_tokens}, " + f"seq_start={sequence_start}, seq_end={sequence_end}, " + f"step={step}, prep={do_preprocess}" + ) + + if generate_config.max_new_tokens is None: # type: ignore + # for interactive endpoint, will try maximum possible token num + generate_config.max_new_tokens = max( # type: ignore + 128, + self._model.session_len + - self._model.id2step[str(session_id)] + - len(input_ids), + ) + elif ( + self._model.id2step[str(session_id)] + + len(input_ids) + + generate_config.max_new_tokens # type: ignore + > self._model.session_len + ): + generate_config.max_new_tokens = max( # type: ignore + self._model.session_len + - self._model.id2step[str(session_id)] + - len(input_ids), + 128, + ) + logger.error(f"Truncate max_new_tokens to {generate_config.max_new_tokens}") # type: ignore + + if ( + self._model.id2step[str(session_id)] + + len(input_ids) + + generate_config.max_new_tokens # type: ignore + > self._model.session_len + ): + logger.error(f"run out of tokens. session_id={session_id}.") + yield GenOut( + "", self._model.id2step[str(session_id)], len(input_ids), 0, "length" + ) + if sequence_end is True and sequence_start is False: + await self._model.end_session(session_id) + else: + generator = await self._model.get_generator(False, session_id) + async with self._model.safe_run(session_id): + state = DetokenizeState(len(input_ids)) + start_ids_offset = state.ids_offset + response = "" + async for outputs in generator.async_stream_infer( + session_id=session_id, + **prompt_input, + gen_config=generate_config, + adapter_name=adapter_name, + stream_output=stream_response, + sequence_start=sequence_start, + sequence_end=sequence_end, + step=self._model.id2step[str(session_id)], + ): + # decode res + res, tokens = ( + input_ids + outputs.token_ids, + outputs.num_token, + ) # noqa + if len(res) <= state.ids_offset: + continue + + ids_offset = state.ids_offset + response, state = self._model.tokenizer.detokenize_incrementally( + res, + state, + skip_special_tokens=generate_config.skip_special_tokens, # type: ignore + ) + + res = res[ids_offset:] + logprobs = None + if outputs.logprobs: + log_offset = ids_offset - start_ids_offset + logprobs = outputs.logprobs[log_offset:] + + # response, history token len, + # input token len, gen token len + yield GenOut( + response, + self._model.id2step[str(session_id)], + len(input_ids), + tokens, + finish_reason, + res, + logprobs, + ) + + finish_reason = ( + "length" if tokens >= generate_config.max_new_tokens else "stop" # type: ignore + ) + # utf-8 char at the end means it's a potential unfinished + # byte sequence + if not response.endswith("�"): + response = "" # avaid returning the last response twice + yield GenOut( + response, + self._model.id2step[str(session_id)], + len(input_ids), + tokens, + finish_reason, + ) + # update step + self._model.id2step[str(session_id)] += len(input_ids) + tokens + if sequence_end: + self._model.id2step[str(session_id)] = 0 + # manually end pytorch session + # TODO modify pytorch or turbomind api + if self._model.backend == "pytorch" and sequence_end: + await self._model.end_session(session_id) + + # copy from lmdeploy + # Reference: lmdeploy.serve.vl_async_engine.py + async def _get_prompt_input( + self, + prompt: Union[str, List[Dict]], + chat_history: Optional[List[ChatCompletionMessage]] = None, + sequence_start: bool = True, + tools: Optional[List[object]] = None, + **kwargs, + ): + """get input_ids, embeddings and offsets.""" + IMAGE_TOKEN = "<IMAGE_TOKEN>" + IMAGE_DUMMY_TOKEN_INDEX = 0 + import numpy as np + + assert self.model_family.prompt_style is not None + prompt_style = self.model_family.prompt_style.copy() + chat_history = chat_history or [] + + decorated, _ = self.get_prompt(prompt, chat_history, prompt_style) # type: ignore + chat_history.append(ChatCompletionMessage(role="user", content=prompt)) # type: ignore + prompt = chat_history # type: ignore + + decorated = decorated.replace("<image>", "<img><IMAGE_TOKEN></img>") + + segs = decorated.split(IMAGE_TOKEN) + + results = {} + input_ids = [] # type: ignore + if len(segs) > 1: + images = await self._model.vl_prompt_template.async_collect_pil_images( + prompt + ) + + features = await self._model.vl_encoder.async_infer(images) + + from lmdeploy.vl.templates import MiniCPMVTempateWrapper + + if isinstance(self._model.vl_prompt_template, MiniCPMVTempateWrapper): + ( + decorated, + features, + ) = self._model.vl_prompt_template.update_image_token( # noqa: E501 + decorated, features + ) + segs = decorated.split(IMAGE_TOKEN) + + features = [x.cpu().numpy() for x in features] + input_ids = [] + begins = [] + ends = [] + if len(segs) != len(features) + 1: + logger.error( + f"the number of {IMAGE_TOKEN} is not equal " + f"to input images, {len(segs) - 1} vs {len(features)}" + ) + features = features[: len(segs) - 1] + for i, seg in enumerate(segs): + if i > 0 and i <= len(features): + image_dim = features[i - 1].shape[0] + begins.append(len(input_ids)) + ends.append(begins[-1] + image_dim) + input_ids.extend([IMAGE_DUMMY_TOKEN_INDEX] * image_dim) + seg_ids = self._model.tokenizer.encode( + seg, add_bos=((i == 0) and sequence_start) + ) + input_ids.extend(seg_ids) + ranges = np.stack([begins, ends], axis=1).tolist() + results["input_embeddings"] = features + results["input_embedding_ranges"] = ranges + else: + input_ids = self._model.tokenizer.encode(decorated, add_bos=sequence_start) + + results["input_ids"] = input_ids + results["prompt"] = decorated + + return results diff --git a/xinference/model/llm/lmdeploy/tests/__init__.py b/xinference/model/llm/lmdeploy/tests/__init__.py new file mode 100644 index 0000000000..37f6558d95 --- /dev/null +++ b/xinference/model/llm/lmdeploy/tests/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2023 XProbe Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/xinference/model/llm/transformers/intern_vl.py b/xinference/model/llm/transformers/intern_vl.py index dc90cd0516..02632e2af8 100644 --- a/xinference/model/llm/transformers/intern_vl.py +++ b/xinference/model/llm/transformers/intern_vl.py @@ -507,7 +507,23 @@ def _generate_stream(self, generate_kwargs, input_ids, include_usage): ) chunk["usage"] = completion_usage yield chunk - + completion_choice = CompletionChoice( + text="", index=0, logprobs=None, finish_reason="stop" + ) + chunk = CompletionChunk( + id=completion_id, + object="text_completion", + created=int(time.time()), + model=self.model_uid, + choices=[completion_choice], + ) + completion_usage = CompletionUsage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=total_tokens, + ) + chunk["usage"] = completion_usage + yield chunk if include_usage: chunk = CompletionChunk( id=completion_id, diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 2caaa83c71..7f203d0c21 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -459,7 +459,16 @@ def get_role(role_name: str): role = get_role(message["role"]) content = message["content"] if isinstance(content, str): - ret += role + "\n" + content + prompt_style.intra_message_sep + "\n" + if content: + ret += ( + role + + "\n" + + content + + prompt_style.intra_message_sep + + "\n" + ) + else: + ret += role + "\n" elif isinstance(content, list): text = "" image_urls = [] diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 49a324e5d9..4b009aa646 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -721,7 +721,7 @@ async def async_chat( prompt_style = self.model_family.prompt_style.copy() chat_history = chat_history or [] prompt, images = self.get_prompt(prompt, chat_history, prompt_style) - logger.info(f"messages:{prompt}") + if len(images) == 0: inputs = { "prompt": prompt, From 2460978551ae3b2ae7d3fa0101566e2ce00f9031 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Sun, 25 Aug 2024 09:29:43 +0800 Subject: [PATCH 281/298] BUG: fix docker conflict (#2156) --- xinference/deploy/docker/Dockerfile | 1 + xinference/deploy/docker/cpu.Dockerfile | 1 + xinference/deploy/docker/requirements.txt | 2 +- xinference/deploy/docker/requirements_cpu.txt | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 1975adb5eb..7ede36a9f0 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -26,6 +26,7 @@ ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib/python3.10/dist-packages/nvi ARG PIP_INDEX=https://pypi.org/simple RUN pip install --upgrade -i "$PIP_INDEX" pip && \ pip install -i "$PIP_INDEX" "diskcache>=5.6.1" "jinja2>=2.11.3" && \ + pip install -i "$PIP_INDEX" matcha-tts && \ # use pre-built whl package for llama-cpp-python, otherwise may core dump when init llama in some envs pip install "llama-cpp-python>=0.2.82" -i https://abetlen.github.io/llama-cpp-python/whl/cu124 && \ pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements.txt && \ diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index d7bd45c463..a22eac50d4 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -19,6 +19,7 @@ ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ + pip install -i "$PIP_INDEX" matcha-tts && \ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements_cpu.txt && \ CMAKE_ARGS="-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS" pip install llama-cpp-python && \ diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 5408194367..7ee4776a71 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -52,7 +52,7 @@ torchaudio # For ChatTTS ChatTTS>0.1 xxhash # For ChatTTS HyperPyYAML # For CosyVoice -matcha-tts>=0.0.7 # For CosyVoice +# matcha-tts>=0.0.7 # For CosyVoice onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice openai-whisper # For CosyVoice diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 00a33dae9c..48d6a74e8d 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -49,7 +49,7 @@ torchaudio # For ChatTTS ChatTTS>0.1 xxhash # For ChatTTS HyperPyYAML # For CosyVoice -matcha-tts>=0.0.7 # For CosyVoice +# matcha-tts>=0.0.7 # For CosyVoice onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice openai-whisper # For CosyVoice From e7f598435dbcf44ab9e3ff50b51b3ff2fccf9ab4 Mon Sep 17 00:00:00 2001 From: wxiwnd <40122078+wxiwnd@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:29:18 +0800 Subject: [PATCH 282/298] ENH: support padding for sd inpainting model (#2165) Signed-off-by: wxiwnd <wxiwnd@outlook.com> Co-authored-by: Xuye (Chris) Qin <qinxuye@gmail.com> --- .../model/image/stable_diffusion/core.py | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/xinference/model/image/stable_diffusion/core.py b/xinference/model/image/stable_diffusion/core.py index 7d5fdb5bf4..96db927023 100644 --- a/xinference/model/image/stable_diffusion/core.py +++ b/xinference/model/image/stable_diffusion/core.py @@ -257,15 +257,19 @@ def image_to_image( self._i2i_model = model = AutoPipelineForImage2Image.from_pipe( self._model ) - if size: - width, height = map(int, re.split(r"[^\d]+", size)) - kwargs["width"] = width - kwargs["height"] = height + if padding_image_to_multiple := kwargs.pop("padding_image_to_multiple", None): # Model like SD3 image to image requires image's height and width is times of 16 # padding the image if specified image = self.pad_to_multiple(image, multiple=int(padding_image_to_multiple)) + if size: + width, height = map(int, re.split(r"[^\d]+", size)) + if padding_image_to_multiple: + width, height = image.size + kwargs["width"] = width + kwargs["height"] = height + self._filter_kwargs(kwargs) return self._call_model( image=image, @@ -279,8 +283,8 @@ def image_to_image( def inpainting( self, - image: bytes, - mask_image: bytes, + image: PIL.Image, + mask_image: PIL.Image, prompt: Optional[Union[str, List[str]]] = None, negative_prompt: Optional[Union[str, List[str]]] = None, n: int = 1, @@ -306,6 +310,17 @@ def inpainting( model = self._model width, height = map(int, re.split(r"[^\d]+", size)) + + if padding_image_to_multiple := kwargs.pop("padding_image_to_multiple", None): + # Model like SD3 inpainting requires image's height and width is times of 16 + # padding the image if specified + image = self.pad_to_multiple(image, multiple=int(padding_image_to_multiple)) + mask_image = self.pad_to_multiple( + mask_image, multiple=int(padding_image_to_multiple) + ) + # calculate actual image size after padding + width, height = image.size + return self._call_model( image=image, mask_image=mask_image, From 1c8889aaa73fb303c4b7e48bdf1331c2f10d7a29 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Tue, 27 Aug 2024 15:30:58 +0800 Subject: [PATCH 283/298] EHN: clean cache for VL models (#2163) --- xinference/model/llm/utils.py | 3 +++ xinference/model/utils.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/xinference/model/llm/utils.py b/xinference/model/llm/utils.py index 7f203d0c21..8107d890a0 100644 --- a/xinference/model/llm/utils.py +++ b/xinference/model/llm/utils.py @@ -32,6 +32,7 @@ Completion, CompletionChunk, ) +from ..utils import ensure_cache_cleared from .llm_family import ( LlamaCppLLMSpecV1, LLMFamilyV1, @@ -576,6 +577,7 @@ def _get_final_chat_completion_chunk( return cast(ChatCompletionChunk, chat_chunk) @classmethod + @ensure_cache_cleared def _to_chat_completion_chunks( cls, chunks: Iterator[CompletionChunk], @@ -608,6 +610,7 @@ async def _async_to_chat_completion_chunks( i += 1 @staticmethod + @ensure_cache_cleared def _to_chat_completion(completion: Completion) -> ChatCompletion: return { "id": "chat" + completion["id"], diff --git a/xinference/model/utils.py b/xinference/model/utils.py index c266afcff9..e67d911395 100644 --- a/xinference/model/utils.py +++ b/xinference/model/utils.py @@ -11,6 +11,10 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +import functools +import gc +import inspect import json import logging import os @@ -21,7 +25,7 @@ import huggingface_hub from ..constants import XINFERENCE_CACHE_DIR, XINFERENCE_ENV_MODEL_SRC -from ..device_utils import get_available_device, is_device_available +from ..device_utils import empty_cache, get_available_device, is_device_available from .core import CacheableModelSpec logger = logging.getLogger(__name__) @@ -348,3 +352,29 @@ def convert_float_to_int_or_str(model_size: float) -> Union[int, str]: return int(model_size) else: return str(model_size) + + +def ensure_cache_cleared(func: Callable): + assert not inspect.iscoroutinefunction(func) and not inspect.isasyncgenfunction( + func + ) + if inspect.isgeneratorfunction(func): + + @functools.wraps(func) + def inner(*args, **kwargs): + for obj in func(*args, **kwargs): + yield obj + gc.collect() + empty_cache() + + else: + + @functools.wraps(func) + def inner(*args, **kwargs): + try: + return func(*args, **kwargs) + finally: + gc.collect() + empty_cache() + + return inner From 4d77065f52f556f523272aa2c3de29df94409bc7 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:26:24 +0200 Subject: [PATCH 284/298] ENH: Move matcha to third party (#2166) Co-authored-by: Xuye (Chris) Qin <qinxuye@gmail.com> --- setup.cfg | 27 +- xinference/deploy/docker/Dockerfile | 1 - xinference/deploy/docker/cpu.Dockerfile | 1 - xinference/deploy/docker/requirements.txt | 13 +- xinference/deploy/docker/requirements_cpu.txt | 13 +- xinference/thirdparty/matcha/VERSION | 1 + xinference/thirdparty/matcha/__init__.py | 0 xinference/thirdparty/matcha/app.py | 357 ++++++++++++++ xinference/thirdparty/matcha/cli.py | 419 +++++++++++++++++ xinference/thirdparty/matcha/data/__init__.py | 0 .../matcha/data/components/__init__.py | 0 .../matcha/data/text_mel_datamodule.py | 274 +++++++++++ xinference/thirdparty/matcha/hifigan/LICENSE | 21 + .../thirdparty/matcha/hifigan/README.md | 101 ++++ .../thirdparty/matcha/hifigan/__init__.py | 0 .../thirdparty/matcha/hifigan/config.py | 28 ++ .../thirdparty/matcha/hifigan/denoiser.py | 64 +++ xinference/thirdparty/matcha/hifigan/env.py | 17 + .../thirdparty/matcha/hifigan/meldataset.py | 217 +++++++++ .../thirdparty/matcha/hifigan/models.py | 368 +++++++++++++++ .../thirdparty/matcha/hifigan/xutils.py | 60 +++ .../thirdparty/matcha/models/__init__.py | 0 .../matcha/models/baselightningmodule.py | 210 +++++++++ .../matcha/models/components/__init__.py | 0 .../matcha/models/components/decoder.py | 443 ++++++++++++++++++ .../matcha/models/components/flow_matching.py | 132 ++++++ .../matcha/models/components/text_encoder.py | 410 ++++++++++++++++ .../matcha/models/components/transformer.py | 316 +++++++++++++ .../thirdparty/matcha/models/matcha_tts.py | 244 ++++++++++ xinference/thirdparty/matcha/onnx/__init__.py | 0 xinference/thirdparty/matcha/onnx/export.py | 181 +++++++ xinference/thirdparty/matcha/onnx/infer.py | 168 +++++++ xinference/thirdparty/matcha/text/__init__.py | 53 +++ xinference/thirdparty/matcha/text/cleaners.py | 121 +++++ xinference/thirdparty/matcha/text/numbers.py | 71 +++ xinference/thirdparty/matcha/text/symbols.py | 17 + xinference/thirdparty/matcha/train.py | 122 +++++ .../thirdparty/matcha/utils/__init__.py | 5 + xinference/thirdparty/matcha/utils/audio.py | 82 ++++ .../matcha/utils/generate_data_statistics.py | 112 +++++ .../utils/get_durations_from_trained_model.py | 195 ++++++++ .../thirdparty/matcha/utils/instantiators.py | 56 +++ .../thirdparty/matcha/utils/logging_utils.py | 53 +++ xinference/thirdparty/matcha/utils/model.py | 90 ++++ .../matcha/utils/monotonic_align/__init__.py | 22 + .../matcha/utils/monotonic_align/core.pyx | 47 ++ .../matcha/utils/monotonic_align/setup.py | 7 + .../thirdparty/matcha/utils/pylogger.py | 21 + .../thirdparty/matcha/utils/rich_utils.py | 101 ++++ xinference/thirdparty/matcha/utils/utils.py | 259 ++++++++++ 50 files changed, 5505 insertions(+), 15 deletions(-) create mode 100644 xinference/thirdparty/matcha/VERSION create mode 100644 xinference/thirdparty/matcha/__init__.py create mode 100644 xinference/thirdparty/matcha/app.py create mode 100644 xinference/thirdparty/matcha/cli.py create mode 100644 xinference/thirdparty/matcha/data/__init__.py create mode 100644 xinference/thirdparty/matcha/data/components/__init__.py create mode 100644 xinference/thirdparty/matcha/data/text_mel_datamodule.py create mode 100644 xinference/thirdparty/matcha/hifigan/LICENSE create mode 100644 xinference/thirdparty/matcha/hifigan/README.md create mode 100644 xinference/thirdparty/matcha/hifigan/__init__.py create mode 100644 xinference/thirdparty/matcha/hifigan/config.py create mode 100644 xinference/thirdparty/matcha/hifigan/denoiser.py create mode 100644 xinference/thirdparty/matcha/hifigan/env.py create mode 100644 xinference/thirdparty/matcha/hifigan/meldataset.py create mode 100644 xinference/thirdparty/matcha/hifigan/models.py create mode 100644 xinference/thirdparty/matcha/hifigan/xutils.py create mode 100644 xinference/thirdparty/matcha/models/__init__.py create mode 100644 xinference/thirdparty/matcha/models/baselightningmodule.py create mode 100644 xinference/thirdparty/matcha/models/components/__init__.py create mode 100644 xinference/thirdparty/matcha/models/components/decoder.py create mode 100644 xinference/thirdparty/matcha/models/components/flow_matching.py create mode 100644 xinference/thirdparty/matcha/models/components/text_encoder.py create mode 100644 xinference/thirdparty/matcha/models/components/transformer.py create mode 100644 xinference/thirdparty/matcha/models/matcha_tts.py create mode 100644 xinference/thirdparty/matcha/onnx/__init__.py create mode 100644 xinference/thirdparty/matcha/onnx/export.py create mode 100644 xinference/thirdparty/matcha/onnx/infer.py create mode 100644 xinference/thirdparty/matcha/text/__init__.py create mode 100644 xinference/thirdparty/matcha/text/cleaners.py create mode 100644 xinference/thirdparty/matcha/text/numbers.py create mode 100644 xinference/thirdparty/matcha/text/symbols.py create mode 100644 xinference/thirdparty/matcha/train.py create mode 100644 xinference/thirdparty/matcha/utils/__init__.py create mode 100644 xinference/thirdparty/matcha/utils/audio.py create mode 100644 xinference/thirdparty/matcha/utils/generate_data_statistics.py create mode 100644 xinference/thirdparty/matcha/utils/get_durations_from_trained_model.py create mode 100644 xinference/thirdparty/matcha/utils/instantiators.py create mode 100644 xinference/thirdparty/matcha/utils/logging_utils.py create mode 100644 xinference/thirdparty/matcha/utils/model.py create mode 100644 xinference/thirdparty/matcha/utils/monotonic_align/__init__.py create mode 100644 xinference/thirdparty/matcha/utils/monotonic_align/core.pyx create mode 100644 xinference/thirdparty/matcha/utils/monotonic_align/setup.py create mode 100644 xinference/thirdparty/matcha/utils/pylogger.py create mode 100644 xinference/thirdparty/matcha/utils/rich_utils.py create mode 100644 xinference/thirdparty/matcha/utils/utils.py diff --git a/setup.cfg b/setup.cfg index 7b83211c84..6d8c334740 100644 --- a/setup.cfg +++ b/setup.cfg @@ -80,7 +80,7 @@ dev = all = llama-cpp-python>=0.2.25,!=0.2.58 transformers>=4.43.2 - torch + torch>=2.0.0 # >=2.0 For CosyVoice accelerate>=0.27.2 sentencepiece transformers_stream_generator @@ -106,14 +106,20 @@ all = FlagEmbedding # For rerank funasr omegaconf~=2.3.0 # For ChatTTS - nemo_text_processing # For ChatTTS - WeTextProcessing # For ChatTTS + nemo_text_processing<1.1.0 # 1.1.0 requires pynini==2.1.6.post1 + WeTextProcessing<1.0.4 # 1.0.4 requires pynini==2.1.6 librosa # For ChatTTS xxhash # For ChatTTS torchaudio # For ChatTTS ChatTTS>0.1 + lightning>=2.0.0 # For CosyVoice, matcha + hydra-core>=1.3.2 # For CosyVoice, matcha + inflect # For CosyVoice, matcha + conformer # For CosyVoice, matcha + diffusers>=0.30.0 # For CosyVoice, matcha + gdown # For CosyVoice, matcha + pyarrow # For CosyVoice, matcha HyperPyYAML # For CosyVoice - matcha-tts>=0.0.7 # For CosyVoice onnxruntime==1.16.0 # For CosyVoice, use onnxruntime-gpu==1.16.0 if possible openai-whisper # For CosyVoice boto3>=1.28.55,<1.28.65 # For tensorizer @@ -170,14 +176,21 @@ video = audio = funasr omegaconf~=2.3.0 - nemo_text_processing - WeTextProcessing + nemo_text_processing<1.1.0 # 1.1.0 requires pynini==2.1.6.post1 + WeTextProcessing<1.0.4 # 1.0.4 requires pynini==2.1.6 librosa xxhash torchaudio ChatTTS>0.1 + torch>=2.0.0 # For CosyVoice, matcha + lightning>=2.0.0 # For CosyVoice, matcha + hydra-core>=1.3.2 # For CosyVoice, matcha + inflect # For CosyVoice, matcha + conformer # For CosyVoice, matcha + diffusers>=0.30.0 # For CosyVoice, matcha + gdown # For CosyVoice, matcha + pyarrow # For CosyVoice, matcha HyperPyYAML # For CosyVoice - matcha-tts>=0.0.7 # For CosyVoice onnxruntime==1.16.0 # For CosyVoice, use onnxruntime-gpu==1.16.0 if possible openai-whisper # For CosyVoice loguru # For Fish Speech diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 7ede36a9f0..1975adb5eb 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -26,7 +26,6 @@ ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib/python3.10/dist-packages/nvi ARG PIP_INDEX=https://pypi.org/simple RUN pip install --upgrade -i "$PIP_INDEX" pip && \ pip install -i "$PIP_INDEX" "diskcache>=5.6.1" "jinja2>=2.11.3" && \ - pip install -i "$PIP_INDEX" matcha-tts && \ # use pre-built whl package for llama-cpp-python, otherwise may core dump when init llama in some envs pip install "llama-cpp-python>=0.2.82" -i https://abetlen.github.io/llama-cpp-python/whl/cu124 && \ pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements.txt && \ diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index a22eac50d4..d7bd45c463 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -19,7 +19,6 @@ ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH ARG PIP_INDEX=https://pypi.org/simple RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ - pip install -i "$PIP_INDEX" matcha-tts && \ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ pip install -i "$PIP_INDEX" --upgrade-strategy only-if-needed -r /opt/inference/xinference/deploy/docker/requirements_cpu.txt && \ CMAKE_ARGS="-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS" pip install llama-cpp-python && \ diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 7ee4776a71..7ca70aff5e 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -45,14 +45,21 @@ torchvision # For deepseek VL FlagEmbedding # For rerank funasr omegaconf~=2.3.0 # For ChatTTS -nemo_text_processing # For ChatTTS -WeTextProcessing # For ChatTTS +nemo_text_processing<1.1.0 # 1.1.0 requires pynini==2.1.6.post1 +WeTextProcessing<1.0.4 # 1.0.4 requires pynini==2.1.6 librosa # For ChatTTS torchaudio # For ChatTTS ChatTTS>0.1 xxhash # For ChatTTS +torch>=2.0.0 # For CosyVoice +lightning>=2.0.0 # For CosyVoice, matcha +hydra-core>=1.3.2 # For CosyVoice, matcha +inflect # For CosyVoice, matcha +conformer # For CosyVoice, matcha +diffusers>=0.30.0 # For CosyVoice, matcha +gdown # For CosyVoice, matcha +pyarrow # For CosyVoice, matcha HyperPyYAML # For CosyVoice -# matcha-tts>=0.0.7 # For CosyVoice onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice openai-whisper # For CosyVoice diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 48d6a74e8d..8d1c3308cf 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -42,14 +42,21 @@ timm opencv-contrib-python-headless funasr omegaconf~=2.3.0 # For ChatTTS -nemo_text_processing # For ChatTTS -WeTextProcessing # For ChatTTS +nemo_text_processing<1.1.0 # 1.1.0 requires pynini==2.1.6.post1 +WeTextProcessing<1.0.4 # 1.0.4 requires pynini==2.1.6 librosa # For ChatTTS torchaudio # For ChatTTS ChatTTS>0.1 xxhash # For ChatTTS +torch>=2.0.0 # For CosyVoice +lightning>=2.0.0 # For CosyVoice, matcha +hydra-core>=1.3.2 # For CosyVoice, matcha +inflect # For CosyVoice, matcha +conformer # For CosyVoice, matcha +diffusers>=0.30.0 # For CosyVoice, matcha +gdown # For CosyVoice, matcha +pyarrow # For CosyVoice, matcha HyperPyYAML # For CosyVoice -# matcha-tts>=0.0.7 # For CosyVoice onnxruntime-gpu==1.16.0; sys_platform == 'linux' # For CosyVoice onnxruntime==1.16.0; sys_platform == 'darwin' or sys_platform == 'windows' # For CosyVoice openai-whisper # For CosyVoice diff --git a/xinference/thirdparty/matcha/VERSION b/xinference/thirdparty/matcha/VERSION new file mode 100644 index 0000000000..ea5abc8f95 --- /dev/null +++ b/xinference/thirdparty/matcha/VERSION @@ -0,0 +1 @@ +0.0.7.0 diff --git a/xinference/thirdparty/matcha/__init__.py b/xinference/thirdparty/matcha/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/matcha/app.py b/xinference/thirdparty/matcha/app.py new file mode 100644 index 0000000000..d68fbaa2d1 --- /dev/null +++ b/xinference/thirdparty/matcha/app.py @@ -0,0 +1,357 @@ +import tempfile +from argparse import Namespace +from pathlib import Path + +import gradio as gr +import soundfile as sf +import torch + +from matcha.cli import ( + MATCHA_URLS, + VOCODER_URLS, + assert_model_downloaded, + get_device, + load_matcha, + load_vocoder, + process_text, + to_waveform, +) +from matcha.utils.utils import get_user_data_dir, plot_tensor + +LOCATION = Path(get_user_data_dir()) + +args = Namespace( + cpu=False, + model="matcha_vctk", + vocoder="hifigan_univ_v1", + spk=0, +) + +CURRENTLY_LOADED_MODEL = args.model + + +def MATCHA_TTS_LOC(x): + return LOCATION / f"{x}.ckpt" + + +def VOCODER_LOC(x): + return LOCATION / f"{x}" + + +LOGO_URL = "https://shivammehta25.github.io/Matcha-TTS/images/logo.png" +RADIO_OPTIONS = { + "Multi Speaker (VCTK)": { + "model": "matcha_vctk", + "vocoder": "hifigan_univ_v1", + }, + "Single Speaker (LJ Speech)": { + "model": "matcha_ljspeech", + "vocoder": "hifigan_T2_v1", + }, +} + +# Ensure all the required models are downloaded +assert_model_downloaded(MATCHA_TTS_LOC("matcha_ljspeech"), MATCHA_URLS["matcha_ljspeech"]) +assert_model_downloaded(VOCODER_LOC("hifigan_T2_v1"), VOCODER_URLS["hifigan_T2_v1"]) +assert_model_downloaded(MATCHA_TTS_LOC("matcha_vctk"), MATCHA_URLS["matcha_vctk"]) +assert_model_downloaded(VOCODER_LOC("hifigan_univ_v1"), VOCODER_URLS["hifigan_univ_v1"]) + +device = get_device(args) + +# Load default model +model = load_matcha(args.model, MATCHA_TTS_LOC(args.model), device) +vocoder, denoiser = load_vocoder(args.vocoder, VOCODER_LOC(args.vocoder), device) + + +def load_model(model_name, vocoder_name): + model = load_matcha(model_name, MATCHA_TTS_LOC(model_name), device) + vocoder, denoiser = load_vocoder(vocoder_name, VOCODER_LOC(vocoder_name), device) + return model, vocoder, denoiser + + +def load_model_ui(model_type, textbox): + model_name, vocoder_name = RADIO_OPTIONS[model_type]["model"], RADIO_OPTIONS[model_type]["vocoder"] + + global model, vocoder, denoiser, CURRENTLY_LOADED_MODEL # pylint: disable=global-statement + if CURRENTLY_LOADED_MODEL != model_name: + model, vocoder, denoiser = load_model(model_name, vocoder_name) + CURRENTLY_LOADED_MODEL = model_name + + if model_name == "matcha_ljspeech": + spk_slider = gr.update(visible=False, value=-1) + single_speaker_examples = gr.update(visible=True) + multi_speaker_examples = gr.update(visible=False) + length_scale = gr.update(value=0.95) + else: + spk_slider = gr.update(visible=True, value=0) + single_speaker_examples = gr.update(visible=False) + multi_speaker_examples = gr.update(visible=True) + length_scale = gr.update(value=0.85) + + return ( + textbox, + gr.update(interactive=True), + spk_slider, + single_speaker_examples, + multi_speaker_examples, + length_scale, + ) + + +@torch.inference_mode() +def process_text_gradio(text): + output = process_text(1, text, device) + return output["x_phones"][1::2], output["x"], output["x_lengths"] + + +@torch.inference_mode() +def synthesise_mel(text, text_length, n_timesteps, temperature, length_scale, spk): + spk = torch.tensor([spk], device=device, dtype=torch.long) if spk >= 0 else None + output = model.synthesise( + text, + text_length, + n_timesteps=n_timesteps, + temperature=temperature, + spks=spk, + length_scale=length_scale, + ) + output["waveform"] = to_waveform(output["mel"], vocoder, denoiser) + with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as fp: + sf.write(fp.name, output["waveform"], 22050, "PCM_24") + + return fp.name, plot_tensor(output["mel"].squeeze().cpu().numpy()) + + +def multispeaker_example_cacher(text, n_timesteps, mel_temp, length_scale, spk): + global CURRENTLY_LOADED_MODEL # pylint: disable=global-statement + if CURRENTLY_LOADED_MODEL != "matcha_vctk": + global model, vocoder, denoiser # pylint: disable=global-statement + model, vocoder, denoiser = load_model("matcha_vctk", "hifigan_univ_v1") + CURRENTLY_LOADED_MODEL = "matcha_vctk" + + phones, text, text_lengths = process_text_gradio(text) + audio, mel_spectrogram = synthesise_mel(text, text_lengths, n_timesteps, mel_temp, length_scale, spk) + return phones, audio, mel_spectrogram + + +def ljspeech_example_cacher(text, n_timesteps, mel_temp, length_scale, spk=-1): + global CURRENTLY_LOADED_MODEL # pylint: disable=global-statement + if CURRENTLY_LOADED_MODEL != "matcha_ljspeech": + global model, vocoder, denoiser # pylint: disable=global-statement + model, vocoder, denoiser = load_model("matcha_ljspeech", "hifigan_T2_v1") + CURRENTLY_LOADED_MODEL = "matcha_ljspeech" + + phones, text, text_lengths = process_text_gradio(text) + audio, mel_spectrogram = synthesise_mel(text, text_lengths, n_timesteps, mel_temp, length_scale, spk) + return phones, audio, mel_spectrogram + + +def main(): + description = """# 🍵 Matcha-TTS: A fast TTS architecture with conditional flow matching + ### [Shivam Mehta](https://www.kth.se/profile/smehta), [Ruibo Tu](https://www.kth.se/profile/ruibo), [Jonas Beskow](https://www.kth.se/profile/beskow), [Éva Székely](https://www.kth.se/profile/szekely), and [Gustav Eje Henter](https://people.kth.se/~ghe/) + We propose 🍵 Matcha-TTS, a new approach to non-autoregressive neural TTS, that uses conditional flow matching (similar to rectified flows) to speed up ODE-based speech synthesis. Our method: + + + * Is probabilistic + * Has compact memory footprint + * Sounds highly natural + * Is very fast to synthesise from + + + Check out our [demo page](https://shivammehta25.github.io/Matcha-TTS). Read our [arXiv preprint for more details](https://arxiv.org/abs/2309.03199). + Code is available in our [GitHub repository](https://github.com/shivammehta25/Matcha-TTS), along with pre-trained models. + + Cached examples are available at the bottom of the page. + """ + + with gr.Blocks(title="🍵 Matcha-TTS: A fast TTS architecture with conditional flow matching") as demo: + processed_text = gr.State(value=None) + processed_text_len = gr.State(value=None) + + with gr.Box(): + with gr.Row(): + gr.Markdown(description, scale=3) + with gr.Column(): + gr.Image(LOGO_URL, label="Matcha-TTS logo", height=50, width=50, scale=1, show_label=False) + html = '<br><iframe width="560" height="315" src="https://www.youtube.com/embed/xmvJkz3bqw0?si=jN7ILyDsbPwJCGoa" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>' + gr.HTML(html) + + with gr.Box(): + radio_options = list(RADIO_OPTIONS.keys()) + model_type = gr.Radio( + radio_options, value=radio_options[0], label="Choose a Model", interactive=True, container=False + ) + + with gr.Row(): + gr.Markdown("# Text Input") + with gr.Row(): + text = gr.Textbox(value="", lines=2, label="Text to synthesise", scale=3) + spk_slider = gr.Slider( + minimum=0, maximum=107, step=1, value=args.spk, label="Speaker ID", interactive=True, scale=1 + ) + + with gr.Row(): + gr.Markdown("### Hyper parameters") + with gr.Row(): + n_timesteps = gr.Slider( + label="Number of ODE steps", + minimum=1, + maximum=100, + step=1, + value=10, + interactive=True, + ) + length_scale = gr.Slider( + label="Length scale (Speaking rate)", + minimum=0.5, + maximum=1.5, + step=0.05, + value=1.0, + interactive=True, + ) + mel_temp = gr.Slider( + label="Sampling temperature", + minimum=0.00, + maximum=2.001, + step=0.16675, + value=0.667, + interactive=True, + ) + + synth_btn = gr.Button("Synthesise") + + with gr.Box(): + with gr.Row(): + gr.Markdown("### Phonetised text") + phonetised_text = gr.Textbox(interactive=False, scale=10, label="Phonetised text") + + with gr.Box(): + with gr.Row(): + mel_spectrogram = gr.Image(interactive=False, label="mel spectrogram") + + # with gr.Row(): + audio = gr.Audio(interactive=False, label="Audio") + + with gr.Row(visible=False) as example_row_lj_speech: + examples = gr.Examples( # pylint: disable=unused-variable + examples=[ + [ + "We propose Matcha-TTS, a new approach to non-autoregressive neural TTS, that uses conditional flow matching (similar to rectified flows) to speed up O D E-based speech synthesis.", + 50, + 0.677, + 0.95, + ], + [ + "The Secret Service believed that it was very doubtful that any President would ride regularly in a vehicle with a fixed top, even though transparent.", + 2, + 0.677, + 0.95, + ], + [ + "The Secret Service believed that it was very doubtful that any President would ride regularly in a vehicle with a fixed top, even though transparent.", + 4, + 0.677, + 0.95, + ], + [ + "The Secret Service believed that it was very doubtful that any President would ride regularly in a vehicle with a fixed top, even though transparent.", + 10, + 0.677, + 0.95, + ], + [ + "The Secret Service believed that it was very doubtful that any President would ride regularly in a vehicle with a fixed top, even though transparent.", + 50, + 0.677, + 0.95, + ], + [ + "The narrative of these events is based largely on the recollections of the participants.", + 10, + 0.677, + 0.95, + ], + [ + "The jury did not believe him, and the verdict was for the defendants.", + 10, + 0.677, + 0.95, + ], + ], + fn=ljspeech_example_cacher, + inputs=[text, n_timesteps, mel_temp, length_scale], + outputs=[phonetised_text, audio, mel_spectrogram], + cache_examples=True, + ) + + with gr.Row() as example_row_multispeaker: + multi_speaker_examples = gr.Examples( # pylint: disable=unused-variable + examples=[ + [ + "Hello everyone! I am speaker 0 and I am here to tell you that Matcha-TTS is amazing!", + 10, + 0.677, + 0.85, + 0, + ], + [ + "Hello everyone! I am speaker 16 and I am here to tell you that Matcha-TTS is amazing!", + 10, + 0.677, + 0.85, + 16, + ], + [ + "Hello everyone! I am speaker 44 and I am here to tell you that Matcha-TTS is amazing!", + 50, + 0.677, + 0.85, + 44, + ], + [ + "Hello everyone! I am speaker 45 and I am here to tell you that Matcha-TTS is amazing!", + 50, + 0.677, + 0.85, + 45, + ], + [ + "Hello everyone! I am speaker 58 and I am here to tell you that Matcha-TTS is amazing!", + 4, + 0.677, + 0.85, + 58, + ], + ], + fn=multispeaker_example_cacher, + inputs=[text, n_timesteps, mel_temp, length_scale, spk_slider], + outputs=[phonetised_text, audio, mel_spectrogram], + cache_examples=True, + label="Multi Speaker Examples", + ) + + model_type.change(lambda x: gr.update(interactive=False), inputs=[synth_btn], outputs=[synth_btn]).then( + load_model_ui, + inputs=[model_type, text], + outputs=[text, synth_btn, spk_slider, example_row_lj_speech, example_row_multispeaker, length_scale], + ) + + synth_btn.click( + fn=process_text_gradio, + inputs=[ + text, + ], + outputs=[phonetised_text, processed_text, processed_text_len], + api_name="matcha_tts", + queue=True, + ).then( + fn=synthesise_mel, + inputs=[processed_text, processed_text_len, n_timesteps, mel_temp, length_scale, spk_slider], + outputs=[audio, mel_spectrogram], + ) + + demo.queue().launch(share=True) + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/matcha/cli.py b/xinference/thirdparty/matcha/cli.py new file mode 100644 index 0000000000..7daf13073a --- /dev/null +++ b/xinference/thirdparty/matcha/cli.py @@ -0,0 +1,419 @@ +import argparse +import datetime as dt +import os +import warnings +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import soundfile as sf +import torch + +from matcha.hifigan.config import v1 +from matcha.hifigan.denoiser import Denoiser +from matcha.hifigan.env import AttrDict +from matcha.hifigan.models import Generator as HiFiGAN +from matcha.models.matcha_tts import MatchaTTS +from matcha.text import sequence_to_text, text_to_sequence +from matcha.utils.utils import assert_model_downloaded, get_user_data_dir, intersperse + +MATCHA_URLS = { + "matcha_ljspeech": "https://github.com/shivammehta25/Matcha-TTS-checkpoints/releases/download/v1.0/matcha_ljspeech.ckpt", + "matcha_vctk": "https://github.com/shivammehta25/Matcha-TTS-checkpoints/releases/download/v1.0/matcha_vctk.ckpt", +} + +VOCODER_URLS = { + "hifigan_T2_v1": "https://github.com/shivammehta25/Matcha-TTS-checkpoints/releases/download/v1.0/generator_v1", # Old url: https://drive.google.com/file/d/14NENd4equCBLyyCSke114Mv6YR_j_uFs/view?usp=drive_link + "hifigan_univ_v1": "https://github.com/shivammehta25/Matcha-TTS-checkpoints/releases/download/v1.0/g_02500000", # Old url: https://drive.google.com/file/d/1qpgI41wNXFcH-iKq1Y42JlBC9j0je8PW/view?usp=drive_link +} + +MULTISPEAKER_MODEL = { + "matcha_vctk": {"vocoder": "hifigan_univ_v1", "speaking_rate": 0.85, "spk": 0, "spk_range": (0, 107)} +} + +SINGLESPEAKER_MODEL = {"matcha_ljspeech": {"vocoder": "hifigan_T2_v1", "speaking_rate": 0.95, "spk": None}} + + +def plot_spectrogram_to_numpy(spectrogram, filename): + fig, ax = plt.subplots(figsize=(12, 3)) + im = ax.imshow(spectrogram, aspect="auto", origin="lower", interpolation="none") + plt.colorbar(im, ax=ax) + plt.xlabel("Frames") + plt.ylabel("Channels") + plt.title("Synthesised Mel-Spectrogram") + fig.canvas.draw() + plt.savefig(filename) + + +def process_text(i: int, text: str, device: torch.device): + print(f"[{i}] - Input text: {text}") + x = torch.tensor( + intersperse(text_to_sequence(text, ["english_cleaners2"])[0], 0), + dtype=torch.long, + device=device, + )[None] + x_lengths = torch.tensor([x.shape[-1]], dtype=torch.long, device=device) + x_phones = sequence_to_text(x.squeeze(0).tolist()) + print(f"[{i}] - Phonetised text: {x_phones[1::2]}") + + return {"x_orig": text, "x": x, "x_lengths": x_lengths, "x_phones": x_phones} + + +def get_texts(args): + if args.text: + texts = [args.text] + else: + with open(args.file, encoding="utf-8") as f: + texts = f.readlines() + return texts + + +def assert_required_models_available(args): + save_dir = get_user_data_dir() + if not hasattr(args, "checkpoint_path") and args.checkpoint_path is None: + model_path = args.checkpoint_path + else: + model_path = save_dir / f"{args.model}.ckpt" + assert_model_downloaded(model_path, MATCHA_URLS[args.model]) + + vocoder_path = save_dir / f"{args.vocoder}" + assert_model_downloaded(vocoder_path, VOCODER_URLS[args.vocoder]) + return {"matcha": model_path, "vocoder": vocoder_path} + + +def load_hifigan(checkpoint_path, device): + h = AttrDict(v1) + hifigan = HiFiGAN(h).to(device) + hifigan.load_state_dict(torch.load(checkpoint_path, map_location=device)["generator"]) + _ = hifigan.eval() + hifigan.remove_weight_norm() + return hifigan + + +def load_vocoder(vocoder_name, checkpoint_path, device): + print(f"[!] Loading {vocoder_name}!") + vocoder = None + if vocoder_name in ("hifigan_T2_v1", "hifigan_univ_v1"): + vocoder = load_hifigan(checkpoint_path, device) + else: + raise NotImplementedError( + f"Vocoder {vocoder_name} not implemented! define a load_<<vocoder_name>> method for it" + ) + + denoiser = Denoiser(vocoder, mode="zeros") + print(f"[+] {vocoder_name} loaded!") + return vocoder, denoiser + + +def load_matcha(model_name, checkpoint_path, device): + print(f"[!] Loading {model_name}!") + model = MatchaTTS.load_from_checkpoint(checkpoint_path, map_location=device) + _ = model.eval() + + print(f"[+] {model_name} loaded!") + return model + + +def to_waveform(mel, vocoder, denoiser=None): + audio = vocoder(mel).clamp(-1, 1) + if denoiser is not None: + audio = denoiser(audio.squeeze(), strength=0.00025).cpu().squeeze() + + return audio.cpu().squeeze() + + +def save_to_folder(filename: str, output: dict, folder: str): + folder = Path(folder) + folder.mkdir(exist_ok=True, parents=True) + plot_spectrogram_to_numpy(np.array(output["mel"].squeeze().float().cpu()), f"{filename}.png") + np.save(folder / f"{filename}", output["mel"].cpu().numpy()) + sf.write(folder / f"{filename}.wav", output["waveform"], 22050, "PCM_24") + return folder.resolve() / f"{filename}.wav" + + +def validate_args(args): + assert ( + args.text or args.file + ), "Either text or file must be provided Matcha-T(ea)TTS need sometext to whisk the waveforms." + assert args.temperature >= 0, "Sampling temperature cannot be negative" + assert args.steps > 0, "Number of ODE steps must be greater than 0" + + if args.checkpoint_path is None: + # When using pretrained models + if args.model in SINGLESPEAKER_MODEL: + args = validate_args_for_single_speaker_model(args) + + if args.model in MULTISPEAKER_MODEL: + args = validate_args_for_multispeaker_model(args) + else: + # When using a custom model + if args.vocoder != "hifigan_univ_v1": + warn_ = "[-] Using custom model checkpoint! I would suggest passing --vocoder hifigan_univ_v1, unless the custom model is trained on LJ Speech." + warnings.warn(warn_, UserWarning) + if args.speaking_rate is None: + args.speaking_rate = 1.0 + + if args.batched: + assert args.batch_size > 0, "Batch size must be greater than 0" + assert args.speaking_rate > 0, "Speaking rate must be greater than 0" + + return args + + +def validate_args_for_multispeaker_model(args): + if args.vocoder is not None: + if args.vocoder != MULTISPEAKER_MODEL[args.model]["vocoder"]: + warn_ = f"[-] Using {args.model} model! I would suggest passing --vocoder {MULTISPEAKER_MODEL[args.model]['vocoder']}" + warnings.warn(warn_, UserWarning) + else: + args.vocoder = MULTISPEAKER_MODEL[args.model]["vocoder"] + + if args.speaking_rate is None: + args.speaking_rate = MULTISPEAKER_MODEL[args.model]["speaking_rate"] + + spk_range = MULTISPEAKER_MODEL[args.model]["spk_range"] + if args.spk is not None: + assert ( + args.spk >= spk_range[0] and args.spk <= spk_range[-1] + ), f"Speaker ID must be between {spk_range} for this model." + else: + available_spk_id = MULTISPEAKER_MODEL[args.model]["spk"] + warn_ = f"[!] Speaker ID not provided! Using speaker ID {available_spk_id}" + warnings.warn(warn_, UserWarning) + args.spk = available_spk_id + + return args + + +def validate_args_for_single_speaker_model(args): + if args.vocoder is not None: + if args.vocoder != SINGLESPEAKER_MODEL[args.model]["vocoder"]: + warn_ = f"[-] Using {args.model} model! I would suggest passing --vocoder {SINGLESPEAKER_MODEL[args.model]['vocoder']}" + warnings.warn(warn_, UserWarning) + else: + args.vocoder = SINGLESPEAKER_MODEL[args.model]["vocoder"] + + if args.speaking_rate is None: + args.speaking_rate = SINGLESPEAKER_MODEL[args.model]["speaking_rate"] + + if args.spk != SINGLESPEAKER_MODEL[args.model]["spk"]: + warn_ = f"[-] Ignoring speaker id {args.spk} for {args.model}" + warnings.warn(warn_, UserWarning) + args.spk = SINGLESPEAKER_MODEL[args.model]["spk"] + + return args + + +@torch.inference_mode() +def cli(): + parser = argparse.ArgumentParser( + description=" 🍵 Matcha-TTS: A fast TTS architecture with conditional flow matching" + ) + parser.add_argument( + "--model", + type=str, + default="matcha_ljspeech", + help="Model to use", + choices=MATCHA_URLS.keys(), + ) + + parser.add_argument( + "--checkpoint_path", + type=str, + default=None, + help="Path to the custom model checkpoint", + ) + + parser.add_argument( + "--vocoder", + type=str, + default=None, + help="Vocoder to use (default: will use the one suggested with the pretrained model))", + choices=VOCODER_URLS.keys(), + ) + parser.add_argument("--text", type=str, default=None, help="Text to synthesize") + parser.add_argument("--file", type=str, default=None, help="Text file to synthesize") + parser.add_argument("--spk", type=int, default=None, help="Speaker ID") + parser.add_argument( + "--temperature", + type=float, + default=0.667, + help="Variance of the x0 noise (default: 0.667)", + ) + parser.add_argument( + "--speaking_rate", + type=float, + default=None, + help="change the speaking rate, a higher value means slower speaking rate (default: 1.0)", + ) + parser.add_argument("--steps", type=int, default=10, help="Number of ODE steps (default: 10)") + parser.add_argument("--cpu", action="store_true", help="Use CPU for inference (default: use GPU if available)") + parser.add_argument( + "--denoiser_strength", + type=float, + default=0.00025, + help="Strength of the vocoder bias denoiser (default: 0.00025)", + ) + parser.add_argument( + "--output_folder", + type=str, + default=os.getcwd(), + help="Output folder to save results (default: current dir)", + ) + parser.add_argument("--batched", action="store_true", help="Batched inference (default: False)") + parser.add_argument( + "--batch_size", type=int, default=32, help="Batch size only useful when --batched (default: 32)" + ) + + args = parser.parse_args() + + args = validate_args(args) + device = get_device(args) + print_config(args) + paths = assert_required_models_available(args) + + if args.checkpoint_path is not None: + print(f"[🍵] Loading custom model from {args.checkpoint_path}") + paths["matcha"] = args.checkpoint_path + args.model = "custom_model" + + model = load_matcha(args.model, paths["matcha"], device) + vocoder, denoiser = load_vocoder(args.vocoder, paths["vocoder"], device) + + texts = get_texts(args) + + spk = torch.tensor([args.spk], device=device, dtype=torch.long) if args.spk is not None else None + if len(texts) == 1 or not args.batched: + unbatched_synthesis(args, device, model, vocoder, denoiser, texts, spk) + else: + batched_synthesis(args, device, model, vocoder, denoiser, texts, spk) + + +class BatchedSynthesisDataset(torch.utils.data.Dataset): + def __init__(self, processed_texts): + self.processed_texts = processed_texts + + def __len__(self): + return len(self.processed_texts) + + def __getitem__(self, idx): + return self.processed_texts[idx] + + +def batched_collate_fn(batch): + x = [] + x_lengths = [] + + for b in batch: + x.append(b["x"].squeeze(0)) + x_lengths.append(b["x_lengths"]) + + x = torch.nn.utils.rnn.pad_sequence(x, batch_first=True) + x_lengths = torch.concat(x_lengths, dim=0) + return {"x": x, "x_lengths": x_lengths} + + +def batched_synthesis(args, device, model, vocoder, denoiser, texts, spk): + total_rtf = [] + total_rtf_w = [] + processed_text = [process_text(i, text, "cpu") for i, text in enumerate(texts)] + dataloader = torch.utils.data.DataLoader( + BatchedSynthesisDataset(processed_text), + batch_size=args.batch_size, + collate_fn=batched_collate_fn, + num_workers=8, + ) + for i, batch in enumerate(dataloader): + i = i + 1 + start_t = dt.datetime.now() + b = batch["x"].shape[0] + output = model.synthesise( + batch["x"].to(device), + batch["x_lengths"].to(device), + n_timesteps=args.steps, + temperature=args.temperature, + spks=spk.expand(b) if spk is not None else spk, + length_scale=args.speaking_rate, + ) + + output["waveform"] = to_waveform(output["mel"], vocoder, denoiser) + t = (dt.datetime.now() - start_t).total_seconds() + rtf_w = t * 22050 / (output["waveform"].shape[-1]) + print(f"[🍵-Batch: {i}] Matcha-TTS RTF: {output['rtf']:.4f}") + print(f"[🍵-Batch: {i}] Matcha-TTS + VOCODER RTF: {rtf_w:.4f}") + total_rtf.append(output["rtf"]) + total_rtf_w.append(rtf_w) + for j in range(output["mel"].shape[0]): + base_name = f"utterance_{j:03d}_speaker_{args.spk:03d}" if args.spk is not None else f"utterance_{j:03d}" + length = output["mel_lengths"][j] + new_dict = {"mel": output["mel"][j][:, :length], "waveform": output["waveform"][j][: length * 256]} + location = save_to_folder(base_name, new_dict, args.output_folder) + print(f"[🍵-{j}] Waveform saved: {location}") + + print("".join(["="] * 100)) + print(f"[🍵] Average Matcha-TTS RTF: {np.mean(total_rtf):.4f} ± {np.std(total_rtf)}") + print(f"[🍵] Average Matcha-TTS + VOCODER RTF: {np.mean(total_rtf_w):.4f} ± {np.std(total_rtf_w)}") + print("[🍵] Enjoy the freshly whisked 🍵 Matcha-TTS!") + + +def unbatched_synthesis(args, device, model, vocoder, denoiser, texts, spk): + total_rtf = [] + total_rtf_w = [] + for i, text in enumerate(texts): + i = i + 1 + base_name = f"utterance_{i:03d}_speaker_{args.spk:03d}" if args.spk is not None else f"utterance_{i:03d}" + + print("".join(["="] * 100)) + text = text.strip() + text_processed = process_text(i, text, device) + + print(f"[🍵] Whisking Matcha-T(ea)TS for: {i}") + start_t = dt.datetime.now() + output = model.synthesise( + text_processed["x"], + text_processed["x_lengths"], + n_timesteps=args.steps, + temperature=args.temperature, + spks=spk, + length_scale=args.speaking_rate, + ) + output["waveform"] = to_waveform(output["mel"], vocoder, denoiser) + # RTF with HiFiGAN + t = (dt.datetime.now() - start_t).total_seconds() + rtf_w = t * 22050 / (output["waveform"].shape[-1]) + print(f"[🍵-{i}] Matcha-TTS RTF: {output['rtf']:.4f}") + print(f"[🍵-{i}] Matcha-TTS + VOCODER RTF: {rtf_w:.4f}") + total_rtf.append(output["rtf"]) + total_rtf_w.append(rtf_w) + + location = save_to_folder(base_name, output, args.output_folder) + print(f"[+] Waveform saved: {location}") + + print("".join(["="] * 100)) + print(f"[🍵] Average Matcha-TTS RTF: {np.mean(total_rtf):.4f} ± {np.std(total_rtf)}") + print(f"[🍵] Average Matcha-TTS + VOCODER RTF: {np.mean(total_rtf_w):.4f} ± {np.std(total_rtf_w)}") + print("[🍵] Enjoy the freshly whisked 🍵 Matcha-TTS!") + + +def print_config(args): + print("[!] Configurations: ") + print(f"\t- Model: {args.model}") + print(f"\t- Vocoder: {args.vocoder}") + print(f"\t- Temperature: {args.temperature}") + print(f"\t- Speaking rate: {args.speaking_rate}") + print(f"\t- Number of ODE steps: {args.steps}") + print(f"\t- Speaker: {args.spk}") + + +def get_device(args): + if torch.cuda.is_available() and not args.cpu: + print("[+] GPU Available! Using GPU") + device = torch.device("cuda") + else: + print("[-] GPU not available or forced CPU run! Using CPU") + device = torch.device("cpu") + return device + + +if __name__ == "__main__": + cli() diff --git a/xinference/thirdparty/matcha/data/__init__.py b/xinference/thirdparty/matcha/data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/matcha/data/components/__init__.py b/xinference/thirdparty/matcha/data/components/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/matcha/data/text_mel_datamodule.py b/xinference/thirdparty/matcha/data/text_mel_datamodule.py new file mode 100644 index 0000000000..e10dfcb8bb --- /dev/null +++ b/xinference/thirdparty/matcha/data/text_mel_datamodule.py @@ -0,0 +1,274 @@ +import random +from pathlib import Path +from typing import Any, Dict, Optional + +import numpy as np +import torch +import torchaudio as ta +from lightning import LightningDataModule +from torch.utils.data.dataloader import DataLoader + +from matcha.text import text_to_sequence +from matcha.utils.audio import mel_spectrogram +from matcha.utils.model import fix_len_compatibility, normalize +from matcha.utils.utils import intersperse + + +def parse_filelist(filelist_path, split_char="|"): + with open(filelist_path, encoding="utf-8") as f: + filepaths_and_text = [line.strip().split(split_char) for line in f] + return filepaths_and_text + + +class TextMelDataModule(LightningDataModule): + def __init__( # pylint: disable=unused-argument + self, + name, + train_filelist_path, + valid_filelist_path, + batch_size, + num_workers, + pin_memory, + cleaners, + add_blank, + n_spks, + n_fft, + n_feats, + sample_rate, + hop_length, + win_length, + f_min, + f_max, + data_statistics, + seed, + load_durations, + ): + super().__init__() + + # this line allows to access init params with 'self.hparams' attribute + # also ensures init params will be stored in ckpt + self.save_hyperparameters(logger=False) + + def setup(self, stage: Optional[str] = None): # pylint: disable=unused-argument + """Load data. Set variables: `self.data_train`, `self.data_val`, `self.data_test`. + + This method is called by lightning with both `trainer.fit()` and `trainer.test()`, so be + careful not to execute things like random split twice! + """ + # load and split datasets only if not loaded already + + self.trainset = TextMelDataset( # pylint: disable=attribute-defined-outside-init + self.hparams.train_filelist_path, + self.hparams.n_spks, + self.hparams.cleaners, + self.hparams.add_blank, + self.hparams.n_fft, + self.hparams.n_feats, + self.hparams.sample_rate, + self.hparams.hop_length, + self.hparams.win_length, + self.hparams.f_min, + self.hparams.f_max, + self.hparams.data_statistics, + self.hparams.seed, + self.hparams.load_durations, + ) + self.validset = TextMelDataset( # pylint: disable=attribute-defined-outside-init + self.hparams.valid_filelist_path, + self.hparams.n_spks, + self.hparams.cleaners, + self.hparams.add_blank, + self.hparams.n_fft, + self.hparams.n_feats, + self.hparams.sample_rate, + self.hparams.hop_length, + self.hparams.win_length, + self.hparams.f_min, + self.hparams.f_max, + self.hparams.data_statistics, + self.hparams.seed, + self.hparams.load_durations, + ) + + def train_dataloader(self): + return DataLoader( + dataset=self.trainset, + batch_size=self.hparams.batch_size, + num_workers=self.hparams.num_workers, + pin_memory=self.hparams.pin_memory, + shuffle=True, + collate_fn=TextMelBatchCollate(self.hparams.n_spks), + ) + + def val_dataloader(self): + return DataLoader( + dataset=self.validset, + batch_size=self.hparams.batch_size, + num_workers=self.hparams.num_workers, + pin_memory=self.hparams.pin_memory, + shuffle=False, + collate_fn=TextMelBatchCollate(self.hparams.n_spks), + ) + + def teardown(self, stage: Optional[str] = None): + """Clean up after fit or test.""" + pass # pylint: disable=unnecessary-pass + + def state_dict(self): + """Extra things to save to checkpoint.""" + return {} + + def load_state_dict(self, state_dict: Dict[str, Any]): + """Things to do when loading checkpoint.""" + pass # pylint: disable=unnecessary-pass + + +class TextMelDataset(torch.utils.data.Dataset): + def __init__( + self, + filelist_path, + n_spks, + cleaners, + add_blank=True, + n_fft=1024, + n_mels=80, + sample_rate=22050, + hop_length=256, + win_length=1024, + f_min=0.0, + f_max=8000, + data_parameters=None, + seed=None, + load_durations=False, + ): + self.filepaths_and_text = parse_filelist(filelist_path) + self.n_spks = n_spks + self.cleaners = cleaners + self.add_blank = add_blank + self.n_fft = n_fft + self.n_mels = n_mels + self.sample_rate = sample_rate + self.hop_length = hop_length + self.win_length = win_length + self.f_min = f_min + self.f_max = f_max + self.load_durations = load_durations + + if data_parameters is not None: + self.data_parameters = data_parameters + else: + self.data_parameters = {"mel_mean": 0, "mel_std": 1} + random.seed(seed) + random.shuffle(self.filepaths_and_text) + + def get_datapoint(self, filepath_and_text): + if self.n_spks > 1: + filepath, spk, text = ( + filepath_and_text[0], + int(filepath_and_text[1]), + filepath_and_text[2], + ) + else: + filepath, text = filepath_and_text[0], filepath_and_text[1] + spk = None + + text, cleaned_text = self.get_text(text, add_blank=self.add_blank) + mel = self.get_mel(filepath) + + durations = self.get_durations(filepath, text) if self.load_durations else None + + return {"x": text, "y": mel, "spk": spk, "filepath": filepath, "x_text": cleaned_text, "durations": durations} + + def get_durations(self, filepath, text): + filepath = Path(filepath) + data_dir, name = filepath.parent.parent, filepath.stem + + try: + dur_loc = data_dir / "durations" / f"{name}.npy" + durs = torch.from_numpy(np.load(dur_loc).astype(int)) + + except FileNotFoundError as e: + raise FileNotFoundError( + f"Tried loading the durations but durations didn't exist at {dur_loc}, make sure you've generate the durations first using: python matcha/utils/get_durations_from_trained_model.py \n" + ) from e + + assert len(durs) == len(text), f"Length of durations {len(durs)} and text {len(text)} do not match" + + return durs + + def get_mel(self, filepath): + audio, sr = ta.load(filepath) + assert sr == self.sample_rate + mel = mel_spectrogram( + audio, + self.n_fft, + self.n_mels, + self.sample_rate, + self.hop_length, + self.win_length, + self.f_min, + self.f_max, + center=False, + ).squeeze() + mel = normalize(mel, self.data_parameters["mel_mean"], self.data_parameters["mel_std"]) + return mel + + def get_text(self, text, add_blank=True): + text_norm, cleaned_text = text_to_sequence(text, self.cleaners) + if self.add_blank: + text_norm = intersperse(text_norm, 0) + text_norm = torch.IntTensor(text_norm) + return text_norm, cleaned_text + + def __getitem__(self, index): + datapoint = self.get_datapoint(self.filepaths_and_text[index]) + return datapoint + + def __len__(self): + return len(self.filepaths_and_text) + + +class TextMelBatchCollate: + def __init__(self, n_spks): + self.n_spks = n_spks + + def __call__(self, batch): + B = len(batch) + y_max_length = max([item["y"].shape[-1] for item in batch]) + y_max_length = fix_len_compatibility(y_max_length) + x_max_length = max([item["x"].shape[-1] for item in batch]) + n_feats = batch[0]["y"].shape[-2] + + y = torch.zeros((B, n_feats, y_max_length), dtype=torch.float32) + x = torch.zeros((B, x_max_length), dtype=torch.long) + durations = torch.zeros((B, x_max_length), dtype=torch.long) + + y_lengths, x_lengths = [], [] + spks = [] + filepaths, x_texts = [], [] + for i, item in enumerate(batch): + y_, x_ = item["y"], item["x"] + y_lengths.append(y_.shape[-1]) + x_lengths.append(x_.shape[-1]) + y[i, :, : y_.shape[-1]] = y_ + x[i, : x_.shape[-1]] = x_ + spks.append(item["spk"]) + filepaths.append(item["filepath"]) + x_texts.append(item["x_text"]) + if item["durations"] is not None: + durations[i, : item["durations"].shape[-1]] = item["durations"] + + y_lengths = torch.tensor(y_lengths, dtype=torch.long) + x_lengths = torch.tensor(x_lengths, dtype=torch.long) + spks = torch.tensor(spks, dtype=torch.long) if self.n_spks > 1 else None + + return { + "x": x, + "x_lengths": x_lengths, + "y": y, + "y_lengths": y_lengths, + "spks": spks, + "filepaths": filepaths, + "x_texts": x_texts, + "durations": durations if not torch.eq(durations, 0).all() else None, + } diff --git a/xinference/thirdparty/matcha/hifigan/LICENSE b/xinference/thirdparty/matcha/hifigan/LICENSE new file mode 100644 index 0000000000..91751daed8 --- /dev/null +++ b/xinference/thirdparty/matcha/hifigan/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Jungil Kong + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/xinference/thirdparty/matcha/hifigan/README.md b/xinference/thirdparty/matcha/hifigan/README.md new file mode 100644 index 0000000000..5db2585045 --- /dev/null +++ b/xinference/thirdparty/matcha/hifigan/README.md @@ -0,0 +1,101 @@ +# HiFi-GAN: Generative Adversarial Networks for Efficient and High Fidelity Speech Synthesis + +### Jungil Kong, Jaehyeon Kim, Jaekyoung Bae + +In our [paper](https://arxiv.org/abs/2010.05646), +we proposed HiFi-GAN: a GAN-based model capable of generating high fidelity speech efficiently.<br/> +We provide our implementation and pretrained models as open source in this repository. + +**Abstract :** +Several recent work on speech synthesis have employed generative adversarial networks (GANs) to produce raw waveforms. +Although such methods improve the sampling efficiency and memory usage, +their sample quality has not yet reached that of autoregressive and flow-based generative models. +In this work, we propose HiFi-GAN, which achieves both efficient and high-fidelity speech synthesis. +As speech audio consists of sinusoidal signals with various periods, +we demonstrate that modeling periodic patterns of an audio is crucial for enhancing sample quality. +A subjective human evaluation (mean opinion score, MOS) of a single speaker dataset indicates that our proposed method +demonstrates similarity to human quality while generating 22.05 kHz high-fidelity audio 167.9 times faster than +real-time on a single V100 GPU. We further show the generality of HiFi-GAN to the mel-spectrogram inversion of unseen +speakers and end-to-end speech synthesis. Finally, a small footprint version of HiFi-GAN generates samples 13.4 times +faster than real-time on CPU with comparable quality to an autoregressive counterpart. + +Visit our [demo website](https://jik876.github.io/hifi-gan-demo/) for audio samples. + +## Pre-requisites + +1. Python >= 3.6 +2. Clone this repository. +3. Install python requirements. Please refer [requirements.txt](requirements.txt) +4. Download and extract the [LJ Speech dataset](https://keithito.com/LJ-Speech-Dataset/). + And move all wav files to `LJSpeech-1.1/wavs` + +## Training + +``` +python train.py --config config_v1.json +``` + +To train V2 or V3 Generator, replace `config_v1.json` with `config_v2.json` or `config_v3.json`.<br> +Checkpoints and copy of the configuration file are saved in `cp_hifigan` directory by default.<br> +You can change the path by adding `--checkpoint_path` option. + +Validation loss during training with V1 generator.<br> +![validation loss](./validation_loss.png) + +## Pretrained Model + +You can also use pretrained models we provide.<br/> +[Download pretrained models](https://drive.google.com/drive/folders/1-eEYTB5Av9jNql0WGBlRoi-WH2J7bp5Y?usp=sharing)<br/> +Details of each folder are as in follows: + +| Folder Name | Generator | Dataset | Fine-Tuned | +| ------------ | --------- | --------- | ------------------------------------------------------ | +| LJ_V1 | V1 | LJSpeech | No | +| LJ_V2 | V2 | LJSpeech | No | +| LJ_V3 | V3 | LJSpeech | No | +| LJ_FT_T2_V1 | V1 | LJSpeech | Yes ([Tacotron2](https://github.com/NVIDIA/tacotron2)) | +| LJ_FT_T2_V2 | V2 | LJSpeech | Yes ([Tacotron2](https://github.com/NVIDIA/tacotron2)) | +| LJ_FT_T2_V3 | V3 | LJSpeech | Yes ([Tacotron2](https://github.com/NVIDIA/tacotron2)) | +| VCTK_V1 | V1 | VCTK | No | +| VCTK_V2 | V2 | VCTK | No | +| VCTK_V3 | V3 | VCTK | No | +| UNIVERSAL_V1 | V1 | Universal | No | + +We provide the universal model with discriminator weights that can be used as a base for transfer learning to other datasets. + +## Fine-Tuning + +1. Generate mel-spectrograms in numpy format using [Tacotron2](https://github.com/NVIDIA/tacotron2) with teacher-forcing.<br/> + The file name of the generated mel-spectrogram should match the audio file and the extension should be `.npy`.<br/> + Example: + ` Audio File : LJ001-0001.wav +Mel-Spectrogram File : LJ001-0001.npy` +2. Create `ft_dataset` folder and copy the generated mel-spectrogram files into it.<br/> +3. Run the following command. + ``` + python train.py --fine_tuning True --config config_v1.json + ``` + For other command line options, please refer to the training section. + +## Inference from wav file + +1. Make `test_files` directory and copy wav files into the directory. +2. Run the following command. + ` python inference.py --checkpoint_file [generator checkpoint file path]` + Generated wav files are saved in `generated_files` by default.<br> + You can change the path by adding `--output_dir` option. + +## Inference for end-to-end speech synthesis + +1. Make `test_mel_files` directory and copy generated mel-spectrogram files into the directory.<br> + You can generate mel-spectrograms using [Tacotron2](https://github.com/NVIDIA/tacotron2), + [Glow-TTS](https://github.com/jaywalnut310/glow-tts) and so forth. +2. Run the following command. + ` python inference_e2e.py --checkpoint_file [generator checkpoint file path]` + Generated wav files are saved in `generated_files_from_mel` by default.<br> + You can change the path by adding `--output_dir` option. + +## Acknowledgements + +We referred to [WaveGlow](https://github.com/NVIDIA/waveglow), [MelGAN](https://github.com/descriptinc/melgan-neurips) +and [Tacotron2](https://github.com/NVIDIA/tacotron2) to implement this. diff --git a/xinference/thirdparty/matcha/hifigan/__init__.py b/xinference/thirdparty/matcha/hifigan/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/matcha/hifigan/config.py b/xinference/thirdparty/matcha/hifigan/config.py new file mode 100644 index 0000000000..b3abea9e15 --- /dev/null +++ b/xinference/thirdparty/matcha/hifigan/config.py @@ -0,0 +1,28 @@ +v1 = { + "resblock": "1", + "num_gpus": 0, + "batch_size": 16, + "learning_rate": 0.0004, + "adam_b1": 0.8, + "adam_b2": 0.99, + "lr_decay": 0.999, + "seed": 1234, + "upsample_rates": [8, 8, 2, 2], + "upsample_kernel_sizes": [16, 16, 4, 4], + "upsample_initial_channel": 512, + "resblock_kernel_sizes": [3, 7, 11], + "resblock_dilation_sizes": [[1, 3, 5], [1, 3, 5], [1, 3, 5]], + "resblock_initial_channel": 256, + "segment_size": 8192, + "num_mels": 80, + "num_freq": 1025, + "n_fft": 1024, + "hop_size": 256, + "win_size": 1024, + "sampling_rate": 22050, + "fmin": 0, + "fmax": 8000, + "fmax_loss": None, + "num_workers": 4, + "dist_config": {"dist_backend": "nccl", "dist_url": "tcp://localhost:54321", "world_size": 1}, +} diff --git a/xinference/thirdparty/matcha/hifigan/denoiser.py b/xinference/thirdparty/matcha/hifigan/denoiser.py new file mode 100644 index 0000000000..9fd33312a0 --- /dev/null +++ b/xinference/thirdparty/matcha/hifigan/denoiser.py @@ -0,0 +1,64 @@ +# Code modified from Rafael Valle's implementation https://github.com/NVIDIA/waveglow/blob/5bc2a53e20b3b533362f974cfa1ea0267ae1c2b1/denoiser.py + +"""Waveglow style denoiser can be used to remove the artifacts from the HiFiGAN generated audio.""" +import torch + + +class Denoiser(torch.nn.Module): + """Removes model bias from audio produced with waveglow""" + + def __init__(self, vocoder, filter_length=1024, n_overlap=4, win_length=1024, mode="zeros"): + super().__init__() + self.filter_length = filter_length + self.hop_length = int(filter_length / n_overlap) + self.win_length = win_length + + dtype, device = next(vocoder.parameters()).dtype, next(vocoder.parameters()).device + self.device = device + if mode == "zeros": + mel_input = torch.zeros((1, 80, 88), dtype=dtype, device=device) + elif mode == "normal": + mel_input = torch.randn((1, 80, 88), dtype=dtype, device=device) + else: + raise Exception(f"Mode {mode} if not supported") + + def stft_fn(audio, n_fft, hop_length, win_length, window): + spec = torch.stft( + audio, + n_fft=n_fft, + hop_length=hop_length, + win_length=win_length, + window=window, + return_complex=True, + ) + spec = torch.view_as_real(spec) + return torch.sqrt(spec.pow(2).sum(-1)), torch.atan2(spec[..., -1], spec[..., 0]) + + self.stft = lambda x: stft_fn( + audio=x, + n_fft=self.filter_length, + hop_length=self.hop_length, + win_length=self.win_length, + window=torch.hann_window(self.win_length, device=device), + ) + self.istft = lambda x, y: torch.istft( + torch.complex(x * torch.cos(y), x * torch.sin(y)), + n_fft=self.filter_length, + hop_length=self.hop_length, + win_length=self.win_length, + window=torch.hann_window(self.win_length, device=device), + ) + + with torch.no_grad(): + bias_audio = vocoder(mel_input).float().squeeze(0) + bias_spec, _ = self.stft(bias_audio) + + self.register_buffer("bias_spec", bias_spec[:, :, 0][:, :, None]) + + @torch.inference_mode() + def forward(self, audio, strength=0.0005): + audio_spec, audio_angles = self.stft(audio) + audio_spec_denoised = audio_spec - self.bias_spec.to(audio.device) * strength + audio_spec_denoised = torch.clamp(audio_spec_denoised, 0.0) + audio_denoised = self.istft(audio_spec_denoised, audio_angles) + return audio_denoised diff --git a/xinference/thirdparty/matcha/hifigan/env.py b/xinference/thirdparty/matcha/hifigan/env.py new file mode 100644 index 0000000000..9ea4f948a3 --- /dev/null +++ b/xinference/thirdparty/matcha/hifigan/env.py @@ -0,0 +1,17 @@ +""" from https://github.com/jik876/hifi-gan """ + +import os +import shutil + + +class AttrDict(dict): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.__dict__ = self + + +def build_env(config, config_name, path): + t_path = os.path.join(path, config_name) + if config != t_path: + os.makedirs(path, exist_ok=True) + shutil.copyfile(config, os.path.join(path, config_name)) diff --git a/xinference/thirdparty/matcha/hifigan/meldataset.py b/xinference/thirdparty/matcha/hifigan/meldataset.py new file mode 100644 index 0000000000..8b43ea7965 --- /dev/null +++ b/xinference/thirdparty/matcha/hifigan/meldataset.py @@ -0,0 +1,217 @@ +""" from https://github.com/jik876/hifi-gan """ + +import math +import os +import random + +import numpy as np +import torch +import torch.utils.data +from librosa.filters import mel as librosa_mel_fn +from librosa.util import normalize +from scipy.io.wavfile import read + +MAX_WAV_VALUE = 32768.0 + + +def load_wav(full_path): + sampling_rate, data = read(full_path) + return data, sampling_rate + + +def dynamic_range_compression(x, C=1, clip_val=1e-5): + return np.log(np.clip(x, a_min=clip_val, a_max=None) * C) + + +def dynamic_range_decompression(x, C=1): + return np.exp(x) / C + + +def dynamic_range_compression_torch(x, C=1, clip_val=1e-5): + return torch.log(torch.clamp(x, min=clip_val) * C) + + +def dynamic_range_decompression_torch(x, C=1): + return torch.exp(x) / C + + +def spectral_normalize_torch(magnitudes): + output = dynamic_range_compression_torch(magnitudes) + return output + + +def spectral_de_normalize_torch(magnitudes): + output = dynamic_range_decompression_torch(magnitudes) + return output + + +mel_basis = {} +hann_window = {} + + +def mel_spectrogram(y, n_fft, num_mels, sampling_rate, hop_size, win_size, fmin, fmax, center=False): + if torch.min(y) < -1.0: + print("min value is ", torch.min(y)) + if torch.max(y) > 1.0: + print("max value is ", torch.max(y)) + + global mel_basis, hann_window # pylint: disable=global-statement + if fmax not in mel_basis: + mel = librosa_mel_fn(sampling_rate, n_fft, num_mels, fmin, fmax) + mel_basis[str(fmax) + "_" + str(y.device)] = torch.from_numpy(mel).float().to(y.device) + hann_window[str(y.device)] = torch.hann_window(win_size).to(y.device) + + y = torch.nn.functional.pad( + y.unsqueeze(1), (int((n_fft - hop_size) / 2), int((n_fft - hop_size) / 2)), mode="reflect" + ) + y = y.squeeze(1) + + spec = torch.view_as_real( + torch.stft( + y, + n_fft, + hop_length=hop_size, + win_length=win_size, + window=hann_window[str(y.device)], + center=center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=True, + ) + ) + + spec = torch.sqrt(spec.pow(2).sum(-1) + (1e-9)) + + spec = torch.matmul(mel_basis[str(fmax) + "_" + str(y.device)], spec) + spec = spectral_normalize_torch(spec) + + return spec + + +def get_dataset_filelist(a): + with open(a.input_training_file, encoding="utf-8") as fi: + training_files = [ + os.path.join(a.input_wavs_dir, x.split("|")[0] + ".wav") for x in fi.read().split("\n") if len(x) > 0 + ] + + with open(a.input_validation_file, encoding="utf-8") as fi: + validation_files = [ + os.path.join(a.input_wavs_dir, x.split("|")[0] + ".wav") for x in fi.read().split("\n") if len(x) > 0 + ] + return training_files, validation_files + + +class MelDataset(torch.utils.data.Dataset): + def __init__( + self, + training_files, + segment_size, + n_fft, + num_mels, + hop_size, + win_size, + sampling_rate, + fmin, + fmax, + split=True, + shuffle=True, + n_cache_reuse=1, + device=None, + fmax_loss=None, + fine_tuning=False, + base_mels_path=None, + ): + self.audio_files = training_files + random.seed(1234) + if shuffle: + random.shuffle(self.audio_files) + self.segment_size = segment_size + self.sampling_rate = sampling_rate + self.split = split + self.n_fft = n_fft + self.num_mels = num_mels + self.hop_size = hop_size + self.win_size = win_size + self.fmin = fmin + self.fmax = fmax + self.fmax_loss = fmax_loss + self.cached_wav = None + self.n_cache_reuse = n_cache_reuse + self._cache_ref_count = 0 + self.device = device + self.fine_tuning = fine_tuning + self.base_mels_path = base_mels_path + + def __getitem__(self, index): + filename = self.audio_files[index] + if self._cache_ref_count == 0: + audio, sampling_rate = load_wav(filename) + audio = audio / MAX_WAV_VALUE + if not self.fine_tuning: + audio = normalize(audio) * 0.95 + self.cached_wav = audio + if sampling_rate != self.sampling_rate: + raise ValueError(f"{sampling_rate} SR doesn't match target {self.sampling_rate} SR") + self._cache_ref_count = self.n_cache_reuse + else: + audio = self.cached_wav + self._cache_ref_count -= 1 + + audio = torch.FloatTensor(audio) + audio = audio.unsqueeze(0) + + if not self.fine_tuning: + if self.split: + if audio.size(1) >= self.segment_size: + max_audio_start = audio.size(1) - self.segment_size + audio_start = random.randint(0, max_audio_start) + audio = audio[:, audio_start : audio_start + self.segment_size] + else: + audio = torch.nn.functional.pad(audio, (0, self.segment_size - audio.size(1)), "constant") + + mel = mel_spectrogram( + audio, + self.n_fft, + self.num_mels, + self.sampling_rate, + self.hop_size, + self.win_size, + self.fmin, + self.fmax, + center=False, + ) + else: + mel = np.load(os.path.join(self.base_mels_path, os.path.splitext(os.path.split(filename)[-1])[0] + ".npy")) + mel = torch.from_numpy(mel) + + if len(mel.shape) < 3: + mel = mel.unsqueeze(0) + + if self.split: + frames_per_seg = math.ceil(self.segment_size / self.hop_size) + + if audio.size(1) >= self.segment_size: + mel_start = random.randint(0, mel.size(2) - frames_per_seg - 1) + mel = mel[:, :, mel_start : mel_start + frames_per_seg] + audio = audio[:, mel_start * self.hop_size : (mel_start + frames_per_seg) * self.hop_size] + else: + mel = torch.nn.functional.pad(mel, (0, frames_per_seg - mel.size(2)), "constant") + audio = torch.nn.functional.pad(audio, (0, self.segment_size - audio.size(1)), "constant") + + mel_loss = mel_spectrogram( + audio, + self.n_fft, + self.num_mels, + self.sampling_rate, + self.hop_size, + self.win_size, + self.fmin, + self.fmax_loss, + center=False, + ) + + return (mel.squeeze(), audio.squeeze(0), filename, mel_loss.squeeze()) + + def __len__(self): + return len(self.audio_files) diff --git a/xinference/thirdparty/matcha/hifigan/models.py b/xinference/thirdparty/matcha/hifigan/models.py new file mode 100644 index 0000000000..d209d9a4e9 --- /dev/null +++ b/xinference/thirdparty/matcha/hifigan/models.py @@ -0,0 +1,368 @@ +""" from https://github.com/jik876/hifi-gan """ + +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import AvgPool1d, Conv1d, Conv2d, ConvTranspose1d +from torch.nn.utils import remove_weight_norm, spectral_norm, weight_norm + +from .xutils import get_padding, init_weights + +LRELU_SLOPE = 0.1 + + +class ResBlock1(torch.nn.Module): + def __init__(self, h, channels, kernel_size=3, dilation=(1, 3, 5)): + super().__init__() + self.h = h + self.convs1 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[2], + padding=get_padding(kernel_size, dilation[2]), + ) + ), + ] + ) + self.convs1.apply(init_weights) + + self.convs2 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + ] + ) + self.convs2.apply(init_weights) + + def forward(self, x): + for c1, c2 in zip(self.convs1, self.convs2): + xt = F.leaky_relu(x, LRELU_SLOPE) + xt = c1(xt) + xt = F.leaky_relu(xt, LRELU_SLOPE) + xt = c2(xt) + x = xt + x + return x + + def remove_weight_norm(self): + for l in self.convs1: + remove_weight_norm(l) + for l in self.convs2: + remove_weight_norm(l) + + +class ResBlock2(torch.nn.Module): + def __init__(self, h, channels, kernel_size=3, dilation=(1, 3)): + super().__init__() + self.h = h + self.convs = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + ] + ) + self.convs.apply(init_weights) + + def forward(self, x): + for c in self.convs: + xt = F.leaky_relu(x, LRELU_SLOPE) + xt = c(xt) + x = xt + x + return x + + def remove_weight_norm(self): + for l in self.convs: + remove_weight_norm(l) + + +class Generator(torch.nn.Module): + def __init__(self, h): + super().__init__() + self.h = h + self.num_kernels = len(h.resblock_kernel_sizes) + self.num_upsamples = len(h.upsample_rates) + self.conv_pre = weight_norm(Conv1d(80, h.upsample_initial_channel, 7, 1, padding=3)) + resblock = ResBlock1 if h.resblock == "1" else ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(h.upsample_rates, h.upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + h.upsample_initial_channel // (2**i), + h.upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = h.upsample_initial_channel // (2 ** (i + 1)) + for _, (k, d) in enumerate(zip(h.resblock_kernel_sizes, h.resblock_dilation_sizes)): + self.resblocks.append(resblock(h, ch, k, d)) + + self.conv_post = weight_norm(Conv1d(ch, 1, 7, 1, padding=3)) + self.ups.apply(init_weights) + self.conv_post.apply(init_weights) + + def forward(self, x): + x = self.conv_pre(x) + for i in range(self.num_upsamples): + x = F.leaky_relu(x, LRELU_SLOPE) + x = self.ups[i](x) + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + + return x + + def remove_weight_norm(self): + print("Removing weight norm...") + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + remove_weight_norm(self.conv_pre) + remove_weight_norm(self.conv_post) + + +class DiscriminatorP(torch.nn.Module): + def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False): + super().__init__() + self.period = period + norm_f = weight_norm if use_spectral_norm is False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f(Conv2d(1, 32, (kernel_size, 1), (stride, 1), padding=(get_padding(5, 1), 0))), + norm_f(Conv2d(32, 128, (kernel_size, 1), (stride, 1), padding=(get_padding(5, 1), 0))), + norm_f(Conv2d(128, 512, (kernel_size, 1), (stride, 1), padding=(get_padding(5, 1), 0))), + norm_f(Conv2d(512, 1024, (kernel_size, 1), (stride, 1), padding=(get_padding(5, 1), 0))), + norm_f(Conv2d(1024, 1024, (kernel_size, 1), 1, padding=(2, 0))), + ] + ) + self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0))) + + def forward(self, x): + fmap = [] + + # 1d to 2d + b, c, t = x.shape + if t % self.period != 0: # pad first + n_pad = self.period - (t % self.period) + x = F.pad(x, (0, n_pad), "reflect") + t = t + n_pad + x = x.view(b, c, t // self.period, self.period) + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self): + super().__init__() + self.discriminators = nn.ModuleList( + [ + DiscriminatorP(2), + DiscriminatorP(3), + DiscriminatorP(5), + DiscriminatorP(7), + DiscriminatorP(11), + ] + ) + + def forward(self, y, y_hat): + y_d_rs = [] + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for _, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + y_d_rs.append(y_d_r) + fmap_rs.append(fmap_r) + y_d_gs.append(y_d_g) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class DiscriminatorS(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super().__init__() + norm_f = weight_norm if use_spectral_norm is False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f(Conv1d(1, 128, 15, 1, padding=7)), + norm_f(Conv1d(128, 128, 41, 2, groups=4, padding=20)), + norm_f(Conv1d(128, 256, 41, 2, groups=16, padding=20)), + norm_f(Conv1d(256, 512, 41, 4, groups=16, padding=20)), + norm_f(Conv1d(512, 1024, 41, 4, groups=16, padding=20)), + norm_f(Conv1d(1024, 1024, 41, 1, groups=16, padding=20)), + norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), + ] + ) + self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1)) + + def forward(self, x): + fmap = [] + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap + + +class MultiScaleDiscriminator(torch.nn.Module): + def __init__(self): + super().__init__() + self.discriminators = nn.ModuleList( + [ + DiscriminatorS(use_spectral_norm=True), + DiscriminatorS(), + DiscriminatorS(), + ] + ) + self.meanpools = nn.ModuleList([AvgPool1d(4, 2, padding=2), AvgPool1d(4, 2, padding=2)]) + + def forward(self, y, y_hat): + y_d_rs = [] + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + if i != 0: + y = self.meanpools[i - 1](y) + y_hat = self.meanpools[i - 1](y_hat) + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + y_d_rs.append(y_d_r) + fmap_rs.append(fmap_r) + y_d_gs.append(y_d_g) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +def feature_loss(fmap_r, fmap_g): + loss = 0 + for dr, dg in zip(fmap_r, fmap_g): + for rl, gl in zip(dr, dg): + loss += torch.mean(torch.abs(rl - gl)) + + return loss * 2 + + +def discriminator_loss(disc_real_outputs, disc_generated_outputs): + loss = 0 + r_losses = [] + g_losses = [] + for dr, dg in zip(disc_real_outputs, disc_generated_outputs): + r_loss = torch.mean((1 - dr) ** 2) + g_loss = torch.mean(dg**2) + loss += r_loss + g_loss + r_losses.append(r_loss.item()) + g_losses.append(g_loss.item()) + + return loss, r_losses, g_losses + + +def generator_loss(disc_outputs): + loss = 0 + gen_losses = [] + for dg in disc_outputs: + l = torch.mean((1 - dg) ** 2) + gen_losses.append(l) + loss += l + + return loss, gen_losses diff --git a/xinference/thirdparty/matcha/hifigan/xutils.py b/xinference/thirdparty/matcha/hifigan/xutils.py new file mode 100644 index 0000000000..eefadcb7a1 --- /dev/null +++ b/xinference/thirdparty/matcha/hifigan/xutils.py @@ -0,0 +1,60 @@ +""" from https://github.com/jik876/hifi-gan """ + +import glob +import os + +import matplotlib +import torch +from torch.nn.utils import weight_norm + +matplotlib.use("Agg") +import matplotlib.pylab as plt + + +def plot_spectrogram(spectrogram): + fig, ax = plt.subplots(figsize=(10, 2)) + im = ax.imshow(spectrogram, aspect="auto", origin="lower", interpolation="none") + plt.colorbar(im, ax=ax) + + fig.canvas.draw() + plt.close() + + return fig + + +def init_weights(m, mean=0.0, std=0.01): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) + + +def apply_weight_norm(m): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + weight_norm(m) + + +def get_padding(kernel_size, dilation=1): + return int((kernel_size * dilation - dilation) / 2) + + +def load_checkpoint(filepath, device): + assert os.path.isfile(filepath) + print(f"Loading '{filepath}'") + checkpoint_dict = torch.load(filepath, map_location=device) + print("Complete.") + return checkpoint_dict + + +def save_checkpoint(filepath, obj): + print(f"Saving checkpoint to {filepath}") + torch.save(obj, filepath) + print("Complete.") + + +def scan_checkpoint(cp_dir, prefix): + pattern = os.path.join(cp_dir, prefix + "????????") + cp_list = glob.glob(pattern) + if len(cp_list) == 0: + return None + return sorted(cp_list)[-1] diff --git a/xinference/thirdparty/matcha/models/__init__.py b/xinference/thirdparty/matcha/models/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/matcha/models/baselightningmodule.py b/xinference/thirdparty/matcha/models/baselightningmodule.py new file mode 100644 index 0000000000..f8abe7b44f --- /dev/null +++ b/xinference/thirdparty/matcha/models/baselightningmodule.py @@ -0,0 +1,210 @@ +""" +This is a base lightning module that can be used to train a model. +The benefit of this abstraction is that all the logic outside of model definition can be reused for different models. +""" +import inspect +from abc import ABC +from typing import Any, Dict + +import torch +from lightning import LightningModule +from lightning.pytorch.utilities import grad_norm + +from matcha import utils +from matcha.utils.utils import plot_tensor + +log = utils.get_pylogger(__name__) + + +class BaseLightningClass(LightningModule, ABC): + def update_data_statistics(self, data_statistics): + if data_statistics is None: + data_statistics = { + "mel_mean": 0.0, + "mel_std": 1.0, + } + + self.register_buffer("mel_mean", torch.tensor(data_statistics["mel_mean"])) + self.register_buffer("mel_std", torch.tensor(data_statistics["mel_std"])) + + def configure_optimizers(self) -> Any: + optimizer = self.hparams.optimizer(params=self.parameters()) + if self.hparams.scheduler not in (None, {}): + scheduler_args = {} + # Manage last epoch for exponential schedulers + if "last_epoch" in inspect.signature(self.hparams.scheduler.scheduler).parameters: + if hasattr(self, "ckpt_loaded_epoch"): + current_epoch = self.ckpt_loaded_epoch - 1 + else: + current_epoch = -1 + + scheduler_args.update({"optimizer": optimizer}) + scheduler = self.hparams.scheduler.scheduler(**scheduler_args) + scheduler.last_epoch = current_epoch + return { + "optimizer": optimizer, + "lr_scheduler": { + "scheduler": scheduler, + "interval": self.hparams.scheduler.lightning_args.interval, + "frequency": self.hparams.scheduler.lightning_args.frequency, + "name": "learning_rate", + }, + } + + return {"optimizer": optimizer} + + def get_losses(self, batch): + x, x_lengths = batch["x"], batch["x_lengths"] + y, y_lengths = batch["y"], batch["y_lengths"] + spks = batch["spks"] + + dur_loss, prior_loss, diff_loss, *_ = self( + x=x, + x_lengths=x_lengths, + y=y, + y_lengths=y_lengths, + spks=spks, + out_size=self.out_size, + durations=batch["durations"], + ) + return { + "dur_loss": dur_loss, + "prior_loss": prior_loss, + "diff_loss": diff_loss, + } + + def on_load_checkpoint(self, checkpoint: Dict[str, Any]) -> None: + self.ckpt_loaded_epoch = checkpoint["epoch"] # pylint: disable=attribute-defined-outside-init + + def training_step(self, batch: Any, batch_idx: int): + loss_dict = self.get_losses(batch) + self.log( + "step", + float(self.global_step), + on_step=True, + prog_bar=True, + logger=True, + sync_dist=True, + ) + + self.log( + "sub_loss/train_dur_loss", + loss_dict["dur_loss"], + on_step=True, + on_epoch=True, + logger=True, + sync_dist=True, + ) + self.log( + "sub_loss/train_prior_loss", + loss_dict["prior_loss"], + on_step=True, + on_epoch=True, + logger=True, + sync_dist=True, + ) + self.log( + "sub_loss/train_diff_loss", + loss_dict["diff_loss"], + on_step=True, + on_epoch=True, + logger=True, + sync_dist=True, + ) + + total_loss = sum(loss_dict.values()) + self.log( + "loss/train", + total_loss, + on_step=True, + on_epoch=True, + logger=True, + prog_bar=True, + sync_dist=True, + ) + + return {"loss": total_loss, "log": loss_dict} + + def validation_step(self, batch: Any, batch_idx: int): + loss_dict = self.get_losses(batch) + self.log( + "sub_loss/val_dur_loss", + loss_dict["dur_loss"], + on_step=True, + on_epoch=True, + logger=True, + sync_dist=True, + ) + self.log( + "sub_loss/val_prior_loss", + loss_dict["prior_loss"], + on_step=True, + on_epoch=True, + logger=True, + sync_dist=True, + ) + self.log( + "sub_loss/val_diff_loss", + loss_dict["diff_loss"], + on_step=True, + on_epoch=True, + logger=True, + sync_dist=True, + ) + + total_loss = sum(loss_dict.values()) + self.log( + "loss/val", + total_loss, + on_step=True, + on_epoch=True, + logger=True, + prog_bar=True, + sync_dist=True, + ) + + return total_loss + + def on_validation_end(self) -> None: + if self.trainer.is_global_zero: + one_batch = next(iter(self.trainer.val_dataloaders)) + if self.current_epoch == 0: + log.debug("Plotting original samples") + for i in range(2): + y = one_batch["y"][i].unsqueeze(0).to(self.device) + self.logger.experiment.add_image( + f"original/{i}", + plot_tensor(y.squeeze().cpu()), + self.current_epoch, + dataformats="HWC", + ) + + log.debug("Synthesising...") + for i in range(2): + x = one_batch["x"][i].unsqueeze(0).to(self.device) + x_lengths = one_batch["x_lengths"][i].unsqueeze(0).to(self.device) + spks = one_batch["spks"][i].unsqueeze(0).to(self.device) if one_batch["spks"] is not None else None + output = self.synthesise(x[:, :x_lengths], x_lengths, n_timesteps=10, spks=spks) + y_enc, y_dec = output["encoder_outputs"], output["decoder_outputs"] + attn = output["attn"] + self.logger.experiment.add_image( + f"generated_enc/{i}", + plot_tensor(y_enc.squeeze().cpu()), + self.current_epoch, + dataformats="HWC", + ) + self.logger.experiment.add_image( + f"generated_dec/{i}", + plot_tensor(y_dec.squeeze().cpu()), + self.current_epoch, + dataformats="HWC", + ) + self.logger.experiment.add_image( + f"alignment/{i}", + plot_tensor(attn.squeeze().cpu()), + self.current_epoch, + dataformats="HWC", + ) + + def on_before_optimizer_step(self, optimizer): + self.log_dict({f"grad_norm/{k}": v for k, v in grad_norm(self, norm_type=2).items()}) diff --git a/xinference/thirdparty/matcha/models/components/__init__.py b/xinference/thirdparty/matcha/models/components/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/matcha/models/components/decoder.py b/xinference/thirdparty/matcha/models/components/decoder.py new file mode 100644 index 0000000000..1137cd7008 --- /dev/null +++ b/xinference/thirdparty/matcha/models/components/decoder.py @@ -0,0 +1,443 @@ +import math +from typing import Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from conformer import ConformerBlock +from diffusers.models.activations import get_activation +from einops import pack, rearrange, repeat + +from matcha.models.components.transformer import BasicTransformerBlock + + +class SinusoidalPosEmb(torch.nn.Module): + def __init__(self, dim): + super().__init__() + self.dim = dim + assert self.dim % 2 == 0, "SinusoidalPosEmb requires dim to be even" + + def forward(self, x, scale=1000): + if x.ndim < 1: + x = x.unsqueeze(0) + device = x.device + half_dim = self.dim // 2 + emb = math.log(10000) / (half_dim - 1) + emb = torch.exp(torch.arange(half_dim, device=device).float() * -emb) + emb = scale * x.unsqueeze(1) * emb.unsqueeze(0) + emb = torch.cat((emb.sin(), emb.cos()), dim=-1) + return emb + + +class Block1D(torch.nn.Module): + def __init__(self, dim, dim_out, groups=8): + super().__init__() + self.block = torch.nn.Sequential( + torch.nn.Conv1d(dim, dim_out, 3, padding=1), + torch.nn.GroupNorm(groups, dim_out), + nn.Mish(), + ) + + def forward(self, x, mask): + output = self.block(x * mask) + return output * mask + + +class ResnetBlock1D(torch.nn.Module): + def __init__(self, dim, dim_out, time_emb_dim, groups=8): + super().__init__() + self.mlp = torch.nn.Sequential(nn.Mish(), torch.nn.Linear(time_emb_dim, dim_out)) + + self.block1 = Block1D(dim, dim_out, groups=groups) + self.block2 = Block1D(dim_out, dim_out, groups=groups) + + self.res_conv = torch.nn.Conv1d(dim, dim_out, 1) + + def forward(self, x, mask, time_emb): + h = self.block1(x, mask) + h += self.mlp(time_emb).unsqueeze(-1) + h = self.block2(h, mask) + output = h + self.res_conv(x * mask) + return output + + +class Downsample1D(nn.Module): + def __init__(self, dim): + super().__init__() + self.conv = torch.nn.Conv1d(dim, dim, 3, 2, 1) + + def forward(self, x): + return self.conv(x) + + +class TimestepEmbedding(nn.Module): + def __init__( + self, + in_channels: int, + time_embed_dim: int, + act_fn: str = "silu", + out_dim: int = None, + post_act_fn: Optional[str] = None, + cond_proj_dim=None, + ): + super().__init__() + + self.linear_1 = nn.Linear(in_channels, time_embed_dim) + + if cond_proj_dim is not None: + self.cond_proj = nn.Linear(cond_proj_dim, in_channels, bias=False) + else: + self.cond_proj = None + + self.act = get_activation(act_fn) + + if out_dim is not None: + time_embed_dim_out = out_dim + else: + time_embed_dim_out = time_embed_dim + self.linear_2 = nn.Linear(time_embed_dim, time_embed_dim_out) + + if post_act_fn is None: + self.post_act = None + else: + self.post_act = get_activation(post_act_fn) + + def forward(self, sample, condition=None): + if condition is not None: + sample = sample + self.cond_proj(condition) + sample = self.linear_1(sample) + + if self.act is not None: + sample = self.act(sample) + + sample = self.linear_2(sample) + + if self.post_act is not None: + sample = self.post_act(sample) + return sample + + +class Upsample1D(nn.Module): + """A 1D upsampling layer with an optional convolution. + + Parameters: + channels (`int`): + number of channels in the inputs and outputs. + use_conv (`bool`, default `False`): + option to use a convolution. + use_conv_transpose (`bool`, default `False`): + option to use a convolution transpose. + out_channels (`int`, optional): + number of output channels. Defaults to `channels`. + """ + + def __init__(self, channels, use_conv=False, use_conv_transpose=True, out_channels=None, name="conv"): + super().__init__() + self.channels = channels + self.out_channels = out_channels or channels + self.use_conv = use_conv + self.use_conv_transpose = use_conv_transpose + self.name = name + + self.conv = None + if use_conv_transpose: + self.conv = nn.ConvTranspose1d(channels, self.out_channels, 4, 2, 1) + elif use_conv: + self.conv = nn.Conv1d(self.channels, self.out_channels, 3, padding=1) + + def forward(self, inputs): + assert inputs.shape[1] == self.channels + if self.use_conv_transpose: + return self.conv(inputs) + + outputs = F.interpolate(inputs, scale_factor=2.0, mode="nearest") + + if self.use_conv: + outputs = self.conv(outputs) + + return outputs + + +class ConformerWrapper(ConformerBlock): + def __init__( # pylint: disable=useless-super-delegation + self, + *, + dim, + dim_head=64, + heads=8, + ff_mult=4, + conv_expansion_factor=2, + conv_kernel_size=31, + attn_dropout=0, + ff_dropout=0, + conv_dropout=0, + conv_causal=False, + ): + super().__init__( + dim=dim, + dim_head=dim_head, + heads=heads, + ff_mult=ff_mult, + conv_expansion_factor=conv_expansion_factor, + conv_kernel_size=conv_kernel_size, + attn_dropout=attn_dropout, + ff_dropout=ff_dropout, + conv_dropout=conv_dropout, + conv_causal=conv_causal, + ) + + def forward( + self, + hidden_states, + attention_mask, + encoder_hidden_states=None, + encoder_attention_mask=None, + timestep=None, + ): + return super().forward(x=hidden_states, mask=attention_mask.bool()) + + +class Decoder(nn.Module): + def __init__( + self, + in_channels, + out_channels, + channels=(256, 256), + dropout=0.05, + attention_head_dim=64, + n_blocks=1, + num_mid_blocks=2, + num_heads=4, + act_fn="snake", + down_block_type="transformer", + mid_block_type="transformer", + up_block_type="transformer", + ): + super().__init__() + channels = tuple(channels) + self.in_channels = in_channels + self.out_channels = out_channels + + self.time_embeddings = SinusoidalPosEmb(in_channels) + time_embed_dim = channels[0] * 4 + self.time_mlp = TimestepEmbedding( + in_channels=in_channels, + time_embed_dim=time_embed_dim, + act_fn="silu", + ) + + self.down_blocks = nn.ModuleList([]) + self.mid_blocks = nn.ModuleList([]) + self.up_blocks = nn.ModuleList([]) + + output_channel = in_channels + for i in range(len(channels)): # pylint: disable=consider-using-enumerate + input_channel = output_channel + output_channel = channels[i] + is_last = i == len(channels) - 1 + resnet = ResnetBlock1D(dim=input_channel, dim_out=output_channel, time_emb_dim=time_embed_dim) + transformer_blocks = nn.ModuleList( + [ + self.get_block( + down_block_type, + output_channel, + attention_head_dim, + num_heads, + dropout, + act_fn, + ) + for _ in range(n_blocks) + ] + ) + downsample = ( + Downsample1D(output_channel) if not is_last else nn.Conv1d(output_channel, output_channel, 3, padding=1) + ) + + self.down_blocks.append(nn.ModuleList([resnet, transformer_blocks, downsample])) + + for i in range(num_mid_blocks): + input_channel = channels[-1] + out_channels = channels[-1] + + resnet = ResnetBlock1D(dim=input_channel, dim_out=output_channel, time_emb_dim=time_embed_dim) + + transformer_blocks = nn.ModuleList( + [ + self.get_block( + mid_block_type, + output_channel, + attention_head_dim, + num_heads, + dropout, + act_fn, + ) + for _ in range(n_blocks) + ] + ) + + self.mid_blocks.append(nn.ModuleList([resnet, transformer_blocks])) + + channels = channels[::-1] + (channels[0],) + for i in range(len(channels) - 1): + input_channel = channels[i] + output_channel = channels[i + 1] + is_last = i == len(channels) - 2 + + resnet = ResnetBlock1D( + dim=2 * input_channel, + dim_out=output_channel, + time_emb_dim=time_embed_dim, + ) + transformer_blocks = nn.ModuleList( + [ + self.get_block( + up_block_type, + output_channel, + attention_head_dim, + num_heads, + dropout, + act_fn, + ) + for _ in range(n_blocks) + ] + ) + upsample = ( + Upsample1D(output_channel, use_conv_transpose=True) + if not is_last + else nn.Conv1d(output_channel, output_channel, 3, padding=1) + ) + + self.up_blocks.append(nn.ModuleList([resnet, transformer_blocks, upsample])) + + self.final_block = Block1D(channels[-1], channels[-1]) + self.final_proj = nn.Conv1d(channels[-1], self.out_channels, 1) + + self.initialize_weights() + # nn.init.normal_(self.final_proj.weight) + + @staticmethod + def get_block(block_type, dim, attention_head_dim, num_heads, dropout, act_fn): + if block_type == "conformer": + block = ConformerWrapper( + dim=dim, + dim_head=attention_head_dim, + heads=num_heads, + ff_mult=1, + conv_expansion_factor=2, + ff_dropout=dropout, + attn_dropout=dropout, + conv_dropout=dropout, + conv_kernel_size=31, + ) + elif block_type == "transformer": + block = BasicTransformerBlock( + dim=dim, + num_attention_heads=num_heads, + attention_head_dim=attention_head_dim, + dropout=dropout, + activation_fn=act_fn, + ) + else: + raise ValueError(f"Unknown block type {block_type}") + + return block + + def initialize_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv1d): + nn.init.kaiming_normal_(m.weight, nonlinearity="relu") + + if m.bias is not None: + nn.init.constant_(m.bias, 0) + + elif isinstance(m, nn.GroupNorm): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + + elif isinstance(m, nn.Linear): + nn.init.kaiming_normal_(m.weight, nonlinearity="relu") + + if m.bias is not None: + nn.init.constant_(m.bias, 0) + + def forward(self, x, mask, mu, t, spks=None, cond=None): + """Forward pass of the UNet1DConditional model. + + Args: + x (torch.Tensor): shape (batch_size, in_channels, time) + mask (_type_): shape (batch_size, 1, time) + t (_type_): shape (batch_size) + spks (_type_, optional): shape: (batch_size, condition_channels). Defaults to None. + cond (_type_, optional): placeholder for future use. Defaults to None. + + Raises: + ValueError: _description_ + ValueError: _description_ + + Returns: + _type_: _description_ + """ + + t = self.time_embeddings(t) + t = self.time_mlp(t) + + x = pack([x, mu], "b * t")[0] + + if spks is not None: + spks = repeat(spks, "b c -> b c t", t=x.shape[-1]) + x = pack([x, spks], "b * t")[0] + + hiddens = [] + masks = [mask] + for resnet, transformer_blocks, downsample in self.down_blocks: + mask_down = masks[-1] + x = resnet(x, mask_down, t) + x = rearrange(x, "b c t -> b t c") + mask_down = rearrange(mask_down, "b 1 t -> b t") + for transformer_block in transformer_blocks: + x = transformer_block( + hidden_states=x, + attention_mask=mask_down, + timestep=t, + ) + x = rearrange(x, "b t c -> b c t") + mask_down = rearrange(mask_down, "b t -> b 1 t") + hiddens.append(x) # Save hidden states for skip connections + x = downsample(x * mask_down) + masks.append(mask_down[:, :, ::2]) + + masks = masks[:-1] + mask_mid = masks[-1] + + for resnet, transformer_blocks in self.mid_blocks: + x = resnet(x, mask_mid, t) + x = rearrange(x, "b c t -> b t c") + mask_mid = rearrange(mask_mid, "b 1 t -> b t") + for transformer_block in transformer_blocks: + x = transformer_block( + hidden_states=x, + attention_mask=mask_mid, + timestep=t, + ) + x = rearrange(x, "b t c -> b c t") + mask_mid = rearrange(mask_mid, "b t -> b 1 t") + + for resnet, transformer_blocks, upsample in self.up_blocks: + mask_up = masks.pop() + x = resnet(pack([x, hiddens.pop()], "b * t")[0], mask_up, t) + x = rearrange(x, "b c t -> b t c") + mask_up = rearrange(mask_up, "b 1 t -> b t") + for transformer_block in transformer_blocks: + x = transformer_block( + hidden_states=x, + attention_mask=mask_up, + timestep=t, + ) + x = rearrange(x, "b t c -> b c t") + mask_up = rearrange(mask_up, "b t -> b 1 t") + x = upsample(x * mask_up) + + x = self.final_block(x, mask_up) + output = self.final_proj(x * mask_up) + + return output * mask diff --git a/xinference/thirdparty/matcha/models/components/flow_matching.py b/xinference/thirdparty/matcha/models/components/flow_matching.py new file mode 100644 index 0000000000..5cad7431ef --- /dev/null +++ b/xinference/thirdparty/matcha/models/components/flow_matching.py @@ -0,0 +1,132 @@ +from abc import ABC + +import torch +import torch.nn.functional as F + +from matcha.models.components.decoder import Decoder +from matcha.utils.pylogger import get_pylogger + +log = get_pylogger(__name__) + + +class BASECFM(torch.nn.Module, ABC): + def __init__( + self, + n_feats, + cfm_params, + n_spks=1, + spk_emb_dim=128, + ): + super().__init__() + self.n_feats = n_feats + self.n_spks = n_spks + self.spk_emb_dim = spk_emb_dim + self.solver = cfm_params.solver + if hasattr(cfm_params, "sigma_min"): + self.sigma_min = cfm_params.sigma_min + else: + self.sigma_min = 1e-4 + + self.estimator = None + + @torch.inference_mode() + def forward(self, mu, mask, n_timesteps, temperature=1.0, spks=None, cond=None): + """Forward diffusion + + Args: + mu (torch.Tensor): output of encoder + shape: (batch_size, n_feats, mel_timesteps) + mask (torch.Tensor): output_mask + shape: (batch_size, 1, mel_timesteps) + n_timesteps (int): number of diffusion steps + temperature (float, optional): temperature for scaling noise. Defaults to 1.0. + spks (torch.Tensor, optional): speaker ids. Defaults to None. + shape: (batch_size, spk_emb_dim) + cond: Not used but kept for future purposes + + Returns: + sample: generated mel-spectrogram + shape: (batch_size, n_feats, mel_timesteps) + """ + z = torch.randn_like(mu) * temperature + t_span = torch.linspace(0, 1, n_timesteps + 1, device=mu.device) + return self.solve_euler(z, t_span=t_span, mu=mu, mask=mask, spks=spks, cond=cond) + + def solve_euler(self, x, t_span, mu, mask, spks, cond): + """ + Fixed euler solver for ODEs. + Args: + x (torch.Tensor): random noise + t_span (torch.Tensor): n_timesteps interpolated + shape: (n_timesteps + 1,) + mu (torch.Tensor): output of encoder + shape: (batch_size, n_feats, mel_timesteps) + mask (torch.Tensor): output_mask + shape: (batch_size, 1, mel_timesteps) + spks (torch.Tensor, optional): speaker ids. Defaults to None. + shape: (batch_size, spk_emb_dim) + cond: Not used but kept for future purposes + """ + t, _, dt = t_span[0], t_span[-1], t_span[1] - t_span[0] + + # I am storing this because I can later plot it by putting a debugger here and saving it to a file + # Or in future might add like a return_all_steps flag + sol = [] + + for step in range(1, len(t_span)): + dphi_dt = self.estimator(x, mask, mu, t, spks, cond) + + x = x + dt * dphi_dt + t = t + dt + sol.append(x) + if step < len(t_span) - 1: + dt = t_span[step + 1] - t + + return sol[-1] + + def compute_loss(self, x1, mask, mu, spks=None, cond=None): + """Computes diffusion loss + + Args: + x1 (torch.Tensor): Target + shape: (batch_size, n_feats, mel_timesteps) + mask (torch.Tensor): target mask + shape: (batch_size, 1, mel_timesteps) + mu (torch.Tensor): output of encoder + shape: (batch_size, n_feats, mel_timesteps) + spks (torch.Tensor, optional): speaker embedding. Defaults to None. + shape: (batch_size, spk_emb_dim) + + Returns: + loss: conditional flow matching loss + y: conditional flow + shape: (batch_size, n_feats, mel_timesteps) + """ + b, _, t = mu.shape + + # random timestep + t = torch.rand([b, 1, 1], device=mu.device, dtype=mu.dtype) + # sample noise p(x_0) + z = torch.randn_like(x1) + + y = (1 - (1 - self.sigma_min) * t) * z + t * x1 + u = x1 - (1 - self.sigma_min) * z + + loss = F.mse_loss(self.estimator(y, mask, mu, t.squeeze(), spks), u, reduction="sum") / ( + torch.sum(mask) * u.shape[1] + ) + return loss, y + + +class CFM(BASECFM): + def __init__(self, in_channels, out_channel, cfm_params, decoder_params, n_spks=1, spk_emb_dim=64): + super().__init__( + n_feats=in_channels, + cfm_params=cfm_params, + n_spks=n_spks, + spk_emb_dim=spk_emb_dim, + ) + + in_channels = in_channels + (spk_emb_dim if n_spks > 1 else 0) + # Just change the architecture of the estimator here + self.estimator = Decoder(in_channels=in_channels, out_channels=out_channel, **decoder_params) diff --git a/xinference/thirdparty/matcha/models/components/text_encoder.py b/xinference/thirdparty/matcha/models/components/text_encoder.py new file mode 100644 index 0000000000..a388d05d63 --- /dev/null +++ b/xinference/thirdparty/matcha/models/components/text_encoder.py @@ -0,0 +1,410 @@ +""" from https://github.com/jaywalnut310/glow-tts """ + +import math + +import torch +import torch.nn as nn +from einops import rearrange + +import matcha.utils as utils +from matcha.utils.model import sequence_mask + +log = utils.get_pylogger(__name__) + + +class LayerNorm(nn.Module): + def __init__(self, channels, eps=1e-4): + super().__init__() + self.channels = channels + self.eps = eps + + self.gamma = torch.nn.Parameter(torch.ones(channels)) + self.beta = torch.nn.Parameter(torch.zeros(channels)) + + def forward(self, x): + n_dims = len(x.shape) + mean = torch.mean(x, 1, keepdim=True) + variance = torch.mean((x - mean) ** 2, 1, keepdim=True) + + x = (x - mean) * torch.rsqrt(variance + self.eps) + + shape = [1, -1] + [1] * (n_dims - 2) + x = x * self.gamma.view(*shape) + self.beta.view(*shape) + return x + + +class ConvReluNorm(nn.Module): + def __init__(self, in_channels, hidden_channels, out_channels, kernel_size, n_layers, p_dropout): + super().__init__() + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + + self.conv_layers = torch.nn.ModuleList() + self.norm_layers = torch.nn.ModuleList() + self.conv_layers.append(torch.nn.Conv1d(in_channels, hidden_channels, kernel_size, padding=kernel_size // 2)) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.relu_drop = torch.nn.Sequential(torch.nn.ReLU(), torch.nn.Dropout(p_dropout)) + for _ in range(n_layers - 1): + self.conv_layers.append( + torch.nn.Conv1d(hidden_channels, hidden_channels, kernel_size, padding=kernel_size // 2) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.proj = torch.nn.Conv1d(hidden_channels, out_channels, 1) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask): + x_org = x + for i in range(self.n_layers): + x = self.conv_layers[i](x * x_mask) + x = self.norm_layers[i](x) + x = self.relu_drop(x) + x = x_org + self.proj(x) + return x * x_mask + + +class DurationPredictor(nn.Module): + def __init__(self, in_channels, filter_channels, kernel_size, p_dropout): + super().__init__() + self.in_channels = in_channels + self.filter_channels = filter_channels + self.p_dropout = p_dropout + + self.drop = torch.nn.Dropout(p_dropout) + self.conv_1 = torch.nn.Conv1d(in_channels, filter_channels, kernel_size, padding=kernel_size // 2) + self.norm_1 = LayerNorm(filter_channels) + self.conv_2 = torch.nn.Conv1d(filter_channels, filter_channels, kernel_size, padding=kernel_size // 2) + self.norm_2 = LayerNorm(filter_channels) + self.proj = torch.nn.Conv1d(filter_channels, 1, 1) + + def forward(self, x, x_mask): + x = self.conv_1(x * x_mask) + x = torch.relu(x) + x = self.norm_1(x) + x = self.drop(x) + x = self.conv_2(x * x_mask) + x = torch.relu(x) + x = self.norm_2(x) + x = self.drop(x) + x = self.proj(x * x_mask) + return x * x_mask + + +class RotaryPositionalEmbeddings(nn.Module): + """ + ## RoPE module + + Rotary encoding transforms pairs of features by rotating in the 2D plane. + That is, it organizes the $d$ features as $\frac{d}{2}$ pairs. + Each pair can be considered a coordinate in a 2D plane, and the encoding will rotate it + by an angle depending on the position of the token. + """ + + def __init__(self, d: int, base: int = 10_000): + r""" + * `d` is the number of features $d$ + * `base` is the constant used for calculating $\Theta$ + """ + super().__init__() + + self.base = base + self.d = int(d) + self.cos_cached = None + self.sin_cached = None + + def _build_cache(self, x: torch.Tensor): + r""" + Cache $\cos$ and $\sin$ values + """ + # Return if cache is already built + if self.cos_cached is not None and x.shape[0] <= self.cos_cached.shape[0]: + return + + # Get sequence length + seq_len = x.shape[0] + + # $\Theta = {\theta_i = 10000^{-\frac{2(i-1)}{d}}, i \in [1, 2, ..., \frac{d}{2}]}$ + theta = 1.0 / (self.base ** (torch.arange(0, self.d, 2).float() / self.d)).to(x.device) + + # Create position indexes `[0, 1, ..., seq_len - 1]` + seq_idx = torch.arange(seq_len, device=x.device).float().to(x.device) + + # Calculate the product of position index and $\theta_i$ + idx_theta = torch.einsum("n,d->nd", seq_idx, theta) + + # Concatenate so that for row $m$ we have + # $[m \theta_0, m \theta_1, ..., m \theta_{\frac{d}{2}}, m \theta_0, m \theta_1, ..., m \theta_{\frac{d}{2}}]$ + idx_theta2 = torch.cat([idx_theta, idx_theta], dim=1) + + # Cache them + self.cos_cached = idx_theta2.cos()[:, None, None, :] + self.sin_cached = idx_theta2.sin()[:, None, None, :] + + def _neg_half(self, x: torch.Tensor): + # $\frac{d}{2}$ + d_2 = self.d // 2 + + # Calculate $[-x^{(\frac{d}{2} + 1)}, -x^{(\frac{d}{2} + 2)}, ..., -x^{(d)}, x^{(1)}, x^{(2)}, ..., x^{(\frac{d}{2})}]$ + return torch.cat([-x[:, :, :, d_2:], x[:, :, :, :d_2]], dim=-1) + + def forward(self, x: torch.Tensor): + """ + * `x` is the Tensor at the head of a key or a query with shape `[seq_len, batch_size, n_heads, d]` + """ + # Cache $\cos$ and $\sin$ values + x = rearrange(x, "b h t d -> t b h d") + + self._build_cache(x) + + # Split the features, we can choose to apply rotary embeddings only to a partial set of features. + x_rope, x_pass = x[..., : self.d], x[..., self.d :] + + # Calculate + # $[-x^{(\frac{d}{2} + 1)}, -x^{(\frac{d}{2} + 2)}, ..., -x^{(d)}, x^{(1)}, x^{(2)}, ..., x^{(\frac{d}{2})}]$ + neg_half_x = self._neg_half(x_rope) + + x_rope = (x_rope * self.cos_cached[: x.shape[0]]) + (neg_half_x * self.sin_cached[: x.shape[0]]) + + return rearrange(torch.cat((x_rope, x_pass), dim=-1), "t b h d -> b h t d") + + +class MultiHeadAttention(nn.Module): + def __init__( + self, + channels, + out_channels, + n_heads, + heads_share=True, + p_dropout=0.0, + proximal_bias=False, + proximal_init=False, + ): + super().__init__() + assert channels % n_heads == 0 + + self.channels = channels + self.out_channels = out_channels + self.n_heads = n_heads + self.heads_share = heads_share + self.proximal_bias = proximal_bias + self.p_dropout = p_dropout + self.attn = None + + self.k_channels = channels // n_heads + self.conv_q = torch.nn.Conv1d(channels, channels, 1) + self.conv_k = torch.nn.Conv1d(channels, channels, 1) + self.conv_v = torch.nn.Conv1d(channels, channels, 1) + + # from https://nn.labml.ai/transformers/rope/index.html + self.query_rotary_pe = RotaryPositionalEmbeddings(self.k_channels * 0.5) + self.key_rotary_pe = RotaryPositionalEmbeddings(self.k_channels * 0.5) + + self.conv_o = torch.nn.Conv1d(channels, out_channels, 1) + self.drop = torch.nn.Dropout(p_dropout) + + torch.nn.init.xavier_uniform_(self.conv_q.weight) + torch.nn.init.xavier_uniform_(self.conv_k.weight) + if proximal_init: + self.conv_k.weight.data.copy_(self.conv_q.weight.data) + self.conv_k.bias.data.copy_(self.conv_q.bias.data) + torch.nn.init.xavier_uniform_(self.conv_v.weight) + + def forward(self, x, c, attn_mask=None): + q = self.conv_q(x) + k = self.conv_k(c) + v = self.conv_v(c) + + x, self.attn = self.attention(q, k, v, mask=attn_mask) + + x = self.conv_o(x) + return x + + def attention(self, query, key, value, mask=None): + b, d, t_s, t_t = (*key.size(), query.size(2)) + query = rearrange(query, "b (h c) t-> b h t c", h=self.n_heads) + key = rearrange(key, "b (h c) t-> b h t c", h=self.n_heads) + value = rearrange(value, "b (h c) t-> b h t c", h=self.n_heads) + + query = self.query_rotary_pe(query) + key = self.key_rotary_pe(key) + + scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(self.k_channels) + + if self.proximal_bias: + assert t_s == t_t, "Proximal bias is only available for self-attention." + scores = scores + self._attention_bias_proximal(t_s).to(device=scores.device, dtype=scores.dtype) + if mask is not None: + scores = scores.masked_fill(mask == 0, -1e4) + p_attn = torch.nn.functional.softmax(scores, dim=-1) + p_attn = self.drop(p_attn) + output = torch.matmul(p_attn, value) + output = output.transpose(2, 3).contiguous().view(b, d, t_t) + return output, p_attn + + @staticmethod + def _attention_bias_proximal(length): + r = torch.arange(length, dtype=torch.float32) + diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1) + return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0) + + +class FFN(nn.Module): + def __init__(self, in_channels, out_channels, filter_channels, kernel_size, p_dropout=0.0): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.p_dropout = p_dropout + + self.conv_1 = torch.nn.Conv1d(in_channels, filter_channels, kernel_size, padding=kernel_size // 2) + self.conv_2 = torch.nn.Conv1d(filter_channels, out_channels, kernel_size, padding=kernel_size // 2) + self.drop = torch.nn.Dropout(p_dropout) + + def forward(self, x, x_mask): + x = self.conv_1(x * x_mask) + x = torch.relu(x) + x = self.drop(x) + x = self.conv_2(x * x_mask) + return x * x_mask + + +class Encoder(nn.Module): + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + **kwargs, + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + + self.drop = torch.nn.Dropout(p_dropout) + self.attn_layers = torch.nn.ModuleList() + self.norm_layers_1 = torch.nn.ModuleList() + self.ffn_layers = torch.nn.ModuleList() + self.norm_layers_2 = torch.nn.ModuleList() + for _ in range(self.n_layers): + self.attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout)) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask): + attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1) + for i in range(self.n_layers): + x = x * x_mask + y = self.attn_layers[i](x, x, attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x + + +class TextEncoder(nn.Module): + def __init__( + self, + encoder_type, + encoder_params, + duration_predictor_params, + n_vocab, + n_spks=1, + spk_emb_dim=128, + ): + super().__init__() + self.encoder_type = encoder_type + self.n_vocab = n_vocab + self.n_feats = encoder_params.n_feats + self.n_channels = encoder_params.n_channels + self.spk_emb_dim = spk_emb_dim + self.n_spks = n_spks + + self.emb = torch.nn.Embedding(n_vocab, self.n_channels) + torch.nn.init.normal_(self.emb.weight, 0.0, self.n_channels**-0.5) + + if encoder_params.prenet: + self.prenet = ConvReluNorm( + self.n_channels, + self.n_channels, + self.n_channels, + kernel_size=5, + n_layers=3, + p_dropout=0.5, + ) + else: + self.prenet = lambda x, x_mask: x + + self.encoder = Encoder( + encoder_params.n_channels + (spk_emb_dim if n_spks > 1 else 0), + encoder_params.filter_channels, + encoder_params.n_heads, + encoder_params.n_layers, + encoder_params.kernel_size, + encoder_params.p_dropout, + ) + + self.proj_m = torch.nn.Conv1d(self.n_channels + (spk_emb_dim if n_spks > 1 else 0), self.n_feats, 1) + self.proj_w = DurationPredictor( + self.n_channels + (spk_emb_dim if n_spks > 1 else 0), + duration_predictor_params.filter_channels_dp, + duration_predictor_params.kernel_size, + duration_predictor_params.p_dropout, + ) + + def forward(self, x, x_lengths, spks=None): + """Run forward pass to the transformer based encoder and duration predictor + + Args: + x (torch.Tensor): text input + shape: (batch_size, max_text_length) + x_lengths (torch.Tensor): text input lengths + shape: (batch_size,) + spks (torch.Tensor, optional): speaker ids. Defaults to None. + shape: (batch_size,) + + Returns: + mu (torch.Tensor): average output of the encoder + shape: (batch_size, n_feats, max_text_length) + logw (torch.Tensor): log duration predicted by the duration predictor + shape: (batch_size, 1, max_text_length) + x_mask (torch.Tensor): mask for the text input + shape: (batch_size, 1, max_text_length) + """ + x = self.emb(x) * math.sqrt(self.n_channels) + x = torch.transpose(x, 1, -1) + x_mask = torch.unsqueeze(sequence_mask(x_lengths, x.size(2)), 1).to(x.dtype) + + x = self.prenet(x, x_mask) + if self.n_spks > 1: + x = torch.cat([x, spks.unsqueeze(-1).repeat(1, 1, x.shape[-1])], dim=1) + x = self.encoder(x, x_mask) + mu = self.proj_m(x) * x_mask + + x_dp = torch.detach(x) + logw = self.proj_w(x_dp, x_mask) + + return mu, logw, x_mask diff --git a/xinference/thirdparty/matcha/models/components/transformer.py b/xinference/thirdparty/matcha/models/components/transformer.py new file mode 100644 index 0000000000..dd1afa3aff --- /dev/null +++ b/xinference/thirdparty/matcha/models/components/transformer.py @@ -0,0 +1,316 @@ +from typing import Any, Dict, Optional + +import torch +import torch.nn as nn +from diffusers.models.attention import ( + GEGLU, + GELU, + AdaLayerNorm, + AdaLayerNormZero, + ApproximateGELU, +) +from diffusers.models.attention_processor import Attention +from diffusers.models.lora import LoRACompatibleLinear +from diffusers.utils.torch_utils import maybe_allow_in_graph + + +class SnakeBeta(nn.Module): + """ + A modified Snake function which uses separate parameters for the magnitude of the periodic components + Shape: + - Input: (B, C, T) + - Output: (B, C, T), same shape as the input + Parameters: + - alpha - trainable parameter that controls frequency + - beta - trainable parameter that controls magnitude + References: + - This activation function is a modified version based on this paper by Liu Ziyin, Tilman Hartwig, Masahito Ueda: + https://arxiv.org/abs/2006.08195 + Examples: + >>> a1 = snakebeta(256) + >>> x = torch.randn(256) + >>> x = a1(x) + """ + + def __init__(self, in_features, out_features, alpha=1.0, alpha_trainable=True, alpha_logscale=True): + """ + Initialization. + INPUT: + - in_features: shape of the input + - alpha - trainable parameter that controls frequency + - beta - trainable parameter that controls magnitude + alpha is initialized to 1 by default, higher values = higher-frequency. + beta is initialized to 1 by default, higher values = higher-magnitude. + alpha will be trained along with the rest of your model. + """ + super().__init__() + self.in_features = out_features if isinstance(out_features, list) else [out_features] + self.proj = LoRACompatibleLinear(in_features, out_features) + + # initialize alpha + self.alpha_logscale = alpha_logscale + if self.alpha_logscale: # log scale alphas initialized to zeros + self.alpha = nn.Parameter(torch.zeros(self.in_features) * alpha) + self.beta = nn.Parameter(torch.zeros(self.in_features) * alpha) + else: # linear scale alphas initialized to ones + self.alpha = nn.Parameter(torch.ones(self.in_features) * alpha) + self.beta = nn.Parameter(torch.ones(self.in_features) * alpha) + + self.alpha.requires_grad = alpha_trainable + self.beta.requires_grad = alpha_trainable + + self.no_div_by_zero = 0.000000001 + + def forward(self, x): + """ + Forward pass of the function. + Applies the function to the input elementwise. + SnakeBeta ∶= x + 1/b * sin^2 (xa) + """ + x = self.proj(x) + if self.alpha_logscale: + alpha = torch.exp(self.alpha) + beta = torch.exp(self.beta) + else: + alpha = self.alpha + beta = self.beta + + x = x + (1.0 / (beta + self.no_div_by_zero)) * torch.pow(torch.sin(x * alpha), 2) + + return x + + +class FeedForward(nn.Module): + r""" + A feed-forward layer. + + Parameters: + dim (`int`): The number of channels in the input. + dim_out (`int`, *optional*): The number of channels in the output. If not given, defaults to `dim`. + mult (`int`, *optional*, defaults to 4): The multiplier to use for the hidden dimension. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + activation_fn (`str`, *optional*, defaults to `"geglu"`): Activation function to be used in feed-forward. + final_dropout (`bool` *optional*, defaults to False): Apply a final dropout. + """ + + def __init__( + self, + dim: int, + dim_out: Optional[int] = None, + mult: int = 4, + dropout: float = 0.0, + activation_fn: str = "geglu", + final_dropout: bool = False, + ): + super().__init__() + inner_dim = int(dim * mult) + dim_out = dim_out if dim_out is not None else dim + + if activation_fn == "gelu": + act_fn = GELU(dim, inner_dim) + if activation_fn == "gelu-approximate": + act_fn = GELU(dim, inner_dim, approximate="tanh") + elif activation_fn == "geglu": + act_fn = GEGLU(dim, inner_dim) + elif activation_fn == "geglu-approximate": + act_fn = ApproximateGELU(dim, inner_dim) + elif activation_fn == "snakebeta": + act_fn = SnakeBeta(dim, inner_dim) + + self.net = nn.ModuleList([]) + # project in + self.net.append(act_fn) + # project dropout + self.net.append(nn.Dropout(dropout)) + # project out + self.net.append(LoRACompatibleLinear(inner_dim, dim_out)) + # FF as used in Vision Transformer, MLP-Mixer, etc. have a final dropout + if final_dropout: + self.net.append(nn.Dropout(dropout)) + + def forward(self, hidden_states): + for module in self.net: + hidden_states = module(hidden_states) + return hidden_states + + +@maybe_allow_in_graph +class BasicTransformerBlock(nn.Module): + r""" + A basic Transformer block. + + Parameters: + dim (`int`): The number of channels in the input and output. + num_attention_heads (`int`): The number of heads to use for multi-head attention. + attention_head_dim (`int`): The number of channels in each head. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + cross_attention_dim (`int`, *optional*): The size of the encoder_hidden_states vector for cross attention. + only_cross_attention (`bool`, *optional*): + Whether to use only cross-attention layers. In this case two cross attention layers are used. + double_self_attention (`bool`, *optional*): + Whether to use two self-attention layers. In this case no cross attention layers are used. + activation_fn (`str`, *optional*, defaults to `"geglu"`): Activation function to be used in feed-forward. + num_embeds_ada_norm (: + obj: `int`, *optional*): The number of diffusion steps used during training. See `Transformer2DModel`. + attention_bias (: + obj: `bool`, *optional*, defaults to `False`): Configure if the attentions should contain a bias parameter. + """ + + def __init__( + self, + dim: int, + num_attention_heads: int, + attention_head_dim: int, + dropout=0.0, + cross_attention_dim: Optional[int] = None, + activation_fn: str = "geglu", + num_embeds_ada_norm: Optional[int] = None, + attention_bias: bool = False, + only_cross_attention: bool = False, + double_self_attention: bool = False, + upcast_attention: bool = False, + norm_elementwise_affine: bool = True, + norm_type: str = "layer_norm", + final_dropout: bool = False, + ): + super().__init__() + self.only_cross_attention = only_cross_attention + + self.use_ada_layer_norm_zero = (num_embeds_ada_norm is not None) and norm_type == "ada_norm_zero" + self.use_ada_layer_norm = (num_embeds_ada_norm is not None) and norm_type == "ada_norm" + + if norm_type in ("ada_norm", "ada_norm_zero") and num_embeds_ada_norm is None: + raise ValueError( + f"`norm_type` is set to {norm_type}, but `num_embeds_ada_norm` is not defined. Please make sure to" + f" define `num_embeds_ada_norm` if setting `norm_type` to {norm_type}." + ) + + # Define 3 blocks. Each block has its own normalization layer. + # 1. Self-Attn + if self.use_ada_layer_norm: + self.norm1 = AdaLayerNorm(dim, num_embeds_ada_norm) + elif self.use_ada_layer_norm_zero: + self.norm1 = AdaLayerNormZero(dim, num_embeds_ada_norm) + else: + self.norm1 = nn.LayerNorm(dim, elementwise_affine=norm_elementwise_affine) + self.attn1 = Attention( + query_dim=dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + cross_attention_dim=cross_attention_dim if only_cross_attention else None, + upcast_attention=upcast_attention, + ) + + # 2. Cross-Attn + if cross_attention_dim is not None or double_self_attention: + # We currently only use AdaLayerNormZero for self attention where there will only be one attention block. + # I.e. the number of returned modulation chunks from AdaLayerZero would not make sense if returned during + # the second cross attention block. + self.norm2 = ( + AdaLayerNorm(dim, num_embeds_ada_norm) + if self.use_ada_layer_norm + else nn.LayerNorm(dim, elementwise_affine=norm_elementwise_affine) + ) + self.attn2 = Attention( + query_dim=dim, + cross_attention_dim=cross_attention_dim if not double_self_attention else None, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + upcast_attention=upcast_attention, + # scale_qk=False, # uncomment this to not to use flash attention + ) # is self-attn if encoder_hidden_states is none + else: + self.norm2 = None + self.attn2 = None + + # 3. Feed-forward + self.norm3 = nn.LayerNorm(dim, elementwise_affine=norm_elementwise_affine) + self.ff = FeedForward(dim, dropout=dropout, activation_fn=activation_fn, final_dropout=final_dropout) + + # let chunk size default to None + self._chunk_size = None + self._chunk_dim = 0 + + def set_chunk_feed_forward(self, chunk_size: Optional[int], dim: int): + # Sets chunk feed-forward + self._chunk_size = chunk_size + self._chunk_dim = dim + + def forward( + self, + hidden_states: torch.FloatTensor, + attention_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + timestep: Optional[torch.LongTensor] = None, + cross_attention_kwargs: Dict[str, Any] = None, + class_labels: Optional[torch.LongTensor] = None, + ): + # Notice that normalization is always applied before the real computation in the following blocks. + # 1. Self-Attention + if self.use_ada_layer_norm: + norm_hidden_states = self.norm1(hidden_states, timestep) + elif self.use_ada_layer_norm_zero: + norm_hidden_states, gate_msa, shift_mlp, scale_mlp, gate_mlp = self.norm1( + hidden_states, timestep, class_labels, hidden_dtype=hidden_states.dtype + ) + else: + norm_hidden_states = self.norm1(hidden_states) + + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + + attn_output = self.attn1( + norm_hidden_states, + encoder_hidden_states=encoder_hidden_states if self.only_cross_attention else None, + attention_mask=encoder_attention_mask if self.only_cross_attention else attention_mask, + **cross_attention_kwargs, + ) + if self.use_ada_layer_norm_zero: + attn_output = gate_msa.unsqueeze(1) * attn_output + hidden_states = attn_output + hidden_states + + # 2. Cross-Attention + if self.attn2 is not None: + norm_hidden_states = ( + self.norm2(hidden_states, timestep) if self.use_ada_layer_norm else self.norm2(hidden_states) + ) + + attn_output = self.attn2( + norm_hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=encoder_attention_mask, + **cross_attention_kwargs, + ) + hidden_states = attn_output + hidden_states + + # 3. Feed-forward + norm_hidden_states = self.norm3(hidden_states) + + if self.use_ada_layer_norm_zero: + norm_hidden_states = norm_hidden_states * (1 + scale_mlp[:, None]) + shift_mlp[:, None] + + if self._chunk_size is not None: + # "feed_forward_chunk_size" can be used to save memory + if norm_hidden_states.shape[self._chunk_dim] % self._chunk_size != 0: + raise ValueError( + f"`hidden_states` dimension to be chunked: {norm_hidden_states.shape[self._chunk_dim]} has to be divisible by chunk size: {self._chunk_size}. Make sure to set an appropriate `chunk_size` when calling `unet.enable_forward_chunking`." + ) + + num_chunks = norm_hidden_states.shape[self._chunk_dim] // self._chunk_size + ff_output = torch.cat( + [self.ff(hid_slice) for hid_slice in norm_hidden_states.chunk(num_chunks, dim=self._chunk_dim)], + dim=self._chunk_dim, + ) + else: + ff_output = self.ff(norm_hidden_states) + + if self.use_ada_layer_norm_zero: + ff_output = gate_mlp.unsqueeze(1) * ff_output + + hidden_states = ff_output + hidden_states + + return hidden_states diff --git a/xinference/thirdparty/matcha/models/matcha_tts.py b/xinference/thirdparty/matcha/models/matcha_tts.py new file mode 100644 index 0000000000..07f95ad2e3 --- /dev/null +++ b/xinference/thirdparty/matcha/models/matcha_tts.py @@ -0,0 +1,244 @@ +import datetime as dt +import math +import random + +import torch + +import matcha.utils.monotonic_align as monotonic_align +from matcha import utils +from matcha.models.baselightningmodule import BaseLightningClass +from matcha.models.components.flow_matching import CFM +from matcha.models.components.text_encoder import TextEncoder +from matcha.utils.model import ( + denormalize, + duration_loss, + fix_len_compatibility, + generate_path, + sequence_mask, +) + +log = utils.get_pylogger(__name__) + + +class MatchaTTS(BaseLightningClass): # 🍵 + def __init__( + self, + n_vocab, + n_spks, + spk_emb_dim, + n_feats, + encoder, + decoder, + cfm, + data_statistics, + out_size, + optimizer=None, + scheduler=None, + prior_loss=True, + use_precomputed_durations=False, + ): + super().__init__() + + self.save_hyperparameters(logger=False) + + self.n_vocab = n_vocab + self.n_spks = n_spks + self.spk_emb_dim = spk_emb_dim + self.n_feats = n_feats + self.out_size = out_size + self.prior_loss = prior_loss + self.use_precomputed_durations = use_precomputed_durations + + if n_spks > 1: + self.spk_emb = torch.nn.Embedding(n_spks, spk_emb_dim) + + self.encoder = TextEncoder( + encoder.encoder_type, + encoder.encoder_params, + encoder.duration_predictor_params, + n_vocab, + n_spks, + spk_emb_dim, + ) + + self.decoder = CFM( + in_channels=2 * encoder.encoder_params.n_feats, + out_channel=encoder.encoder_params.n_feats, + cfm_params=cfm, + decoder_params=decoder, + n_spks=n_spks, + spk_emb_dim=spk_emb_dim, + ) + + self.update_data_statistics(data_statistics) + + @torch.inference_mode() + def synthesise(self, x, x_lengths, n_timesteps, temperature=1.0, spks=None, length_scale=1.0): + """ + Generates mel-spectrogram from text. Returns: + 1. encoder outputs + 2. decoder outputs + 3. generated alignment + + Args: + x (torch.Tensor): batch of texts, converted to a tensor with phoneme embedding ids. + shape: (batch_size, max_text_length) + x_lengths (torch.Tensor): lengths of texts in batch. + shape: (batch_size,) + n_timesteps (int): number of steps to use for reverse diffusion in decoder. + temperature (float, optional): controls variance of terminal distribution. + spks (bool, optional): speaker ids. + shape: (batch_size,) + length_scale (float, optional): controls speech pace. + Increase value to slow down generated speech and vice versa. + + Returns: + dict: { + "encoder_outputs": torch.Tensor, shape: (batch_size, n_feats, max_mel_length), + # Average mel spectrogram generated by the encoder + "decoder_outputs": torch.Tensor, shape: (batch_size, n_feats, max_mel_length), + # Refined mel spectrogram improved by the CFM + "attn": torch.Tensor, shape: (batch_size, max_text_length, max_mel_length), + # Alignment map between text and mel spectrogram + "mel": torch.Tensor, shape: (batch_size, n_feats, max_mel_length), + # Denormalized mel spectrogram + "mel_lengths": torch.Tensor, shape: (batch_size,), + # Lengths of mel spectrograms + "rtf": float, + # Real-time factor + """ + # For RTF computation + t = dt.datetime.now() + + if self.n_spks > 1: + # Get speaker embedding + spks = self.spk_emb(spks.long()) + + # Get encoder_outputs `mu_x` and log-scaled token durations `logw` + mu_x, logw, x_mask = self.encoder(x, x_lengths, spks) + + w = torch.exp(logw) * x_mask + w_ceil = torch.ceil(w) * length_scale + y_lengths = torch.clamp_min(torch.sum(w_ceil, [1, 2]), 1).long() + y_max_length = y_lengths.max() + y_max_length_ = fix_len_compatibility(y_max_length) + + # Using obtained durations `w` construct alignment map `attn` + y_mask = sequence_mask(y_lengths, y_max_length_).unsqueeze(1).to(x_mask.dtype) + attn_mask = x_mask.unsqueeze(-1) * y_mask.unsqueeze(2) + attn = generate_path(w_ceil.squeeze(1), attn_mask.squeeze(1)).unsqueeze(1) + + # Align encoded text and get mu_y + mu_y = torch.matmul(attn.squeeze(1).transpose(1, 2), mu_x.transpose(1, 2)) + mu_y = mu_y.transpose(1, 2) + encoder_outputs = mu_y[:, :, :y_max_length] + + # Generate sample tracing the probability flow + decoder_outputs = self.decoder(mu_y, y_mask, n_timesteps, temperature, spks) + decoder_outputs = decoder_outputs[:, :, :y_max_length] + + t = (dt.datetime.now() - t).total_seconds() + rtf = t * 22050 / (decoder_outputs.shape[-1] * 256) + + return { + "encoder_outputs": encoder_outputs, + "decoder_outputs": decoder_outputs, + "attn": attn[:, :, :y_max_length], + "mel": denormalize(decoder_outputs, self.mel_mean, self.mel_std), + "mel_lengths": y_lengths, + "rtf": rtf, + } + + def forward(self, x, x_lengths, y, y_lengths, spks=None, out_size=None, cond=None, durations=None): + """ + Computes 3 losses: + 1. duration loss: loss between predicted token durations and those extracted by Monotinic Alignment Search (MAS). + 2. prior loss: loss between mel-spectrogram and encoder outputs. + 3. flow matching loss: loss between mel-spectrogram and decoder outputs. + + Args: + x (torch.Tensor): batch of texts, converted to a tensor with phoneme embedding ids. + shape: (batch_size, max_text_length) + x_lengths (torch.Tensor): lengths of texts in batch. + shape: (batch_size,) + y (torch.Tensor): batch of corresponding mel-spectrograms. + shape: (batch_size, n_feats, max_mel_length) + y_lengths (torch.Tensor): lengths of mel-spectrograms in batch. + shape: (batch_size,) + out_size (int, optional): length (in mel's sampling rate) of segment to cut, on which decoder will be trained. + Should be divisible by 2^{num of UNet downsamplings}. Needed to increase batch size. + spks (torch.Tensor, optional): speaker ids. + shape: (batch_size,) + """ + if self.n_spks > 1: + # Get speaker embedding + spks = self.spk_emb(spks) + + # Get encoder_outputs `mu_x` and log-scaled token durations `logw` + mu_x, logw, x_mask = self.encoder(x, x_lengths, spks) + y_max_length = y.shape[-1] + + y_mask = sequence_mask(y_lengths, y_max_length).unsqueeze(1).to(x_mask) + attn_mask = x_mask.unsqueeze(-1) * y_mask.unsqueeze(2) + + if self.use_precomputed_durations: + attn = generate_path(durations.squeeze(1), attn_mask.squeeze(1)) + else: + # Use MAS to find most likely alignment `attn` between text and mel-spectrogram + with torch.no_grad(): + const = -0.5 * math.log(2 * math.pi) * self.n_feats + factor = -0.5 * torch.ones(mu_x.shape, dtype=mu_x.dtype, device=mu_x.device) + y_square = torch.matmul(factor.transpose(1, 2), y**2) + y_mu_double = torch.matmul(2.0 * (factor * mu_x).transpose(1, 2), y) + mu_square = torch.sum(factor * (mu_x**2), 1).unsqueeze(-1) + log_prior = y_square - y_mu_double + mu_square + const + + attn = monotonic_align.maximum_path(log_prior, attn_mask.squeeze(1)) + attn = attn.detach() # b, t_text, T_mel + + # Compute loss between predicted log-scaled durations and those obtained from MAS + # refered to as prior loss in the paper + logw_ = torch.log(1e-8 + torch.sum(attn.unsqueeze(1), -1)) * x_mask + dur_loss = duration_loss(logw, logw_, x_lengths) + + # Cut a small segment of mel-spectrogram in order to increase batch size + # - "Hack" taken from Grad-TTS, in case of Grad-TTS, we cannot train batch size 32 on a 24GB GPU without it + # - Do not need this hack for Matcha-TTS, but it works with it as well + if not isinstance(out_size, type(None)): + max_offset = (y_lengths - out_size).clamp(0) + offset_ranges = list(zip([0] * max_offset.shape[0], max_offset.cpu().numpy())) + out_offset = torch.LongTensor( + [torch.tensor(random.choice(range(start, end)) if end > start else 0) for start, end in offset_ranges] + ).to(y_lengths) + attn_cut = torch.zeros(attn.shape[0], attn.shape[1], out_size, dtype=attn.dtype, device=attn.device) + y_cut = torch.zeros(y.shape[0], self.n_feats, out_size, dtype=y.dtype, device=y.device) + + y_cut_lengths = [] + for i, (y_, out_offset_) in enumerate(zip(y, out_offset)): + y_cut_length = out_size + (y_lengths[i] - out_size).clamp(None, 0) + y_cut_lengths.append(y_cut_length) + cut_lower, cut_upper = out_offset_, out_offset_ + y_cut_length + y_cut[i, :, :y_cut_length] = y_[:, cut_lower:cut_upper] + attn_cut[i, :, :y_cut_length] = attn[i, :, cut_lower:cut_upper] + + y_cut_lengths = torch.LongTensor(y_cut_lengths) + y_cut_mask = sequence_mask(y_cut_lengths).unsqueeze(1).to(y_mask) + + attn = attn_cut + y = y_cut + y_mask = y_cut_mask + + # Align encoded text with mel-spectrogram and get mu_y segment + mu_y = torch.matmul(attn.squeeze(1).transpose(1, 2), mu_x.transpose(1, 2)) + mu_y = mu_y.transpose(1, 2) + + # Compute loss of the decoder + diff_loss, _ = self.decoder.compute_loss(x1=y, mask=y_mask, mu=mu_y, spks=spks, cond=cond) + + if self.prior_loss: + prior_loss = torch.sum(0.5 * ((y - mu_y) ** 2 + math.log(2 * math.pi)) * y_mask) + prior_loss = prior_loss / (torch.sum(y_mask) * self.n_feats) + else: + prior_loss = 0 + + return dur_loss, prior_loss, diff_loss, attn diff --git a/xinference/thirdparty/matcha/onnx/__init__.py b/xinference/thirdparty/matcha/onnx/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/xinference/thirdparty/matcha/onnx/export.py b/xinference/thirdparty/matcha/onnx/export.py new file mode 100644 index 0000000000..9b79508615 --- /dev/null +++ b/xinference/thirdparty/matcha/onnx/export.py @@ -0,0 +1,181 @@ +import argparse +import random +from pathlib import Path + +import numpy as np +import torch +from lightning import LightningModule + +from matcha.cli import VOCODER_URLS, load_matcha, load_vocoder + +DEFAULT_OPSET = 15 + +SEED = 1234 +random.seed(SEED) +np.random.seed(SEED) +torch.manual_seed(SEED) +torch.cuda.manual_seed(SEED) +torch.backends.cudnn.deterministic = True +torch.backends.cudnn.benchmark = False + + +class MatchaWithVocoder(LightningModule): + def __init__(self, matcha, vocoder): + super().__init__() + self.matcha = matcha + self.vocoder = vocoder + + def forward(self, x, x_lengths, scales, spks=None): + mel, mel_lengths = self.matcha(x, x_lengths, scales, spks) + wavs = self.vocoder(mel).clamp(-1, 1) + lengths = mel_lengths * 256 + return wavs.squeeze(1), lengths + + +def get_exportable_module(matcha, vocoder, n_timesteps): + """ + Return an appropriate `LighteningModule` and output-node names + based on whether the vocoder is embedded in the final graph + """ + + def onnx_forward_func(x, x_lengths, scales, spks=None): + """ + Custom forward function for accepting + scaler parameters as tensors + """ + # Extract scaler parameters from tensors + temperature = scales[0] + length_scale = scales[1] + output = matcha.synthesise(x, x_lengths, n_timesteps, temperature, spks, length_scale) + return output["mel"], output["mel_lengths"] + + # Monkey-patch Matcha's forward function + matcha.forward = onnx_forward_func + + if vocoder is None: + model, output_names = matcha, ["mel", "mel_lengths"] + else: + model = MatchaWithVocoder(matcha, vocoder) + output_names = ["wav", "wav_lengths"] + return model, output_names + + +def get_inputs(is_multi_speaker): + """ + Create dummy inputs for tracing + """ + dummy_input_length = 50 + x = torch.randint(low=0, high=20, size=(1, dummy_input_length), dtype=torch.long) + x_lengths = torch.LongTensor([dummy_input_length]) + + # Scales + temperature = 0.667 + length_scale = 1.0 + scales = torch.Tensor([temperature, length_scale]) + + model_inputs = [x, x_lengths, scales] + input_names = [ + "x", + "x_lengths", + "scales", + ] + + if is_multi_speaker: + spks = torch.LongTensor([1]) + model_inputs.append(spks) + input_names.append("spks") + + return tuple(model_inputs), input_names + + +def main(): + parser = argparse.ArgumentParser(description="Export 🍵 Matcha-TTS to ONNX") + + parser.add_argument( + "checkpoint_path", + type=str, + help="Path to the model checkpoint", + ) + parser.add_argument("output", type=str, help="Path to output `.onnx` file") + parser.add_argument( + "--n-timesteps", type=int, default=5, help="Number of steps to use for reverse diffusion in decoder (default 5)" + ) + parser.add_argument( + "--vocoder-name", + type=str, + choices=list(VOCODER_URLS.keys()), + default=None, + help="Name of the vocoder to embed in the ONNX graph", + ) + parser.add_argument( + "--vocoder-checkpoint-path", + type=str, + default=None, + help="Vocoder checkpoint to embed in the ONNX graph for an `e2e` like experience", + ) + parser.add_argument("--opset", type=int, default=DEFAULT_OPSET, help="ONNX opset version to use (default 15") + + args = parser.parse_args() + + print(f"[🍵] Loading Matcha checkpoint from {args.checkpoint_path}") + print(f"Setting n_timesteps to {args.n_timesteps}") + + checkpoint_path = Path(args.checkpoint_path) + matcha = load_matcha(checkpoint_path.stem, checkpoint_path, "cpu") + + if args.vocoder_name or args.vocoder_checkpoint_path: + assert ( + args.vocoder_name and args.vocoder_checkpoint_path + ), "Both vocoder_name and vocoder-checkpoint are required when embedding the vocoder in the ONNX graph." + vocoder, _ = load_vocoder(args.vocoder_name, args.vocoder_checkpoint_path, "cpu") + else: + vocoder = None + + is_multi_speaker = matcha.n_spks > 1 + + dummy_input, input_names = get_inputs(is_multi_speaker) + model, output_names = get_exportable_module(matcha, vocoder, args.n_timesteps) + + # Set dynamic shape for inputs/outputs + dynamic_axes = { + "x": {0: "batch_size", 1: "time"}, + "x_lengths": {0: "batch_size"}, + } + + if vocoder is None: + dynamic_axes.update( + { + "mel": {0: "batch_size", 2: "time"}, + "mel_lengths": {0: "batch_size"}, + } + ) + else: + print("Embedding the vocoder in the ONNX graph") + dynamic_axes.update( + { + "wav": {0: "batch_size", 1: "time"}, + "wav_lengths": {0: "batch_size"}, + } + ) + + if is_multi_speaker: + dynamic_axes["spks"] = {0: "batch_size"} + + # Create the output directory (if not exists) + Path(args.output).parent.mkdir(parents=True, exist_ok=True) + + model.to_onnx( + args.output, + dummy_input, + input_names=input_names, + output_names=output_names, + dynamic_axes=dynamic_axes, + opset_version=args.opset, + export_params=True, + do_constant_folding=True, + ) + print(f"[🍵] ONNX model exported to {args.output}") + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/matcha/onnx/infer.py b/xinference/thirdparty/matcha/onnx/infer.py new file mode 100644 index 0000000000..89ca92559c --- /dev/null +++ b/xinference/thirdparty/matcha/onnx/infer.py @@ -0,0 +1,168 @@ +import argparse +import os +import warnings +from pathlib import Path +from time import perf_counter + +import numpy as np +import onnxruntime as ort +import soundfile as sf +import torch + +from matcha.cli import plot_spectrogram_to_numpy, process_text + + +def validate_args(args): + assert ( + args.text or args.file + ), "Either text or file must be provided Matcha-T(ea)TTS need sometext to whisk the waveforms." + assert args.temperature >= 0, "Sampling temperature cannot be negative" + assert args.speaking_rate >= 0, "Speaking rate must be greater than 0" + return args + + +def write_wavs(model, inputs, output_dir, external_vocoder=None): + if external_vocoder is None: + print("The provided model has the vocoder embedded in the graph.\nGenerating waveform directly") + t0 = perf_counter() + wavs, wav_lengths = model.run(None, inputs) + infer_secs = perf_counter() - t0 + mel_infer_secs = vocoder_infer_secs = None + else: + print("[🍵] Generating mel using Matcha") + mel_t0 = perf_counter() + mels, mel_lengths = model.run(None, inputs) + mel_infer_secs = perf_counter() - mel_t0 + print("Generating waveform from mel using external vocoder") + vocoder_inputs = {external_vocoder.get_inputs()[0].name: mels} + vocoder_t0 = perf_counter() + wavs = external_vocoder.run(None, vocoder_inputs)[0] + vocoder_infer_secs = perf_counter() - vocoder_t0 + wavs = wavs.squeeze(1) + wav_lengths = mel_lengths * 256 + infer_secs = mel_infer_secs + vocoder_infer_secs + + output_dir = Path(output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + for i, (wav, wav_length) in enumerate(zip(wavs, wav_lengths)): + output_filename = output_dir.joinpath(f"output_{i + 1}.wav") + audio = wav[:wav_length] + print(f"Writing audio to {output_filename}") + sf.write(output_filename, audio, 22050, "PCM_24") + + wav_secs = wav_lengths.sum() / 22050 + print(f"Inference seconds: {infer_secs}") + print(f"Generated wav seconds: {wav_secs}") + rtf = infer_secs / wav_secs + if mel_infer_secs is not None: + mel_rtf = mel_infer_secs / wav_secs + print(f"Matcha RTF: {mel_rtf}") + if vocoder_infer_secs is not None: + vocoder_rtf = vocoder_infer_secs / wav_secs + print(f"Vocoder RTF: {vocoder_rtf}") + print(f"Overall RTF: {rtf}") + + +def write_mels(model, inputs, output_dir): + t0 = perf_counter() + mels, mel_lengths = model.run(None, inputs) + infer_secs = perf_counter() - t0 + + output_dir = Path(output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + for i, mel in enumerate(mels): + output_stem = output_dir.joinpath(f"output_{i + 1}") + plot_spectrogram_to_numpy(mel.squeeze(), output_stem.with_suffix(".png")) + np.save(output_stem.with_suffix(".numpy"), mel) + + wav_secs = (mel_lengths * 256).sum() / 22050 + print(f"Inference seconds: {infer_secs}") + print(f"Generated wav seconds: {wav_secs}") + rtf = infer_secs / wav_secs + print(f"RTF: {rtf}") + + +def main(): + parser = argparse.ArgumentParser( + description=" 🍵 Matcha-TTS: A fast TTS architecture with conditional flow matching" + ) + parser.add_argument( + "model", + type=str, + help="ONNX model to use", + ) + parser.add_argument("--vocoder", type=str, default=None, help="Vocoder to use (defaults to None)") + parser.add_argument("--text", type=str, default=None, help="Text to synthesize") + parser.add_argument("--file", type=str, default=None, help="Text file to synthesize") + parser.add_argument("--spk", type=int, default=None, help="Speaker ID") + parser.add_argument( + "--temperature", + type=float, + default=0.667, + help="Variance of the x0 noise (default: 0.667)", + ) + parser.add_argument( + "--speaking-rate", + type=float, + default=1.0, + help="change the speaking rate, a higher value means slower speaking rate (default: 1.0)", + ) + parser.add_argument("--gpu", action="store_true", help="Use CPU for inference (default: use GPU if available)") + parser.add_argument( + "--output-dir", + type=str, + default=os.getcwd(), + help="Output folder to save results (default: current dir)", + ) + + args = parser.parse_args() + args = validate_args(args) + + if args.gpu: + providers = ["GPUExecutionProvider"] + else: + providers = ["CPUExecutionProvider"] + model = ort.InferenceSession(args.model, providers=providers) + + model_inputs = model.get_inputs() + model_outputs = list(model.get_outputs()) + + if args.text: + text_lines = args.text.splitlines() + else: + with open(args.file, encoding="utf-8") as file: + text_lines = file.read().splitlines() + + processed_lines = [process_text(0, line, "cpu") for line in text_lines] + x = [line["x"].squeeze() for line in processed_lines] + # Pad + x = torch.nn.utils.rnn.pad_sequence(x, batch_first=True) + x = x.detach().cpu().numpy() + x_lengths = np.array([line["x_lengths"].item() for line in processed_lines], dtype=np.int64) + inputs = { + "x": x, + "x_lengths": x_lengths, + "scales": np.array([args.temperature, args.speaking_rate], dtype=np.float32), + } + is_multi_speaker = len(model_inputs) == 4 + if is_multi_speaker: + if args.spk is None: + args.spk = 0 + warn = "[!] Speaker ID not provided! Using speaker ID 0" + warnings.warn(warn, UserWarning) + inputs["spks"] = np.repeat(args.spk, x.shape[0]).astype(np.int64) + + has_vocoder_embedded = model_outputs[0].name == "wav" + if has_vocoder_embedded: + write_wavs(model, inputs, args.output_dir) + elif args.vocoder: + external_vocoder = ort.InferenceSession(args.vocoder, providers=providers) + write_wavs(model, inputs, args.output_dir, external_vocoder=external_vocoder) + else: + warn = "[!] A vocoder is not embedded in the graph nor an external vocoder is provided. The mel output will be written as numpy arrays to `*.npy` files in the output directory" + warnings.warn(warn, UserWarning) + write_mels(model, inputs, args.output_dir) + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/matcha/text/__init__.py b/xinference/thirdparty/matcha/text/__init__.py new file mode 100644 index 0000000000..8c75d6b571 --- /dev/null +++ b/xinference/thirdparty/matcha/text/__init__.py @@ -0,0 +1,53 @@ +""" from https://github.com/keithito/tacotron """ +from matcha.text import cleaners +from matcha.text.symbols import symbols + +# Mappings from symbol to numeric ID and vice versa: +_symbol_to_id = {s: i for i, s in enumerate(symbols)} +_id_to_symbol = {i: s for i, s in enumerate(symbols)} # pylint: disable=unnecessary-comprehension + + +def text_to_sequence(text, cleaner_names): + """Converts a string of text to a sequence of IDs corresponding to the symbols in the text. + Args: + text: string to convert to a sequence + cleaner_names: names of the cleaner functions to run the text through + Returns: + List of integers corresponding to the symbols in the text + """ + sequence = [] + + clean_text = _clean_text(text, cleaner_names) + for symbol in clean_text: + symbol_id = _symbol_to_id[symbol] + sequence += [symbol_id] + return sequence, clean_text + + +def cleaned_text_to_sequence(cleaned_text): + """Converts a string of text to a sequence of IDs corresponding to the symbols in the text. + Args: + text: string to convert to a sequence + Returns: + List of integers corresponding to the symbols in the text + """ + sequence = [_symbol_to_id[symbol] for symbol in cleaned_text] + return sequence + + +def sequence_to_text(sequence): + """Converts a sequence of IDs back to a string""" + result = "" + for symbol_id in sequence: + s = _id_to_symbol[symbol_id] + result += s + return result + + +def _clean_text(text, cleaner_names): + for name in cleaner_names: + cleaner = getattr(cleaners, name) + if not cleaner: + raise Exception("Unknown cleaner: %s" % name) + text = cleaner(text) + return text diff --git a/xinference/thirdparty/matcha/text/cleaners.py b/xinference/thirdparty/matcha/text/cleaners.py new file mode 100644 index 0000000000..36776e3552 --- /dev/null +++ b/xinference/thirdparty/matcha/text/cleaners.py @@ -0,0 +1,121 @@ +""" from https://github.com/keithito/tacotron + +Cleaners are transformations that run over the input text at both training and eval time. + +Cleaners can be selected by passing a comma-delimited list of cleaner names as the "cleaners" +hyperparameter. Some cleaners are English-specific. You'll typically want to use: + 1. "english_cleaners" for English text + 2. "transliteration_cleaners" for non-English text that can be transliterated to ASCII using + the Unidecode library (https://pypi.python.org/pypi/Unidecode) + 3. "basic_cleaners" if you do not want to transliterate (in this case, you should also update + the symbols in symbols.py to match your data). +""" + +import logging +import re + +import phonemizer +from unidecode import unidecode + +# To avoid excessive logging we set the log level of the phonemizer package to Critical +critical_logger = logging.getLogger("phonemizer") +critical_logger.setLevel(logging.CRITICAL) + +# Intializing the phonemizer globally significantly reduces the speed +# now the phonemizer is not initialising at every call +# Might be less flexible, but it is much-much faster +global_phonemizer = phonemizer.backend.EspeakBackend( + language="en-us", + preserve_punctuation=True, + with_stress=True, + language_switch="remove-flags", + logger=critical_logger, +) + + +# Regular expression matching whitespace: +_whitespace_re = re.compile(r"\s+") + +# List of (regular expression, replacement) pairs for abbreviations: +_abbreviations = [ + (re.compile("\\b%s\\." % x[0], re.IGNORECASE), x[1]) + for x in [ + ("mrs", "misess"), + ("mr", "mister"), + ("dr", "doctor"), + ("st", "saint"), + ("co", "company"), + ("jr", "junior"), + ("maj", "major"), + ("gen", "general"), + ("drs", "doctors"), + ("rev", "reverend"), + ("lt", "lieutenant"), + ("hon", "honorable"), + ("sgt", "sergeant"), + ("capt", "captain"), + ("esq", "esquire"), + ("ltd", "limited"), + ("col", "colonel"), + ("ft", "fort"), + ] +] + + +def expand_abbreviations(text): + for regex, replacement in _abbreviations: + text = re.sub(regex, replacement, text) + return text + + +def lowercase(text): + return text.lower() + + +def collapse_whitespace(text): + return re.sub(_whitespace_re, " ", text) + + +def convert_to_ascii(text): + return unidecode(text) + + +def basic_cleaners(text): + """Basic pipeline that lowercases and collapses whitespace without transliteration.""" + text = lowercase(text) + text = collapse_whitespace(text) + return text + + +def transliteration_cleaners(text): + """Pipeline for non-English text that transliterates to ASCII.""" + text = convert_to_ascii(text) + text = lowercase(text) + text = collapse_whitespace(text) + return text + + +def english_cleaners2(text): + """Pipeline for English text, including abbreviation expansion. + punctuation + stress""" + text = convert_to_ascii(text) + text = lowercase(text) + text = expand_abbreviations(text) + phonemes = global_phonemizer.phonemize([text], strip=True, njobs=1)[0] + phonemes = collapse_whitespace(phonemes) + return phonemes + + +# I am removing this due to incompatibility with several version of python +# However, if you want to use it, you can uncomment it +# and install piper-phonemize with the following command: +# pip install piper-phonemize + +# import piper_phonemize +# def english_cleaners_piper(text): +# """Pipeline for English text, including abbreviation expansion. + punctuation + stress""" +# text = convert_to_ascii(text) +# text = lowercase(text) +# text = expand_abbreviations(text) +# phonemes = "".join(piper_phonemize.phonemize_espeak(text=text, voice="en-US")[0]) +# phonemes = collapse_whitespace(phonemes) +# return phonemes diff --git a/xinference/thirdparty/matcha/text/numbers.py b/xinference/thirdparty/matcha/text/numbers.py new file mode 100644 index 0000000000..f99a8686dc --- /dev/null +++ b/xinference/thirdparty/matcha/text/numbers.py @@ -0,0 +1,71 @@ +""" from https://github.com/keithito/tacotron """ + +import re + +import inflect + +_inflect = inflect.engine() +_comma_number_re = re.compile(r"([0-9][0-9\,]+[0-9])") +_decimal_number_re = re.compile(r"([0-9]+\.[0-9]+)") +_pounds_re = re.compile(r"£([0-9\,]*[0-9]+)") +_dollars_re = re.compile(r"\$([0-9\.\,]*[0-9]+)") +_ordinal_re = re.compile(r"[0-9]+(st|nd|rd|th)") +_number_re = re.compile(r"[0-9]+") + + +def _remove_commas(m): + return m.group(1).replace(",", "") + + +def _expand_decimal_point(m): + return m.group(1).replace(".", " point ") + + +def _expand_dollars(m): + match = m.group(1) + parts = match.split(".") + if len(parts) > 2: + return match + " dollars" + dollars = int(parts[0]) if parts[0] else 0 + cents = int(parts[1]) if len(parts) > 1 and parts[1] else 0 + if dollars and cents: + dollar_unit = "dollar" if dollars == 1 else "dollars" + cent_unit = "cent" if cents == 1 else "cents" + return f"{dollars} {dollar_unit}, {cents} {cent_unit}" + elif dollars: + dollar_unit = "dollar" if dollars == 1 else "dollars" + return f"{dollars} {dollar_unit}" + elif cents: + cent_unit = "cent" if cents == 1 else "cents" + return f"{cents} {cent_unit}" + else: + return "zero dollars" + + +def _expand_ordinal(m): + return _inflect.number_to_words(m.group(0)) + + +def _expand_number(m): + num = int(m.group(0)) + if num > 1000 and num < 3000: + if num == 2000: + return "two thousand" + elif num > 2000 and num < 2010: + return "two thousand " + _inflect.number_to_words(num % 100) + elif num % 100 == 0: + return _inflect.number_to_words(num // 100) + " hundred" + else: + return _inflect.number_to_words(num, andword="", zero="oh", group=2).replace(", ", " ") + else: + return _inflect.number_to_words(num, andword="") + + +def normalize_numbers(text): + text = re.sub(_comma_number_re, _remove_commas, text) + text = re.sub(_pounds_re, r"\1 pounds", text) + text = re.sub(_dollars_re, _expand_dollars, text) + text = re.sub(_decimal_number_re, _expand_decimal_point, text) + text = re.sub(_ordinal_re, _expand_ordinal, text) + text = re.sub(_number_re, _expand_number, text) + return text diff --git a/xinference/thirdparty/matcha/text/symbols.py b/xinference/thirdparty/matcha/text/symbols.py new file mode 100644 index 0000000000..7018df549a --- /dev/null +++ b/xinference/thirdparty/matcha/text/symbols.py @@ -0,0 +1,17 @@ +""" from https://github.com/keithito/tacotron + +Defines the set of symbols used in text input to the model. +""" +_pad = "_" +_punctuation = ';:,.!?¡¿—…"«»“” ' +_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +_letters_ipa = ( + "ɑɐɒæɓʙβɔɕçɗɖðʤəɘɚɛɜɝɞɟʄɡɠɢʛɦɧħɥʜɨɪʝɭɬɫɮʟɱɯɰŋɳɲɴøɵɸθœɶʘɹɺɾɻʀʁɽʂʃʈʧʉʊʋⱱʌɣɤʍχʎʏʑʐʒʔʡʕʢǀǁǂǃˈˌːˑʼʴʰʱʲʷˠˤ˞↓↑→↗↘'̩'ᵻ" +) + + +# Export all symbols: +symbols = [_pad] + list(_punctuation) + list(_letters) + list(_letters_ipa) + +# Special symbol ids +SPACE_ID = symbols.index(" ") diff --git a/xinference/thirdparty/matcha/train.py b/xinference/thirdparty/matcha/train.py new file mode 100644 index 0000000000..d1d64c6c44 --- /dev/null +++ b/xinference/thirdparty/matcha/train.py @@ -0,0 +1,122 @@ +from typing import Any, Dict, List, Optional, Tuple + +import hydra +import lightning as L +import rootutils +from lightning import Callback, LightningDataModule, LightningModule, Trainer +from lightning.pytorch.loggers import Logger +from omegaconf import DictConfig + +from matcha import utils + +rootutils.setup_root(__file__, indicator=".project-root", pythonpath=True) +# ------------------------------------------------------------------------------------ # +# the setup_root above is equivalent to: +# - adding project root dir to PYTHONPATH +# (so you don't need to force user to install project as a package) +# (necessary before importing any local modules e.g. `from src import utils`) +# - setting up PROJECT_ROOT environment variable +# (which is used as a base for paths in "configs/paths/default.yaml") +# (this way all filepaths are the same no matter where you run the code) +# - loading environment variables from ".env" in root dir +# +# you can remove it if you: +# 1. either install project as a package or move entry files to project root dir +# 2. set `root_dir` to "." in "configs/paths/default.yaml" +# +# more info: https://github.com/ashleve/rootutils +# ------------------------------------------------------------------------------------ # + + +log = utils.get_pylogger(__name__) + + +@utils.task_wrapper +def train(cfg: DictConfig) -> Tuple[Dict[str, Any], Dict[str, Any]]: + """Trains the model. Can additionally evaluate on a testset, using best weights obtained during + training. + + This method is wrapped in optional @task_wrapper decorator, that controls the behavior during + failure. Useful for multiruns, saving info about the crash, etc. + + :param cfg: A DictConfig configuration composed by Hydra. + :return: A tuple with metrics and dict with all instantiated objects. + """ + # set seed for random number generators in pytorch, numpy and python.random + if cfg.get("seed"): + L.seed_everything(cfg.seed, workers=True) + + log.info(f"Instantiating datamodule <{cfg.data._target_}>") # pylint: disable=protected-access + datamodule: LightningDataModule = hydra.utils.instantiate(cfg.data) + + log.info(f"Instantiating model <{cfg.model._target_}>") # pylint: disable=protected-access + model: LightningModule = hydra.utils.instantiate(cfg.model) + + log.info("Instantiating callbacks...") + callbacks: List[Callback] = utils.instantiate_callbacks(cfg.get("callbacks")) + + log.info("Instantiating loggers...") + logger: List[Logger] = utils.instantiate_loggers(cfg.get("logger")) + + log.info(f"Instantiating trainer <{cfg.trainer._target_}>") # pylint: disable=protected-access + trainer: Trainer = hydra.utils.instantiate(cfg.trainer, callbacks=callbacks, logger=logger) + + object_dict = { + "cfg": cfg, + "datamodule": datamodule, + "model": model, + "callbacks": callbacks, + "logger": logger, + "trainer": trainer, + } + + if logger: + log.info("Logging hyperparameters!") + utils.log_hyperparameters(object_dict) + + if cfg.get("train"): + log.info("Starting training!") + trainer.fit(model=model, datamodule=datamodule, ckpt_path=cfg.get("ckpt_path")) + + train_metrics = trainer.callback_metrics + + if cfg.get("test"): + log.info("Starting testing!") + ckpt_path = trainer.checkpoint_callback.best_model_path + if ckpt_path == "": + log.warning("Best ckpt not found! Using current weights for testing...") + ckpt_path = None + trainer.test(model=model, datamodule=datamodule, ckpt_path=ckpt_path) + log.info(f"Best ckpt path: {ckpt_path}") + + test_metrics = trainer.callback_metrics + + # merge train and test metrics + metric_dict = {**train_metrics, **test_metrics} + + return metric_dict, object_dict + + +@hydra.main(version_base="1.3", config_path="../configs", config_name="train.yaml") +def main(cfg: DictConfig) -> Optional[float]: + """Main entry point for training. + + :param cfg: DictConfig configuration composed by Hydra. + :return: Optional[float] with optimized metric value. + """ + # apply extra utilities + # (e.g. ask for tags if none are provided in cfg, print cfg tree, etc.) + utils.extras(cfg) + + # train the model + metric_dict, _ = train(cfg) + + # safely retrieve metric value for hydra-based hyperparameter optimization + metric_value = utils.get_metric_value(metric_dict=metric_dict, metric_name=cfg.get("optimized_metric")) + + # return optimized metric + return metric_value + + +if __name__ == "__main__": + main() # pylint: disable=no-value-for-parameter diff --git a/xinference/thirdparty/matcha/utils/__init__.py b/xinference/thirdparty/matcha/utils/__init__.py new file mode 100644 index 0000000000..074db64611 --- /dev/null +++ b/xinference/thirdparty/matcha/utils/__init__.py @@ -0,0 +1,5 @@ +from matcha.utils.instantiators import instantiate_callbacks, instantiate_loggers +from matcha.utils.logging_utils import log_hyperparameters +from matcha.utils.pylogger import get_pylogger +from matcha.utils.rich_utils import enforce_tags, print_config_tree +from matcha.utils.utils import extras, get_metric_value, task_wrapper diff --git a/xinference/thirdparty/matcha/utils/audio.py b/xinference/thirdparty/matcha/utils/audio.py new file mode 100644 index 0000000000..0bcd74df47 --- /dev/null +++ b/xinference/thirdparty/matcha/utils/audio.py @@ -0,0 +1,82 @@ +import numpy as np +import torch +import torch.utils.data +from librosa.filters import mel as librosa_mel_fn +from scipy.io.wavfile import read + +MAX_WAV_VALUE = 32768.0 + + +def load_wav(full_path): + sampling_rate, data = read(full_path) + return data, sampling_rate + + +def dynamic_range_compression(x, C=1, clip_val=1e-5): + return np.log(np.clip(x, a_min=clip_val, a_max=None) * C) + + +def dynamic_range_decompression(x, C=1): + return np.exp(x) / C + + +def dynamic_range_compression_torch(x, C=1, clip_val=1e-5): + return torch.log(torch.clamp(x, min=clip_val) * C) + + +def dynamic_range_decompression_torch(x, C=1): + return torch.exp(x) / C + + +def spectral_normalize_torch(magnitudes): + output = dynamic_range_compression_torch(magnitudes) + return output + + +def spectral_de_normalize_torch(magnitudes): + output = dynamic_range_decompression_torch(magnitudes) + return output + + +mel_basis = {} +hann_window = {} + + +def mel_spectrogram(y, n_fft, num_mels, sampling_rate, hop_size, win_size, fmin, fmax, center=False): + if torch.min(y) < -1.0: + print("min value is ", torch.min(y)) + if torch.max(y) > 1.0: + print("max value is ", torch.max(y)) + + global mel_basis, hann_window # pylint: disable=global-statement + if f"{str(fmax)}_{str(y.device)}" not in mel_basis: + mel = librosa_mel_fn(sr=sampling_rate, n_fft=n_fft, n_mels=num_mels, fmin=fmin, fmax=fmax) + mel_basis[str(fmax) + "_" + str(y.device)] = torch.from_numpy(mel).float().to(y.device) + hann_window[str(y.device)] = torch.hann_window(win_size).to(y.device) + + y = torch.nn.functional.pad( + y.unsqueeze(1), (int((n_fft - hop_size) / 2), int((n_fft - hop_size) / 2)), mode="reflect" + ) + y = y.squeeze(1) + + spec = torch.view_as_real( + torch.stft( + y, + n_fft, + hop_length=hop_size, + win_length=win_size, + window=hann_window[str(y.device)], + center=center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=True, + ) + ) + + spec = torch.sqrt(spec.pow(2).sum(-1) + (1e-9)) + + spec = torch.matmul(mel_basis[str(fmax) + "_" + str(y.device)], spec) + spec = spectral_normalize_torch(spec) + + return spec diff --git a/xinference/thirdparty/matcha/utils/generate_data_statistics.py b/xinference/thirdparty/matcha/utils/generate_data_statistics.py new file mode 100644 index 0000000000..49ed3c1b07 --- /dev/null +++ b/xinference/thirdparty/matcha/utils/generate_data_statistics.py @@ -0,0 +1,112 @@ +r""" +The file creates a pickle file where the values needed for loading of dataset is stored and the model can load it +when needed. + +Parameters from hparam.py will be used +""" +import argparse +import json +import os +import sys +from pathlib import Path + +import rootutils +import torch +from hydra import compose, initialize +from omegaconf import open_dict +from tqdm.auto import tqdm + +from matcha.data.text_mel_datamodule import TextMelDataModule +from matcha.utils.logging_utils import pylogger + +log = pylogger.get_pylogger(__name__) + + +def compute_data_statistics(data_loader: torch.utils.data.DataLoader, out_channels: int): + """Generate data mean and standard deviation helpful in data normalisation + + Args: + data_loader (torch.utils.data.Dataloader): _description_ + out_channels (int): mel spectrogram channels + """ + total_mel_sum = 0 + total_mel_sq_sum = 0 + total_mel_len = 0 + + for batch in tqdm(data_loader, leave=False): + mels = batch["y"] + mel_lengths = batch["y_lengths"] + + total_mel_len += torch.sum(mel_lengths) + total_mel_sum += torch.sum(mels) + total_mel_sq_sum += torch.sum(torch.pow(mels, 2)) + + data_mean = total_mel_sum / (total_mel_len * out_channels) + data_std = torch.sqrt((total_mel_sq_sum / (total_mel_len * out_channels)) - torch.pow(data_mean, 2)) + + return {"mel_mean": data_mean.item(), "mel_std": data_std.item()} + + +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument( + "-i", + "--input-config", + type=str, + default="vctk.yaml", + help="The name of the yaml config file under configs/data", + ) + + parser.add_argument( + "-b", + "--batch-size", + type=int, + default="256", + help="Can have increased batch size for faster computation", + ) + + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + required=False, + help="force overwrite the file", + ) + args = parser.parse_args() + output_file = Path(args.input_config).with_suffix(".json") + + if os.path.exists(output_file) and not args.force: + print("File already exists. Use -f to force overwrite") + sys.exit(1) + + with initialize(version_base="1.3", config_path="../../configs/data"): + cfg = compose(config_name=args.input_config, return_hydra_config=True, overrides=[]) + + root_path = rootutils.find_root(search_from=__file__, indicator=".project-root") + + with open_dict(cfg): + del cfg["hydra"] + del cfg["_target_"] + cfg["data_statistics"] = None + cfg["seed"] = 1234 + cfg["batch_size"] = args.batch_size + cfg["train_filelist_path"] = str(os.path.join(root_path, cfg["train_filelist_path"])) + cfg["valid_filelist_path"] = str(os.path.join(root_path, cfg["valid_filelist_path"])) + cfg["load_durations"] = False + + text_mel_datamodule = TextMelDataModule(**cfg) + text_mel_datamodule.setup() + data_loader = text_mel_datamodule.train_dataloader() + log.info("Dataloader loaded! Now computing stats...") + params = compute_data_statistics(data_loader, cfg["n_feats"]) + print(params) + json.dump( + params, + open(output_file, "w"), + ) + + +if __name__ == "__main__": + main() diff --git a/xinference/thirdparty/matcha/utils/get_durations_from_trained_model.py b/xinference/thirdparty/matcha/utils/get_durations_from_trained_model.py new file mode 100644 index 0000000000..0fe2f35c42 --- /dev/null +++ b/xinference/thirdparty/matcha/utils/get_durations_from_trained_model.py @@ -0,0 +1,195 @@ +r""" +The file creates a pickle file where the values needed for loading of dataset is stored and the model can load it +when needed. + +Parameters from hparam.py will be used +""" +import argparse +import json +import os +import sys +from pathlib import Path + +import lightning +import numpy as np +import rootutils +import torch +from hydra import compose, initialize +from omegaconf import open_dict +from torch import nn +from tqdm.auto import tqdm + +from matcha.cli import get_device +from matcha.data.text_mel_datamodule import TextMelDataModule +from matcha.models.matcha_tts import MatchaTTS +from matcha.utils.logging_utils import pylogger +from matcha.utils.utils import get_phoneme_durations + +log = pylogger.get_pylogger(__name__) + + +def save_durations_to_folder( + attn: torch.Tensor, x_length: int, y_length: int, filepath: str, output_folder: Path, text: str +): + durations = attn.squeeze().sum(1)[:x_length].numpy() + durations_json = get_phoneme_durations(durations, text) + output = output_folder / Path(filepath).name.replace(".wav", ".npy") + with open(output.with_suffix(".json"), "w", encoding="utf-8") as f: + json.dump(durations_json, f, indent=4, ensure_ascii=False) + + np.save(output, durations) + + +@torch.inference_mode() +def compute_durations(data_loader: torch.utils.data.DataLoader, model: nn.Module, device: torch.device, output_folder): + """Generate durations from the model for each datapoint and save it in a folder + + Args: + data_loader (torch.utils.data.DataLoader): Dataloader + model (nn.Module): MatchaTTS model + device (torch.device): GPU or CPU + """ + + for batch in tqdm(data_loader, desc="🍵 Computing durations 🍵:"): + x, x_lengths = batch["x"], batch["x_lengths"] + y, y_lengths = batch["y"], batch["y_lengths"] + spks = batch["spks"] + x = x.to(device) + y = y.to(device) + x_lengths = x_lengths.to(device) + y_lengths = y_lengths.to(device) + spks = spks.to(device) if spks is not None else None + + _, _, _, attn = model( + x=x, + x_lengths=x_lengths, + y=y, + y_lengths=y_lengths, + spks=spks, + ) + attn = attn.cpu() + for i in range(attn.shape[0]): + save_durations_to_folder( + attn[i], + x_lengths[i].item(), + y_lengths[i].item(), + batch["filepaths"][i], + output_folder, + batch["x_texts"][i], + ) + + +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument( + "-i", + "--input-config", + type=str, + default="ljspeech.yaml", + help="The name of the yaml config file under configs/data", + ) + + parser.add_argument( + "-b", + "--batch-size", + type=int, + default="32", + help="Can have increased batch size for faster computation", + ) + + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + required=False, + help="force overwrite the file", + ) + parser.add_argument( + "-c", + "--checkpoint_path", + type=str, + required=True, + help="Path to the checkpoint file to load the model from", + ) + + parser.add_argument( + "-o", + "--output-folder", + type=str, + default=None, + help="Output folder to save the data statistics", + ) + + parser.add_argument( + "--cpu", action="store_true", help="Use CPU for inference, not recommended (default: use GPU if available)" + ) + + args = parser.parse_args() + + with initialize(version_base="1.3", config_path="../../configs/data"): + cfg = compose(config_name=args.input_config, return_hydra_config=True, overrides=[]) + + root_path = rootutils.find_root(search_from=__file__, indicator=".project-root") + + with open_dict(cfg): + del cfg["hydra"] + del cfg["_target_"] + cfg["seed"] = 1234 + cfg["batch_size"] = args.batch_size + cfg["train_filelist_path"] = str(os.path.join(root_path, cfg["train_filelist_path"])) + cfg["valid_filelist_path"] = str(os.path.join(root_path, cfg["valid_filelist_path"])) + cfg["load_durations"] = False + + if args.output_folder is not None: + output_folder = Path(args.output_folder) + else: + output_folder = Path(cfg["train_filelist_path"]).parent / "durations" + + print(f"Output folder set to: {output_folder}") + + if os.path.exists(output_folder) and not args.force: + print("Folder already exists. Use -f to force overwrite") + sys.exit(1) + + output_folder.mkdir(parents=True, exist_ok=True) + + print(f"Preprocessing: {cfg['name']} from training filelist: {cfg['train_filelist_path']}") + print("Loading model...") + device = get_device(args) + model = MatchaTTS.load_from_checkpoint(args.checkpoint_path, map_location=device) + + text_mel_datamodule = TextMelDataModule(**cfg) + text_mel_datamodule.setup() + try: + print("Computing stats for training set if exists...") + train_dataloader = text_mel_datamodule.train_dataloader() + compute_durations(train_dataloader, model, device, output_folder) + except lightning.fabric.utilities.exceptions.MisconfigurationException: + print("No training set found") + + try: + print("Computing stats for validation set if exists...") + val_dataloader = text_mel_datamodule.val_dataloader() + compute_durations(val_dataloader, model, device, output_folder) + except lightning.fabric.utilities.exceptions.MisconfigurationException: + print("No validation set found") + + try: + print("Computing stats for test set if exists...") + test_dataloader = text_mel_datamodule.test_dataloader() + compute_durations(test_dataloader, model, device, output_folder) + except lightning.fabric.utilities.exceptions.MisconfigurationException: + print("No test set found") + + print(f"[+] Done! Data statistics saved to: {output_folder}") + + +if __name__ == "__main__": + # Helps with generating durations for the dataset to train other architectures + # that cannot learn to align due to limited size of dataset + # Example usage: + # python python matcha/utils/get_durations_from_trained_model.py -i ljspeech.yaml -c pretrained_model + # This will create a folder in data/processed_data/durations/ljspeech with the durations + main() diff --git a/xinference/thirdparty/matcha/utils/instantiators.py b/xinference/thirdparty/matcha/utils/instantiators.py new file mode 100644 index 0000000000..5547b4ed61 --- /dev/null +++ b/xinference/thirdparty/matcha/utils/instantiators.py @@ -0,0 +1,56 @@ +from typing import List + +import hydra +from lightning import Callback +from lightning.pytorch.loggers import Logger +from omegaconf import DictConfig + +from matcha.utils import pylogger + +log = pylogger.get_pylogger(__name__) + + +def instantiate_callbacks(callbacks_cfg: DictConfig) -> List[Callback]: + """Instantiates callbacks from config. + + :param callbacks_cfg: A DictConfig object containing callback configurations. + :return: A list of instantiated callbacks. + """ + callbacks: List[Callback] = [] + + if not callbacks_cfg: + log.warning("No callback configs found! Skipping..") + return callbacks + + if not isinstance(callbacks_cfg, DictConfig): + raise TypeError("Callbacks config must be a DictConfig!") + + for _, cb_conf in callbacks_cfg.items(): + if isinstance(cb_conf, DictConfig) and "_target_" in cb_conf: + log.info(f"Instantiating callback <{cb_conf._target_}>") # pylint: disable=protected-access + callbacks.append(hydra.utils.instantiate(cb_conf)) + + return callbacks + + +def instantiate_loggers(logger_cfg: DictConfig) -> List[Logger]: + """Instantiates loggers from config. + + :param logger_cfg: A DictConfig object containing logger configurations. + :return: A list of instantiated loggers. + """ + logger: List[Logger] = [] + + if not logger_cfg: + log.warning("No logger configs found! Skipping...") + return logger + + if not isinstance(logger_cfg, DictConfig): + raise TypeError("Logger config must be a DictConfig!") + + for _, lg_conf in logger_cfg.items(): + if isinstance(lg_conf, DictConfig) and "_target_" in lg_conf: + log.info(f"Instantiating logger <{lg_conf._target_}>") # pylint: disable=protected-access + logger.append(hydra.utils.instantiate(lg_conf)) + + return logger diff --git a/xinference/thirdparty/matcha/utils/logging_utils.py b/xinference/thirdparty/matcha/utils/logging_utils.py new file mode 100644 index 0000000000..1a12d1ddaf --- /dev/null +++ b/xinference/thirdparty/matcha/utils/logging_utils.py @@ -0,0 +1,53 @@ +from typing import Any, Dict + +from lightning.pytorch.utilities import rank_zero_only +from omegaconf import OmegaConf + +from matcha.utils import pylogger + +log = pylogger.get_pylogger(__name__) + + +@rank_zero_only +def log_hyperparameters(object_dict: Dict[str, Any]) -> None: + """Controls which config parts are saved by Lightning loggers. + + Additionally saves: + - Number of model parameters + + :param object_dict: A dictionary containing the following objects: + - `"cfg"`: A DictConfig object containing the main config. + - `"model"`: The Lightning model. + - `"trainer"`: The Lightning trainer. + """ + hparams = {} + + cfg = OmegaConf.to_container(object_dict["cfg"]) + model = object_dict["model"] + trainer = object_dict["trainer"] + + if not trainer.logger: + log.warning("Logger not found! Skipping hyperparameter logging...") + return + + hparams["model"] = cfg["model"] + + # save number of model parameters + hparams["model/params/total"] = sum(p.numel() for p in model.parameters()) + hparams["model/params/trainable"] = sum(p.numel() for p in model.parameters() if p.requires_grad) + hparams["model/params/non_trainable"] = sum(p.numel() for p in model.parameters() if not p.requires_grad) + + hparams["data"] = cfg["data"] + hparams["trainer"] = cfg["trainer"] + + hparams["callbacks"] = cfg.get("callbacks") + hparams["extras"] = cfg.get("extras") + + hparams["task_name"] = cfg.get("task_name") + hparams["tags"] = cfg.get("tags") + hparams["ckpt_path"] = cfg.get("ckpt_path") + hparams["seed"] = cfg.get("seed") + + # send hparams to all loggers + for logger in trainer.loggers: + logger.log_hyperparams(hparams) diff --git a/xinference/thirdparty/matcha/utils/model.py b/xinference/thirdparty/matcha/utils/model.py new file mode 100644 index 0000000000..869cc6092f --- /dev/null +++ b/xinference/thirdparty/matcha/utils/model.py @@ -0,0 +1,90 @@ +""" from https://github.com/jaywalnut310/glow-tts """ + +import numpy as np +import torch + + +def sequence_mask(length, max_length=None): + if max_length is None: + max_length = length.max() + x = torch.arange(max_length, dtype=length.dtype, device=length.device) + return x.unsqueeze(0) < length.unsqueeze(1) + + +def fix_len_compatibility(length, num_downsamplings_in_unet=2): + factor = torch.scalar_tensor(2).pow(num_downsamplings_in_unet) + length = (length / factor).ceil() * factor + if not torch.onnx.is_in_onnx_export(): + return length.int().item() + else: + return length + + +def convert_pad_shape(pad_shape): + inverted_shape = pad_shape[::-1] + pad_shape = [item for sublist in inverted_shape for item in sublist] + return pad_shape + + +def generate_path(duration, mask): + device = duration.device + + b, t_x, t_y = mask.shape + cum_duration = torch.cumsum(duration, 1) + path = torch.zeros(b, t_x, t_y, dtype=mask.dtype).to(device=device) + + cum_duration_flat = cum_duration.view(b * t_x) + path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype) + path = path.view(b, t_x, t_y) + path = path - torch.nn.functional.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1] + path = path * mask + return path + + +def duration_loss(logw, logw_, lengths): + loss = torch.sum((logw - logw_) ** 2) / torch.sum(lengths) + return loss + + +def normalize(data, mu, std): + if not isinstance(mu, (float, int)): + if isinstance(mu, list): + mu = torch.tensor(mu, dtype=data.dtype, device=data.device) + elif isinstance(mu, torch.Tensor): + mu = mu.to(data.device) + elif isinstance(mu, np.ndarray): + mu = torch.from_numpy(mu).to(data.device) + mu = mu.unsqueeze(-1) + + if not isinstance(std, (float, int)): + if isinstance(std, list): + std = torch.tensor(std, dtype=data.dtype, device=data.device) + elif isinstance(std, torch.Tensor): + std = std.to(data.device) + elif isinstance(std, np.ndarray): + std = torch.from_numpy(std).to(data.device) + std = std.unsqueeze(-1) + + return (data - mu) / std + + +def denormalize(data, mu, std): + if not isinstance(mu, float): + if isinstance(mu, list): + mu = torch.tensor(mu, dtype=data.dtype, device=data.device) + elif isinstance(mu, torch.Tensor): + mu = mu.to(data.device) + elif isinstance(mu, np.ndarray): + mu = torch.from_numpy(mu).to(data.device) + mu = mu.unsqueeze(-1) + + if not isinstance(std, float): + if isinstance(std, list): + std = torch.tensor(std, dtype=data.dtype, device=data.device) + elif isinstance(std, torch.Tensor): + std = std.to(data.device) + elif isinstance(std, np.ndarray): + std = torch.from_numpy(std).to(data.device) + std = std.unsqueeze(-1) + + return data * std + mu diff --git a/xinference/thirdparty/matcha/utils/monotonic_align/__init__.py b/xinference/thirdparty/matcha/utils/monotonic_align/__init__.py new file mode 100644 index 0000000000..eee6e0d47c --- /dev/null +++ b/xinference/thirdparty/matcha/utils/monotonic_align/__init__.py @@ -0,0 +1,22 @@ +import numpy as np +import torch + +from matcha.utils.monotonic_align.core import maximum_path_c + + +def maximum_path(value, mask): + """Cython optimised version. + value: [b, t_x, t_y] + mask: [b, t_x, t_y] + """ + value = value * mask + device = value.device + dtype = value.dtype + value = value.data.cpu().numpy().astype(np.float32) + path = np.zeros_like(value).astype(np.int32) + mask = mask.data.cpu().numpy() + + t_x_max = mask.sum(1)[:, 0].astype(np.int32) + t_y_max = mask.sum(2)[:, 0].astype(np.int32) + maximum_path_c(path, value, t_x_max, t_y_max) + return torch.from_numpy(path).to(device=device, dtype=dtype) diff --git a/xinference/thirdparty/matcha/utils/monotonic_align/core.pyx b/xinference/thirdparty/matcha/utils/monotonic_align/core.pyx new file mode 100644 index 0000000000..091fcc3a50 --- /dev/null +++ b/xinference/thirdparty/matcha/utils/monotonic_align/core.pyx @@ -0,0 +1,47 @@ +import numpy as np + +cimport cython +cimport numpy as np + +from cython.parallel import prange + + +@cython.boundscheck(False) +@cython.wraparound(False) +cdef void maximum_path_each(int[:,::1] path, float[:,::1] value, int t_x, int t_y, float max_neg_val) nogil: + cdef int x + cdef int y + cdef float v_prev + cdef float v_cur + cdef float tmp + cdef int index = t_x - 1 + + for y in range(t_y): + for x in range(max(0, t_x + y - t_y), min(t_x, y + 1)): + if x == y: + v_cur = max_neg_val + else: + v_cur = value[x, y-1] + if x == 0: + if y == 0: + v_prev = 0. + else: + v_prev = max_neg_val + else: + v_prev = value[x-1, y-1] + value[x, y] = max(v_cur, v_prev) + value[x, y] + + for y in range(t_y - 1, -1, -1): + path[index, y] = 1 + if index != 0 and (index == y or value[index, y-1] < value[index-1, y-1]): + index = index - 1 + + +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef void maximum_path_c(int[:,:,::1] paths, float[:,:,::1] values, int[::1] t_xs, int[::1] t_ys, float max_neg_val=-1e9) nogil: + cdef int b = values.shape[0] + + cdef int i + for i in prange(b, nogil=True): + maximum_path_each(paths[i], values[i], t_xs[i], t_ys[i], max_neg_val) diff --git a/xinference/thirdparty/matcha/utils/monotonic_align/setup.py b/xinference/thirdparty/matcha/utils/monotonic_align/setup.py new file mode 100644 index 0000000000..f22bc6a35a --- /dev/null +++ b/xinference/thirdparty/matcha/utils/monotonic_align/setup.py @@ -0,0 +1,7 @@ +# from distutils.core import setup +# from Cython.Build import cythonize +# import numpy + +# setup(name='monotonic_align', +# ext_modules=cythonize("core.pyx"), +# include_dirs=[numpy.get_include()]) diff --git a/xinference/thirdparty/matcha/utils/pylogger.py b/xinference/thirdparty/matcha/utils/pylogger.py new file mode 100644 index 0000000000..6160067802 --- /dev/null +++ b/xinference/thirdparty/matcha/utils/pylogger.py @@ -0,0 +1,21 @@ +import logging + +from lightning.pytorch.utilities import rank_zero_only + + +def get_pylogger(name: str = __name__) -> logging.Logger: + """Initializes a multi-GPU-friendly python command line logger. + + :param name: The name of the logger, defaults to ``__name__``. + + :return: A logger object. + """ + logger = logging.getLogger(name) + + # this ensures all logging levels get marked with the rank zero decorator + # otherwise logs would get multiplied for each GPU process in multi-GPU setup + logging_levels = ("debug", "info", "warning", "error", "exception", "fatal", "critical") + for level in logging_levels: + setattr(logger, level, rank_zero_only(getattr(logger, level))) + + return logger diff --git a/xinference/thirdparty/matcha/utils/rich_utils.py b/xinference/thirdparty/matcha/utils/rich_utils.py new file mode 100644 index 0000000000..f602f6e935 --- /dev/null +++ b/xinference/thirdparty/matcha/utils/rich_utils.py @@ -0,0 +1,101 @@ +from pathlib import Path +from typing import Sequence + +import rich +import rich.syntax +import rich.tree +from hydra.core.hydra_config import HydraConfig +from lightning.pytorch.utilities import rank_zero_only +from omegaconf import DictConfig, OmegaConf, open_dict +from rich.prompt import Prompt + +from matcha.utils import pylogger + +log = pylogger.get_pylogger(__name__) + + +@rank_zero_only +def print_config_tree( + cfg: DictConfig, + print_order: Sequence[str] = ( + "data", + "model", + "callbacks", + "logger", + "trainer", + "paths", + "extras", + ), + resolve: bool = False, + save_to_file: bool = False, +) -> None: + """Prints the contents of a DictConfig as a tree structure using the Rich library. + + :param cfg: A DictConfig composed by Hydra. + :param print_order: Determines in what order config components are printed. Default is ``("data", "model", + "callbacks", "logger", "trainer", "paths", "extras")``. + :param resolve: Whether to resolve reference fields of DictConfig. Default is ``False``. + :param save_to_file: Whether to export config to the hydra output folder. Default is ``False``. + """ + style = "dim" + tree = rich.tree.Tree("CONFIG", style=style, guide_style=style) + + queue = [] + + # add fields from `print_order` to queue + for field in print_order: + _ = ( + queue.append(field) + if field in cfg + else log.warning(f"Field '{field}' not found in config. Skipping '{field}' config printing...") + ) + + # add all the other fields to queue (not specified in `print_order`) + for field in cfg: + if field not in queue: + queue.append(field) + + # generate config tree from queue + for field in queue: + branch = tree.add(field, style=style, guide_style=style) + + config_group = cfg[field] + if isinstance(config_group, DictConfig): + branch_content = OmegaConf.to_yaml(config_group, resolve=resolve) + else: + branch_content = str(config_group) + + branch.add(rich.syntax.Syntax(branch_content, "yaml")) + + # print config tree + rich.print(tree) + + # save config tree to file + if save_to_file: + with open(Path(cfg.paths.output_dir, "config_tree.log"), "w") as file: + rich.print(tree, file=file) + + +@rank_zero_only +def enforce_tags(cfg: DictConfig, save_to_file: bool = False) -> None: + """Prompts user to input tags from command line if no tags are provided in config. + + :param cfg: A DictConfig composed by Hydra. + :param save_to_file: Whether to export tags to the hydra output folder. Default is ``False``. + """ + if not cfg.get("tags"): + if "id" in HydraConfig().cfg.hydra.job: + raise ValueError("Specify tags before launching a multirun!") + + log.warning("No tags provided in config. Prompting user to input tags...") + tags = Prompt.ask("Enter a list of comma separated tags", default="dev") + tags = [t.strip() for t in tags.split(",") if t != ""] + + with open_dict(cfg): + cfg.tags = tags + + log.info(f"Tags: {cfg.tags}") + + if save_to_file: + with open(Path(cfg.paths.output_dir, "tags.log"), "w") as file: + rich.print(cfg.tags, file=file) diff --git a/xinference/thirdparty/matcha/utils/utils.py b/xinference/thirdparty/matcha/utils/utils.py new file mode 100644 index 0000000000..fc3a48ec2b --- /dev/null +++ b/xinference/thirdparty/matcha/utils/utils.py @@ -0,0 +1,259 @@ +import os +import sys +import warnings +from importlib.util import find_spec +from math import ceil +from pathlib import Path +from typing import Any, Callable, Dict, Tuple + +import gdown +import matplotlib.pyplot as plt +import numpy as np +import torch +import wget +from omegaconf import DictConfig + +from matcha.utils import pylogger, rich_utils + +log = pylogger.get_pylogger(__name__) + + +def extras(cfg: DictConfig) -> None: + """Applies optional utilities before the task is started. + + Utilities: + - Ignoring python warnings + - Setting tags from command line + - Rich config printing + + :param cfg: A DictConfig object containing the config tree. + """ + # return if no `extras` config + if not cfg.get("extras"): + log.warning("Extras config not found! <cfg.extras=null>") + return + + # disable python warnings + if cfg.extras.get("ignore_warnings"): + log.info("Disabling python warnings! <cfg.extras.ignore_warnings=True>") + warnings.filterwarnings("ignore") + + # prompt user to input tags from command line if none are provided in the config + if cfg.extras.get("enforce_tags"): + log.info("Enforcing tags! <cfg.extras.enforce_tags=True>") + rich_utils.enforce_tags(cfg, save_to_file=True) + + # pretty print config tree using Rich library + if cfg.extras.get("print_config"): + log.info("Printing config tree with Rich! <cfg.extras.print_config=True>") + rich_utils.print_config_tree(cfg, resolve=True, save_to_file=True) + + +def task_wrapper(task_func: Callable) -> Callable: + """Optional decorator that controls the failure behavior when executing the task function. + + This wrapper can be used to: + - make sure loggers are closed even if the task function raises an exception (prevents multirun failure) + - save the exception to a `.log` file + - mark the run as failed with a dedicated file in the `logs/` folder (so we can find and rerun it later) + - etc. (adjust depending on your needs) + + Example: + ``` + @utils.task_wrapper + def train(cfg: DictConfig) -> Tuple[Dict[str, Any], Dict[str, Any]]: + ... + return metric_dict, object_dict + ``` + + :param task_func: The task function to be wrapped. + + :return: The wrapped task function. + """ + + def wrap(cfg: DictConfig) -> Tuple[Dict[str, Any], Dict[str, Any]]: + # execute the task + try: + metric_dict, object_dict = task_func(cfg=cfg) + + # things to do if exception occurs + except Exception as ex: + # save exception to `.log` file + log.exception("") + + # some hyperparameter combinations might be invalid or cause out-of-memory errors + # so when using hparam search plugins like Optuna, you might want to disable + # raising the below exception to avoid multirun failure + raise ex + + # things to always do after either success or exception + finally: + # display output dir path in terminal + log.info(f"Output dir: {cfg.paths.output_dir}") + + # always close wandb run (even if exception occurs so multirun won't fail) + if find_spec("wandb"): # check if wandb is installed + import wandb + + if wandb.run: + log.info("Closing wandb!") + wandb.finish() + + return metric_dict, object_dict + + return wrap + + +def get_metric_value(metric_dict: Dict[str, Any], metric_name: str) -> float: + """Safely retrieves value of the metric logged in LightningModule. + + :param metric_dict: A dict containing metric values. + :param metric_name: The name of the metric to retrieve. + :return: The value of the metric. + """ + if not metric_name: + log.info("Metric name is None! Skipping metric value retrieval...") + return None + + if metric_name not in metric_dict: + raise ValueError( + f"Metric value not found! <metric_name={metric_name}>\n" + "Make sure metric name logged in LightningModule is correct!\n" + "Make sure `optimized_metric` name in `hparams_search` config is correct!" + ) + + metric_value = metric_dict[metric_name].item() + log.info(f"Retrieved metric value! <{metric_name}={metric_value}>") + + return metric_value + + +def intersperse(lst, item): + # Adds blank symbol + result = [item] * (len(lst) * 2 + 1) + result[1::2] = lst + return result + + +def save_figure_to_numpy(fig): + data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="") + data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) + return data + + +def plot_tensor(tensor): + plt.style.use("default") + fig, ax = plt.subplots(figsize=(12, 3)) + im = ax.imshow(tensor, aspect="auto", origin="lower", interpolation="none") + plt.colorbar(im, ax=ax) + plt.tight_layout() + fig.canvas.draw() + data = save_figure_to_numpy(fig) + plt.close() + return data + + +def save_plot(tensor, savepath): + plt.style.use("default") + fig, ax = plt.subplots(figsize=(12, 3)) + im = ax.imshow(tensor, aspect="auto", origin="lower", interpolation="none") + plt.colorbar(im, ax=ax) + plt.tight_layout() + fig.canvas.draw() + plt.savefig(savepath) + plt.close() + + +def to_numpy(tensor): + if isinstance(tensor, np.ndarray): + return tensor + elif isinstance(tensor, torch.Tensor): + return tensor.detach().cpu().numpy() + elif isinstance(tensor, list): + return np.array(tensor) + else: + raise TypeError("Unsupported type for conversion to numpy array") + + +def get_user_data_dir(appname="matcha_tts"): + """ + Args: + appname (str): Name of application + + Returns: + Path: path to user data directory + """ + + MATCHA_HOME = os.environ.get("MATCHA_HOME") + if MATCHA_HOME is not None: + ans = Path(MATCHA_HOME).expanduser().resolve(strict=False) + elif sys.platform == "win32": + import winreg # pylint: disable=import-outside-toplevel + + key = winreg.OpenKey( + winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", + ) + dir_, _ = winreg.QueryValueEx(key, "Local AppData") + ans = Path(dir_).resolve(strict=False) + elif sys.platform == "darwin": + ans = Path("~/Library/Application Support/").expanduser() + else: + ans = Path.home().joinpath(".local/share") + + final_path = ans.joinpath(appname) + final_path.mkdir(parents=True, exist_ok=True) + return final_path + + +def assert_model_downloaded(checkpoint_path, url, use_wget=True): + if Path(checkpoint_path).exists(): + log.debug(f"[+] Model already present at {checkpoint_path}!") + print(f"[+] Model already present at {checkpoint_path}!") + return + log.info(f"[-] Model not found at {checkpoint_path}! Will download it") + print(f"[-] Model not found at {checkpoint_path}! Will download it") + checkpoint_path = str(checkpoint_path) + if not use_wget: + gdown.download(url=url, output=checkpoint_path, quiet=False, fuzzy=True) + else: + wget.download(url=url, out=checkpoint_path) + + +def get_phoneme_durations(durations, phones): + prev = durations[0] + merged_durations = [] + # Convolve with stride 2 + for i in range(1, len(durations), 2): + if i == len(durations) - 2: + # if it is last take full value + next_half = durations[i + 1] + else: + next_half = ceil(durations[i + 1] / 2) + + curr = prev + durations[i] + next_half + prev = durations[i + 1] - next_half + merged_durations.append(curr) + + assert len(phones) == len(merged_durations) + assert len(merged_durations) == (len(durations) - 1) // 2 + + merged_durations = torch.cumsum(torch.tensor(merged_durations), 0, dtype=torch.long) + start = torch.tensor(0) + duration_json = [] + for i, duration in enumerate(merged_durations): + duration_json.append( + { + phones[i]: { + "starttime": start.item(), + "endtime": duration.item(), + "duration": duration.item() - start.item(), + } + } + ) + start = duration + + assert list(duration_json[-1].values())[0]["endtime"] == sum( + durations + ), f"{list(duration_json[-1].values())[0]['endtime'], sum(durations)}" + return duration_json From 2b0c0910a3315b93fb2d003993872813915ee44d Mon Sep 17 00:00:00 2001 From: Adam Ning <frostyplanet@gmail.com> Date: Tue, 27 Aug 2024 22:41:55 +0800 Subject: [PATCH 285/298] ENH: Fix callback status when model die (#2172) --- xinference/core/worker.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index 7a4f907479..e619b7a5aa 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -146,7 +146,7 @@ async def recover_sub_pool(self, address): else: recover_count = self._model_uid_to_recover_count.get(model_uid) try: - await self.terminate_model(model_uid) + await self.terminate_model(model_uid, is_model_die=True) except Exception: pass if recover_count is not None: @@ -914,7 +914,7 @@ async def launch_builtin_model( ) @log_async(logger=logger) - async def terminate_model(self, model_uid: str): + async def terminate_model(self, model_uid: str, is_model_die=False): # Terminate model while its launching is not allow if model_uid in self._model_uid_launching_guard: raise ValueError(f"{model_uid} is launching") @@ -963,11 +963,16 @@ async def terminate_model(self, model_uid: str): self._model_uid_to_recover_count.pop(model_uid, None) self._model_uid_to_launch_args.pop(model_uid, None) + if is_model_die: + status = LaunchStatus.ERROR.name + else: + status = LaunchStatus.TERMINATED.name + if self._status_guard_ref is None: _ = await self.get_supervisor_ref() assert self._status_guard_ref is not None await self._status_guard_ref.update_instance_info( - origin_uid, {"status": LaunchStatus.TERMINATED.name} + origin_uid, {"status": status} ) # Provide an interface for future version of supervisor to call From 1d787987b0d97010d164265d4bf3b57dbadc7195 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Wed, 28 Aug 2024 16:32:18 +0800 Subject: [PATCH 286/298] ENH: support cosyvoice-300m-instruct without instruction (#2175) --- xinference/model/audio/chattts.py | 7 ++++--- xinference/model/audio/cosyvoice.py | 7 ++++--- xinference/model/audio/tests/test_cosyvoice.py | 10 ++++++++++ xinference/model/utils.py | 10 ++++++++++ 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/xinference/model/audio/chattts.py b/xinference/model/audio/chattts.py index 8f866f429b..1d895a62ba 100644 --- a/xinference/model/audio/chattts.py +++ b/xinference/model/audio/chattts.py @@ -11,11 +11,14 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + import base64 import logging from io import BytesIO from typing import TYPE_CHECKING, Optional +from ..utils import set_all_random_seed + if TYPE_CHECKING: from .core import AudioModelFamilyV1 @@ -78,9 +81,7 @@ def speech( if rnd_spk_emb is None: seed = xxhash.xxh32_intdigest(voice) - torch.manual_seed(seed) - np.random.seed(seed) - torch.cuda.manual_seed(seed) + set_all_random_seed(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False diff --git a/xinference/model/audio/cosyvoice.py b/xinference/model/audio/cosyvoice.py index fcd5605245..6dff9f2beb 100644 --- a/xinference/model/audio/cosyvoice.py +++ b/xinference/model/audio/cosyvoice.py @@ -16,6 +16,8 @@ from io import BytesIO from typing import TYPE_CHECKING, Optional +from ..utils import set_all_random_seed + if TYPE_CHECKING: from .core import AudioModelFamilyV1 @@ -67,6 +69,7 @@ def speech( prompt_speech: Optional[bytes] = kwargs.pop("prompt_speech", None) prompt_text: Optional[str] = kwargs.pop("prompt_text", None) instruct_text: Optional[str] = kwargs.pop("instruct_text", None) + seed: Optional[int] = kwargs.pop("seed", 0) if "SFT" in self._model_spec.model_name: # inference_sft @@ -87,9 +90,6 @@ def speech( assert ( prompt_text is None ), "CosyVoice Instruct model does not support prompt_text" - assert ( - instruct_text is not None - ), "CosyVoice Instruct model expect a instruct_text" else: # inference_zero_shot # inference_cross_lingual @@ -99,6 +99,7 @@ def speech( ), "CosyVoice model does not support instruct_text" assert self._model is not None + set_all_random_seed(seed) if prompt_speech: assert not voice, "voice can't be set with prompt speech." with io.BytesIO(prompt_speech) as prompt_speech_io: diff --git a/xinference/model/audio/tests/test_cosyvoice.py b/xinference/model/audio/tests/test_cosyvoice.py index 481dc767a4..554980af49 100644 --- a/xinference/model/audio/tests/test_cosyvoice.py +++ b/xinference/model/audio/tests/test_cosyvoice.py @@ -106,6 +106,16 @@ def test_cosyvoice_instruct(setup): ) model = client.get_model(model_uid) + # inference without instruction + response = model.speech( + "在面对挑战时,他展现了非凡的<strong>勇气</strong>与<strong>智慧</strong>。", voice="中文男" + ) + assert type(response) is bytes + assert len(response) > 0 + with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f: + f.write(response) + assert os.stat(f.name).st_size > 0 + # inference_instruct response = model.speech( "在面对挑战时,他展现了非凡的<strong>勇气</strong>与<strong>智慧</strong>。", diff --git a/xinference/model/utils.py b/xinference/model/utils.py index e67d911395..e03e3da69c 100644 --- a/xinference/model/utils.py +++ b/xinference/model/utils.py @@ -18,11 +18,14 @@ import json import logging import os +import random from json import JSONDecodeError from pathlib import Path from typing import Any, Callable, Dict, Optional, Tuple, Union import huggingface_hub +import numpy as np +import torch from ..constants import XINFERENCE_CACHE_DIR, XINFERENCE_ENV_MODEL_SRC from ..device_utils import empty_cache, get_available_device, is_device_available @@ -378,3 +381,10 @@ def inner(*args, **kwargs): empty_cache() return inner + + +def set_all_random_seed(seed: int): + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) From c28980734f429cbb9d3e91d3cc0f97952bc69ff6 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Wed, 28 Aug 2024 13:19:22 +0200 Subject: [PATCH 287/298] ENH: Remove opencc and fast_whisper (#2179) --- setup.cfg | 4 ---- xinference/deploy/docker/requirements.txt | 2 -- xinference/deploy/docker/requirements_cpu.txt | 2 -- xinference/thirdparty/fish_speech/tools/api.py | 2 +- 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/setup.cfg b/setup.cfg index 6d8c334740..43c7d8c210 100644 --- a/setup.cfg +++ b/setup.cfg @@ -129,8 +129,6 @@ all = loguru # For Fish Speech natsort # For Fish Speech loralib # For Fish Speech - opencc==1.1.6 # For Fish Speech - faster_whisper # For Fish Speech intel = torch==2.1.0a0 intel_extension_for_pytorch==2.1.10+xpu @@ -196,8 +194,6 @@ audio = loguru # For Fish Speech natsort # For Fish Speech loralib # For Fish Speech - opencc==1.1.6 # For Fish Speech - faster_whisper # For Fish Speech doc = ipython>=6.5.0 sphinx>=3.0.0 diff --git a/xinference/deploy/docker/requirements.txt b/xinference/deploy/docker/requirements.txt index 7ca70aff5e..a5b5749618 100644 --- a/xinference/deploy/docker/requirements.txt +++ b/xinference/deploy/docker/requirements.txt @@ -71,8 +71,6 @@ jj-pytorchvideo # For CogVLM2-video loguru # For Fish Speech natsort # For Fish Speech loralib # For Fish Speech -opencc==1.1.6 # For Fish Speech -faster_whisper # For Fish Speech # sglang outlines>=0.0.44 diff --git a/xinference/deploy/docker/requirements_cpu.txt b/xinference/deploy/docker/requirements_cpu.txt index 8d1c3308cf..048c31a3fa 100644 --- a/xinference/deploy/docker/requirements_cpu.txt +++ b/xinference/deploy/docker/requirements_cpu.txt @@ -66,5 +66,3 @@ jj-pytorchvideo # For CogVLM2-video loguru # For Fish Speech natsort # For Fish Speech loralib # For Fish Speech -opencc==1.1.6 # For Fish Speech -faster_whisper # For Fish Speech diff --git a/xinference/thirdparty/fish_speech/tools/api.py b/xinference/thirdparty/fish_speech/tools/api.py index a11d30b227..29869b267f 100644 --- a/xinference/thirdparty/fish_speech/tools/api.py +++ b/xinference/thirdparty/fish_speech/tools/api.py @@ -34,7 +34,7 @@ # from fish_speech.models.vqgan.lit_module import VQGAN from fish_speech.models.vqgan.modules.firefly import FireflyArchitecture from fish_speech.utils import autocast_exclude_mps -from tools.auto_rerank import batch_asr, calculate_wer, is_chinese, load_model +# from tools.auto_rerank import batch_asr, calculate_wer, is_chinese, load_model from tools.llama.generate import ( GenerateRequest, GenerateResponse, From 5216e6f933a313a3593cbe31930f0fd2fab8d73b Mon Sep 17 00:00:00 2001 From: luhairong11 <1248278429@qq.com> Date: Wed, 28 Aug 2024 19:20:35 +0800 Subject: [PATCH 288/298] ENH: solve the problem of health check for image-to-text model (#2182) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 鲁海荣 <luhr@gitlab.localhost> --- xinference/model/llm/vllm/core.py | 33 ------------------------------- 1 file changed, 33 deletions(-) diff --git a/xinference/model/llm/vllm/core.py b/xinference/model/llm/vllm/core.py index 4b009aa646..372efc7a3e 100644 --- a/xinference/model/llm/vllm/core.py +++ b/xinference/model/llm/vllm/core.py @@ -643,39 +643,6 @@ async def async_chat( class VLLMVisionModel(VLLMModel, ChatModelMixin): - def load(self): - try: - import vllm - from vllm.engine.arg_utils import AsyncEngineArgs - from vllm.engine.async_llm_engine import AsyncLLMEngine - except ImportError: - error_message = "Failed to import module 'vllm'" - installation_guide = [ - "Please make sure 'vllm' is installed. ", - "You can install it by `pip install vllm`\n", - ] - raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") - - if vllm.__version__ >= "0.3.1": - # from vllm v0.3.1, it uses cupy as NCCL backend - # in which cupy will fork a process - # only for xoscar >= 0.3.0, new process is allowed in subpool - # besides, xinference set start method as forkserver for unix - # we need to set it to fork to make cupy NCCL work - multiprocessing.set_start_method("fork", force=True) - - self._model_config = self._sanitize_model_config(self._model_config) - - logger.info( - f"Loading {self.model_uid} with following model config: {self._model_config}" - ) - - engine_args = AsyncEngineArgs( - model=self.model_path, - **self._model_config, - ) - self._engine = AsyncLLMEngine.from_engine_args(engine_args) - @classmethod def match( cls, llm_family: "LLMFamilyV1", llm_spec: "LLMSpecV1", quantization: str From b91aae8d908705392cb3922fc1a4972d18e8c02e Mon Sep 17 00:00:00 2001 From: Chengjie Li <109656400+ChengjieLi28@users.noreply.github.com> Date: Wed, 28 Aug 2024 19:24:24 +0800 Subject: [PATCH 289/298] BUG: docker compose failed due to empty entrypoint (#2180) --- xinference/deploy/docker/Dockerfile | 2 +- xinference/deploy/docker/cpu.Dockerfile | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/xinference/deploy/docker/Dockerfile b/xinference/deploy/docker/Dockerfile index 1975adb5eb..b7f534d225 100644 --- a/xinference/deploy/docker/Dockerfile +++ b/xinference/deploy/docker/Dockerfile @@ -39,4 +39,4 @@ RUN pip install --upgrade -i "$PIP_INDEX" pip && \ # clean packages pip cache purge -ENTRYPOINT [] +CMD ["/bin/bash"] diff --git a/xinference/deploy/docker/cpu.Dockerfile b/xinference/deploy/docker/cpu.Dockerfile index d7bd45c463..145d59ec57 100644 --- a/xinference/deploy/docker/cpu.Dockerfile +++ b/xinference/deploy/docker/cpu.Dockerfile @@ -28,3 +28,5 @@ RUN python -m pip install --upgrade -i "$PIP_INDEX" pip && \ pip install -i "$PIP_INDEX" --no-deps "." && \ # clean packages pip cache purge + +CMD ["/bin/bash"] From de805321aca574ec44b93fb52fefcd178c16f41c Mon Sep 17 00:00:00 2001 From: Zzzz1111 <34296741+Zzzz1111@users.noreply.github.com> Date: Thu, 29 Aug 2024 15:00:01 +0800 Subject: [PATCH 290/298] =?UTF-8?q?BUG:=20=F0=9F=90=9B=20fix=20unable=20la?= =?UTF-8?q?unch=20qwen2-embedding=20(#2185)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 胡子俊 <huzijun@cvte.com> --- xinference/model/embedding/core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xinference/model/embedding/core.py b/xinference/model/embedding/core.py index 23a9766c48..7ad985ff09 100644 --- a/xinference/model/embedding/core.py +++ b/xinference/model/embedding/core.py @@ -124,6 +124,7 @@ def __init__( model_path: str, model_spec: EmbeddingModelSpec, device: Optional[str] = None, + **kwargs, ): self._model_uid = model_uid self._model_path = model_path @@ -131,6 +132,7 @@ def __init__( self._model = None self._counter = 0 self._model_spec = model_spec + self._kwargs = kwargs def load(self): try: From ea407cca17478a5079b305de69d8b6150addc2a5 Mon Sep 17 00:00:00 2001 From: "Kevin.Shin" <mail4kevin@163.com> Date: Thu, 29 Aug 2024 17:58:41 +0800 Subject: [PATCH 291/298] BUG: configuration key different by sglang's version (#2188) Co-authored-by: shenk-b <shenk-b@glodon.com> --- xinference/model/llm/sglang/core.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/xinference/model/llm/sglang/core.py b/xinference/model/llm/sglang/core.py index 3e089b6eb0..3c31b4fe7a 100644 --- a/xinference/model/llm/sglang/core.py +++ b/xinference/model/llm/sglang/core.py @@ -113,6 +113,13 @@ def load(self): raise ImportError(f"{error_message}\n\n{''.join(installation_guide)}") self._model_config = self._sanitize_model_config(self._model_config) + + # Fix: GH#2169 + if sgl.__version__ >= "0.2.14": + self._model_config.setdefault("triton_attention_reduce_in_fp32", False) + else: + self._model_config.setdefault("attention_reduce_in_fp32", False) + logger.info( f"Loading {self.model_uid} with following model config: {self._model_config}" ) @@ -152,7 +159,6 @@ def _sanitize_model_config( else: model_config["mem_fraction_static"] = 0.88 model_config.setdefault("log_level", "info") - model_config.setdefault("attention_reduce_in_fp32", False) return model_config From 71029b5a160e90ddef9b89d1c2f9da8a68dff5d1 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Thu, 29 Aug 2024 19:32:56 +0800 Subject: [PATCH 292/298] BUG: fix lora not load in transformers engine (#2194) --- xinference/model/llm/transformers/core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xinference/model/llm/transformers/core.py b/xinference/model/llm/transformers/core.py index 7b427c4918..b02f88e947 100644 --- a/xinference/model/llm/transformers/core.py +++ b/xinference/model/llm/transformers/core.py @@ -319,6 +319,8 @@ def load(self): else: self._model, self._tokenizer = self._load_model(**kwargs) + self._apply_lora() + if not is_device_map_auto: self._model.to(self._device) From db2b846ddedd99e08f43fe814f210d0afd2443b9 Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:58:41 +0800 Subject: [PATCH 293/298] BUG: fix register model list error (#2189) Co-authored-by: wuzhaoxin <15667065080@162.com> --- xinference/model/audio/custom.py | 9 ++++----- xinference/model/embedding/custom.py | 9 ++++----- .../model/embedding/tests/test_embedding_models.py | 3 ++- xinference/model/flexible/core.py | 6 +++++- xinference/model/image/custom.py | 9 ++++----- xinference/model/llm/llm_family.py | 11 +++++------ xinference/model/rerank/custom.py | 9 ++++----- xinference/model/rerank/tests/test_rerank.py | 3 ++- 8 files changed, 30 insertions(+), 29 deletions(-) diff --git a/xinference/model/audio/custom.py b/xinference/model/audio/custom.py index c342bcc1a7..be2c388fda 100644 --- a/xinference/model/audio/custom.py +++ b/xinference/model/audio/custom.py @@ -88,6 +88,10 @@ def register_audio(model_spec: CustomAudioModelFamilyV1, persist: bool): if not is_valid_model_name(model_spec.model_name): raise ValueError(f"Invalid model name {model_spec.model_name}.") + model_uri = model_spec.model_uri + if model_uri and not is_valid_model_uri(model_uri): + raise ValueError(f"Invalid model URI {model_uri}.") + with UD_AUDIO_LOCK: for model_name in ( list(BUILTIN_AUDIO_MODELS.keys()) @@ -102,11 +106,6 @@ def register_audio(model_spec: CustomAudioModelFamilyV1, persist: bool): UD_AUDIOS.append(model_spec) if persist: - # We only validate model URL when persist is True. - model_uri = model_spec.model_uri - if model_uri and not is_valid_model_uri(model_uri): - raise ValueError(f"Invalid model URI {model_uri}.") - persist_path = os.path.join( XINFERENCE_MODEL_DIR, "audio", f"{model_spec.model_name}.json" ) diff --git a/xinference/model/embedding/custom.py b/xinference/model/embedding/custom.py index 8e311bbd7d..5cf398109b 100644 --- a/xinference/model/embedding/custom.py +++ b/xinference/model/embedding/custom.py @@ -47,6 +47,10 @@ def register_embedding(model_spec: CustomEmbeddingModelSpec, persist: bool): if not is_valid_model_name(model_spec.model_name): raise ValueError(f"Invalid model name {model_spec.model_name}.") + model_uri = model_spec.model_uri + if model_uri and not is_valid_model_uri(model_uri): + raise ValueError(f"Invalid model URI {model_uri}.") + with UD_EMBEDDING_LOCK: for model_name in ( list(BUILTIN_EMBEDDING_MODELS.keys()) @@ -61,11 +65,6 @@ def register_embedding(model_spec: CustomEmbeddingModelSpec, persist: bool): UD_EMBEDDINGS.append(model_spec) if persist: - # We only validate model URL when persist is True. - model_uri = model_spec.model_uri - if model_uri and not is_valid_model_uri(model_uri): - raise ValueError(f"Invalid model URI {model_uri}.") - persist_path = os.path.join( XINFERENCE_MODEL_DIR, "embedding", f"{model_spec.model_name}.json" ) diff --git a/xinference/model/embedding/tests/test_embedding_models.py b/xinference/model/embedding/tests/test_embedding_models.py index 02e0cdde7c..bbdcabf4b5 100644 --- a/xinference/model/embedding/tests/test_embedding_models.py +++ b/xinference/model/embedding/tests/test_embedding_models.py @@ -191,7 +191,8 @@ def test_register_custom_embedding(): model_id="test/custom_test_b", model_uri="file:///c/d", ) - register_embedding(model_spec, False) + with pytest.raises(ValueError): + register_embedding(model_spec, False) # name conflict model_spec = CustomEmbeddingModelSpec( diff --git a/xinference/model/flexible/core.py b/xinference/model/flexible/core.py index 44dd848b4d..666a69afb8 100644 --- a/xinference/model/flexible/core.py +++ b/xinference/model/flexible/core.py @@ -99,11 +99,15 @@ def get_flexible_model_descriptions(): def register_flexible_model(model_spec: FlexibleModelSpec, persist: bool): - from ..utils import is_valid_model_name + from ..utils import is_valid_model_name, is_valid_model_uri if not is_valid_model_name(model_spec.model_name): raise ValueError(f"Invalid model name {model_spec.model_name}.") + model_uri = model_spec.model_uri + if model_uri and not is_valid_model_uri(model_uri): + raise ValueError(f"Invalid model URI {model_uri}.") + if model_spec.launcher_args: try: model_spec.parser_args() diff --git a/xinference/model/image/custom.py b/xinference/model/image/custom.py index ff66ff8aa7..785482f23b 100644 --- a/xinference/model/image/custom.py +++ b/xinference/model/image/custom.py @@ -47,6 +47,10 @@ def register_image(model_spec: CustomImageModelFamilyV1, persist: bool): if not is_valid_model_name(model_spec.model_name): raise ValueError(f"Invalid model name {model_spec.model_name}.") + model_uri = model_spec.model_uri + if model_uri and not is_valid_model_uri(model_uri): + raise ValueError(f"Invalid model URI {model_uri}") + with UD_IMAGE_LOCK: for model_name in ( list(BUILTIN_IMAGE_MODELS.keys()) @@ -60,11 +64,6 @@ def register_image(model_spec: CustomImageModelFamilyV1, persist: bool): UD_IMAGES.append(model_spec) if persist: - # We only validate model URL when persist is True. - model_uri = model_spec.model_uri - if model_uri and not is_valid_model_uri(model_uri): - raise ValueError(f"Invalid model URI {model_uri}") - persist_path = os.path.join( XINFERENCE_MODEL_DIR, "image", f"{model_spec.model_name}.json" ) diff --git a/xinference/model/llm/llm_family.py b/xinference/model/llm/llm_family.py index c2ea4d7b98..e615a10650 100644 --- a/xinference/model/llm/llm_family.py +++ b/xinference/model/llm/llm_family.py @@ -1004,6 +1004,11 @@ def register_llm(llm_family: LLMFamilyV1, persist: bool): if not is_valid_model_name(llm_family.model_name): raise ValueError(f"Invalid model name {llm_family.model_name}.") + for spec in llm_family.model_specs: + model_uri = spec.model_uri + if model_uri and not is_valid_model_uri(model_uri): + raise ValueError(f"Invalid model URI {model_uri}.") + with UD_LLM_FAMILIES_LOCK: for family in BUILTIN_LLM_FAMILIES + UD_LLM_FAMILIES: if llm_family.model_name == family.model_name: @@ -1015,12 +1020,6 @@ def register_llm(llm_family: LLMFamilyV1, persist: bool): generate_engine_config_by_model_family(llm_family) if persist: - # We only validate model URL when persist is True. - for spec in llm_family.model_specs: - model_uri = spec.model_uri - if model_uri and not is_valid_model_uri(model_uri): - raise ValueError(f"Invalid model URI {model_uri}.") - persist_path = os.path.join( XINFERENCE_MODEL_DIR, "llm", f"{llm_family.model_name}.json" ) diff --git a/xinference/model/rerank/custom.py b/xinference/model/rerank/custom.py index 12c86f3942..d81ee48986 100644 --- a/xinference/model/rerank/custom.py +++ b/xinference/model/rerank/custom.py @@ -48,6 +48,10 @@ def register_rerank(model_spec: CustomRerankModelSpec, persist: bool): if not is_valid_model_name(model_spec.model_name): raise ValueError(f"Invalid model name {model_spec.model_name}.") + model_uri = model_spec.model_uri + if model_uri and not is_valid_model_uri(model_uri): + raise ValueError(f"Invalid model URI {model_uri}.") + with UD_RERANK_LOCK: for model_name in ( list(BUILTIN_RERANK_MODELS.keys()) @@ -62,11 +66,6 @@ def register_rerank(model_spec: CustomRerankModelSpec, persist: bool): UD_RERANKS.append(model_spec) if persist: - # We only validate model URL when persist is True. - model_uri = model_spec.model_uri - if model_uri and not is_valid_model_uri(model_uri): - raise ValueError(f"Invalid model URI {model_uri}.") - persist_path = os.path.join( XINFERENCE_MODEL_DIR, "rerank", f"{model_spec.model_name}.json" ) diff --git a/xinference/model/rerank/tests/test_rerank.py b/xinference/model/rerank/tests/test_rerank.py index af1ff9bb44..057432005c 100644 --- a/xinference/model/rerank/tests/test_rerank.py +++ b/xinference/model/rerank/tests/test_rerank.py @@ -121,7 +121,8 @@ def test_register_custom_rerank(): language=["zh"], model_uri="file:///c/d", ) - register_rerank(model_spec, False) + with pytest.raises(ValueError): + register_rerank(model_spec, False) # name conflict model_spec = CustomRerankModelSpec( From bb73a975465086e18fb6c21c99ae3ff8d33dfc67 Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 30 Aug 2024 10:30:08 +0200 Subject: [PATCH 294/298] BUG: Fix list video model (#2190) --- xinference/core/worker.py | 16 ++++++++++------ .../model/image/tests/test_stable_diffusion.py | 8 +++++--- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/xinference/core/worker.py b/xinference/core/worker.py index e619b7a5aa..d9291aa27f 100644 --- a/xinference/core/worker.py +++ b/xinference/core/worker.py @@ -73,15 +73,15 @@ def __init__( self._supervisor_ref: Optional[xo.ActorRefType] = None self._main_pool = main_pool self._main_pool.recover_sub_pool = self.recover_sub_pool - self._status_guard_ref: xo.ActorRefType[ # type: ignore - "StatusGuardActor" - ] = None + self._status_guard_ref: xo.ActorRefType["StatusGuardActor"] = ( # type: ignore + None + ) self._event_collector_ref: xo.ActorRefType[ # type: ignore EventCollectorActor ] = None - self._cache_tracker_ref: xo.ActorRefType[ # type: ignore - CacheTrackerActor - ] = None + self._cache_tracker_ref: xo.ActorRefType[CacheTrackerActor] = ( # type: ignore + None + ) # internal states. # temporary placeholder during model launch process: @@ -664,6 +664,8 @@ def sort_helper(item): ret.sort(key=sort_helper) return ret + elif model_type == "video": + return [] elif model_type == "rerank": from ..model.rerank.custom import get_user_defined_reranks @@ -703,6 +705,8 @@ async def get_model_registration(self, model_type: str, model_name: str) -> Any: for f in get_user_defined_audios(): if f.model_name == model_name: return f + elif model_type == "video": + return None elif model_type == "rerank": from ..model.rerank.custom import get_user_defined_reranks diff --git a/xinference/model/image/tests/test_stable_diffusion.py b/xinference/model/image/tests/test_stable_diffusion.py index ba54ca806d..b50922e70c 100644 --- a/xinference/model/image/tests/test_stable_diffusion.py +++ b/xinference/model/image/tests/test_stable_diffusion.py @@ -39,7 +39,7 @@ def test_model(): model_path = None try: model_path = cache(TEST_MODEL_SPEC) - model = DiffusionModel("mock", model_path) + model = DiffusionModel("mock", model_path, abilities=["text2image"]) # input is a string input_text = "an apple" model.load() @@ -313,12 +313,13 @@ def test_persist_custom_image(): ) tmp_dir = tempfile.mktemp() + os.makedirs(tmp_dir) model_spec = CustomImageModelFamilyV1( model_family="stable_diffusion", model_name="my-custom-image", model_id="my-custom-image", - model_uri=os.path.abspath(tmp_dir), + model_uri=f"file://{os.path.abspath(tmp_dir)}", ) register_image(model_spec, persist=True) @@ -349,11 +350,12 @@ def test_launch_custom_image(setup): "model_uid": "my_sd", "model_name": "my_sd", "model_uri": model_path, + "model_ability": ["text2image"], } client.register_model( model_type="image", - model=json_dumps(my_model), + model=json_dumps(my_model).decode("utf-8"), persist=False, ) From 10094f9390261aefd983ef1af9db10edff648d5d Mon Sep 17 00:00:00 2001 From: codingl2k1 <138426806+codingl2k1@users.noreply.github.com> Date: Fri, 30 Aug 2024 10:34:45 +0200 Subject: [PATCH 295/298] CHORE: Clean test env (#2183) --- .github/workflows/python.yaml | 20 ++++++++++---------- xinference/model/audio/tests/test_whisper.py | 3 +++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index c097314a7a..94343bef57 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -154,37 +154,37 @@ jobs: ${{ env.SELF_HOST_CONDA }} install -c conda-forge pynini=2.1.5 ${{ env.SELF_HOST_CONDA }} install -c conda-forge "ffmpeg<7" ${{ env.SELF_HOST_PYTHON }} -m pip install -U funasr - ${{ env.SELF_HOST_PYTHON }} -m pip install -U nemo_text_processing + ${{ env.SELF_HOST_PYTHON }} -m pip install -U nemo_text_processing<1.1.0 ${{ env.SELF_HOST_PYTHON }} -m pip install -U omegaconf~=2.3.0 - ${{ env.SELF_HOST_PYTHON }} -m pip install -U WeTextProcessing + ${{ env.SELF_HOST_PYTHON }} -m pip install -U WeTextProcessing<1.0.4 ${{ env.SELF_HOST_PYTHON }} -m pip install -U librosa ${{ env.SELF_HOST_PYTHON }} -m pip install -U xxhash ${{ env.SELF_HOST_PYTHON }} -m pip install -U "ChatTTS>0.1" ${{ env.SELF_HOST_PYTHON }} -m pip install -U HyperPyYAML - ${{ env.SELF_HOST_PYTHON }} -m pip install -U matcha-tts + ${{ env.SELF_HOST_PYTHON }} -m pip uninstall -y matcha-tts ${{ env.SELF_HOST_PYTHON }} -m pip install -U onnxruntime-gpu==1.16.0; sys_platform == 'linux' ${{ env.SELF_HOST_PYTHON }} -m pip install -U openai-whisper ${{ env.SELF_HOST_PYTHON }} -m pip install -U "torch==2.3.1" "torchaudio==2.3.1" ${{ env.SELF_HOST_PYTHON }} -m pip install -U "loguru" ${{ env.SELF_HOST_PYTHON }} -m pip install -U "natsort" ${{ env.SELF_HOST_PYTHON }} -m pip install -U "loralib" - ${{ env.SELF_HOST_PYTHON }} -m pip install -U "opencc==1.1.6" - ${{ env.SELF_HOST_PYTHON }} -m pip install -U "faster_whisper" + ${{ env.SELF_HOST_PYTHON }} -m pip uninstall -y opencc + ${{ env.SELF_HOST_PYTHON }} -m pip uninstall -y "faster_whisper" ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ - --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/image/tests/test_stable_diffusion.py + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/image/tests/test_stable_diffusion.py && \ ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ - --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_whisper.py + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_whisper.py && \ ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ - --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_funasr.py + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_funasr.py && \ ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ - --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_chattts.py + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_chattts.py && \ ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ - --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_cosyvoice.py + --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_cosyvoice.py && \ ${{ env.SELF_HOST_PYTHON }} -m pytest --timeout=1500 \ -W ignore::PendingDeprecationWarning \ --cov-config=setup.cfg --cov-report=xml --cov=xinference xinference/model/audio/tests/test_fish_speech.py diff --git a/xinference/model/audio/tests/test_whisper.py b/xinference/model/audio/tests/test_whisper.py index d1c5d95a76..e376087c1a 100644 --- a/xinference/model/audio/tests/test_whisper.py +++ b/xinference/model/audio/tests/test_whisper.py @@ -152,6 +152,7 @@ def test_register_custom_audio(): model_name="custom_test_a", model_id="test/custom_test_a", multilingual=True, + ability="audio-to-text", ) register_audio(family_a, False) @@ -163,6 +164,7 @@ def test_register_custom_audio(): model_name="custom_test_b", model_id="test/custom_test_b", multilingual=True, + ability="audio-to-text", ) register_audio(family_b, False) assert family_b in get_user_defined_audios() @@ -194,6 +196,7 @@ def test_persistent_custom_audio(): model_id="test/custom_test_a", multilingual=True, model_uri=os.path.abspath(temp_dir), + ability="audio-to-text", ) register_audio(family, True) From 2f8c3ce1b01222909bec6f0a4ddb0fa70357886d Mon Sep 17 00:00:00 2001 From: amumu96 <128140880+amumu96@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:15:33 +0800 Subject: [PATCH 296/298] BUG: fix custom path test error (#2200) Co-authored-by: wuzhaoxin <15667065080@162.com> --- .../image/tests/test_stable_diffusion.py | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/xinference/model/image/tests/test_stable_diffusion.py b/xinference/model/image/tests/test_stable_diffusion.py index b50922e70c..15eeacf120 100644 --- a/xinference/model/image/tests/test_stable_diffusion.py +++ b/xinference/model/image/tests/test_stable_diffusion.py @@ -287,20 +287,19 @@ def test_register_custom_image(): unregister_image, ) - tmp_dir = tempfile.mktemp() - - model_spec = CustomImageModelFamilyV1( - model_family="stable_diffusion", - model_name="my-custom-image", - model_id="my-custom-image", - model_uri=os.path.abspath(tmp_dir), - ) - - register_image(model_spec, persist=False) - assert model_spec in get_user_defined_images() - - unregister_image(model_spec.model_name, raise_error=False) - assert model_spec not in get_user_defined_images() + with tempfile.TemporaryDirectory() as tmp_dir: + model_spec = CustomImageModelFamilyV1( + model_family="stable_diffusion", + model_name="my-custom-image", + model_id="my-custom-image", + model_uri=os.path.abspath(tmp_dir), + ) + + register_image(model_spec, persist=False) + assert model_spec in get_user_defined_images() + + unregister_image(model_spec.model_name, raise_error=False) + assert model_spec not in get_user_defined_images() def test_persist_custom_image(): From f3d510eceffbbbc41ce065919fd2c48411017573 Mon Sep 17 00:00:00 2001 From: "Xuye (Chris) Qin" <qinxuye@gmail.com> Date: Fri, 30 Aug 2024 18:54:16 +0800 Subject: [PATCH 297/298] FEAT: support CogVideoX-5b (#2197) --- xinference/model/video/core.py | 4 +- xinference/model/video/diffusers.py | 79 ++++++++++--------- xinference/model/video/model_spec.json | 25 +++++- .../model/video/model_spec_modelscope.json | 26 +++++- 4 files changed, 93 insertions(+), 41 deletions(-) diff --git a/xinference/model/video/core.py b/xinference/model/video/core.py index 3b9f96ad9a..c81cd89b22 100644 --- a/xinference/model/video/core.py +++ b/xinference/model/video/core.py @@ -14,7 +14,7 @@ import logging import os from collections import defaultdict -from typing import Dict, List, Literal, Optional, Tuple +from typing import Any, Dict, List, Literal, Optional, Tuple from ...constants import XINFERENCE_CACHE_DIR from ..core import CacheableModelSpec, ModelDescription @@ -44,6 +44,8 @@ class VideoModelFamilyV1(CacheableModelSpec): model_revision: str model_hub: str = "huggingface" model_ability: Optional[List[str]] + default_model_config: Optional[Dict[str, Any]] + default_generate_config: Optional[Dict[str, Any]] class VideoModelDescription(ModelDescription): diff --git a/xinference/model/video/diffusers.py b/xinference/model/video/diffusers.py index b9b8569918..3c2f801a56 100644 --- a/xinference/model/video/diffusers.py +++ b/xinference/model/video/diffusers.py @@ -15,7 +15,6 @@ import base64 import logging import os -import sys import time import uuid from concurrent.futures import ThreadPoolExecutor @@ -24,10 +23,9 @@ import numpy as np import PIL.Image -import torch from ...constants import XINFERENCE_VIDEO_DIR -from ...device_utils import move_model_to_available_device +from ...device_utils import gpu_count, move_model_to_available_device from ...types import Video, VideoList if TYPE_CHECKING: @@ -76,41 +74,58 @@ def model_spec(self): def load(self): import torch - torch_dtype = self._kwargs.get("torch_dtype") - if sys.platform != "darwin" and torch_dtype is None: - # The following params crashes on Mac M2 - self._kwargs["torch_dtype"] = torch.float16 - self._kwargs["variant"] = "fp16" - self._kwargs["use_safetensors"] = True + kwargs = self._model_spec.default_model_config.copy() + kwargs.update(self._kwargs) + + scheduler_cls_name = kwargs.pop("scheduler", None) + + torch_dtype = kwargs.get("torch_dtype") if isinstance(torch_dtype, str): - self._kwargs["torch_dtype"] = getattr(torch, torch_dtype) + kwargs["torch_dtype"] = getattr(torch, torch_dtype) + logger.debug("Loading video model with kwargs: %s", kwargs) if self._model_spec.model_family == "CogVideoX": + import diffusers from diffusers import CogVideoXPipeline - self._model = CogVideoXPipeline.from_pretrained( - self._model_path, **self._kwargs + pipeline = self._model = CogVideoXPipeline.from_pretrained( + self._model_path, **kwargs ) else: raise Exception( f"Unsupported model family: {self._model_spec.model_family}" ) - if self._kwargs.get("cpu_offload", False): + if scheduler_cls_name: + logger.debug("Using scheduler: %s", scheduler_cls_name) + pipeline.scheduler = getattr(diffusers, scheduler_cls_name).from_config( + pipeline.scheduler.config, timestep_spacing="trailing" + ) + if kwargs.get("compile_graph", False): + pipeline.transformer = torch.compile( + pipeline.transformer, mode="max-autotune", fullgraph=True + ) + if kwargs.get("cpu_offload", False): logger.debug("CPU offloading model") - self._model.enable_model_cpu_offload() - elif not self._kwargs.get("device_map"): + pipeline.enable_model_cpu_offload() + if kwargs.get("sequential_cpu_offload", True): + pipeline.enable_sequential_cpu_offload() + pipeline.vae.enable_slicing() + pipeline.vae.enable_tiling() + elif not kwargs.get("device_map"): logger.debug("Loading model to available device") - self._model = move_model_to_available_device(self._model) + if gpu_count() > 1: + kwargs["device_map"] = "balanced" + else: + pipeline = move_model_to_available_device(self._model) # Recommended if your computer has < 64 GB of RAM - self._model.enable_attention_slicing() + pipeline.enable_attention_slicing() def text_to_video( self, prompt: str, n: int = 1, num_inference_steps: int = 50, - guidance_scale: int = 6, response_format: str = "b64_json", **kwargs, ) -> VideoList: @@ -121,31 +136,19 @@ def text_to_video( # from diffusers.utils import export_to_video from ...device_utils import empty_cache + assert self._model is not None + assert callable(self._model) + generate_kwargs = self._model_spec.default_generate_config.copy() + generate_kwargs.update(kwargs) + generate_kwargs["num_videos_per_prompt"] = n logger.debug( "diffusers text_to_video args: %s", - kwargs, + generate_kwargs, ) - assert self._model is not None - if self._kwargs.get("cpu_offload"): - # if enabled cpu offload, - # the model.device would be CPU - device = "cuda" - else: - device = self._model.device - prompt_embeds, _ = self._model.encode_prompt( - prompt=prompt, - do_classifier_free_guidance=True, - num_videos_per_prompt=n, - max_sequence_length=226, - device=device, - dtype=torch.float16, - ) - assert callable(self._model) output = self._model( + prompt=prompt, num_inference_steps=num_inference_steps, - guidance_scale=guidance_scale, - prompt_embeds=prompt_embeds, - **kwargs, + **generate_kwargs, ) # clean cache diff --git a/xinference/model/video/model_spec.json b/xinference/model/video/model_spec.json index 52b748fd6a..515467ab40 100644 --- a/xinference/model/video/model_spec.json +++ b/xinference/model/video/model_spec.json @@ -6,6 +6,29 @@ "model_revision": "4bbfb1de622b80bc1b77b6e9aced75f816be0e38", "model_ability": [ "text2video" - ] + ], + "default_model_config": { + "scheduler": "CogVideoXDDIMScheduler", + "torch_dtype": "float16" + }, + "default_generate_config": { + "guidance_scale": 6 + } + }, + { + "model_name": "CogVideoX-5b", + "model_family": "CogVideoX", + "model_id": "THUDM/CogVideoX-5b", + "model_revision": "8d6ea3f817438460b25595a120f109b88d5fdfad", + "model_ability": [ + "text2video" + ], + "default_model_config": { + "scheduler": "CogVideoXDPMScheduler", + "torch_dtype": "bfloat16" + }, + "default_generate_config": { + "guidance_scale": 7 + } } ] diff --git a/xinference/model/video/model_spec_modelscope.json b/xinference/model/video/model_spec_modelscope.json index e3cb604921..edf5f0073d 100644 --- a/xinference/model/video/model_spec_modelscope.json +++ b/xinference/model/video/model_spec_modelscope.json @@ -7,6 +7,30 @@ "model_revision": "master", "model_ability": [ "text2video" - ] + ], + "default_model_config": { + "scheduler": "CogVideoXDDIMScheduler", + "torch_dtype": "float16" + }, + "default_generate_config": { + "guidance_scale": 6 + } + }, + { + "model_name": "CogVideoX-5b", + "model_family": "CogVideoX", + "model_hub": "modelscope", + "model_id": "ZhipuAI/CogVideoX-5b", + "model_revision": "master", + "model_ability": [ + "text2video" + ], + "default_model_config": { + "scheduler": "CogVideoXDPMScheduler", + "torch_dtype": "bfloat16" + }, + "default_generate_config": { + "guidance_scale": 7 + } } ] From c84a59ef00a98b7d2d658d8ea031b6f3e8fc1434 Mon Sep 17 00:00:00 2001 From: yiboyasss <3359595624@qq.com> Date: Mon, 2 Sep 2024 14:38:19 +0800 Subject: [PATCH 298/298] fix: detail --- xinference/web/ui/src/App.js | 1 - 1 file changed, 1 deletion(-) diff --git a/xinference/web/ui/src/App.js b/xinference/web/ui/src/App.js index 9ac335eb18..53fa155fce 100644 --- a/xinference/web/ui/src/App.js +++ b/xinference/web/ui/src/App.js @@ -15,7 +15,6 @@ function App() { const [theme] = useMode() const [cookie, setCookie, removeCookie] = useCookies(['token']) const [msg, setMsg] = useState('') - const endPoint = getEndpoint() useEffect(() => {