Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8e3c26be14 | ||
|
|
66ea8b1110 | ||
|
|
a3d432afdf | ||
|
|
06c2bb1715 | ||
|
|
d2e355eae9 | ||
|
|
b7787d8ca8 | ||
|
|
b1fca5d257 | ||
|
|
3e86d16892 | ||
|
|
d9f54ce76a | ||
|
|
149da95cd0 | ||
|
|
0a89394f1d | ||
|
|
8df7f41f1d | ||
|
|
4d7b8c03c0 | ||
|
|
2df915a145 | ||
|
|
aadc025849 | ||
|
|
8b4a49073d | ||
|
|
4e10641d69 | ||
|
|
6e8696c12a | ||
|
|
b49e81a75a | ||
|
|
65932f85e1 | ||
|
|
94840cfbbb | ||
|
|
ce47c41f4a | ||
|
|
c03ecc42fe | ||
|
|
ae56b9f43d | ||
|
|
891699be1e | ||
|
|
c28aa02576 | ||
|
|
eba20c0704 | ||
|
|
677a01e8f3 | ||
|
|
5cd12ba331 | ||
|
|
850c686538 | ||
|
|
de2876e659 | ||
|
|
d3ee3236c0 | ||
|
|
0781e93054 | ||
|
|
251e807012 | ||
|
|
29346769ed | ||
|
|
1420091588 | ||
|
|
d46adeaee9 | ||
|
|
5c0dca44bd | ||
|
|
cc301ac123 | ||
|
|
2ac6a0108f |
@@ -19,32 +19,49 @@ jobs:
|
|||||||
|
|
||||||
- name: Check for new package version and update
|
- name: Check for new package version and update
|
||||||
run: |
|
run: |
|
||||||
# Get current version
|
echo "Fetching the current runpod version from requirements.txt..."
|
||||||
current_version=$(grep -oP 'runpod==\K[^"]+' ./builder/requirements.txt)
|
|
||||||
|
# Get current version, allowing both == and ~= in the search pattern
|
||||||
|
current_version=$(grep -oP 'runpod[~=]{1,2}\K[^"]+' ./builder/requirements.txt)
|
||||||
|
echo "Current version: $current_version"
|
||||||
|
|
||||||
# Get new version
|
# Extract major and minor from current version
|
||||||
|
current_major_minor=$(echo $current_version | cut -d. -f1,2)
|
||||||
|
echo "Current major.minor: $current_major_minor"
|
||||||
|
|
||||||
|
echo "Fetching the latest runpod version from PyPI..."
|
||||||
|
|
||||||
|
# Get new version from PyPI
|
||||||
new_version=$(curl -s https://pypi.org/pypi/runpod/json | jq -r .info.version)
|
new_version=$(curl -s https://pypi.org/pypi/runpod/json | jq -r .info.version)
|
||||||
echo "NEW_VERSION_ENV=$new_version" >> $GITHUB_ENV
|
echo "NEW_VERSION_ENV=$new_version" >> $GITHUB_ENV
|
||||||
|
echo "New version: $new_version"
|
||||||
|
|
||||||
|
# Extract major and minor from new version
|
||||||
|
new_major_minor=$(echo $new_version | cut -d. -f1,2)
|
||||||
|
echo "New major.minor: $new_major_minor"
|
||||||
|
|
||||||
if [ -z "$new_version" ]; then
|
if [ -z "$new_version" ]; then
|
||||||
echo "Failed to fetch the new version."
|
echo "ERROR: Failed to fetch the new version from PyPI."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if the version is already up-to-date
|
# Check if the major or minor version is different
|
||||||
if [ "$current_version" = "$new_version" ]; then
|
if [ "$current_major_minor" = "$new_major_minor" ]; then
|
||||||
echo "The package version is already up-to-date."
|
echo "No update needed. The new version ($new_major_minor) is within the allowed range (~= $current_major_minor)."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Update requirements.txt
|
echo "New major/minor detected ($new_major_minor). Updating requirements.txt..."
|
||||||
sed -i "s/runpod==.*/runpod==$new_version/" ./builder/requirements.txt
|
|
||||||
|
# Update requirements.txt, preserving the existing constraint type (~= or ==)
|
||||||
|
sed -i "s/runpod[~=][^ ]*/runpod~=$new_version/" ./builder/requirements.txt
|
||||||
|
echo "requirements.txt has been updated."
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@v3
|
uses: peter-evans/create-pull-request@v3
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: Update package version
|
commit-message: Update runpod package version
|
||||||
title: Update runpod package version
|
title: Update runpod package version
|
||||||
body: The package version has been updated to ${{ env.NEW_VERSION_ENV }}
|
body: The package version has been updated to ${{ env.NEW_VERSION_ENV }}
|
||||||
branch: runpod-package-update
|
branch: runpod-package-update
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \
|
|||||||
python3 -m pip install --upgrade -r /requirements.txt
|
python3 -m pip install --upgrade -r /requirements.txt
|
||||||
|
|
||||||
# Install vLLM (switching back to pip installs since issues that required building fork are fixed and space optimization is not as important since caching) and FlashInfer
|
# Install vLLM (switching back to pip installs since issues that required building fork are fixed and space optimization is not as important since caching) and FlashInfer
|
||||||
RUN python3 -m pip install vllm==0.5.5 && \
|
RUN python3 -m pip install vllm==0.6.6.post1 && \
|
||||||
python3 -m pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.3
|
python3 -m pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.3
|
||||||
|
|
||||||
# Setup for Option 2: Building the Image with the Model included
|
# Setup for Option 2: Building the Image with the Model included
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ Deploy OpenAI-Compatible Blazing-Fast LLM Endpoints powered by the [vLLM](https:
|
|||||||
### 1. UI for Deploying vLLM Worker on RunPod console:
|
### 1. UI for Deploying vLLM Worker on RunPod console:
|
||||||

|

|
||||||
|
|
||||||
### 2. Worker vLLM `v1.3.1` with vLLM `0.5.5` now available under `stable` tags
|
### 2. Worker vLLM `v1.8.0` with vLLM `0.6.6` now available under `stable` tags
|
||||||
|
|
||||||
Update v1.3.1 is now available, use the image tag `runpod/worker-v1-vllm:v1.3.1stable-cuda12.1.0`.
|
Update v1.8.0 is now available, use the image tag `runpod/worker-v1-vllm:v1.8.0stable-cuda12.1.0`.
|
||||||
|
|
||||||
### 3. OpenAI-Compatible [Embedding Worker](https://github.com/runpod-workers/worker-infinity-embedding) Released
|
### 3. OpenAI-Compatible [Embedding Worker](https://github.com/runpod-workers/worker-infinity-embedding) Released
|
||||||
Deploy your own OpenAI-compatible Serverless Endpoint on RunPod with multiple embedding models and fast inference for RAG and more!
|
Deploy your own OpenAI-compatible Serverless Endpoint on RunPod with multiple embedding models and fast inference for RAG and more!
|
||||||
@@ -82,7 +82,7 @@ Below is a summary of the available RunPod Worker images, categorized by image s
|
|||||||
|
|
||||||
| CUDA Version | Stable Image Tag | Development Image Tag | Note |
|
| CUDA Version | Stable Image Tag | Development Image Tag | Note |
|
||||||
|--------------|-----------------------------------|-----------------------------------|----------------------------------------------------------------------|
|
|--------------|-----------------------------------|-----------------------------------|----------------------------------------------------------------------|
|
||||||
| 12.1.0 | `runpod/worker-v1-vllm:v1.3.1stable-cuda12.1.0` | `runpod/worker-v1-vllm:v1.3.1dev-cuda12.1.0` | When creating an Endpoint, select CUDA Version 12.3, 12.2 and 12.1 in the filter. |
|
| 12.1.0 | `runpod/worker-v1-vllm:v1.8.0stable-cuda12.1.0` | `runpod/worker-v1-vllm:v1.8.0dev-cuda12.1.0` | When creating an Endpoint, select CUDA Version 12.3, 12.2 and 12.1 in the filter. |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
ray
|
ray
|
||||||
pandas
|
pandas
|
||||||
pyarrow
|
pyarrow
|
||||||
runpod==1.7.0
|
runpod~=1.7.0
|
||||||
huggingface-hub
|
huggingface-hub
|
||||||
packaging
|
packaging
|
||||||
typing-extensions==4.7.1
|
typing-extensions==4.7.1
|
||||||
pydantic
|
pydantic
|
||||||
pydantic-settings
|
pydantic-settings
|
||||||
hf-transfer
|
hf-transfer
|
||||||
|
transformers
|
||||||
|
|||||||
+26
-11
@@ -11,6 +11,8 @@ from vllm import AsyncLLMEngine
|
|||||||
from vllm.entrypoints.openai.serving_chat import OpenAIServingChat
|
from vllm.entrypoints.openai.serving_chat import OpenAIServingChat
|
||||||
from vllm.entrypoints.openai.serving_completion import OpenAIServingCompletion
|
from vllm.entrypoints.openai.serving_completion import OpenAIServingCompletion
|
||||||
from vllm.entrypoints.openai.protocol import ChatCompletionRequest, CompletionRequest, ErrorResponse
|
from vllm.entrypoints.openai.protocol import ChatCompletionRequest, CompletionRequest, ErrorResponse
|
||||||
|
from vllm.entrypoints.openai.serving_engine import BaseModelPath, LoRAModulePath
|
||||||
|
|
||||||
|
|
||||||
from utils import DummyRequest, JobInput, BatchSize, create_error_response
|
from utils import DummyRequest, JobInput, BatchSize, create_error_response
|
||||||
from constants import DEFAULT_MAX_CONCURRENCY, DEFAULT_BATCH_SIZE, DEFAULT_BATCH_SIZE_GROWTH_FACTOR, DEFAULT_MIN_BATCH_SIZE
|
from constants import DEFAULT_MAX_CONCURRENCY, DEFAULT_BATCH_SIZE, DEFAULT_BATCH_SIZE_GROWTH_FACTOR, DEFAULT_MIN_BATCH_SIZE
|
||||||
@@ -121,25 +123,41 @@ class OpenAIvLLMEngine(vLLMEngine):
|
|||||||
self.response_role = os.getenv("OPENAI_RESPONSE_ROLE") or "assistant"
|
self.response_role = os.getenv("OPENAI_RESPONSE_ROLE") or "assistant"
|
||||||
asyncio.run(self._initialize_engines())
|
asyncio.run(self._initialize_engines())
|
||||||
self.raw_openai_output = bool(int(os.getenv("RAW_OPENAI_OUTPUT", 1)))
|
self.raw_openai_output = bool(int(os.getenv("RAW_OPENAI_OUTPUT", 1)))
|
||||||
|
|
||||||
async def _initialize_engines(self):
|
async def _initialize_engines(self):
|
||||||
self.model_config = await self.llm.get_model_config()
|
self.model_config = await self.llm.get_model_config()
|
||||||
|
self.base_model_paths = [
|
||||||
|
BaseModelPath(name=self.engine_args.model, model_path=self.engine_args.model)
|
||||||
|
]
|
||||||
|
|
||||||
|
lora_modules = os.getenv('LORA_MODULES', None)
|
||||||
|
if lora_modules is not None:
|
||||||
|
try:
|
||||||
|
lora_modules = json.loads(lora_modules)
|
||||||
|
lora_modules = [LoRAModulePath(**lora_modules)]
|
||||||
|
except:
|
||||||
|
lora_modules = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
self.chat_engine = OpenAIServingChat(
|
self.chat_engine = OpenAIServingChat(
|
||||||
async_engine_client=self.llm,
|
engine_client=self.llm,
|
||||||
model_config=self.model_config,
|
model_config=self.model_config,
|
||||||
served_model_names=[self.served_model_name],
|
base_model_paths=self.base_model_paths,
|
||||||
response_role=self.response_role,
|
response_role=self.response_role,
|
||||||
chat_template=self.tokenizer.tokenizer.chat_template,
|
chat_template=self.tokenizer.tokenizer.chat_template,
|
||||||
lora_modules=None,
|
enable_auto_tools=os.getenv('ENABLE_AUTO_TOOL_CHOICE', 'false').lower() == 'true',
|
||||||
|
tool_parser=os.getenv('TOOL_CALL_PARSER', "") or None,
|
||||||
|
lora_modules=lora_modules,
|
||||||
prompt_adapters=None,
|
prompt_adapters=None,
|
||||||
|
chat_template_content_format="auto",
|
||||||
request_logger=None
|
request_logger=None
|
||||||
)
|
)
|
||||||
self.completion_engine = OpenAIServingCompletion(
|
self.completion_engine = OpenAIServingCompletion(
|
||||||
async_engine_client=self.llm,
|
engine_client=self.llm,
|
||||||
model_config=self.model_config,
|
model_config=self.model_config,
|
||||||
served_model_names=[self.served_model_name],
|
base_model_paths=self.base_model_paths,
|
||||||
lora_modules=[],
|
lora_modules=lora_modules,
|
||||||
prompt_adapters=None,
|
prompt_adapters=None,
|
||||||
request_logger=None
|
request_logger=None
|
||||||
)
|
)
|
||||||
@@ -155,9 +173,6 @@ class OpenAIvLLMEngine(vLLMEngine):
|
|||||||
|
|
||||||
async def _handle_model_request(self):
|
async def _handle_model_request(self):
|
||||||
models = await self.chat_engine.show_available_models()
|
models = await self.chat_engine.show_available_models()
|
||||||
fixed_model = models.data[0]
|
|
||||||
fixed_model.id = self.served_model_name
|
|
||||||
models.data = [fixed_model]
|
|
||||||
return models.model_dump()
|
return models.model_dump()
|
||||||
|
|
||||||
async def _handle_chat_or_completion_request(self, openai_request: JobInput):
|
async def _handle_chat_or_completion_request(self, openai_request: JobInput):
|
||||||
|
|||||||
+2
-1
@@ -88,7 +88,8 @@ DEFAULT_ARGS = {
|
|||||||
"typical_acceptance_sampler_posterior_alpha": float(os.getenv('TYPICAL_ACCEPTANCE_SAMPLER_POSTERIOR_ALPHA', 0)) or None,
|
"typical_acceptance_sampler_posterior_alpha": float(os.getenv('TYPICAL_ACCEPTANCE_SAMPLER_POSTERIOR_ALPHA', 0)) or None,
|
||||||
"qlora_adapter_name_or_path": os.getenv('QLORA_ADAPTER_NAME_OR_PATH', None),
|
"qlora_adapter_name_or_path": os.getenv('QLORA_ADAPTER_NAME_OR_PATH', None),
|
||||||
"disable_logprobs_during_spec_decoding": os.getenv('DISABLE_LOGPROBS_DURING_SPEC_DECODING', None),
|
"disable_logprobs_during_spec_decoding": os.getenv('DISABLE_LOGPROBS_DURING_SPEC_DECODING', None),
|
||||||
"otlp_traces_endpoint": os.getenv('OTLP_TRACES_ENDPOINT', None)
|
"otlp_traces_endpoint": os.getenv('OTLP_TRACES_ENDPOINT', None),
|
||||||
|
"use_v2_block_manager": os.getenv('USE_V2_BLOCK_MANAGER', 'true')
|
||||||
}
|
}
|
||||||
|
|
||||||
def match_vllm_args(args):
|
def match_vllm_args(args):
|
||||||
|
|||||||
+6
-1
@@ -3,6 +3,7 @@ import logging
|
|||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from time import time
|
from time import time
|
||||||
|
from vllm.entrypoints.openai.protocol import RequestResponseMetadata
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from vllm.utils import random_uuid
|
from vllm.utils import random_uuid
|
||||||
@@ -47,10 +48,14 @@ class JobInput:
|
|||||||
self.min_batch_size = int(min_batch_size) if min_batch_size else None
|
self.min_batch_size = int(min_batch_size) if min_batch_size else None
|
||||||
self.openai_route = job.get("openai_route")
|
self.openai_route = job.get("openai_route")
|
||||||
self.openai_input = job.get("openai_input")
|
self.openai_input = job.get("openai_input")
|
||||||
|
class DummyState:
|
||||||
|
def __init__(self):
|
||||||
|
self.request_metadata = None
|
||||||
|
|
||||||
class DummyRequest:
|
class DummyRequest:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.headers = {}
|
self.headers = {}
|
||||||
|
self.state = DummyState()
|
||||||
async def is_disconnected(self):
|
async def is_disconnected(self):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
+983
-880
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user