1. Project Overview & Quickstart (vllm-project/aibrix)
File: README.md
AIBrix
Welcome to AIBrix, an open-source initiative designed to provide essential building blocks to construct scalable GenAI inference infrastructure. AIBrix delivers a cloud-native solution optimized for deploying, managing, and scaling large language model (LLM) inference, tailored specifically to enterprise needs.
Latest News
Releases
- [2026-06-16] AIBrix v0.7.0 is released. Check out the release notes and Blog Post for more details.
- [2026-03-05] AIBrix v0.6.0 is released. Check out the release notes and Blog Post for more details.
- [2025-11-10] AIBrix v0.5.0 is released. Check out the release notes and Blog Post for more details.
- [2025-08-05] AIBrix v0.4.0 is released. Check out the release notes and Blog Post for more details.
- [2025-05-21] AIBrix v0.3.0 is released. Check out the release notes and Blog Post for more details.
- [2025-03-09] AIBrix v0.2.1 is released. DeepSeek-R1 full weights deployment is supported and gateway stability has been improved! Check Blog Post for more details.
- [2025-02-19] AIBrix v0.2.0 is released. Check out the release notes and Blog Post for more details.
- [2024-11-13] AIBrix v0.1.0 is released. Check out the release notes and Blog Post for more details.
Talks and Presentations
- [2025-11-12] AIBrix team co-delivered a keynote at KubeCon North America 2025 AIBrix: Kubernetes-native GenAI Inference Infrastructure, providing AIBrix overview.
- [2025-06-10] AIBrix team delivered a talk at KubeCon China 2025 titled AIBrix: Cost-Effective and Scalable Kubernetes Control Plane for vLLM, discussing how the framework optimizes vLLM deployment via Kubernetes for cost efficiency and scalability.
- [2025-04-04] AIBrix team co-delivered a keynote at KubeCon EU 2025 with Google on LLM-Aware Load Balancing in Kubernetes: A New Era of Efficiency, focusing on LLM specific routing solutions.
- [2025-03-30] AIBrix was featured at the ASPLOS'25 workshop with the presentation AIBrix: An Open-Source, Large-Scale LLM Inference Infrastructure for System Research, showcasing its architecture for efficient LLM inference in system research scenarios.
Key Features
The initial release includes the following key features:
- High-Density LoRA Management: Streamlined support for lightweight, low-rank adaptations of models.
- LLM Gateway and Routing: Efficiently manage and direct traffic across multiple models and replicas.
- LLM App-Tailored Autoscaler: Dynamically scale inference resources based on real-time demand.
- Unified AI Runtime: A versatile sidecar enabling metric standardization, model downloading, and management.
- Distributed Inference: Scalable architecture to handle large workloads across multiple nodes.
- Distributed KV Cache: Enables high-capacity, cross-engine KV reuse.
- Cost-efficient Heterogeneous Serving: Enables mixed GPU inference to reduce costs with SLO guarantees.
- GPU Hardware Failure Detection: Proactive detection of GPU hardware issues.
Architecture
Quick Start
To get started with AIBrix, clone this repository and follow the setup instructions in the documentation. Our comprehensive guide will help you configure and deploy your first LLM infrastructure seamlessly.
# Local Testing
git clone https://github.com/vllm-project/aibrix.git
cd aibrix
# Install nightly aibrix dependencies
kubectl apply -k config/dependency --server-side
# Install nightly AIBrix CRDs (separate from the operator so uninstalls don't wipe user CRs)
kubectl apply -k config/crd --server-side
# Install nightly aibrix components
kubectl apply -k config/defaultInstall stable distribution
# Install component dependencies
kubectl apply -f "https://github.com/vllm-project/aibrix/releases/download/v0.7.0/aibrix-dependency-v0.7.0.yaml" --server-side
# Install AIBrix CRDs (separate from the operator so uninstalls don't wipe user CRs)
kubectl apply -f "https://github.com/vllm-project/aibrix/releases/download/v0.7.0/aibrix-core-crds-v0.7.0.yaml" --server-side
# Install aibrix components
kubectl apply -f "https://github.com/vllm-project/aibrix/releases/download/v0.7.0/aibrix-core-v0.7.0.yaml"Documentation
For detailed documentation on installation, configuration, and usage, please visit our documentation page.
Contributing
We welcome contributions from the community! Check out our contributing guidelines to see how you can make a difference.
Slack Channel: #aibrix
License
AIBrix is licensed under the Apache 2.0 License.
Support
If you have any questions or encounter any issues, please submit an issue on our GitHub issues page.
Thank you for choosing AIBrix for your GenAI infrastructure needs!
File: benchmarks/scenarios/lora/README.md
Lora benchmark
Prerequisite
1. Install dependencies
apt update && apt install -y vim wget zip jq
pip3 install huggingface_hub transformers openai peft vllm1. Download Models
Public Cloud
import os
from huggingface_hub import snapshot_download
os.environ['HF_TOKEN']="hf_xxxxxxxx"
base_model_path = snapshot_download(repo_id="meta-llama/Llama-2-7b-hf", ignore_patterns=[ "*.bin"])
sql_lora_path = snapshot_download(repo_id="Fredh99/llama-2-7b-sft-lora", local_dir="/models/Fredh99/llama-2-7b-sft-lora")Volcano Engine
TODO: Add Toscli tutorials2. Merge Models
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel, PeftConfig
def merge_base_and_lora(base_model_name_or_path, lora_model_name_or_path, output_path):
# Load the base model and tokenizer
print("Loading base model...")
base_model = AutoModelForCausalLM.from_pretrained(base_model_name_or_path)
tokenizer = AutoTokenizer.from_pretrained(base_model_name_or_path)
# Load the LoRA weights
print("Loading LoRA model...")
peft_config = PeftConfig.from_pretrained(lora_model_name_or_path)
lora_model = PeftModel.from_pretrained(base_model, lora_model_name_or_path)
# Merge LoRA weights into the base model
print("Merging LoRA weights into the base model...")
lora_model = lora_model.merge_and_unload()
# Save the merged model
print(f"Saving the merged model to {output_path}...")
lora_model.save_pretrained(output_path)
tokenizer.save_pretrained(output_path)
print(f"Merged model saved successfully at {output_path}!")
merge_base_and_lora('meta-llama/Llama-2-7b-hf', '/models/Fredh99/llama-2-7b-sft-lora', '/models/merge-model-weights')3. Download datasets
wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json4. Download chat template
wget https://raw.githubusercontent.com/chujiezheng/chat_templates/refs/heads/main/chat_templates/llama-2-chat.jinjaDeployments
Deployment 1
Merged Lora weights
CUDA_VISIBLE_DEVICES=0 vllm serve /models/merge-model-weights --served-model-name model-1 --host "0.0.0.0" --port "8071" --chat-template llama-2-chat.jinjaDeployment 2
Unmerged Lora weights but deployed separately.
CUDA_VISIBLE_DEVICES=0 vllm serve meta-llama/Llama-2-7b-hf --host "0.0.0.0" --port "8071" --enable-lora --lora-modules model-1=/models/Fredh99/llama-2-7b-sft-lora --chat-template llama-2-chat.jinja --max-lora-rank=64Deployment 3
Multi-Lora deployments
Note: we just deploy 32 models for easy management. add one more argument
--modelto control it.
CUDA_VISIBLE_DEVICES=0 vllm serve meta-llama/Llama-2-7b-hf --host "0.0.0.0" --port "8070" --enable-lora --lora-modules \
model-1=/models/Fredh99/llama-2-7b-sft-lora \
model-2=/models/Fredh99/llama-2-7b-sft-lora \
model-3=/models/Fredh99/llama-2-7b-sft-lora \
model-4=/models/Fredh99/llama-2-7b-sft-lora \
model-5=/models/Fredh99/llama-2-7b-sft-lora \
model-6=/models/Fredh99/llama-2-7b-sft-lora \
model-7=/models/Fredh99/llama-2-7b-sft-lora \
model-8=/models/Fredh99/llama-2-7b-sft-lora \
model-9=/models/Fredh99/llama-2-7b-sft-lora \
model-10=/models/Fredh99/llama-2-7b-sft-lora \
model-11=/models/Fredh99/llama-2-7b-sft-lora \
model-12=/models/Fredh99/llama-2-7b-sft-lora \
model-13=/models/Fredh99/llama-2-7b-sft-lora \
model-14=/models/Fredh99/llama-2-7b-sft-lora \
model-15=/models/Fredh99/llama-2-7b-sft-lora \
model-16=/models/Fredh99/llama-2-7b-sft-lora \
model-17=/models/Fredh99/llama-2-7b-sft-lora \
model-18=/models/Fredh99/llama-2-7b-sft-lora \
model-19=/models/Fredh99/llama-2-7b-sft-lora \
model-20=/models/Fredh99/llama-2-7b-sft-lora \
model-21=/models/Fredh99/llama-2-7b-sft-lora \
model-22=/models/Fredh99/llama-2-7b-sft-lora \
model-23=/models/Fredh99/llama-2-7b-sft-lora \
model-24=/models/Fredh99/llama-2-7b-sft-lora \
model-25=/models/Fredh99/llama-2-7b-sft-lora \
model-26=/models/Fredh99/llama-2-7b-sft-lora \
model-27=/models/Fredh99/llama-2-7b-sft-lora \
model-28=/models/Fredh99/llama-2-7b-sft-lora \
model-29=/models/Fredh99/llama-2-7b-sft-lora \
model-30=/models/Fredh99/llama-2-7b-sft-lora \
model-31=/models/Fredh99/llama-2-7b-sft-lora \
model-32=/models/Fredh99/llama-2-7b-sft-lora \
--chat-template llama-2-chat.jinja --max-lora-rank=64 --max-loras 32Note: by default,
--max-lorasis equal to number of loras, feel free to change it for different experiments.
Experiment 1 - Pin lora size 4, run difference concurrency.
deployment1
#!/bin/bash
for concurrency in {1..32}; do
output_file="benchmark_merged.jsonl"
echo "Running benchmark with concurrency ${concurrency} and output file ${output_file}"
python3 benchmark.py \
--dataset-path "/workspace/ShareGPT_V3_unfiltered_cleaned_split.json" \
--concurrency ${concurrency} \
--output-file-path "${output_file}" \
--deployment-endpoints "deployment1"
donedeployment2
#!/bin/bash
for concurrency in {1..32}; do
output_file="benchmark_unmerged_single_lora.jsonl"
echo "Running benchmark with concurrency ${concurrency} and output file ${output_file}"
python3 benchmark.py \
--dataset-path "/workspace/ShareGPT_V3_unfiltered_cleaned_split.json" \
--concurrency ${concurrency} \
--output-file-path "${output_file}" \
--deployment-endpoints "deployment2"
donedeployment3
#!/bin/bash
for concurrency in {1..32}; do
output_file="benchmark_unmerged_multi_lora_4.jsonl"
echo "Running benchmark with concurrency ${concurrency} and output file ${output_file}"
python3 benchmark.py \
--dataset-path "/workspace/ShareGPT_V3_unfiltered_cleaned_split.json" \
--concurrency ${concurrency} \
--output-file-path "${output_file}" \
--deployment-endpoints "deployment3"
doneExperiment 2 - Pin lora size 8, run difference concurrency.
There's no difference between deployment1 and deployment2, we can skip the tests.
Note: we can play with server side
max-lorasand do different experiments here.
#!/bin/bash
for concurrency in {1..32}; do
output_file="benchmark_unmerged_multi_lora_8_max_loras_8.jsonl"
echo "Running benchmark with concurrency ${concurrency} and output file ${output_file}"
python3 benchmark.py \
--dataset-path "/workspace/ShareGPT_V3_unfiltered_cleaned_split.json" \
--concurrency ${concurrency} \
--output-file-path "${output_file}" \
--deployment-endpoints "deployment3" \
--models 8
doneExperiment 3 - Pin concurrency size 1, run difference loras
#!/bin/bash
for model_number in {1..32}; do
output_file="benchmark_unmerged_multi_lora_${model_number}_concurrency_1.jsonl"
echo "Running benchmark with model number ${model_number} and output file ${output_file}"
python3 benchmark.py \
--dataset-path "/workspace/ShareGPT_V3_unfiltered_cleaned_split.json" \
--concurrency 1 \
--output-file-path "${output_file}" \
--deployment-endpoints "deployment3" \
--models ${model_number}
doneNote: Find results in deployment1 and deployment2 concurrency=1 cases.
File: benchmarks/scenarios/gateway/README.md
Gateway Routing benchmark
Prerequisite
Test Dataset
wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/blob/main/ShareGPT_V3_unfiltered_cleaned_split.jsonClient - Curl
curl -v http://localhost:8888/v1/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-any-key" \
-d '{
"model": "deepseek-coder-7b-instruct",
"messages": [{"role": "user", "content": "Say this is a test!"}],
"max_tokens": 128
}'Client - Locust
locust -f benchmark.py --host http://localhost:8887Experiments
experiment 1 & 2 should use exact same client setting and they are comparable.
Experiment 1: gateway overhead (httpRoute) vs k8s service (baseline)
kubectl -n envoy-gateway-system port-forward service/envoy-aibrix-system-aibrix-eg-903790dc 8888:80
kubectl port-forward svc/deepseek-coder-7b-instruct 8887:8000 -n aibrix-systemNote: we can not use port-forward in > 1 pod testing, all the traffic will go into one pod.
Change model service and gateway service to LoadBalancer for real testing.
Experiment 2: Three Routing Strategies
wait until cache ready, manually send some request to activate model.
> Note: this is for local testing, feel free to change to Elastic IP later.
# service port-forwarding
OUTPUT_FILE=k8s-service.jsonl locust -f benchmark.py --host http://localhost:8887 --headless --users 30 --spawn-rate 0.08 --run-time 10m --csv benchmark_gateway_httproute.csv --csv-full-history --logfile benchmark_gateway_httproute.log
# gateway port-forwarding
OUTPUT_FILE=http-route.jsonl locust -f benchmark.py --host http://localhost:8888 --headless --users 30 --spawn-rate 0.08 --run-time 10m --csv benchmark_gateway_httproute.csv --csv-full-history --logfile benchmark_gateway_httproute.log
OUTPUT_FILE=random.jsonl ROUTING_STRATEGY=random locust -f benchmark.py --host http://localhost:8888 --headless --users 30 --spawn-rate 0.08 --run-time 10m --csv benchmark_gateway_random.csv --csv-full-history --logfile benchmark_gateway_random.log
OUTPUT_FILE=least-request.jsonl ROUTING_STRATEGY=least-request locust -f benchmark.py --host http://localhost:8888 --headless --users 30 --spawn-rate 0.08 --run-time 10m --csv benchmark_gateway_least_request.csv --csv-full-history --logfile benchmark_gateway_least_request.log
OUTPUT_FILE=throughput.jsonl ROUTING_STRATEGY=throughput locust -f benchmark.py --host http://localhost:8888 --headless --users 30 --spawn-rate 0.08 --run-time 10m --csv benchmark_gateway_throughput.csv --csv-full-history --logfile benchmark_gateway_throughput.logLocal Testing
make docker-build-gateway-plugins
aibrix/gateway-plugins:9bd45a9915b71936ff0001a6fbfc32f10b65e480
k edit deployment aibrix-gateway-plugins
k delete pod aibrix-gateway-plugins-759b87dc65-j9qs8 # commit is exact same, we just need to update oncecurl http://localhost:8888/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer any_key" \
-d '{
"model": "llama2-70b",
"messages": [{"role": "user", "content": "Say this is a test!"}],
"temperature": 0.7
}'Note: We do not need model or routing strategy in the header now. this is clean and sdk compatibile.
New Client Testing
python client.py \
--dataset-path "/tmp/ShareGPT_V3_unfiltered_cleaned_split.json" \
--endpoint "http://localhost:8888" \
--num-prompts 2000 \
--interval 0.05 \
--output-file-path "k8s-v2.jsonl"python client.py \
--dataset-path "/tmp/ShareGPT_V3_unfiltered_cleaned_split.json" \
--endpoint "http://localhost:8888" \
--num-prompts 2000 \
--interval 0.05 \
--output-file-path "httproute-v2.jsonl"update env
python client.py \
--dataset-path "/tmp/ShareGPT_V3_unfiltered_cleaned_split.json" \
--endpoint "http://localhost:8888" \
--num-prompts 2000 \
--interval 0.05 \
--output-file-path "random-v2.jsonl"python client.py \
--dataset-path "/tmp/ShareGPT_V3_unfiltered_cleaned_split.json" \
--endpoint "http://localhost:8888" \
--num-prompts 2000 \
--interval 0.05 \
--output-file-path "least-request-v2.jsonl"python client.py \
--dataset-path "/tmp/ShareGPT_V3_unfiltered_cleaned_split.json" \
--endpoint "http://localhost:8888" \
--num-prompts 2000 \
--interval 0.05 \
--output-file-path "throughput-v2.jsonl"File: benchmarks/scenarios/autoscaling/README.md
How to run autoscaling experiment
TLDR;
You can run autoscaling benchmark experiment by simply running the command below../overnight_run.sh workload/workload/25min_up_and_down/25min_up_and_down.jsonl
What you have to check before running it
- run deployment for your application (refer to
deepseek-llm-7b-chat/deploy.yaml) - change the name field under scaleTargetRed in all autoscaling yaml files.
- check the deployment name in run-test.py
For example,
...
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: deepseek-llm-7b-chat (*this one)
...Workflow
overnight_run.sh will execute run-test.sh with given autoscaling mechanism.
run-test.sh will execute
- Preparation
- clean up existing autoscaler resources
- set the number of replicas to 1 of the target deployment
- restart aibrix-controller-manager, aibrix-gateway-plugins, target application's deployment
- Ready state check
- Once all the deployments are in ready state, it will start experiment
- Start logging running as background processes
- Log application pods, aibrix-controller-manager, aibrix-gateway-plugins by streaming the output to files (it will be used for debugging, post analysis)
- Run client with appropriate arguments (client code is in
aibrix/benchmark/generator/client.py) - Stop logging processes once experiment is done
- clean up resources
- clean up autocaling resources
- set the number of replicas for the application deployment back to 1.
How to plot graphs
There are two plots that you can plot.
Generating report
python <aibrix_root_repo>/benchmarks/plot/plot-everything.py <experiment_home_dir>
For example,python <aibrix_root_repo>/benchmarks/plot/plot-everything.py experiment_results/25min_test
The directories should look like
ls experiment_results/25min_test
25min_up_and_down-apa-least-request-20250209-064742
25min_up_and_down-hpa-least-request-20250209-055214
25min_up_and_down-kpa-least-request-20250209-061957
25min_up_and_down-optimizer-kpa-least-request-20250209-071531Generating per pod graph
python <aibrix_root_repo>/benchmarks/plot/plot_per_pod.py <experiment_pod_logs_dir>For example,
python <aibrix_root_repo>/benchmarks/plot/plot_per_pod.py experiment_results/25min_test/25min_up_and_down-apa-least-request-20250209-064742/pod_logsMove all experiment output dir under the same dir (e.g., 25min_test) to compare them in the report.
It will generate timeseries plot for the number of requests running in the pod, throughput, cache usage.
Dependency
- Client:
aibrix/benchmark/generator/client.py - Workload trace generator:
aibrix/benchmark/generator/workload_generator.py. Please check aibrix/benchmark/generator/README.md for more information.- Workload generated using
syntheticworkload types with configurations specified under this directory.
- Workload generated using
File: benchmarks/client/README.md
Test client locally
Note All generator invocation should be done under the benchmark home (i.e.,
/aibrix/benchmarks/)
Starting vllm server:
export API_KEY=${API_KEY}
vllm serve --host 0.0.0.0 \
--port "8000" \
--model /root/models/deepseek-llm-7b-chat \
--trust-remote-code \
--max-model-len "4096" \
--api-key ${API_KEY} \
--enable-chunked-prefillUsing a sample workload (generated by the workload generator) in a client. Turn on --streaming to collect fine grained metrics such as TTFT and TPOT:
export API_KEY=${API_KEY}
python -m client.client \
--workload-path "output/workload/constant/workload.jsonl" \
--endpoint "http://localhost:8888" \
--model llama-3-8b-instruct \
--api-key ${API_KEY} \
--output-token-limit 128 \
--streaming \
--output-file-path output.jsonlThe output will be stored as a .jsonl file in output.jsonl
Session affinity replay
For sessioned workloads (requests carrying session_id), pass --session-key-header to send each request's session_id as the x-aibrix-session-key header (see HeaderSessionKey in pkg/plugins/gateway/types.go). The gateway only consumes this header when the request is routed with the session-affinity strategy, so pair the flag with --routing-strategy session-affinity (or routing_strategy: session-affinity in the benchmark.py config) โ with any other strategy the header is sent but ignored. Note the gateway caps session keys at 256 bytes; longer keys are dropped and the request silently falls back to load-balanced routing (the client logs a warning per over-long session). The flag is off by default and has no effect on requests without a session_id. When driving the client through benchmark.py, set client_session_key_header: true in the config instead.
Run analysis on metrics collected. For streaming client, we can specify a goodput target (e2e/tpot/ttft) like the following:
python -m client.analyze --trace output.jsonl --output output --goodput-target tpot:0.5By default, client treats timestamp in the workload as timestamp in milliseconds (ms). The timestamp described in the workload generator could be scaled with --time-scale, Say that the original workload demands one paralell disptach at time 0, 1000, 2000..., meaning that the requests will be dispatch every second. You could use --time-scale to scale the intervals of timestamps described in the workload, e.g. --time-scale 0.1 scale the intervals of timetsamps by 0.1 meaning that the requests will be dispatched at time 0, 100, 200....
File: config/dependency/kuberay-operator/README.md
KubeRay upstream manifests
Commands to export manifest from helm package. After you got manifest, copy to this folder.
helm template kuberay-operator kuberay/kuberay-operator --namespace aibrix-system --version 1.2.1 --include-crds --set env[0].name=ENABLE_PROBES_INJECTION --set-string env[0].value=false --set fullnameOverride=kuberay-operator --set featureGates[0].name=RayClusterStatusConditions --set featureGates[0].enabled=true --output-dir ./config/dependencyIf you use zsh, please use noglob helm ... to skip the brace check.
File: deployment/terraform/gcp/README.md
AIBrix GCP Terraform Module
This module deploys an AIBrix cluster in its entirety onto a Google Container Cluster. It is the quickest way to get up and running with AIBrix. The purpose of this module is to both allow developers to quickly spin up the stack, and allow for the team to test on the GCP cloud environment.
NOTE: This module was created to allow users to quickly spin up AIBrix on GCP. It is not currently built for production deployments. The user is is responsible for any costs incurred by running this module.
Quickstart
Prerequisites
- GCloud CLI
- A quota of at least 1 GPU within your GCP project. More information can be found on the topic here.
- Terraform CLI
Quickstart
- Run
gcloud auth application-default loginto setup credentials to Google. - Install cluster auth plugin with
gcloud components install gke-gcloud-auth-plugin. - Rename
terraform.tfvars.exampletoterraform.tfvarsand fill in the required variables. You can also add any optional overrides here as well. - Run
terraform initto initialize the module. - Run
terraform planto see details on the resources created by this module. - When you are satisfied with the plan and want to create the resources, run
terraform apply. NOTE: if you recieveNodePool aibrix-gpu-nodes was created in the error state "ERROR"while running the script, check your quotas for GPUs and the specific instances you're trying to deploy. - Wait for module to complete running. It will output a command to receive the kubernetes config file and a public IP address.
- Run a command against the public IP:
ENDPOINT="<YOUR PUBLIC IP>"
curl http://${ENDPOINT}/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-r1-distill-llama-8b",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "help me write a random generator in python"}
]
}'- When you are finished testing and no longer want the resources, run
terraform destroy. Ensure that you complete this step once you are done trying it out, as GPUs are expensive.
Testing
Testing is done completely end to end, no resources need to be initialized beforehand. The testing script will spin up the entire stack, run its tests with the generic OpenAI client against the created resources, and then will destroy everything it has created. Tests are modeled after the E2E tests found in test/e2e/e2e_test.go.
- Ensure you have required Prerequisites from Quickstart above.
- Complete steps 1-3 in Quickstart steps above. Only fill in the rquired variables within
terraform.tfvars. - Change directory to
/deployment/terraformand rungo test -v -timeout 60m tests/gcp_test.go. NOTE: this test takes a while to run as it's spinning up its own kubernetes cluster. - If the test times out, to ensure resource deletion, simply run the test again.
Inputs
| Name | Description | Type | Default | Required |
|---|---|---|---|---|
| aibrix_release_version | The version of AIBRix to deploy. | string |
"v0.2.0" |
no |
| cluster_name | Name of the GKE cluster. | string |
"aibrix-inference-cluster" |
no |
| cluster_zone | Zone to deploy cluster within. If not provided will be deployed to default region. | string |
"" |
no |
| default_region | Default region to deploy resources within. | string |
n/a | yes |
| deploy_example_model | Whether to deploy the example model. | bool |
true |
no |
| node_pool_machine_count | Machine count for the node pool. | number |
1 |
no |
| node_pool_machine_type | Machine type for the node pool. Must be in the A3, A2, or G2 series. | string |
"g2-standard-4" |
no |
| node_pool_name | Name of the GPU node pool. | string |
"aibrix-gpu-nodes" |
no |
| node_pool_zone | Zone to deploy GPU node pool within. If not provided will be deployed to zone in default region which has capacity for machine type. | string |
"" |
no |
| project_id | GCP project to deploy resources within. | string |
n/a | yes |
Outputs
| Name | Description |
|---|---|
| aibrix_service_public_ip | Public IP address for AIBrix service. |
| configure_kubectl_command | Command to run which will allow kubectl access. |
Modules
| Name | Source | Version |
|---|---|---|
| aibrix | ../kubernetes | n/a |
| cluster | ./cluster | n/a |
Providers
| Name | Version |
|---|---|
| 6.22.0 | |
| kubernetes | 2.36.0 |
2. Official Technical Reference & Guides (vllm-project/vllm-project.github.io)
vLLM blog source
Local development
- Install
jekyllandbundlerby runninggem install jekyll bundler. Ask ChatGPT for help if you encounter any issues. bundle installto install the necessary gems.rm ./Gemfile.lockif you meet gem error.bundle exec jekyll serverto compile and start the server.
To add a new blogpost, please refer to _posts/2023-06-20-vllm.md as an example. Some notes:
- Google Doc can be saved as markdown format which will make your life easier.
- Note that the blogpost will only show when its date is in the past.
- Add
summaryfront matter for SEO. Keep it concise, specific, and 240 characters or fewer. - Put figures under
assets/figures/yourblogname/. - Make a pull request.
The blog is automatically built and deployed by GitHub Actions when main is pushed to.
LaTeX Math
The blog supports LaTeX math via MathJax.
It can be enabled by adding math: true to the document frontmatter. It has been configured to support the standard LaTeX style math notation, i.e.:
$ inline math $$$
math block
$$GitHub Flavored Admonitions
The blog supports GitHub flavored admonitions via jekyll-gfm-admonition. It supports the following syntax:
> [!NOTE]
> Highlights information that users should take into account, even when skimming.
> And supports multi-line text.
> [!TIP]
> Optional information to help a user be more successful.
> [!IMPORTANT]
> Crucial information necessary for users to succeed.
> [!WARNING]
> Critical content demanding immediate
> user attention due to potential risks.
> [!CAUTION]
> Negative potential consequences of an action.
> Opportunity to provide more context.Theme customization
The theme we are using is Minima. If you need to customise anything from this theme, see Overriding theme defaults.