From 8616195607921294d67b3e4629a0e466718fb202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20la=20R=C3=BAa=20Mart=C3=ADnez?= Date: Tue, 11 Feb 2025 11:08:06 +0100 Subject: [PATCH 1/3] [HWORKS-1885] Improve vLLM-related docs --- .../deployment_simple_form_vllm_conf_file.png | Bin 0 -> 82931 bytes .../mlops/registry/frameworks/tch.md | 75 ++++++++++ docs/user_guides/mlops/registry/index.md | 4 +- docs/user_guides/mlops/serving/deployment.md | 23 +-- docs/user_guides/mlops/serving/predictor.md | 138 ++++++++++++------ mkdocs.yml | 1 + 6 files changed, 186 insertions(+), 55 deletions(-) create mode 100644 docs/assets/images/guides/mlops/serving/deployment_simple_form_vllm_conf_file.png create mode 100644 docs/user_guides/mlops/registry/frameworks/tch.md diff --git a/docs/assets/images/guides/mlops/serving/deployment_simple_form_vllm_conf_file.png b/docs/assets/images/guides/mlops/serving/deployment_simple_form_vllm_conf_file.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a04b41c1e60f65ef28f1bdaa07b703da433f20 GIT binary patch literal 82931 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

-### Step 5 (Optional): Enable KServe + +### Step 5 (Optional): Select a configuration file + +!!! note + Only available for LLM deployments. + +You can select a configuration file to be added to the [artifact files](deployment.md#artifact-files). If a predictor script is provided, this configuration file will be available inside the model deployment at the local path stored in the `CONFIG_FILE_PATH` environment variable. If a predictor script is **not** provided, this configuration file will be directly passed to the vLLM server. You can find all configuration parameters supported by the vLLM server in the [vLLM documentation](https://docs.vllm.ai/en/v0.6.4/serving/openai_compatible_server.html). + +

+

+ Server configuration file in the simplified deployment form +
Select a configuration file in the simplified deployment form
+
+

+ +### Step 6 (Optional): Enable KServe Other configuration such as the serving tool, is part of the advanced options of a deployment. To navigate to the advanced creation form, click on `Advanced options`. @@ -105,7 +121,7 @@ Here, you change the [serving tool](#serving-tool) for your deployment by enabli

