From dac6fbe53a35ea34a882aefc70c7ad77e8328655 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Sun, 9 Feb 2025 14:30:22 -0500 Subject: [PATCH 01/21] Adding instructions to deploy observability on other clusters (e.g., OCP clusters) Signed-off-by: Braulio Dumba Signed-off-by: Braulio Dumba Signed-off-by: Braulio Dumba --- deploy/README.md | 301 ++++++++ deploy/router-master.yaml | 113 +++ deploy/vllm-master.yaml | 111 +++ observability/INSTRUCTIONS.md | 111 +++ observability/README.md | 77 +- .../images/grafana-instance-setup.png | Bin 0 -> 203251 bytes .../images/grafana-operator-setup.png | Bin 0 -> 95375 bytes observability/vllm-dashboard.yaml | 665 ++++++++++++++++++ observability/vllm-sm.yaml | 16 + perf-test/README.md | 95 +++ perf-test/setup-clusterloader2.sh | 21 + perf-test/vllm-config.yaml | 59 ++ perf-test/vllm-deployment.yaml | 78 ++ perf-test/vllm-pvc.yaml | 12 + perf-test/vllm-service.yaml | 19 + 15 files changed, 1666 insertions(+), 12 deletions(-) create mode 100644 deploy/README.md create mode 100644 deploy/router-master.yaml create mode 100644 deploy/vllm-master.yaml create mode 100644 observability/INSTRUCTIONS.md create mode 100644 observability/images/grafana-instance-setup.png create mode 100644 observability/images/grafana-operator-setup.png create mode 100644 observability/vllm-dashboard.yaml create mode 100644 observability/vllm-sm.yaml create mode 100644 perf-test/README.md create mode 100755 perf-test/setup-clusterloader2.sh create mode 100644 perf-test/vllm-config.yaml create mode 100644 perf-test/vllm-deployment.yaml create mode 100644 perf-test/vllm-pvc.yaml create mode 100644 perf-test/vllm-service.yaml diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 000000000..ee99312b4 --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,301 @@ +## Deploying the stack via Kubectl + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Prerequisites](#prerequisites) +- [Steps](#steps) + - [1. Deploy VLLM router](#1-deploy-vllm-router) + - [2. Deploy VLLM app](#2-deploy-vllm-app) + - [3. Check GPUs allocated to the deployed VLLM application](#3-check-gpus-allocated-to-the-deployed-vllm-application) + - [4. Send a Query to the Stack](#4-send-a-query-to-the-stack) + - [4.1. Forward the Service Port](#41-forward-the-service-port) + - [4.2. Query the OpenAI-Compatible API to list the available models](#42-query-the-openai-compatible-api-to-list-the-available-models) + - [4.3. Query the OpenAI Completion Endpoint](#43-query-the-openai-completion-endpoint) + - [5. Uninstall](#5-uninstall) + + +### Prerequisites + +- A running Kubernetes (K8s) environment with GPUs + +### Steps + +Each component of the vLLM Production Stack can be individually deployed using yaml as following: + +Starting from a local directory containing this git repo: + +#### 1. Deploy VLLM router + + First, set the variable `NAMESPACE` to the name of a target namespace (e.g., `vllm-test`). For example: + + ```bash + NS=vllm-test + ``` + + Then, deploy the router app: + + ```bash + kubectl create ns vllm-test + sed s/%TARGET_NS%/$NS/g router-master.yaml | kubectl -n $NS apply -f - + ``` + + Optionally, check the deployment of the router app: + + ```bash + kubectl -n $NS get all + ``` + + Sample output: + + ```console + NAME READY STATUS RESTARTS AGE + pod/vllm-deployment-router-xx-yy 1/1 Running 0 12s + + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + service/vllm-router-service ClusterIP 172.21.165.147 80/TCP 19s + + NAME READY UP-TO-DATE AVAILABLE AGE + deployment.apps/vllm-deployment-router 1/1 1 1 19s + + NAME DESIRED CURRENT READY AGE + replicaset.apps/vllm-deployment-router-xx 1 1 1 12s + ``` + + +#### 2. Deploy VLLM app + + First, set the variables `INSTANCE_NAME` and `MODEL_URL` to the given name and model URL for a VLLM instance. For example: + + ```bash + INSTANCE_NAME=vllm-1 + MODEL_URL=facebook/opt-125m + ``` + + Then, deploy the vllm instance in the target namespace (e.g., `vllm-test`): + + ```bash + sed -e s,%INSTANCE_NAME%,$INSTANCE_NAME,g -e s,%MODEL_URL%,$MODEL_URL,g vllm-master.yaml | kubectl -n $NS apply -f - + ``` + + Deploy a second vllm instance with a `gpt2` model: + + ```bash + INSTANCE_NAME=vllm-2 + MODEL_URL=openai-community/gpt2 + sed -e s,%INSTANCE_NAME%,$INSTANCE_NAME,g -e s,%MODEL_URL%,$MODEL_URL,g vllm-master.yaml | kubectl -n $NS apply -f - + ``` + + Optionally, check the deployment of the vllm apps: + + ```bash + kubectl -n $NS get pods -l environment=test + ``` + + Sample output: + ```console + NAME READY STATUS RESTARTS AGE + vllm-1-deployment-vllm-abcd-yyy 1/1 Running 0 6m28s + vllm-2-deployment-vllm-abcd-xyx 1/1 Running 0 112s + ``` + +#### 3. Check GPUs allocated to the deployed VLLM application + +In certain situations, if your cluster offers various GPU types, you can determine which GPU was chosen for a deployed VLLM instance with a specific model by using the tool [nvidia-smi](https://developer.download.nvidia.com/compute/DCGM/docs/nvidia-smi-367.38.pdf). + +This can be done with any pod capable of utilizing a GPU and with the open source vllm image from `vllm/vllm-openai:version`. Proceed as following: + +Exec into the vllm pod and list the NVIDIA GPUs in the system: + +a) For `vllm-1` instance: + + ```bash + kubectl -n $NS exec -it vllm-1-deployment-vllm-abcd-yyy -- nvidia-smi -L + ``` + Sample output: + + ```console + GPU 0: Tesla V100-PCIE-16GB (UUID: GPU-xxxxxx-d4ef-5ee2-3995-yyyyyyy) + ``` + +b) For `vllm-2` instance: + + ```bash + kubectl -n $NS exec -it vllm-2-deployment-vllm-abcd-xyx -- nvidia-smi -L + ``` + Sample output: + + ```console + GPU 0: Tesla V100-PCIE-16GB (UUID: GPU-yyyyyy-8224-b69d-3b55-xxxxx) + ``` + +Furthermore, you can also query for more detailed information about NVIDIA GPUs in the system (i.e, memory usage, etc.): + +```bash +kubectl -n $NS exec -it vllm-1-deployment-vllm-abcd-yyy -- nvidia-smi +``` + +Sample output: + +```console +Mon Feb 10 11:49:44 2025 ++-----------------------------------------------------------------------------------------+ +| NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 | +|-----------------------------------------+------------------------+----------------------+ +| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | +| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | +| | | MIG M. | +|=========================================+========================+======================| +| 0 Tesla V100-PCIE-16GB On | 00000000:00:1E.0 Off | 0 | +| N/A 31C P0 38W / 250W | 14555MiB / 16384MiB | 0% Default | +| | | N/A | ++-----------------------------------------+------------------------+----------------------+ + ++-----------------------------------------------------------------------------------------+ +| Processes: | +| GPU GI CI PID Type Process name GPU Memory | +| ID ID Usage | +|=========================================================================================| ++-----------------------------------------------------------------------------------------+ +``` + + +#### 4. Send a Query to the Stack + +#### 4.1: Forward the Service Port + +Expose the `vllm-router-service` port to the host machine: + +```bash +sudo kubectl -n $NS port-forward svc/vllm-router-service 30080:80 +``` + +#### 4.2: Query the OpenAI-Compatible API to list the available models + +Open a new terminal and test the stack's OpenAI-compatible API by querying the available models: + +```bash +curl -o- http://localhost:30080/models +``` + +Expected output: + +```json +{ + "object": "list", + "data": [ + { + "id": "facebook/opt-125m", + "object": "model", + "created": 1739156592, + "owned_by": "vllm", + "root": null + }, + { + "id": "openai-community/gpt2", + "object": "model", + "created": 1739156824, + "owned_by": "vllm", + "root": null + } + ] +} +``` + +#### 4.3: Query the OpenAI Completion Endpoint + +a) Send a query to the OpenAI `/completion` endpoint to generate a completion for a prompt using the `facebook/opt-125m` model: + +```bash +curl -X POST http://localhost:30080/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "facebook/opt-125m", + "prompt": "The capital of France is,", + "max_tokens": 10 + }' \ + | jq +``` + +Sample output: + +```json +{ + "id": "cmpl-8e6eb10325484c52ab5e7666d452c14c", + "object": "text_completion", + "created": 1739157366, + "model": "facebook/opt-125m", + "choices": [ + { + "index": 0, + "text": " surprisingly, a French swim pool. Seriously, no", + "logprobs": null, + "finish_reason": "length", + "stop_reason": null, + "prompt_logprobs": null + } + ], + "usage": { + "prompt_tokens": 7, + "total_tokens": 17, + "completion_tokens": 10, + "prompt_tokens_details": null + } +} +``` + +b) Send a query to the OpenAI `/completion` endpoint to generate a completion for a prompt using the `openai-community/gpt2` model: + +```bash +curl -s http://localhost:30080/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "openai-community/gpt2", + "prompt": "The capital of France is", + "max_tokens": 17, + "temperature": 0.2 + }' \ + | jq +``` + +Sample output: + +```json +{ + "id": "cmpl-0d5c63917f0f4ebb8eca62170fd1b4a4", + "object": "text_completion", + "created": 1739157195, + "model": "openai-community/gpt2", + "choices": [ + { + "index": 0, + "text": " the capital of the French Republic. The French Republic is the largest state in the world", + "logprobs": null, + "finish_reason": "length", + "stop_reason": null, + "prompt_logprobs": null + } + ], + "usage": { + "prompt_tokens": 5, + "total_tokens": 22, + "completion_tokens": 17, + "prompt_tokens_details": null + } +} +``` + +This demonstrates the model generating a continuation for the provided prompt for both `facebook/opt-125m` and `openai-community/gpt2` models. + +#### 5. Uninstall + +To remove the deployment, run: + +```bash +kubectl -n $NS delete -f router-master.yaml +kubectl -n $NS delete all -l environment=test +kubectl delete ns $NS +``` + + + diff --git a/deploy/router-master.yaml b/deploy/router-master.yaml new file mode 100644 index 000000000..4150a70e3 --- /dev/null +++ b/deploy/router-master.yaml @@ -0,0 +1,113 @@ +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: "vllm-pdb" +spec: + maxUnavailable: 1 + +--- +apiVersion: v1 +kind: Service +metadata: + name: "vllm-router-service" + labels: + environment: router + release: router +spec: + type: ClusterIP + ports: + - name: "router-sport" + port: 80 + targetPort: 8000 + protocol: TCP + selector: + environment: router + release: router + +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: "vllm-router-service-account" + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: "vllm-pod-reader" +rules: +- apiGroups: [""] # "" indicates the core API group + resources: ["pods"] + verbs: ["get", "watch", "list"] + + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: vllm-deployment-access-binding +subjects: + - kind: ServiceAccount + name: vllm-router-service-account +roleRef: + kind: Role + name: vllm-pod-reader + apiGroup: rbac.authorization.k8s.io + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "vllm-deployment-router" + labels: + environment: router + release: router +spec: + replicas: 1 + selector: + matchLabels: + environment: router + release: router + template: + metadata: + labels: + environment: router + release: router + spec: + serviceAccountName: vllm-router-service-account + containers: + - name: router-container + image: lmcache/lmstack-router:latest + args: # TODO: update here + - "--host" + - "0.0.0.0" + - "--port" + - "8000" + - "--service-discovery" + - "k8s" + - "--k8s-namespace" + - "%TARGET_NS%" + - "--k8s-label-selector" + - environment=test,release=test + - "--routing-logic" + - "roundrobin" + - "--engine-stats-interval" + - "15" + - "--request-stats-window" + - "60" + resources: # TODO: update here + requests: + cpu: "4" + memory: "16G" + ports: + - name: "router-cport" + containerPort: 8000 + + livenessProbe: + initialDelaySeconds: 30 + periodSeconds: 5 + failureThreshold: 3 + httpGet: + path: /health + port: 8000 diff --git a/deploy/vllm-master.yaml b/deploy/vllm-master.yaml new file mode 100644 index 000000000..a17214a87 --- /dev/null +++ b/deploy/vllm-master.yaml @@ -0,0 +1,111 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: "%INSTANCE_NAME%-engine-service" + labels: + environment: test + release: test +spec: + type: ClusterIP + ports: + - name: "service-port" + port: 80 + targetPort: "container-port" + protocol: TCP + selector: + environment: test + release: test + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: "%INSTANCE_NAME%-storage-claim" + labels: + environment: test + release: test +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "%INSTANCE_NAME%-deployment-vllm" + labels: + environment: test + release: test +spec: + replicas: 1 + strategy: + rollingUpdate: + maxSurge: 100% + maxUnavailable: 0 + selector: + matchLabels: + environment: test + release: test + progressDeadlineSeconds: 1200 + template: + metadata: + labels: + environment: test + release: test + spec: + containers: + - name: "vllm" + image: "vllm/vllm-openai:latest" + + command: + - "vllm" + - "serve" + - "%MODEL_URL%" + - "--host" + - "0.0.0.0" + - "--port" + - "8000" + securityContext: + runAsNonRoot: false + imagePullPolicy: IfNotPresent + env: + - name: HF_HOME + value: /data + ports: + - name: "container-port" + containerPort: 8000 + startupProbe: + failureThreshold: 60 + httpGet: + path: /health + port: 8000 + initialDelaySeconds: 15 + periodSeconds: 10 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: 8000 + initialDelaySeconds: 15 + periodSeconds: 10 + resources: + requests: + memory: "16Gi" + cpu: "6" + nvidia.com/gpu: "1" + limits: + memory: "16Gi" + cpu: "6" + nvidia.com/gpu: "1" + volumeMounts: + - name: vllm-storage + mountPath: /data + + volumes: + - name: vllm-storage + persistentVolumeClaim: + claimName: "%INSTANCE_NAME%-storage-claim" diff --git a/observability/INSTRUCTIONS.md b/observability/INSTRUCTIONS.md new file mode 100644 index 000000000..2a514f1e7 --- /dev/null +++ b/observability/INSTRUCTIONS.md @@ -0,0 +1,111 @@ +## Setting up Grafana on Red Hat OpenShift Container Platform (OCP) + +1. Deploy the Grafana operator: + + Open the OpenShift web console and switch to the OperatorHub section. Search for the Grafana operator provided by the community. Follow the instructios and deploy it - you can use all the default values or specify your own namespace (e.g., `grafana-operator`) in the configuration parameters: + + + + Then, check that the Grafana operator pod is running: + + ```bash + oc kubectl -n grafana-operator get pods + ``` + + Sample output: + + ```console + NAME READY STATUS RESTARTS AGE + grafana-operator-controller-manager-v5-xxxxxx-yyy 1/1 Running 0 3d15h + ``` + +2. Create the Grafana instance: + + From Installed Operators, select the Grafana Operator. + Navigate to Grafana tab and select Create Grafana to create the Grafana instance. You can replace the default name for the Grafana instance. + + + + + Then, check that the Grafana pod is running: + + ```bash + oc -n grafana-operator get pods + ``` + + Sample output: + ```console + NAME READY STATUS RESTARTS AGE + grafana-a-deployment-758694d5c8-5dfd7 1/1 Running 0 16s + grafana-operator-controller-manager-v5-596559bbcc-fh2pk 1/1 Running 0 46h + ``` + +3. Create the Grafana router: + + ```bash + oc -n grafana-operator create route edge grafana-ui --service=grafana-a-service + ``` + +4. Create the Grafana data source: + + a) Give the Grafana service account the cluster-monitoring-view role. This account was created alongside the Grafana instance: + + ```bash + oc project grafana-operator + oc adm policy add-cluster-role-to-user cluster-monitoring-view -z grafana-a-sa + ``` + + b) Create a bearer token for the grafana service account. The token is used for the service account to authenticate with thanos-querier in the openshift-monitoring namespace: + + ```bash + BEARER_TOKEN=$(kubectl create token grafana-a-sa --duration 129600m --namespace grafana-operator) + ``` + + c) Deploy the prometheus data source: + + ```bash + cat << EOF | oc apply -f - + apiVersion: grafana.integreatly.org/v1beta1 + kind: GrafanaDatasource + metadata: + name: prometheus-test + namespace: grafana-operator + spec: + datasource: + jsonData: + httpHeaderName1: 'Authorization' + timeInterval: 5s + tlsSkipVerify: true + secureJsonData: + httpHeaderValue1: 'Bearer ' + access: proxy + isDefault: true + name: prometheus + type: prometheus + url: 'https://thanos-querier.openshift-monitoring.svc.cluster.local:9091' + instanceSelector: + matchLabels: + dashboards: grafana-a + plugins: + - name: grafana-clock-panel + version: 1.3.0 + resyncPeriod: 5m + EOF + ``` + + +5. Get the URL for Grafana: + + ```bash + oc -n grafana-operator get route grafana-ui -o jsonpath='{"https://"}{.spec.host}{"\n"}' + ``` + +6. Browse to the URL from above, and sign in with default administrator credentials. + + You can obtain the default administrator from the following secret: + + ```bash + oc -n grafana-operator get secret grafana-a-admin-credentials -o yaml + ``` + + Then, use `base64 -d` to decode and obtain the raw text of the credentials. This makes available the Grafana administrator features of creating dashboards. \ No newline at end of file diff --git a/observability/README.md b/observability/README.md index b08373426..eb82843ae 100644 --- a/observability/README.md +++ b/observability/README.md @@ -4,24 +4,77 @@ ## Deploy the observability stack -The observability stack is based on [kube-prom-stack](https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/README.md). +1. If using plain K8s clusters: -To launch the observability stack: + The observability stack is based on [kube-prom-stack](https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/README.md). -```bash -sudo bash install.sh -``` + To launch the observability stack: + + ```bash + sudo bash install.sh + ``` + + After installing, the dashboard can be accessed through the service `service/kube-prom-stack-grafana` in the `monitoring` namespace. + +2. If using OpenShift clusters: + + Follow the instructions [here](INSTRUCTIONS.md) if you need to set up Grafana on Red Hat OpenShift Container Platform (OCP). + + Then, configure Prometheus to scrape metrics from a running vllm instance: + + ```bash + kubectl -n k -n openshift-monitoring create -f vllm-sm.yaml + ``` + + Optionally, check the prometheus service monitor object was created: + + ```bash + kubectl -n openshift-monitoring get servicemonitor -l app=vllm + ``` + + Sample output: + + ```bash + NAME AGE + test-vllm-monitor2 6d3h + ``` + + Lastly, Grafana dashboard can be accessed through the openshift route in the Grafana namespace. -After installing, the dashboard can be accessed through the service `service/kube-prom-stack-grafana` in the `monitoring` namespace. ## Access the Grafana dashboard -Forward the Grafana dashboard port to the local node-port +1. If using plain K8s clusters: + + Forward the Grafana dashboard port to the local node-port + + ```bash + sudo kubectl --namespace monitoring port-forward svc/kube-prom-stack-grafana 3000:80 --address 0.0.0.0 + ``` + + Open the webpage at `http://:3000` to access the Grafana web page. The default user name is `admin` and the password can be configured in `values.yaml` (default is `prom-operator`). + +2. If using OpenShift clusters: + + Get the URL for Grafana: + + ```bash + oc -n grafana-operator get route grafana-ui -o jsonpath='{"https://"}{.spec.host}{"\n"}' + ``` + + Browse to the URL from above, and sign in with default administrator credentials. + + You can obtain the default administrator from the following secret: + + ```bash + oc -n grafana-operator get secret grafana-a-admin-credentials -o yaml + ``` -```bash -sudo kubectl --namespace monitoring port-forward svc/kube-prom-stack-grafana 3000:80 --address 0.0.0.0 -``` + Then, use `base64 -d` to decode and obtain the raw text of the credentials -Open the webpage at `http://:3000` to access the Grafana web page. The default user name is `admin` and the password can be configured in `values.yaml` (default is `prom-operator`). +3. Create the Grafana dashboard for vllm: -Import the dashboard using the `vllm-dashboard.json` in this folder. + ```bash + kubectl -n grafana-operator create -f vllm-dashboard.yaml + ``` + The above command uses the dashboard `vllm-dashboard.yaml` in this folder. diff --git a/observability/images/grafana-instance-setup.png b/observability/images/grafana-instance-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..38b5122ce76840ac31d9d99886489456bd45f93a GIT binary patch literal 203251 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