-### Step 6 (Optional): Other advanced options +### Step 7 (Optional): Other advanced options Additionally, you can adjust the default values of the rest of components: @@ -143,50 +159,71 @@ Once you are done with the changes, click on `Create new deployment` at the bott def __init__(self): """ Initialization code goes here""" - pass + # Model files can be found at os.environ["MODEL_FILES_PATH"] + # self.model = ... # load your model def predict(self, inputs): """ Serve predictions using the trained model""" - pass + # Use the model to make predictions + # return self.model.predict(inputs) ``` -=== "Generate (vLLM deployments only)" +=== "Predictor (vLLM deployments only)" ``` python - from typing import Iterable, AsyncIterator, Union - - from vllm import LLM - + import os + from vllm import __version__, AsyncEngineArgs, AsyncLLMEngine + from typing import Iterable, AsyncIterator, Union, Optional from kserve.protocol.rest.openai import ( CompletionRequest, ChatPrompt, ChatCompletionRequestMessage, ) from kserve.protocol.rest.openai.types import Completion + from kserve.protocol.rest.openai.types.openapi import ChatCompletionTool + class Predictor(): def __init__(self): """ Initialization code goes here""" - # initialize vLLM backend - self.llm = LLM(os.environ["MODEL_FILES_PATH]) - - # initialize tokenizer if needed - # self.tokenizer = ... - - def apply_chat_template( - self, - messages: Iterable[ChatCompletionRequestMessage,], - ) -> ChatPrompt: - pass - - async def create_completion( - self, request: CompletionRequest - ) -> Union[Completion, AsyncIterator[Completion]]: - """Generate responses using the LLM""" - - # Completion: used for returning a single answer (batch) - # AsyncIterator[Completion]: used for returning a stream of answers - - pass + + # (optional) if any, access the configuration file via os.environ["CONFIG_FILE_PATH"] + config = ... + + print("Starting vLLM backend...") + engine_args = AsyncEngineArgs( + model=os.environ["MODEL_FILES_PATH"], + **config + ) + + # "self.vllm_engine" is required as the local variable with the vllm engine handler + self.vllm_engine = AsyncLLMEngine.from_engine_args(engine_args) + + # + # NOTE: Default implementations of the apply_chat_template and create_completion methods are already provided. + # If needed, you can override these methods as shown below + # + + #def apply_chat_template( + # self, + # messages: Iterable[ChatCompletionRequestMessage], + # chat_template: Optional[str] = None, + # tools: Optional[list[ChatCompletionTool]] = None, + #) -> ChatPrompt: + # """Converts a prompt or list of messages into a single templated prompt string""" + + # prompt = ... # apply chat template on the message to build the prompt + # return ChatPrompt(prompt=prompt) + + #async def create_completion( + # self, request: CompletionRequest + #) -> Union[Completion, AsyncIterator[Completion]]: + # """Generate responses using the vLLM engine""" + # + # generators = self.vllm_engine.generate(...) + # + # # Completion: used for returning a single answer (batch) + # # AsyncIterator[Completion]: used for returning a stream of answers + # return ... ``` !!! info "Jupyter magic" @@ -242,7 +279,7 @@ Hopsworks Model Serving supports deploying models with a Flask server for python | Flask | ✅ | python-based (scikit-learn, xgboost, pytorch...) | | TensorFlow Serving | ✅ | keras, tensorflow | | TorchServe | ❌ | pytorch | - | vLLM | ✅ | vLLM-supported models (see [list](https://docs.vllm.ai/en/latest/models/supported_models.html)) | + | vLLM | ✅ | vLLM-supported models (see [list](https://docs.vllm.ai/en/v0.6.4/models/supported_models.html)) | ## Serving tool @@ -279,7 +316,17 @@ The predictor script needs to implement a given template depending on the model | | TensorFlow Serving | ❌ | | KServe | Fast API | ✅ (only required for artifacts with multiple models) | | | TensorFlow Serving | ❌ | - | | vLLM | ✅ (required) | + | | vLLM | ✅ (optional) | + +### Server configuration file + +Depending on the model server, a **server configuration file** can be selected to help detach configuration used within the model deployment from the model server or the implementation of the predictor and transformer scripts. In other words, by modifying the configuration file of an existing model deployment you can adjust its settings without making changes to the predictor or transformer scripts. Inside a model deployment, the local path to the configuration file is stored in the `CONFIG_FILE_PATH` environment variable (see [environment variables](#environment-variables)). + +!!! warning "Configuration file format" + The configuration file can be of any format, except in vLLM deployments **without a predictor script** for which a YAML file is ==required==. + +!!! note "Passing arguments to vLLM via configuration file" + For vLLM deployments **without a predictor script**, the server configuration file is ==required== and it is used to configure the vLLM server. For example, you can use this configuration file to specify the chat template or LoRA modules to be loaded by the vLLM server. See all available parameters in the [official documentation](https://docs.vllm.ai/en/v0.6.4/serving/openai_compatible_server.html#command-line-arguments-for-the-server). ### Environment variables @@ -291,6 +338,7 @@ A number of different environment variables is available in the predictor to eas | ------------------- | -------------------------------------------------------------------- | | MODEL_FILES_PATH | Local path to the model files | | ARTIFACT_FILES_PATH | Local path to the artifact files | + | CONFIG_FILE_PATH | Local path to the configuration file | | DEPLOYMENT_NAME | Name of the current deployment | | MODEL_NAME | Name of the model being served by the current deployment | | MODEL_VERSION | Version of the model being served by the current deployment | @@ -302,13 +350,13 @@ Depending on the model server and serving tool used in the model deployment, you ??? info "Show supported Python environments" - | Serving tool | Model server | Editable | Predictor | Transformer | - | ------------ | ------------------ | -------- | ----------------------------------- | ------------------------------ | - | Kubernetes | Flask server | ❌ | `pandas-inference-pipeline` only | ❌ | - | | TensorFlow Serving | ❌ | (official) tensorflow serving image | ❌ | - | KServe | Fast API | ✅ | any `inference-pipeline` image | any `inference-pipeline` image | - | | TensorFlow Serving | ✅ | (official) tensorflow serving image | any `inference-pipeline` image | - | | vLLM | ✅ | `vllm-inference-pipeline` only | any `inference-pipeline` image | + | Serving tool | Model server | Editable | Predictor | Transformer | + | ------------ | ------------------ | -------- | ------------------------------------------ | ------------------------------ | + | Kubernetes | Flask server | ❌ | `pandas-inference-pipeline` only | ❌ | + | | TensorFlow Serving | ❌ | (official) tensorflow serving image | ❌ | + | KServe | Fast API | ✅ | any `inference-pipeline` image | any `inference-pipeline` image | + | | TensorFlow Serving | ✅ | (official) tensorflow serving image | any `inference-pipeline` image | + | | vLLM | ✅ | `vllm-inference-pipeline` or `vllm-openai` | any `inference-pipeline` image | !!! note The selected Python environment is used for both predictor and transformer. Support for selecting a different Python environment for the predictor and transformer is coming soon. diff --git a/mkdocs.yml b/mkdocs.yml index 0de1d2bc0..1d26480ad 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -182,6 +182,7 @@ nav: - user_guides/mlops/registry/index.md - Frameworks: - TensorFlow: user_guides/mlops/registry/frameworks/tf.md + - Torch: user_guides/mlops/registry/frameworks/tch.md - Scikit-learn: user_guides/mlops/registry/frameworks/skl.md - LLM: user_guides/mlops/registry/frameworks/llm.md - Python: user_guides/mlops/registry/frameworks/python.md From f59264960964fc94c6e1e5f8497742e55a3531a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20la=20R=C3=BAa=20Mart=C3=ADnez?= Date: Thu, 13 Feb 2025 11:44:18 +0100 Subject: [PATCH 2/3] Add description tags to pages --- docs/user_guides/mlops/registry/frameworks/llm.md | 6 +++++- docs/user_guides/mlops/registry/frameworks/python.md | 4 ++++ docs/user_guides/mlops/registry/frameworks/skl.md | 4 ++++ docs/user_guides/mlops/registry/frameworks/tch.md | 4 ++++ docs/user_guides/mlops/registry/frameworks/tf.md | 4 ++++ docs/user_guides/mlops/serving/deployment.md | 6 +++++- docs/user_guides/mlops/serving/predictor.md | 4 ++++ docs/user_guides/mlops/serving/resources.md | 6 +++++- docs/user_guides/mlops/serving/transformer.md | 4 ++++ docs/user_guides/mlops/serving/troubleshooting.md | 6 +++++- 10 files changed, 44 insertions(+), 4 deletions(-) diff --git a/docs/user_guides/mlops/registry/frameworks/llm.md b/docs/user_guides/mlops/registry/frameworks/llm.md index 986dee6bf..ee9e29a05 100644 --- a/docs/user_guides/mlops/registry/frameworks/llm.md +++ b/docs/user_guides/mlops/registry/frameworks/llm.md @@ -1,4 +1,8 @@ -# How To Export an LLM Model +--- +description: Documentation on how to export a Large Language Model (LLM) to the model registry +--- + +# How To Export a Large Language Model (LLM) ## Introduction diff --git a/docs/user_guides/mlops/registry/frameworks/python.md b/docs/user_guides/mlops/registry/frameworks/python.md index af4689c60..8a7544aa9 100644 --- a/docs/user_guides/mlops/registry/frameworks/python.md +++ b/docs/user_guides/mlops/registry/frameworks/python.md @@ -1,3 +1,7 @@ +--- +description: Documentation on how to export a Python model to the model registry +--- + # How To Export a Python Model ## Introduction diff --git a/docs/user_guides/mlops/registry/frameworks/skl.md b/docs/user_guides/mlops/registry/frameworks/skl.md index e364101a9..81d8254bf 100644 --- a/docs/user_guides/mlops/registry/frameworks/skl.md +++ b/docs/user_guides/mlops/registry/frameworks/skl.md @@ -1,3 +1,7 @@ +--- +description: Documentation on how to export a Scikit-learn model to the model registry +--- + # How To Export a Scikit-learn Model ## Introduction diff --git a/docs/user_guides/mlops/registry/frameworks/tch.md b/docs/user_guides/mlops/registry/frameworks/tch.md index c87f2c074..040cf61be 100644 --- a/docs/user_guides/mlops/registry/frameworks/tch.md +++ b/docs/user_guides/mlops/registry/frameworks/tch.md @@ -1,3 +1,7 @@ +--- +description: Documentation on how to export a Pytorch model to the model registry +--- + # How To Export a Torch Model ## Introduction diff --git a/docs/user_guides/mlops/registry/frameworks/tf.md b/docs/user_guides/mlops/registry/frameworks/tf.md index d74630cbe..64a5e7225 100644 --- a/docs/user_guides/mlops/registry/frameworks/tf.md +++ b/docs/user_guides/mlops/registry/frameworks/tf.md @@ -1,3 +1,7 @@ +--- +description: Documentation on how to export a Tensorflow model to the model registry +--- + # How To Export a TensorFlow Model ## Introduction diff --git a/docs/user_guides/mlops/serving/deployment.md b/docs/user_guides/mlops/serving/deployment.md index f7f9407d7..59e4f8447 100644 --- a/docs/user_guides/mlops/serving/deployment.md +++ b/docs/user_guides/mlops/serving/deployment.md @@ -1,4 +1,8 @@ -# How To Create A Deployment +--- +description: Documentation on how to deployment Machine Learning (ML) models and Large Language Models (LLMs) +--- + +# How To Create A Model Deployment ## Introduction diff --git a/docs/user_guides/mlops/serving/predictor.md b/docs/user_guides/mlops/serving/predictor.md index a26f893d5..fbd19824b 100644 --- a/docs/user_guides/mlops/serving/predictor.md +++ b/docs/user_guides/mlops/serving/predictor.md @@ -1,3 +1,7 @@ +--- +description: Documentation on how to configure a predictor for a model deployment +--- + # How To Configure A Predictor ## Introduction diff --git a/docs/user_guides/mlops/serving/resources.md b/docs/user_guides/mlops/serving/resources.md index d79bb7edb..27a22ba02 100644 --- a/docs/user_guides/mlops/serving/resources.md +++ b/docs/user_guides/mlops/serving/resources.md @@ -1,4 +1,8 @@ -# How To Allocate Resources For A Deployment +--- +description: Documentation on how to allocate resources to a model deployment +--- + +# How To Allocate Resources To A Model Deployment ## Introduction diff --git a/docs/user_guides/mlops/serving/transformer.md b/docs/user_guides/mlops/serving/transformer.md index bd851c304..6d3466932 100644 --- a/docs/user_guides/mlops/serving/transformer.md +++ b/docs/user_guides/mlops/serving/transformer.md @@ -1,3 +1,7 @@ +--- +description: Documentation on how to configure a KServe transformer for a model deployment +--- + # How To Configure A Transformer ## Introduction diff --git a/docs/user_guides/mlops/serving/troubleshooting.md b/docs/user_guides/mlops/serving/troubleshooting.md index 78521e79b..df18c156c 100644 --- a/docs/user_guides/mlops/serving/troubleshooting.md +++ b/docs/user_guides/mlops/serving/troubleshooting.md @@ -1,4 +1,8 @@ -# How To Troubleshoot A Deployment +--- +description: Documentation on how to troubleshoot a model deployment +--- + +# How To Troubleshoot A Model Deployment ## Introduction From a45ef1f56b9bb524fedcecc908ae3a7841423c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20la=20R=C3=BAa=20Mart=C3=ADnez?= Date: Tue, 11 Feb 2025 11:26:52 +0100 Subject: [PATCH 3/3] Point to v0.7.1 vllm docs --- docs/user_guides/mlops/serving/predictor.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/user_guides/mlops/serving/predictor.md b/docs/user_guides/mlops/serving/predictor.md index fbd19824b..79008919c 100644 --- a/docs/user_guides/mlops/serving/predictor.md +++ b/docs/user_guides/mlops/serving/predictor.md @@ -96,7 +96,7 @@ To create your own it is recommended to [clone](../../projects/python/python_env !!! note Only available for LLM deployments. -You can select a configuration file to be added to the [artifact files](deployment.md#artifact-files). If a predictor script is provided, this configuration file will be available inside the model deployment at the local path stored in the `CONFIG_FILE_PATH` environment variable. If a predictor script is **not** provided, this configuration file will be directly passed to the vLLM server. You can find all configuration parameters supported by the vLLM server in the [vLLM documentation](https://docs.vllm.ai/en/v0.6.4/serving/openai_compatible_server.html). +You can select a configuration file to be added to the [artifact files](deployment.md#artifact-files). If a predictor script is provided, this configuration file will be available inside the model deployment at the local path stored in the `CONFIG_FILE_PATH` environment variable. If a predictor script is **not** provided, this configuration file will be directly passed to the vLLM server. You can find all configuration parameters supported by the vLLM server in the [vLLM documentation](https://docs.vllm.ai/en/v0.7.1/serving/openai_compatible_server.html).

@@ -283,7 +283,7 @@ Hopsworks Model Serving supports deploying models with a Flask server for python | Flask | ✅ | python-based (scikit-learn, xgboost, pytorch...) | | TensorFlow Serving | ✅ | keras, tensorflow | | TorchServe | ❌ | pytorch | - | vLLM | ✅ | vLLM-supported models (see [list](https://docs.vllm.ai/en/v0.6.4/models/supported_models.html)) | + | vLLM | ✅ | vLLM-supported models (see [list](https://docs.vllm.ai/en/v0.7.1/models/supported_models.html)) | ## Serving tool @@ -330,7 +330,7 @@ Depending on the model server, a **server configuration file** can be selected t The configuration file can be of any format, except in vLLM deployments **without a predictor script** for which a YAML file is ==required==. !!! note "Passing arguments to vLLM via configuration file" - For vLLM deployments **without a predictor script**, the server configuration file is ==required== and it is used to configure the vLLM server. For example, you can use this configuration file to specify the chat template or LoRA modules to be loaded by the vLLM server. See all available parameters in the [official documentation](https://docs.vllm.ai/en/v0.6.4/serving/openai_compatible_server.html#command-line-arguments-for-the-server). + For vLLM deployments **without a predictor script**, the server configuration file is ==required== and it is used to configure the vLLM server. For example, you can use this configuration file to specify the chat template or LoRA modules to be loaded by the vLLM server. See all available parameters in the [official documentation](https://docs.vllm.ai/en/v0.7.1/serving/openai_compatible_server.html#command-line-arguments-for-the-server). ### Environment variables