(kc}4QgGJ{oLi6$%1{JCJ)}ZdKZ=qgXo!()d1> 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 *CxLiY-csCd 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 D*T}co literal 0 HcmV?d00001 diff --git a/observability/images/grafana-operator-setup.png b/observability/images/grafana-operator-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..71ff3b566bee3a74f492ade2e7d401a9ac6db8cf GIT binary patch literal 95375 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 Ob6HL60^!_k-~R>dY%i+- literal 0 HcmV?d00001 diff --git a/observability/vllm-dashboard.yaml b/observability/vllm-dashboard.yaml new file mode 100644 index 000000000..754cd811c --- /dev/null +++ b/observability/vllm-dashboard.yaml @@ -0,0 +1,665 @@ +apiVersion: grafana.integreatly.org/v1beta1 +kind: GrafanaDashboard +metadata: + labels: + app: grafana + name: cluster-metrics +spec: + instanceSelector: + matchLabels: + dashboards: grafana-a + json: | + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 27, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "description": "Number of healthy vLLM instances", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 5, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "count by(endpoint) (vllm:cpu_cache_usage_perc)", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "vLLM instances", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Available vLLM instances", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 9, + "x": 5, + "y": 0 + }, + "id": 6, + "options": { + "displayMode": "gradient", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": false, + "expr": "sum by(le) (vllm:e2e_request_latency_seconds_bucket)", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{le}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Request latency distribution", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 10, + "x": 14, + "y": 0 + }, + "id": 7, + "options": { + "displayMode": "gradient", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "sum by(le) (vllm:time_to_first_token_seconds_bucket)", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Request TTFT distribution", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 7 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "vllm:num_requests_running", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Number of running requests", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 7 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "vllm:gpu_cache_usage_perc", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "GPU KV Usage percent", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 15 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "vllm:num_requests_waiting", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Number of pending requests", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 15 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "vllm:gpu_prefix_cache_hit_rate", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "GPU KV cache hit rate", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "auto", + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "vllm dashboard", + "uid": "ee9i0i4y606psc", + "version": 17, + "weekStart": "" + } + \ No newline at end of file diff --git a/observability/vllm-sm.yaml b/observability/vllm-sm.yaml new file mode 100644 index 000000000..27d0cb6ab --- /dev/null +++ b/observability/vllm-sm.yaml @@ -0,0 +1,16 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: vllm-monitoring + labels: + app: vllm +spec: + endpoints: + - port: "service-port" + namespaceSelector: + matchNames: + - default + selector: + matchLabels: + environment: test + release: test \ No newline at end of file diff --git a/perf-test/README.md b/perf-test/README.md new file mode 100644 index 000000000..569a98849 --- /dev/null +++ b/perf-test/README.md @@ -0,0 +1,95 @@ +## Measure VLLM PodStartupLatency + +### Prerequisites +- A running Kubernetes (K8s) environment with GPUs + + +In this tutorial, we will use [clusterloader2](https://github.com/kubernetes/perf-tests/tree/master/clusterloader2) tool to measure the VLLM pod startup latency as following: + +#### 1. Clone the following clusterloader2 repo: + + ```bash + git clone -b release-1.31 https://github.com/kubernetes/perf-tests.git + ``` + +#### 2. Configure clusterloader2: + + Starting from a local directory containing this repo, run the following script to set-up your environment: + + a) cd into the `/production-stack/perf-test` directory from your local copy of the vllm production stack repo, for example: + + ```bash + cd $HOME/production-stack/perf-test + ``` + + b) set-up your environment: + + First, set the variable `CL2_DIR` to the path of the subdirectory `clusterloader2/` of the cloned repo in step 1. For example: + + ```bash + export CL2_DIR=$HOME/perf-tests/clusterloader2 + ``` + + Then, run the set-up script as following: + ```bash + ./setup-clusterloader2.sh + ``` + +#### 3. Configure the parameters of your workload: + + a) cd into the load configuration directory. + + ```bash + cd $CL2_DIR/testing/load/ + ``` + + b) configure the parameters to create the workload traffic. + + ```bash + vi vllm-config.yaml + ``` + + More specifically, configure the following parameter: + + - *namespace*: name prefix for the target namespace (e.g., `vllm-test`) + - *deploymentReplicas*: number of VLLM deployment replicas (default value: `1`) + - *podReplicas*: number of pod replicas per deployment (default value: `1`) + + +#### 4. Deploy your first VLLM app workload and measure the PodStartupLatency: + + Use a command of the following form to create the workload. The value given to the `--kubeconfig` flag should be a pathname of the kubeconfig of your k8s cluster. + + ```bash + cd $CL2_DIR + go run cmd/clusterloader.go --testconfig=./testing/load/vllm-config.yaml --kubeconfig=${KUBECONFIG:-$HOME/.kube/config} --provider=local --v=2 + ``` + + At the end of clusterloader output you should see pod startup latency: + + ```console + { + "data": { + "Perc50": 28571.352, + "Perc90": 28571.352, + "Perc99": 28571.352 + }, + "unit": "ms", + "labels": { + "Metric": "pod_startup" + } + }, + ``` + + `pod_startup` measures time since pod was created until it was observed via watch as running. However, this time does not include the time it takes to bring up the vllm server with a model. More precisely, how long it takes for a `running` pod to reach the `ready` state + + You should also see that test succeeded: + + ```console + -------------------------------------------------------------------------------- + Test Finished + Test: ./testing/load/vllm-config.yaml + Status: Success + -------------------------------------------------------------------------------- + ``` + diff --git a/perf-test/setup-clusterloader2.sh b/perf-test/setup-clusterloader2.sh new file mode 100755 index 000000000..8a5c3c09f --- /dev/null +++ b/perf-test/setup-clusterloader2.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + + +set -x # echo so that users can understand what is happening +set -e # exit on error + +: +: ------------------------------------------------------------------------- +: "Configuring clusterloader2 to measure VLLM PodStartupLatency" + +if [ $CL2_DIR == "" ];then + echo "Set the variable CL2_DIR to the path of the subdirectory clusterloader2/ of a cloned `https://github.com/kubernetes/perf-tests/` repo." + exit 1; +fi + +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) +cp $SCRIPT_DIR/vllm-config.yaml $CL2_DIR/testing/load +cp $SCRIPT_DIR/vllm-deployment.yaml $CL2_DIR/testing/load +cp $SCRIPT_DIR/vllm-service.yaml $CL2_DIR/testing/load +cp $SCRIPT_DIR/vllm-pvc.yaml $CL2_DIR/testing/load + diff --git a/perf-test/vllm-config.yaml b/perf-test/vllm-config.yaml new file mode 100644 index 000000000..cbd479050 --- /dev/null +++ b/perf-test/vllm-config.yaml @@ -0,0 +1,59 @@ +{{$namespace := DefaultParam .namespace "default"}} +{{$deploymentReplicas:= DefaultParam .deploymentReplicas 1}} +{{$podReplicas := DefaultParam .podReplicas "1"}} + + +name: test +namespace: + number: 1 + +tuningSets: +- name: Uniform1qps + qpsLoad: + qps: 1 + +steps: +- name: Start measurements + measurements: + - Identifier: PodStartupLatency + Method: PodStartupLatency + Params: + action: start + labelSelector: performance = test + threshold: 300s + - Identifier: WaitForControlledPodsRunning + Method: WaitForControlledPodsRunning + Params: + action: start + apiVersion: apps/v1 + kind: Deployment + labelSelector: performance = test + operationTimeout: 300s +- name: Create VLLM deployment + phases: + - NamespaceList: + - {{$namespace}} + replicasPerNamespace: {{$deploymentReplicas}} + tuningSet: Uniform1qps + objectBundle: + - basename: vllm-storage-claim + objectTemplatePath: "vllm-pvc.yaml" + - basename: vllm-deployment + objectTemplatePath: "vllm-deployment.yaml" + templateFillMap: + podReplicas: {{$podReplicas}} + claimName: "vllm-storage-claim" + - basename: vllm-svc + objectTemplatePath: "vllm-service.yaml" +- name: Wait for pods to be running + measurements: + - Identifier: WaitForControlledPodsRunning + Method: WaitForControlledPodsRunning + Params: + action: gather +- name: Measure pod startup latency + measurements: + - Identifier: PodStartupLatency + Method: PodStartupLatency + Params: + action: gather diff --git a/perf-test/vllm-deployment.yaml b/perf-test/vllm-deployment.yaml new file mode 100644 index 000000000..c8594c0d5 --- /dev/null +++ b/perf-test/vllm-deployment.yaml @@ -0,0 +1,78 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{.Name}} + labels: + environment: test + release: test + performance: test +spec: + replicas: {{.podReplicas}} + strategy: + rollingUpdate: + maxSurge: 100% + maxUnavailable: 0 + selector: + matchLabels: + environment: test + release: test + progressDeadlineSeconds: 1200 + template: + metadata: + labels: + environment: test + release: test + performance: test + spec: + containers: + - name: "vllm" + image: "vllm/vllm-openai:latest" + + command: + - "vllm" + - "serve" + - "openai-community/gpt2" + - "--host" + - "0.0.0.0" + - "--port" + - "8000" + securityContext: + runAsNonRoot: false + imagePullPolicy: IfNotPresent + env: + - name: HF_HOME + value: /data + ports: + - name: "container-port" + containerPort: 8000 + startupProbe: + failureThreshold: 60 + httpGet: + path: /health + port: 8000 + initialDelaySeconds: 15 + periodSeconds: 10 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: 8000 + initialDelaySeconds: 15 + periodSeconds: 10 + resources: + requests: + memory: "16Gi" + cpu: "6" + nvidia.com/gpu: "1" + limits: + memory: "16Gi" + cpu: "6" + nvidia.com/gpu: "1" + volumeMounts: + - name: vllm-storage + mountPath: /data + + volumes: + - name: vllm-storage + persistentVolumeClaim: + claimName: {{.claimName}}-{{.Index}} \ No newline at end of file diff --git a/perf-test/vllm-pvc.yaml b/perf-test/vllm-pvc.yaml new file mode 100644 index 000000000..a5e79217a --- /dev/null +++ b/perf-test/vllm-pvc.yaml @@ -0,0 +1,12 @@ +--- +# Source: vllm-stack/templates/pvc.yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{.Name}} +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi diff --git a/perf-test/vllm-service.yaml b/perf-test/vllm-service.yaml new file mode 100644 index 000000000..203155bdf --- /dev/null +++ b/perf-test/vllm-service.yaml @@ -0,0 +1,19 @@ +--- +# Source: vllm-stack/templates/service-vllm.yaml +apiVersion: v1 +kind: Service +metadata: + name: {{.Name}} + labels: + environment: test + release: test +spec: + type: ClusterIP + ports: + - name: "service-port" + port: 80 + targetPort: "container-port" + protocol: TCP + selector: + environment: test + release: test From 1a124ab7381ce33c439fcefb31ef0eefa01c86bb Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Tue, 11 Feb 2025 09:54:52 -0500 Subject: [PATCH 02/21] Measuring VLLM workload E2E latency Signed-off-by: Braulio Dumba --- .gitignore | 4 + perf-test/README.md | 95 +------------------ perf-test/pod-startup/README.md | 95 +++++++++++++++++++ .../{ => pod-startup}/setup-clusterloader2.sh | 0 perf-test/{ => pod-startup}/vllm-config.yaml | 0 .../{ => pod-startup}/vllm-deployment.yaml | 0 perf-test/{ => pod-startup}/vllm-pvc.yaml | 0 perf-test/{ => pod-startup}/vllm-service.yaml | 0 perf-test/server-startup/README.md | 81 ++++++++++++++++ perf-test/server-startup/requirements.txt | 1 + .../vllm-serverStartupLatency.py | 90 ++++++++++++++++++ perf-test/server-startup/vllmLogParser.py | 48 ++++++++++ 12 files changed, 323 insertions(+), 91 deletions(-) create mode 100644 perf-test/pod-startup/README.md rename perf-test/{ => pod-startup}/setup-clusterloader2.sh (100%) rename perf-test/{ => pod-startup}/vllm-config.yaml (100%) rename perf-test/{ => pod-startup}/vllm-deployment.yaml (100%) rename perf-test/{ => pod-startup}/vllm-pvc.yaml (100%) rename perf-test/{ => pod-startup}/vllm-service.yaml (100%) create mode 100644 perf-test/server-startup/README.md create mode 100644 perf-test/server-startup/requirements.txt create mode 100644 perf-test/server-startup/vllm-serverStartupLatency.py create mode 100644 perf-test/server-startup/vllmLogParser.py diff --git a/.gitignore b/.gitignore index 72c382291..7862ff172 100644 --- a/.gitignore +++ b/.gitignore @@ -94,3 +94,7 @@ perf-test.py values-*.yaml helm/examples + +# perf-test +/perf-test/server-startup/.venv +/perf-test/server-startup/__pycache__/ diff --git a/perf-test/README.md b/perf-test/README.md index 569a98849..76176157e 100644 --- a/perf-test/README.md +++ b/perf-test/README.md @@ -1,95 +1,8 @@ -## Measure VLLM PodStartupLatency +## Measure End-to-End VLLM StartUp Latency -### Prerequisites -- A running Kubernetes (K8s) environment with GPUs +Use the following instructions to compute the e2e latency for a vllm workload in a kubernetes cluster: -In this tutorial, we will use [clusterloader2](https://github.com/kubernetes/perf-tests/tree/master/clusterloader2) tool to measure the VLLM pod startup latency as following: - -#### 1. Clone the following clusterloader2 repo: - - ```bash - git clone -b release-1.31 https://github.com/kubernetes/perf-tests.git - ``` - -#### 2. Configure clusterloader2: - - Starting from a local directory containing this repo, run the following script to set-up your environment: - - a) cd into the `/production-stack/perf-test` directory from your local copy of the vllm production stack repo, for example: - - ```bash - cd $HOME/production-stack/perf-test - ``` - - b) set-up your environment: - - First, set the variable `CL2_DIR` to the path of the subdirectory `clusterloader2/` of the cloned repo in step 1. For example: - - ```bash - export CL2_DIR=$HOME/perf-tests/clusterloader2 - ``` - - Then, run the set-up script as following: - ```bash - ./setup-clusterloader2.sh - ``` - -#### 3. Configure the parameters of your workload: - - a) cd into the load configuration directory. - - ```bash - cd $CL2_DIR/testing/load/ - ``` - - b) configure the parameters to create the workload traffic. - - ```bash - vi vllm-config.yaml - ``` - - More specifically, configure the following parameter: - - - *namespace*: name prefix for the target namespace (e.g., `vllm-test`) - - *deploymentReplicas*: number of VLLM deployment replicas (default value: `1`) - - *podReplicas*: number of pod replicas per deployment (default value: `1`) - - -#### 4. Deploy your first VLLM app workload and measure the PodStartupLatency: - - Use a command of the following form to create the workload. The value given to the `--kubeconfig` flag should be a pathname of the kubeconfig of your k8s cluster. - - ```bash - cd $CL2_DIR - go run cmd/clusterloader.go --testconfig=./testing/load/vllm-config.yaml --kubeconfig=${KUBECONFIG:-$HOME/.kube/config} --provider=local --v=2 - ``` - - At the end of clusterloader output you should see pod startup latency: - - ```console - { - "data": { - "Perc50": 28571.352, - "Perc90": 28571.352, - "Perc99": 28571.352 - }, - "unit": "ms", - "labels": { - "Metric": "pod_startup" - } - }, - ``` - - `pod_startup` measures time since pod was created until it was observed via watch as running. However, this time does not include the time it takes to bring up the vllm server with a model. More precisely, how long it takes for a `running` pod to reach the `ready` state - - You should also see that test succeeded: - - ```console - -------------------------------------------------------------------------------- - Test Finished - Test: ./testing/load/vllm-config.yaml - Status: Success - -------------------------------------------------------------------------------- - ``` +a)[Instructions to Measure VLLM PodStartupLatency ](pod-startup/README.md) +b)[Instructions for Measure VLLM Serve StartupLatency](server-startup/README.md) diff --git a/perf-test/pod-startup/README.md b/perf-test/pod-startup/README.md new file mode 100644 index 000000000..569a98849 --- /dev/null +++ b/perf-test/pod-startup/README.md @@ -0,0 +1,95 @@ +## Measure VLLM PodStartupLatency + +### Prerequisites +- A running Kubernetes (K8s) environment with GPUs + + +In this tutorial, we will use [clusterloader2](https://github.com/kubernetes/perf-tests/tree/master/clusterloader2) tool to measure the VLLM pod startup latency as following: + +#### 1. Clone the following clusterloader2 repo: + + ```bash + git clone -b release-1.31 https://github.com/kubernetes/perf-tests.git + ``` + +#### 2. Configure clusterloader2: + + Starting from a local directory containing this repo, run the following script to set-up your environment: + + a) cd into the `/production-stack/perf-test` directory from your local copy of the vllm production stack repo, for example: + + ```bash + cd $HOME/production-stack/perf-test + ``` + + b) set-up your environment: + + First, set the variable `CL2_DIR` to the path of the subdirectory `clusterloader2/` of the cloned repo in step 1. For example: + + ```bash + export CL2_DIR=$HOME/perf-tests/clusterloader2 + ``` + + Then, run the set-up script as following: + ```bash + ./setup-clusterloader2.sh + ``` + +#### 3. Configure the parameters of your workload: + + a) cd into the load configuration directory. + + ```bash + cd $CL2_DIR/testing/load/ + ``` + + b) configure the parameters to create the workload traffic. + + ```bash + vi vllm-config.yaml + ``` + + More specifically, configure the following parameter: + + - *namespace*: name prefix for the target namespace (e.g., `vllm-test`) + - *deploymentReplicas*: number of VLLM deployment replicas (default value: `1`) + - *podReplicas*: number of pod replicas per deployment (default value: `1`) + + +#### 4. Deploy your first VLLM app workload and measure the PodStartupLatency: + + Use a command of the following form to create the workload. The value given to the `--kubeconfig` flag should be a pathname of the kubeconfig of your k8s cluster. + + ```bash + cd $CL2_DIR + go run cmd/clusterloader.go --testconfig=./testing/load/vllm-config.yaml --kubeconfig=${KUBECONFIG:-$HOME/.kube/config} --provider=local --v=2 + ``` + + At the end of clusterloader output you should see pod startup latency: + + ```console + { + "data": { + "Perc50": 28571.352, + "Perc90": 28571.352, + "Perc99": 28571.352 + }, + "unit": "ms", + "labels": { + "Metric": "pod_startup" + } + }, + ``` + + `pod_startup` measures time since pod was created until it was observed via watch as running. However, this time does not include the time it takes to bring up the vllm server with a model. More precisely, how long it takes for a `running` pod to reach the `ready` state + + You should also see that test succeeded: + + ```console + -------------------------------------------------------------------------------- + Test Finished + Test: ./testing/load/vllm-config.yaml + Status: Success + -------------------------------------------------------------------------------- + ``` + diff --git a/perf-test/setup-clusterloader2.sh b/perf-test/pod-startup/setup-clusterloader2.sh similarity index 100% rename from perf-test/setup-clusterloader2.sh rename to perf-test/pod-startup/setup-clusterloader2.sh diff --git a/perf-test/vllm-config.yaml b/perf-test/pod-startup/vllm-config.yaml similarity index 100% rename from perf-test/vllm-config.yaml rename to perf-test/pod-startup/vllm-config.yaml diff --git a/perf-test/vllm-deployment.yaml b/perf-test/pod-startup/vllm-deployment.yaml similarity index 100% rename from perf-test/vllm-deployment.yaml rename to perf-test/pod-startup/vllm-deployment.yaml diff --git a/perf-test/vllm-pvc.yaml b/perf-test/pod-startup/vllm-pvc.yaml similarity index 100% rename from perf-test/vllm-pvc.yaml rename to perf-test/pod-startup/vllm-pvc.yaml diff --git a/perf-test/vllm-service.yaml b/perf-test/pod-startup/vllm-service.yaml similarity index 100% rename from perf-test/vllm-service.yaml rename to perf-test/pod-startup/vllm-service.yaml diff --git a/perf-test/server-startup/README.md b/perf-test/server-startup/README.md new file mode 100644 index 000000000..33c8597c6 --- /dev/null +++ b/perf-test/server-startup/README.md @@ -0,0 +1,81 @@ +## Measure VLLM Server StartupLatency + + +### Prerequisites: +- A running Kubernetes (K8s) environment with GPUs +- [python3](https://www.python.org/downloads/) with all the dependencies listed [here](requirements.txt) installed. We recommend to create a python virtual environment `.venv` under `perf-test/server-startup`, for example: + +```bash +cd perf-test/server-startup +python3 -m venv .venv +. .venv/bin/activate +pip3 install -r requirements.txt +``` + +In this tutorial, we will compute the breakdown of the e2e latency for a VLLM server running in a Kubernetes cluster as following: + +### Steps + +1. Open a new terminal and cd into the `perf-test/server-startup` directory from your local copy of this repo repo, for example: + + ```bash + cd $HOME/production-stack/perf-test/server-startup + ``` + + Then, run the metrics collection script: + + ```bash + python3 vllm-serverStartupLatency.py + ``` + + For example: + + ```bash + python3 vllm-serverStartupLatency.py $HOME/.kube/config wec1 its1 cluster1 1 $HOME/data + ``` + + Below is a detailed explanation of the input parameters: + - `kubeconfig`: path to the kubeconfig file, e.g., `$HOME/.kube/config` + - `k8s-context-name`: name of the context for the k8s cluster, e.g., `wec1` + - `pod-label-selector`: label of the vllm pods, e.g., `environment=test` + - `namespace`: namespace for the vllm pods, e.g., `vllm-test` + - `output-directory`: path to the directory for the output data files, e.g., `$HOME/data` + + + The input parameter `kubeconfig` and `k8s-context-name` are optional. Setting both parameters to `None`, we will use the current . For example: + + ```bash + python3 metrics_collector.py None None its1 cluster1 1 $HOME/data + ``` + + The generated output from the script is tab-delimited file named `vllm-server-startup-latency.txt` with the following structure: + + ```console + + ``` + + For example: + + ```bash + cd $HOME/data + cat vllm-server-startup-latency.txt + ``` + + Sample output: + + ```console + vllm-opt125m-deployment-vllm-xxx-yyy + ``` + +2. Clean up the generated workload Kubernetes API objects from your cluster: + + ```bash + kubectl -n delete pods -l + ``` + + For example: + + ```console + kubectl -n vllm-test delete pods -l environment=test + ``` + diff --git a/perf-test/server-startup/requirements.txt b/perf-test/server-startup/requirements.txt new file mode 100644 index 000000000..7c74298e4 --- /dev/null +++ b/perf-test/server-startup/requirements.txt @@ -0,0 +1 @@ +kubernetes==30.1.0 \ No newline at end of file diff --git a/perf-test/server-startup/vllm-serverStartupLatency.py b/perf-test/server-startup/vllm-serverStartupLatency.py new file mode 100644 index 000000000..3d0c45f14 --- /dev/null +++ b/perf-test/server-startup/vllm-serverStartupLatency.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 + +import os +import kubernetes +from kubernetes import client, config +from kubernetes.client.rest import ApiException +import re +from vllmLogParser import * + + +class Collector(): + def __init__(self, kubeconfig=None, k8s_context=None): + self.kubeconfig = kubeconfig + self.context = k8s_context + self.core_v1_api, self.app_v1_api, self.custom_objects_api = self.load_kubeconfig(kubeconfig, k8s_context) + + def load_kubeconfig(self, kubeconfig, context): + + if kubeconfig != None and context == None: + config.load_kube_config(config_file=kubeconfigg) + elif kubeconfig != None and context != None: + config.load_kube_config(config_file=kubeconfig, context=context) + else: + config.load_kube_config() + + api_client = kubernetes.client.ApiClient() + core_v1_api = kubernetes.client.CoreV1Api(api_client) + app_v1_api = kubernetes.client.AppsV1Api(api_client) + custom_objects_api = kubernetes.client.CustomObjectsApi(api_client) + + return core_v1_api, app_v1_api, custom_objects_api + + + def read_pod_logs(self, pod_name, namespace="default"): + + try: + logs = self.core_v1_api.read_namespaced_pod_log(name=pod_name, namespace=namespace) + return logs + + except client.exceptions.ApiException as e: + print(f"Error reading logs: {e}") + return None + + + def find_pod_by_label(self, label_selector, namespace="default"): + + pods = self.core_v1_api.list_namespaced_pod(namespace, label_selector=label_selector).items + return pods + + +if __name__=="__main__": + + kubeconfig = str(sys.argv[1]) # path to the kubeconfig file (e.g., "kscore-config) + k8s_context = str(sys.argv[2]) # name of the k8s cluster context (e.g., 'wec1') + label_selector = str(sys.argv[3]) # vllm pod label selector (e.g, 'environment=test') + namespace = str(sys.argv[4]) # vllm pod namespace (e.g., `vllm-test`) + output_dir = str(sys.argv[5]) # path to the directory for the output files (e.g., $HOME/data/) + + c = Collector() + pods = c.find_pod_by_label(label_selector, namespace) + + fname = "vllm-server-startup-latency.txt" + fout = open(output_dir + fname, "w") + + if pods: + for pod in pods: + name = pod.metadata.name + + # Check if the pod is running and condition status is 'ready' + if pod.status.phase == "Running" and any(cond.status == "True" for cond in pod.status.conditions if cond.type == "Ready"): + print("Pod is running and condition status is 'ready': ", name) + else: + print("Pod is not running or condition status is not 'ready': ", name) + + pod_logs = c.read_pod_logs(name, namespace) + + # Compute + if pod_logs: + temp_logs = pod_logs.splitlines() + print("Extracting CUDA graph instantiation latency ...") + t1 = get_graph_capture_time(temp_logs) + + print("Extracting memory profile latency ...") + t2 = get_memory_profile_time(temp_logs) + + print('--------------------------------------') + fout.write(name + "\t" + t1 + "\t" + t2 + "\n") + fout.flush() + else: + print("No pods found with label: ", label_selector) diff --git a/perf-test/server-startup/vllmLogParser.py b/perf-test/server-startup/vllmLogParser.py new file mode 100644 index 000000000..b85ef2283 --- /dev/null +++ b/perf-test/server-startup/vllmLogParser.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +import re + + +# Extract CUDA graph instantiation latency +def get_graph_capture_time(logs): + t = 0 + pattern = "Graph capturing finished" + + for line in logs: + sentence = line.strip("\n") + match = re.search(pattern, sentence) + + if match: + new_sentence=sentence.split("]") + match = re.findall(r"-?\d+\.\d+|-?\d+", new_sentence[1]) # The regex pattern matches one or more digits (\d+) + + if match: + t = match[0] + break + else: + continue + else: + continue + return t + +# Extract memory profile latency +def get_memory_profile_time(logs): + t = 0 + pattern = "Memory profiling takes" + + for line in logs: + sentence = line.strip("\n") + match = re.search(pattern, sentence) + + if match: + new_sentence=sentence.split("]") + match = re.findall(r"-?\d+\.\d+|-?\d+", new_sentence[1]) # The regex pattern matches one or more digits (\d+) + + if match: + t = match[0] + break + else: + continue + else: + continue + return t + From d2825e2f3e46e147b811c30a64ffc30400ed60a4 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Tue, 11 Feb 2025 10:11:48 -0500 Subject: [PATCH 03/21] fixing a typo in the README Signed-off-by: Braulio Dumba --- perf-test/server-startup/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-test/server-startup/README.md b/perf-test/server-startup/README.md index 33c8597c6..665ad155f 100644 --- a/perf-test/server-startup/README.md +++ b/perf-test/server-startup/README.md @@ -31,7 +31,7 @@ In this tutorial, we will compute the breakdown of the e2e latency for a VLLM se For example: ```bash - python3 vllm-serverStartupLatency.py $HOME/.kube/config wec1 its1 cluster1 1 $HOME/data + python3 vllm-serverStartupLatency.py $HOME/.kube/config wec1 environment=test vllm-test $HOME/data ``` Below is a detailed explanation of the input parameters: From b12905f4cd2f62c27d86fdb4f7e649bad8f84e94 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Tue, 11 Feb 2025 10:14:34 -0500 Subject: [PATCH 04/21] fixing a new typo in the README Signed-off-by: Braulio Dumba --- perf-test/server-startup/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/perf-test/server-startup/README.md b/perf-test/server-startup/README.md index 665ad155f..a2841a365 100644 --- a/perf-test/server-startup/README.md +++ b/perf-test/server-startup/README.md @@ -42,10 +42,10 @@ In this tutorial, we will compute the breakdown of the e2e latency for a VLLM se - `output-directory`: path to the directory for the output data files, e.g., `$HOME/data` - The input parameter `kubeconfig` and `k8s-context-name` are optional. Setting both parameters to `None`, we will use the current . For example: + The input parameter `kubeconfig` and `k8s-context-name` are optional. Setting both parameters to `None`, we will use the current context set in the kubeconfig file set by the `KUBECONFIG` env variable. For example: ```bash - python3 metrics_collector.py None None its1 cluster1 1 $HOME/data + python3 vllm-serverStartupLatency.py None None environment=test vllm-test $HOME/data ``` The generated output from the script is tab-delimited file named `vllm-server-startup-latency.txt` with the following structure: From a5794d29c427707f00ccc593b6a2cf669807bb74 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Tue, 11 Feb 2025 13:27:44 -0500 Subject: [PATCH 05/21] Adding more breakdown of time collection Signed-off-by: Braulio Dumba --- perf-test/server-startup/README.md | 4 +- .../vllm-serverStartupLatency.py | 20 ++- perf-test/server-startup/vllmLogParser.py | 138 ++++++++++++++++++ 3 files changed, 154 insertions(+), 8 deletions(-) diff --git a/perf-test/server-startup/README.md b/perf-test/server-startup/README.md index a2841a365..d761cac26 100644 --- a/perf-test/server-startup/README.md +++ b/perf-test/server-startup/README.md @@ -51,7 +51,7 @@ In this tutorial, we will compute the breakdown of the e2e latency for a VLLM se The generated output from the script is tab-delimited file named `vllm-server-startup-latency.txt` with the following structure: ```console - + ``` For example: @@ -64,7 +64,7 @@ In this tutorial, we will compute the breakdown of the e2e latency for a VLLM se Sample output: ```console - vllm-opt125m-deployment-vllm-xxx-yyy + vllm-opt125m-deployment-vllm-xxx-yyy ``` 2. Clean up the generated workload Kubernetes API objects from your cluster: diff --git a/perf-test/server-startup/vllm-serverStartupLatency.py b/perf-test/server-startup/vllm-serverStartupLatency.py index 3d0c45f14..9aabde53b 100644 --- a/perf-test/server-startup/vllm-serverStartupLatency.py +++ b/perf-test/server-startup/vllm-serverStartupLatency.py @@ -5,6 +5,7 @@ from kubernetes import client, config from kubernetes.client.rest import ApiException import re +import sys from vllmLogParser import * @@ -60,7 +61,7 @@ def find_pod_by_label(self, label_selector, namespace="default"): pods = c.find_pod_by_label(label_selector, namespace) fname = "vllm-server-startup-latency.txt" - fout = open(output_dir + fname, "w") + fout = open(output_dir + "/" + fname, "w") if pods: for pod in pods: @@ -74,17 +75,24 @@ def find_pod_by_label(self, label_selector, namespace="default"): pod_logs = c.read_pod_logs(name, namespace) - # Compute + # Compute the breakdow of the e2e startup latency for the VLLM server if pod_logs: temp_logs = pod_logs.splitlines() + + print("Extracting engine initalization latency ...") + t1 = get_engine_init_time(temp_logs) + + print("Extracting Model Loading latency ...") + t2 = get_model_load_time(temp_logs) + print("Extracting CUDA graph instantiation latency ...") - t1 = get_graph_capture_time(temp_logs) + t3 = get_graph_capture_time(temp_logs) - print("Extracting memory profile latency ...") - t2 = get_memory_profile_time(temp_logs) + print("Extracting API Server Init latency ...") + t4 = get_apiserver_init_time(temp_logs) print('--------------------------------------') - fout.write(name + "\t" + t1 + "\t" + t2 + "\n") + fout.write(name + "\t" + str(t1) + "\t" + str(t2) + "\t" + str(t3) + "\t" + str(t4) + "\n") fout.flush() else: print("No pods found with label: ", label_selector) diff --git a/perf-test/server-startup/vllmLogParser.py b/perf-test/server-startup/vllmLogParser.py index b85ef2283..ee5959201 100644 --- a/perf-test/server-startup/vllmLogParser.py +++ b/perf-test/server-startup/vllmLogParser.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 import re +from datetime import datetime # Extract CUDA graph instantiation latency @@ -24,6 +25,7 @@ def get_graph_capture_time(logs): continue return t + # Extract memory profile latency def get_memory_profile_time(logs): t = 0 @@ -46,3 +48,139 @@ def get_memory_profile_time(logs): continue return t + +# Extract memory profile latency +def get_model_weight_time(logs): + t = 0 + pattern = "Time took to download weights for" + + for line in logs: + sentence = line.strip("\n") + match = re.search(pattern, sentence) + + if match: + new_sentence=(sentence.split("]")[1]).split(":") + match = re.findall(r"-?\d+\.\d+|-?\d+", new_sentence[1]) # The regex pattern matches one or more digits (\d+) + + if match: + t = match[0] + break + else: + continue + else: + continue + return t + + +# Extract Engine Initialization +def get_engine_init_time(logs): + pattern1 = "Automatically detected platform cuda." + pattern2 = "Starting to load model" + + t = 0 + m1=False + m2=False + + for line in logs: + sentence = line.strip("\n") + match_1 = re.search(pattern1, sentence) + match_2 = re.search(pattern2, sentence) + + if match_1 and not m1: + t1 = sentence.split(" ")[2] + m1=True + + elif match_2 and not m2: + t2 = sentence.split(" ")[2] + m2=True + + else: + continue + + # compute the time + if m1 and m2: + format_string = "%H:%M:%S" + d1 = datetime.strptime(t1, format_string) + d2 = datetime.strptime(t2, format_string) + delta = d2 - d1 + t = delta.seconds + break + + return t + + +# Extract Model Loading latency +def get_model_load_time(logs): + pattern1 = "Starting to load model" + pattern2 = "Capturing cudagraphs for decoding" + + t = 0 + m1=False + m2=False + + for line in logs: + sentence = line.strip("\n") + match_1 = re.search(pattern1, sentence) + match_2 = re.search(pattern2, sentence) + + if match_1 and not m1: + t1 = sentence.split(" ")[2] + m1=True + print("Match 1") + print(t1) + + elif match_2 and not m2: + t2 = sentence.split(" ")[2] + m2=True + print("Match 2") + print(t2) + + else: + continue + + # compute the time + if m1 and m2: + format_string = "%H:%M:%S" + d1 = datetime.strptime(t1, format_string) + d2 = datetime.strptime(t2, format_string) + delta = d2 - d1 + t = delta.seconds + break + + print("Duration: ", t) + return t + + +def get_apiserver_init_time (logs): + pattern1 = "init engine" + pattern2 = "Route: /invocations, Methods: POST" + + t = 0 + m1=False + m2=False + + for line in logs: + sentence = line.strip("\n") + match_1 = re.search(pattern1, sentence) + match_2 = re.search(pattern2, sentence) + + if match_1 and not m1: + t1 = sentence.split(" ")[2] + m1=True + + elif match_2 and not m2: + t2 = sentence.split(" ")[2] + m2=True + else: + continue + + # compute the time + if m1 and m2: + format_string = "%H:%M:%S" + d1 = datetime.strptime(t1, format_string) + d2 = datetime.strptime(t2, format_string) + delta = d2 - d1 + t = delta.seconds + break + + return t \ No newline at end of file From def0c600ac7bd24ecc5e2a2e8a869880ad869f1b Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Tue, 11 Feb 2025 13:33:44 -0500 Subject: [PATCH 06/21] fixing a typo Signed-off-by: Braulio Dumba --- perf-test/server-startup/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-test/server-startup/README.md b/perf-test/server-startup/README.md index d761cac26..6810aeee9 100644 --- a/perf-test/server-startup/README.md +++ b/perf-test/server-startup/README.md @@ -64,7 +64,7 @@ In this tutorial, we will compute the breakdown of the e2e latency for a VLLM se Sample output: ```console - vllm-opt125m-deployment-vllm-xxx-yyy + vllm-opt125m-deployment-vllm-xxx-yyy 17 8 16 0 ``` 2. Clean up the generated workload Kubernetes API objects from your cluster: From e93505f8bceb5fc75ac3d57cd410e904e822fa03 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Tue, 11 Feb 2025 13:53:06 -0500 Subject: [PATCH 07/21] fixing a typo Signed-off-by: Braulio Dumba --- perf-test/server-startup/vllmLogParser.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/perf-test/server-startup/vllmLogParser.py b/perf-test/server-startup/vllmLogParser.py index ee5959201..e38fbf45d 100644 --- a/perf-test/server-startup/vllmLogParser.py +++ b/perf-test/server-startup/vllmLogParser.py @@ -105,7 +105,6 @@ def get_engine_init_time(logs): delta = d2 - d1 t = delta.seconds break - return t @@ -146,8 +145,6 @@ def get_model_load_time(logs): delta = d2 - d1 t = delta.seconds break - - print("Duration: ", t) return t @@ -182,5 +179,4 @@ def get_apiserver_init_time (logs): delta = d2 - d1 t = delta.seconds break - return t \ No newline at end of file From 5088339dea208d1ab61c3d6ac6e613c5bd52535f Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Tue, 11 Feb 2025 13:56:32 -0500 Subject: [PATCH 08/21] latest Signed-off-by: Braulio Dumba --- perf-test/server-startup/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/perf-test/server-startup/README.md b/perf-test/server-startup/README.md index 6810aeee9..7460ca623 100644 --- a/perf-test/server-startup/README.md +++ b/perf-test/server-startup/README.md @@ -54,6 +54,8 @@ In this tutorial, we will compute the breakdown of the e2e latency for a VLLM se ``` + The unit of time for each value is `seconds`. + For example: ```bash From 6eb7e4115eca89a8c32e13da4462222c9ef4c4bf Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Tue, 11 Feb 2025 14:02:49 -0500 Subject: [PATCH 09/21] fixing a typo Signed-off-by: Braulio Dumba --- perf-test/server-startup/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-test/server-startup/README.md b/perf-test/server-startup/README.md index 7460ca623..5017c72e1 100644 --- a/perf-test/server-startup/README.md +++ b/perf-test/server-startup/README.md @@ -54,7 +54,7 @@ In this tutorial, we will compute the breakdown of the e2e latency for a VLLM se ``` - The unit of time for each value is `seconds`. + Also, the unit of measurement for each value is `seconds` in the generated output file, except for the value in the first colum which corresponds to the VLLM pod name. For example: From df3cd712c698333f9e34cdffc5a551c55a3e1745 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Tue, 11 Feb 2025 19:21:47 -0500 Subject: [PATCH 10/21] removing debug print statements Signed-off-by: Braulio Dumba --- perf-test/server-startup/vllmLogParser.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/perf-test/server-startup/vllmLogParser.py b/perf-test/server-startup/vllmLogParser.py index e38fbf45d..aea681e02 100644 --- a/perf-test/server-startup/vllmLogParser.py +++ b/perf-test/server-startup/vllmLogParser.py @@ -89,11 +89,9 @@ def get_engine_init_time(logs): if match_1 and not m1: t1 = sentence.split(" ")[2] m1=True - elif match_2 and not m2: t2 = sentence.split(" ")[2] m2=True - else: continue @@ -125,15 +123,9 @@ def get_model_load_time(logs): if match_1 and not m1: t1 = sentence.split(" ")[2] m1=True - print("Match 1") - print(t1) - elif match_2 and not m2: t2 = sentence.split(" ")[2] m2=True - print("Match 2") - print(t2) - else: continue @@ -164,7 +156,6 @@ def get_apiserver_init_time (logs): if match_1 and not m1: t1 = sentence.split(" ")[2] m1=True - elif match_2 and not m2: t2 = sentence.split(" ")[2] m2=True From 2980e5d834a250808659996bfdd487dd20353fa4 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Thu, 13 Feb 2025 13:04:55 -0500 Subject: [PATCH 11/21] latest Signed-off-by: Braulio Dumba --- deploy/sample-vllm-deployment.yaml | 99 ++++++++++++++++++++++++++++++ deploy/sample-vllm-pvc.yaml | 11 ++++ 2 files changed, 110 insertions(+) create mode 100644 deploy/sample-vllm-deployment.yaml create mode 100644 deploy/sample-vllm-pvc.yaml diff --git a/deploy/sample-vllm-deployment.yaml b/deploy/sample-vllm-deployment.yaml new file mode 100644 index 000000000..816dfff3c --- /dev/null +++ b/deploy/sample-vllm-deployment.yaml @@ -0,0 +1,99 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-granite-3-0-2b-instruct + namespace: serverless-workstream +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app: vllm-granite + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: "100%" + maxUnavailable: "0%" + template: + metadata: + labels: + app: vllm-granite + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nvidia.com/gpu.product + operator: In + values: + - NVIDIA-L40S + containers: + - name: vllm + image: vllm/vllm-openai:latest + imagePullPolicy: IfNotPresent + command: + - vllm + - serve + - "ibm-granite/granite-3.0-3b-a800m-instruct" + - --host + - "0.0.0.0" + - --port + - "8000" + env: + - name: HF_HOME + value: "/data" + - name: XDG_CONFIG_HOME + value: "/data/vllm" + - name: TRITON_CACHE_DIR + value: "/data/triton" + - name: TORCH_HOME + value: "/data/torch" + - name: XDG_CACHE_HOME + value: "/data/cache/vllm" + ports: + - containerPort: 8000 + name: container-port + protocol: TCP + livenessProbe: + httpGet: + path: /health + port: 8000 + scheme: HTTP + initialDelaySeconds: 15 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: /health + port: 8000 + scheme: HTTP + initialDelaySeconds: 15 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 60 + resources: + limits: + cpu: "10" + memory: 16Gi + nvidia.com/gpu: "1" + requests: + cpu: "10" + memory: 16Gi + nvidia.com/gpu: "1" + securityContext: + runAsNonRoot: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - name: vllm-storage + mountPath: /data + restartPolicy: Always + terminationGracePeriodSeconds: 30 + volumes: + - name: vllm-storage + persistentVolumeClaim: + claimName: vllm-cache-pvc2 \ No newline at end of file diff --git a/deploy/sample-vllm-pvc.yaml b/deploy/sample-vllm-pvc.yaml new file mode 100644 index 000000000..6dc438895 --- /dev/null +++ b/deploy/sample-vllm-pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: vllm-cache-pvc2 + namespace: serverless-workstream +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 15Gi \ No newline at end of file From 571743b7343cde8fc8ed236b49db5d9c82b22777 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Thu, 13 Feb 2025 13:09:49 -0500 Subject: [PATCH 12/21] latest Signed-off-by: Braulio Dumba --- deploy/sample-vllm-deployment.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deploy/sample-vllm-deployment.yaml b/deploy/sample-vllm-deployment.yaml index 816dfff3c..2e95fd390 100644 --- a/deploy/sample-vllm-deployment.yaml +++ b/deploy/sample-vllm-deployment.yaml @@ -50,7 +50,9 @@ spec: - name: TORCH_HOME value: "/data/torch" - name: XDG_CACHE_HOME - value: "/data/cache/vllm" + value: "/data/cache" + - name: VLLM_USE_V1 + value: "1" ports: - containerPort: 8000 name: container-port From 819ae5107f924f96e74036a8d19803a40f766d72 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Thu, 13 Feb 2025 21:48:36 -0500 Subject: [PATCH 13/21] latest Signed-off-by: Braulio Dumba --- perf-test/server-startup/README.md | 39 +++- .../vllm-serverStartupLatency.py | 72 ++++-- perf-test/server-startup/vllmLogParser.py | 216 +++++++++++++----- 3 files changed, 249 insertions(+), 78 deletions(-) diff --git a/perf-test/server-startup/README.md b/perf-test/server-startup/README.md index 5017c72e1..9fd0b4e81 100644 --- a/perf-test/server-startup/README.md +++ b/perf-test/server-startup/README.md @@ -48,13 +48,13 @@ In this tutorial, we will compute the breakdown of the e2e latency for a VLLM se python3 vllm-serverStartupLatency.py None None environment=test vllm-test $HOME/data ``` - The generated output from the script is tab-delimited file named `vllm-server-startup-latency.txt` with the following structure: + The generated output from the script are two files. The first is a tab-delimited file named `vllm-server-startup-latency.txt` with the following structure: ```console - + ``` - Also, the unit of measurement for each value is `seconds` in the generated output file, except for the value in the first colum which corresponds to the VLLM pod name. + Also, the unit of measurement for each value is `seconds` in the generated output file, except for the value in the first colum which corresponds to the VLLM pod name, and the `` which has unit of GB. For example: @@ -66,9 +66,40 @@ In this tutorial, we will compute the breakdown of the e2e latency for a VLLM se Sample output: ```console - vllm-opt125m-deployment-vllm-xxx-yyy 17 8 16 0 + vllm-granite-3-0-2b-instruct-6f9cb88444-2czv 13 14 6.1501 2.97 30.03 18 0 ``` + The second file contains the logs of the vllm pods. For example: + + ```bash + cat vllm-granite-3-0-2b-instruct-6f9cb88444-2czvd-log.txt + ``` + + Sample output: + ``` bash + INFO 02-13 15:01:07 gpu_model_runner.py:872] Loading model weights took 6.1501 GB + INFO 02-13 15:01:13 backends.py:579] Using cache directory: /data/cache/vllm/torch_compile_cache/02bf430320/rank_0 for vLLM's torch.compile + INFO 02-13 15:01:13 backends.py:587] Dynamo bytecode transform time: 6.77 s + INFO 02-13 15:01:16 backends.py:311] Cache the graph of shape None for later use + INFO 02-13 15:01:37 backends.py:323] Compiling a graph for general shape takes 23.26 s + WARNING 02-13 15:01:39 fused_moe.py:806] Using default MoE config. Performance might be sub-optimal! Config file not found at /usr/local/lib/python3.12/dist-packages/vllm/model_executor/layers/fused_moe/configs/E=40,N=512,device_name=NVIDIA_L40S.json + INFO 02-13 15:01:40 monitor.py:33] torch.compile takes 30.03 s in total + INFO 02-13 15:01:40 kv_cache_utils.py:407] # GPU blocks: 33660 + INFO 02-13 15:01:40 kv_cache_utils.py:410] Maximum concurrency for 4096 tokens per request: 131.48x + INFO 02-13 15:01:59 gpu_model_runner.py:1043] Graph capturing finished in 18 secs, took 0.62 GiB + INFO 02-13 15:01:59 core.py:91] init engine (profile, create kv cache, warmup model) took 51.89 seconds + INFO 02-13 15:01:59 api_server.py:756] Using supplied chat template:^M + INFO 02-13 15:01:59 api_server.py:756] None + INFO 02-13 15:01:59 launcher.py:21] Available routes are: + INFO 02-13 15:01:59 launcher.py:29] Route: /openapi.json, Methods: HEAD, GET + INFO 02-13 15:01:59 launcher.py:29] Route: /docs, Methods: HEAD, GET + INFO 02-13 15:01:59 launcher.py:29] Route: /docs/oauth2-redirect, Methods: HEAD, GET + INFO 02-13 15:01:59 launcher.py:29] Route: /redoc, Methods: HEAD, GET + INFO 02-13 15:01:59 launcher.py:29] Route: /health, Methods: GET + INFO 02-13 15:01:59 launcher.py:29] Route: /ping, Methods: GET, POST + ``` + + 2. Clean up the generated workload Kubernetes API objects from your cluster: ```bash diff --git a/perf-test/server-startup/vllm-serverStartupLatency.py b/perf-test/server-startup/vllm-serverStartupLatency.py index 9aabde53b..73a4a2b8d 100644 --- a/perf-test/server-startup/vllm-serverStartupLatency.py +++ b/perf-test/server-startup/vllm-serverStartupLatency.py @@ -6,6 +6,7 @@ from kubernetes.client.rest import ApiException import re import sys +import pandas as pd from vllmLogParser import * @@ -33,7 +34,6 @@ def load_kubeconfig(self, kubeconfig, context): def read_pod_logs(self, pod_name, namespace="default"): - try: logs = self.core_v1_api.read_namespaced_pod_log(name=pod_name, namespace=namespace) return logs @@ -44,11 +44,26 @@ def read_pod_logs(self, pod_name, namespace="default"): def find_pod_by_label(self, label_selector, namespace="default"): - pods = self.core_v1_api.list_namespaced_pod(namespace, label_selector=label_selector).items return pods + def get_pod_readiness_time(self, pod_name, namespace="default"): + for cond in pod.status.conditions: + if cond.type == "Ready": + t = cond.last_transition_time + return t + + # def text_to_csv(text_file_path, csv_file_path, delimiter='\t'): + # try: + # df = pd.read_csv(text_file_path, sep=delimiter) + # df.to_csv(csv_file_path, index=False) + # print(f"Successfully converted '{text_file_path}' to '{csv_file_path}'") + # except FileNotFoundError: + # print(f"Error: Text file '{text_file_path}' not found.") + # except Exception as e: + # print(f"An error occurred: {e}") + if __name__=="__main__": kubeconfig = str(sys.argv[1]) # path to the kubeconfig file (e.g., "kscore-config) @@ -60,8 +75,8 @@ def find_pod_by_label(self, label_selector, namespace="default"): c = Collector() pods = c.find_pod_by_label(label_selector, namespace) - fname = "vllm-server-startup-latency.txt" - fout = open(output_dir + "/" + fname, "w") + fout = open(output_dir + "/vllm-server-startup-latency.txt", "w") + #fout.write("pod_name" + "\t" + "engine_init" + "\t" + "model_loading model_weight_GB" + "\t" + "before_torch_compile" + "\t" + "torch_compile" + "\t" + "CUDA_graph" + "\t" + "API_readiness" + "\n") if pods: for pod in pods: @@ -70,29 +85,46 @@ def find_pod_by_label(self, label_selector, namespace="default"): # Check if the pod is running and condition status is 'ready' if pod.status.phase == "Running" and any(cond.status == "True" for cond in pod.status.conditions if cond.type == "Ready"): print("Pod is running and condition status is 'ready': ", name) - else: - print("Pod is not running or condition status is not 'ready': ", name) - pod_logs = c.read_pod_logs(name, namespace) - - # Compute the breakdow of the e2e startup latency for the VLLM server - if pod_logs: - temp_logs = pod_logs.splitlines() + pod_logs = c.read_pod_logs(name, namespace) + if pod_logs: + # save the logs into a file + f = open(output_dir + "/" + name + "-log.txt", "w") + f.write(pod_logs) + f.close() - print("Extracting engine initalization latency ...") - t1 = get_engine_init_time(temp_logs) + # Compute the breakdow of the e2e startup latency for the VLLM server + temp_logs = pod_logs.splitlines() - print("Extracting Model Loading latency ...") - t2 = get_model_load_time(temp_logs) + print("Extracting engine initalization latency ...") + t1 = get_engine_init_time(temp_logs) - print("Extracting CUDA graph instantiation latency ...") - t3 = get_graph_capture_time(temp_logs) + print("Extracting Model Loading latency ...") + t2 = get_model_load_time(temp_logs) - print("Extracting API Server Init latency ...") - t4 = get_apiserver_init_time(temp_logs) + print("Extracting Model Weight Loading GB latency ...") + t3 = get_model_weight_gb(temp_logs) + + print("Extracting time before torch.compile...") + tx = get_before_torch_compile_time(temp_logs) + + print("Extracting torch.compile time ...") + t5 = get_torch_compile_time(temp_logs) + t4 = round(float(tx) - float(t5), 3) # computing time before torch.compile + + print("Extracting CUDA graph instantiation latency ...") + t6 = get_cuda_graph_time(temp_logs) + + print("Extracting API Server Init latency ...") + t7 = get_apiserver_init_time(temp_logs) + else: + print("Pod is not running or condition status is not 'ready': ", name) + continue print('--------------------------------------') - fout.write(name + "\t" + str(t1) + "\t" + str(t2) + "\t" + str(t3) + "\t" + str(t4) + "\n") + fout.write(name + "\t" + str(t1) + "\t" + str(t2) + "\t" + str(t3) + "\t" + str(t4) + "\t" + str(t5) + "\t" + str(t6) + "\t" + str(t7) + "\n") fout.flush() + fout.close() else: print("No pods found with label: ", label_selector) + diff --git a/perf-test/server-startup/vllmLogParser.py b/perf-test/server-startup/vllmLogParser.py index aea681e02..f23f1aa33 100644 --- a/perf-test/server-startup/vllmLogParser.py +++ b/perf-test/server-startup/vllmLogParser.py @@ -3,33 +3,80 @@ from datetime import datetime -# Extract CUDA graph instantiation latency -def get_graph_capture_time(logs): - t = 0 - pattern = "Graph capturing finished" +# Extract Engine Initialization +def get_engine_init_time(logs): + pattern1 = "Automatically detected platform cuda." + pattern2 = "Starting to load model" + + t = 0 + m1=False + m2=False + for line in logs: sentence = line.strip("\n") - match = re.search(pattern, sentence) + match_1 = re.search(pattern1, sentence) + match_2 = re.search(pattern2, sentence) - if match: - new_sentence=sentence.split("]") - match = re.findall(r"-?\d+\.\d+|-?\d+", new_sentence[1]) # The regex pattern matches one or more digits (\d+) + if match_1 and not m1: + t1 = sentence.split(" ")[2] + m1=True + elif match_2 and not m2: + t2 = sentence.split(" ")[2] + m2=True + else: + continue - if match: - t = match[0] - break - else: - continue + # compute the time + if m1 and m2: + format_string = "%H:%M:%S" + d1 = datetime.strptime(t1, format_string) + d2 = datetime.strptime(t2, format_string) + delta = d2 - d1 + t = delta.seconds + break + return t + + +# Extract Model Loading latency +def get_model_load_time(logs): + pattern1 = "Starting to load model" + pattern2 = "Loading model weights took" + #pattern2 = "Capturing cudagraphs for decoding" + + t = 0 + m1=False + m2=False + + for line in logs: + sentence = line.strip("\n") + match_1 = re.search(pattern1, sentence) + match_2 = re.search(pattern2, sentence) + + if match_1 and not m1: + t1 = sentence.split(" ")[2] + m1=True + elif match_2 and not m2: + t2 = sentence.split(" ")[2] + m2=True else: - continue + continue + + # compute the time + if m1 and m2: + format_string = "%H:%M:%S" + d1 = datetime.strptime(t1, format_string) + d2 = datetime.strptime(t2, format_string) + delta = d2 - d1 + t = delta.seconds + break return t -# Extract memory profile latency -def get_memory_profile_time(logs): +# Extract Model weight loading (GB) +def get_model_weight_gb(logs): t = 0 - pattern = "Memory profiling takes" + pattern = "Loading model weights took" for line in logs: sentence = line.strip("\n") @@ -38,7 +85,7 @@ def get_memory_profile_time(logs): if match: new_sentence=sentence.split("]") match = re.findall(r"-?\d+\.\d+|-?\d+", new_sentence[1]) # The regex pattern matches one or more digits (\d+) - + if match: t = match[0] break @@ -49,17 +96,17 @@ def get_memory_profile_time(logs): return t -# Extract memory profile latency -def get_model_weight_time(logs): +# Extract Torch compile time +def get_torch_compile_time(logs): t = 0 - pattern = "Time took to download weights for" + pattern = "torch.compile takes" for line in logs: sentence = line.strip("\n") match = re.search(pattern, sentence) if match: - new_sentence=(sentence.split("]")[1]).split(":") + new_sentence=sentence.split("]") match = re.findall(r"-?\d+\.\d+|-?\d+", new_sentence[1]) # The regex pattern matches one or more digits (\d+) if match: @@ -72,11 +119,11 @@ def get_model_weight_time(logs): return t -# Extract Engine Initialization -def get_engine_init_time(logs): - pattern1 = "Automatically detected platform cuda." - pattern2 = "Starting to load model" - +# Extract before Torch compile time +def get_before_torch_compile_time(logs): + pattern1 = "Loading model weights took" + pattern2 = "torch.compile takes" + t = 0 m1=False m2=False @@ -106,40 +153,47 @@ def get_engine_init_time(logs): return t -# Extract Model Loading latency -def get_model_load_time(logs): - pattern1 = "Starting to load model" - pattern2 = "Capturing cudagraphs for decoding" - +# Extract CUDA graph instantiation latency +def get_cuda_graph_time(logs): t = 0 - m1=False - m2=False - + pattern = "Graph capturing finished" + for line in logs: sentence = line.strip("\n") - match_1 = re.search(pattern1, sentence) - match_2 = re.search(pattern2, sentence) + match = re.search(pattern, sentence) - if match_1 and not m1: - t1 = sentence.split(" ")[2] - m1=True - elif match_2 and not m2: - t2 = sentence.split(" ")[2] - m2=True - else: - continue + if match: + new_sentence=sentence.split("]") + match = re.findall(r"-?\d+\.\d+|-?\d+", new_sentence[1]) # The regex pattern matches one or more digits (\d+) - # compute the time - if m1 and m2: - format_string = "%H:%M:%S" - d1 = datetime.strptime(t1, format_string) - d2 = datetime.strptime(t2, format_string) - delta = d2 - d1 - t = delta.seconds - break + if match: + t = match[0] + break + else: + continue + else: + continue return t +# # Extract init engine time +# def get_apiserver_init_time (logs): +# d = None +# pattern = "init engine" + +# for line in logs: +# sentence = line.strip("\n") +# match = re.search(pattern, sentence) + +# if match: +# format_string = "%H:%M:%S" +# t = sentence.split(" ")[2] +# d = datetime.strptime(t, format_string) +# else: +# continue +# return d + +# Extract API Readiness time def get_apiserver_init_time (logs): pattern1 = "init engine" pattern2 = "Route: /invocations, Methods: POST" @@ -170,4 +224,58 @@ def get_apiserver_init_time (logs): delta = d2 - d1 t = delta.seconds break - return t \ No newline at end of file + return t + +# Extract memory profile latency +def get_memory_profile_time(logs): + t = 0 + pattern = "Memory profiling takes" + + for line in logs: + sentence = line.strip("\n") + match = re.search(pattern, sentence) + + if match: + new_sentence=sentence.split("]") + match = re.findall(r"-?\d+\.\d+|-?\d+", new_sentence[1]) # The regex pattern matches one or more digits (\d+) + + if match: + t = match[0] + break + else: + continue + else: + continue + return t + + +# Extract memory profile latency +def get_model_weight_time(logs): + t = 0 + pattern = "Time took to download weights for" + + for line in logs: + sentence = line.strip("\n") + match = re.search(pattern, sentence) + + if match: + new_sentence=(sentence.split("]")[1]).split(":") + match = re.findall(r"-?\d+\.\d+|-?\d+", new_sentence[1]) # The regex pattern matches one or more digits (\d+) + + if match: + t = match[0] + break + else: + continue + else: + continue + return t + + +def convert_string_to_datetime(date_string, format_string): + try: + datetime_object = datetime.strptime(date_string, format_string) + return datetime_object + + except ValueError: + return None \ No newline at end of file From c03925ba5fc3b7789d1776dae4b2d8838ab8dc53 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Thu, 13 Feb 2025 21:50:48 -0500 Subject: [PATCH 14/21] latest Signed-off-by: Braulio Dumba --- perf-test/server-startup/vllm-serverStartupLatency.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-test/server-startup/vllm-serverStartupLatency.py b/perf-test/server-startup/vllm-serverStartupLatency.py index 73a4a2b8d..ea3dc82a0 100644 --- a/perf-test/server-startup/vllm-serverStartupLatency.py +++ b/perf-test/server-startup/vllm-serverStartupLatency.py @@ -77,7 +77,7 @@ def get_pod_readiness_time(self, pod_name, namespace="default"): fout = open(output_dir + "/vllm-server-startup-latency.txt", "w") #fout.write("pod_name" + "\t" + "engine_init" + "\t" + "model_loading model_weight_GB" + "\t" + "before_torch_compile" + "\t" + "torch_compile" + "\t" + "CUDA_graph" + "\t" + "API_readiness" + "\n") - + if pods: for pod in pods: name = pod.metadata.name From 072cc198fc0ed369350b01dfc25e400f2cbbde34 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Fri, 14 Feb 2025 00:14:42 -0500 Subject: [PATCH 15/21] latest Signed-off-by: Braulio Dumba --- perf-test/pod-startup/README.md | 2 + perf-test/pod-startup/vllm-config.yaml | 24 ++-- perf-test/pod-startup/vllm-deployment.yaml | 132 ++++++++++++--------- perf-test/pod-startup/vllm-pvc.yaml | 2 +- 4 files changed, 99 insertions(+), 61 deletions(-) diff --git a/perf-test/pod-startup/README.md b/perf-test/pod-startup/README.md index 569a98849..da29cd315 100644 --- a/perf-test/pod-startup/README.md +++ b/perf-test/pod-startup/README.md @@ -53,6 +53,8 @@ In this tutorial, we will use [clusterloader2](https://github.com/kubernetes/per - *namespace*: name prefix for the target namespace (e.g., `vllm-test`) - *deploymentReplicas*: number of VLLM deployment replicas (default value: `1`) + - *modelName*: name of the VLLM model to be served by the instance (default value: `gpt2`) + - *modelRepo*: repo of the LLM model (default value: `openai-community/gpt2`) - *podReplicas*: number of pod replicas per deployment (default value: `1`) diff --git a/perf-test/pod-startup/vllm-config.yaml b/perf-test/pod-startup/vllm-config.yaml index cbd479050..fe9675289 100644 --- a/perf-test/pod-startup/vllm-config.yaml +++ b/perf-test/pod-startup/vllm-config.yaml @@ -1,9 +1,18 @@ -{{$namespace := DefaultParam .namespace "default"}} +# {{$namespace := DefaultParam .namespace "default"}} +# {{$deploymentReplicas:= DefaultParam .deploymentReplicas 1}} +# {{$modelName := DefaultParam .modelName "gpt2"}} +# {{$modelRepo := DefaultParam .modelName "openai-community/gpt2"}} +# {{$podReplicas := DefaultParam .podReplicas "1"}} + +{{$namespace := DefaultParam .namespace "serverless-workstream"}} {{$deploymentReplicas:= DefaultParam .deploymentReplicas 1}} +{{$modelName := DefaultParam .modelName "granite-3-0-2b-instruct"}} +{{$modelRepo := DefaultParam .modelName "ibm-granite/granite-3.0-3b-a800m-instruct"}} {{$podReplicas := DefaultParam .podReplicas "1"}} name: test +automanagedNamespaces: 0 namespace: number: 1 @@ -20,7 +29,7 @@ steps: Params: action: start labelSelector: performance = test - threshold: 300s + threshold: 3600s - Identifier: WaitForControlledPodsRunning Method: WaitForControlledPodsRunning Params: @@ -28,7 +37,7 @@ steps: apiVersion: apps/v1 kind: Deployment labelSelector: performance = test - operationTimeout: 300s + operationTimeout: 3600s - name: Create VLLM deployment phases: - NamespaceList: @@ -36,14 +45,15 @@ steps: replicasPerNamespace: {{$deploymentReplicas}} tuningSet: Uniform1qps objectBundle: - - basename: vllm-storage-claim + - basename: {{$modelName}} objectTemplatePath: "vllm-pvc.yaml" - - basename: vllm-deployment + - basename: {{$modelName}} objectTemplatePath: "vllm-deployment.yaml" templateFillMap: podReplicas: {{$podReplicas}} - claimName: "vllm-storage-claim" - - basename: vllm-svc + claimName: {{$modelName}} + modelRepo: {{$modelRepo}} + - basename: {{$modelName}} objectTemplatePath: "vllm-service.yaml" - name: Wait for pods to be running measurements: diff --git a/perf-test/pod-startup/vllm-deployment.yaml b/perf-test/pod-startup/vllm-deployment.yaml index c8594c0d5..c2d77985d 100644 --- a/perf-test/pod-startup/vllm-deployment.yaml +++ b/perf-test/pod-startup/vllm-deployment.yaml @@ -8,70 +8,96 @@ metadata: performance: test spec: replicas: {{.podReplicas}} - strategy: - rollingUpdate: - maxSurge: 100% - maxUnavailable: 0 + revisionHistoryLimit: 10 selector: matchLabels: - environment: test - release: test - progressDeadlineSeconds: 1200 + app: vllm-granite + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: "100%" + maxUnavailable: "0%" template: metadata: labels: - environment: test - release: test - performance: test + app: vllm-granite spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nvidia.com/gpu.product + operator: In + values: + - NVIDIA-L40S containers: - - name: "vllm" - image: "vllm/vllm-openai:latest" - - command: - - "vllm" - - "serve" - - "openai-community/gpt2" - - "--host" + - name: vllm + image: vllm/vllm-openai:latest + imagePullPolicy: IfNotPresent + command: + - vllm + - serve + - {{.modelRepo}} + - --host - "0.0.0.0" - - "--port" + - --port - "8000" - securityContext: - runAsNonRoot: false - imagePullPolicy: IfNotPresent - env: - - name: HF_HOME - value: /data - ports: - - name: "container-port" - containerPort: 8000 - startupProbe: - failureThreshold: 60 - httpGet: - path: /health - port: 8000 - initialDelaySeconds: 15 - periodSeconds: 10 - livenessProbe: - failureThreshold: 3 - httpGet: - path: /health - port: 8000 - initialDelaySeconds: 15 - periodSeconds: 10 - resources: - requests: - memory: "16Gi" - cpu: "6" - nvidia.com/gpu: "1" - limits: - memory: "16Gi" - cpu: "6" - nvidia.com/gpu: "1" - volumeMounts: + env: + - name: HF_HOME + value: "/data" + - name: XDG_CONFIG_HOME + value: "/data/vllm" + - name: TRITON_CACHE_DIR + value: "/data/triton" + - name: TORCH_HOME + value: "/data/torch" + - name: XDG_CACHE_HOME + value: "/data/cache" + - name: VLLM_USE_V1 + value: "1" + ports: + - containerPort: 8000 + name: container-port + protocol: TCP + livenessProbe: + httpGet: + path: /health + port: 8000 + scheme: HTTP + initialDelaySeconds: 15 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: /health + port: 8000 + scheme: HTTP + initialDelaySeconds: 15 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 60 + resources: + limits: + cpu: "10" + memory: 16Gi + nvidia.com/gpu: "1" + requests: + cpu: "10" + memory: 16Gi + nvidia.com/gpu: "1" + securityContext: + runAsNonRoot: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: - name: vllm-storage mountPath: /data - + restartPolicy: Always + terminationGracePeriodSeconds: 30 volumes: - name: vllm-storage persistentVolumeClaim: diff --git a/perf-test/pod-startup/vllm-pvc.yaml b/perf-test/pod-startup/vllm-pvc.yaml index a5e79217a..950fdf88f 100644 --- a/perf-test/pod-startup/vllm-pvc.yaml +++ b/perf-test/pod-startup/vllm-pvc.yaml @@ -9,4 +9,4 @@ spec: - ReadWriteOnce resources: requests: - storage: 10Gi + storage: 15Gi \ No newline at end of file From a0808aa12c8cfaef3c79aa38d01c0bc8f8c8033c Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Fri, 14 Feb 2025 00:16:54 -0500 Subject: [PATCH 16/21] latest Signed-off-by: Braulio Dumba --- perf-test/server-startup/vllm-serverStartupLatency.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-test/server-startup/vllm-serverStartupLatency.py b/perf-test/server-startup/vllm-serverStartupLatency.py index ea3dc82a0..a7443127b 100644 --- a/perf-test/server-startup/vllm-serverStartupLatency.py +++ b/perf-test/server-startup/vllm-serverStartupLatency.py @@ -6,7 +6,7 @@ from kubernetes.client.rest import ApiException import re import sys -import pandas as pd +# import pandas as pd from vllmLogParser import * From dafbdc810a1512e627117e8ba73401b2fbb235b7 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Fri, 14 Feb 2025 00:30:00 -0500 Subject: [PATCH 17/21] latest Signed-off-by: Braulio Dumba --- perf-test/pod-startup/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-test/pod-startup/README.md b/perf-test/pod-startup/README.md index da29cd315..b7b34137a 100644 --- a/perf-test/pod-startup/README.md +++ b/perf-test/pod-startup/README.md @@ -9,7 +9,7 @@ In this tutorial, we will use [clusterloader2](https://github.com/kubernetes/per #### 1. Clone the following clusterloader2 repo: ```bash - git clone -b release-1.31 https://github.com/kubernetes/perf-tests.git + git clone -b vllm-exp https://github.com/dumb0002/perf-tests.git ``` #### 2. Configure clusterloader2: From 06e06f410b24535ef23d977265dbe8eab360de32 Mon Sep 17 00:00:00 2001 From: Braulio Dumba Date: Fri, 14 Feb 2025 01:39:59 -0500 Subject: [PATCH 18/21] latest Signed-off-by: Braulio Dumba --- perf-test/pod-startup/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-test/pod-startup/README.md b/perf-test/pod-startup/README.md index b7b34137a..42bfcf22f 100644 --- a/perf-test/pod-startup/README.md +++ b/perf-test/pod-startup/README.md @@ -64,7 +64,7 @@ In this tutorial, we will use [clusterloader2](https://github.com/kubernetes/per ```bash cd $CL2_DIR - go run cmd/clusterloader.go --testconfig=./testing/load/vllm-config.yaml --kubeconfig=${KUBECONFIG:-$HOME/.kube/config} --provider=local --v=2 + go run cmd/clusterloader.go --testconfig=./testing/load/vllm-config.yaml --kubeconfig=${KUBECONFIG:-$HOME/.kube/config} --provider=ks --v=2 ``` At the end of clusterloader output you should see pod startup latency: From daea32d911ab0b4251f84243601fa555422a2d25 Mon Sep 17 00:00:00 2001 From: Jun Duan Date: Fri, 14 Feb 2025 12:09:43 -0500 Subject: [PATCH 19/21] Add k8s manifests which are ready to be kubectl-applied Signed-off-by: Jun Duan --- .../vllm-deployment-no-template.yaml | 109 ++++++++++++++++++ .../pod-startup/vllm-pvc-no-template.yaml | 11 ++ 2 files changed, 120 insertions(+) create mode 100644 perf-test/pod-startup/vllm-deployment-no-template.yaml create mode 100644 perf-test/pod-startup/vllm-pvc-no-template.yaml diff --git a/perf-test/pod-startup/vllm-deployment-no-template.yaml b/perf-test/pod-startup/vllm-deployment-no-template.yaml new file mode 100644 index 000000000..f5fd09c9a --- /dev/null +++ b/perf-test/pod-startup/vllm-deployment-no-template.yaml @@ -0,0 +1,109 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vllm-test + labels: + environment: test + release: test + performance: test +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app: vllm-test + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: "100%" + maxUnavailable: "0%" + template: + metadata: + labels: + app: vllm-test + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nvidia.com/gpu.product + operator: In + values: + - NVIDIA-L40S + # - NVIDIA-A100-SXM4-80GB + containers: + - name: vllm + image: vllm/vllm-openai:latest + imagePullPolicy: IfNotPresent + command: + - vllm + - serve + - ibm-granite/granite-3.1-8b-instruct + # - meta-llama/Llama-3.1-8B-Instruct + # - meta-llama/Llama-3.1-70B-Instruct + - --host + - "0.0.0.0" + - --port + - "8000" + env: + - name: HF_HOME + value: "/data" + - name: HF_TOKEN + value: + - name: XDG_CONFIG_HOME + value: "/data/vllm" + - name: TRITON_CACHE_DIR + value: "/data/triton" + - name: TORCH_HOME + value: "/data/torch" + - name: XDG_CACHE_HOME + value: "/data/cache" + - name: VLLM_USE_V1 + value: "1" + ports: + - containerPort: 8000 + name: container-port + protocol: TCP + livenessProbe: + httpGet: + path: /health + port: 8000 + scheme: HTTP + initialDelaySeconds: 15 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: /health + port: 8000 + scheme: HTTP + initialDelaySeconds: 15 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 60 + resources: + limits: + cpu: "10" + memory: 16Gi + nvidia.com/gpu: "1" + requests: + cpu: "10" + memory: 16Gi + nvidia.com/gpu: "1" + securityContext: + runAsNonRoot: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - name: vllm-storage + mountPath: /data + restartPolicy: Always + terminationGracePeriodSeconds: 30 + volumes: + - name: vllm-storage + persistentVolumeClaim: + claimName: vllm-test diff --git a/perf-test/pod-startup/vllm-pvc-no-template.yaml b/perf-test/pod-startup/vllm-pvc-no-template.yaml new file mode 100644 index 000000000..9127092be --- /dev/null +++ b/perf-test/pod-startup/vllm-pvc-no-template.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: vllm-test +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 20Gi From 18b72dc3c58aa8a85d25704714c24ceb16d642c6 Mon Sep 17 00:00:00 2001 From: Jun Duan Date: Fri, 14 Feb 2025 12:14:09 -0500 Subject: [PATCH 20/21] Add script for quick measurement of pod startup --- .gitignore | 1 + perf-test/pod-startup/measure.sh | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100755 perf-test/pod-startup/measure.sh diff --git a/.gitignore b/.gitignore index 7862ff172..b31c30d56 100644 --- a/.gitignore +++ b/.gitignore @@ -98,3 +98,4 @@ helm/examples # perf-test /perf-test/server-startup/.venv /perf-test/server-startup/__pycache__/ +/perf-test/outputs/ diff --git a/perf-test/pod-startup/measure.sh b/perf-test/pod-startup/measure.sh new file mode 100755 index 000000000..8e6726606 --- /dev/null +++ b/perf-test/pod-startup/measure.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +NAMESPACE="serverless-workstream" +DEPLOYMENT_NAME="vllm-test" +LABEL="app=vllm-test" +CLEANUP=${CLEANUP:-false} + +# For MacOS, `brew install coreutils` can make gdate available, if necessary +START_TIME=$(gdate +%s%3N) + +kubectl apply -f ./perf-test/pod-startup/vllm-pvc-no-template.yaml -n $NAMESPACE +kubectl apply -f ./perf-test/pod-startup/vllm-deployment-no-template.yaml -n $NAMESPACE + +# Wait until at least one pod exists before proceeding +while [[ -z $(kubectl get pods -n $NAMESPACE -l $LABEL -o jsonpath='{.items[0].metadata.name}') ]]; do + sleep 0.1 +done + +# Get a pod name +POD_NAME=$(kubectl get pods -n $NAMESPACE -l $LABEL -o jsonpath='{.items[0].metadata.name}') + +# Wait for the pod to be "Running" +kubectl wait --for=jsonpath='{.status.phase}'=Running pod/$POD_NAME -n $NAMESPACE --timeout=3600s + +# Record the end time in milliseconds +END_TIME=$(gdate +%s%3N) + +# Calculate startup latency in milliseconds +LATENCY_MS=$((END_TIME - START_TIME)) + +# Convert milliseconds to seconds and show it +LATENCY_SEC=$(echo "scale=3; $LATENCY_MS / 1000" | bc) +echo "Pod startup latency: ${LATENCY_SEC} seconds" + +# Optional cleanup +if [ "$CLEANUP" = "true" ]; then + kubectl delete -f ./perf-test/pod-startup/vllm-deployment-no-template.yaml -n $NAMESPACE --wait + kubectl delete -f ./perf-test/pod-startup/vllm-pvc-no-template.yaml -n $NAMESPACE --wait +fi From 7b1dae1eef823b5fe4cb6acc51b43f48e33bd585 Mon Sep 17 00:00:00 2001 From: Jun Duan Date: Fri, 14 Feb 2025 17:29:55 -0500 Subject: [PATCH 21/21] Making it clear from which directory the script needs to be run Signed-off-by: Jun Duan --- perf-test/pod-startup/measure.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/perf-test/pod-startup/measure.sh b/perf-test/pod-startup/measure.sh index 8e6726606..a3636842a 100755 --- a/perf-test/pod-startup/measure.sh +++ b/perf-test/pod-startup/measure.sh @@ -1,5 +1,7 @@ #!/bin/bash +# This script should be called from the root dir of the cloned repository. + NAMESPACE="serverless-workstream" DEPLOYMENT_NAME="vllm-test" LABEL="app=vllm-test"