198 lines
5.3 KiB
Python
198 lines
5.3 KiB
Python
# flake8: noqa
|
|
"""
|
|
Cross-node parallelism examples for Ray Serve LLM.
|
|
|
|
TP / PP / custom placement group strategies
|
|
for multi-node LLM deployments.
|
|
"""
|
|
|
|
# __cross_node_tp_example_start__
|
|
import vllm
|
|
from ray import serve
|
|
from ray.serve.llm import LLMConfig, build_openai_app
|
|
|
|
# Configure a model with tensor parallelism across 2 GPUs
|
|
# Tensor parallelism splits model weights across GPUs
|
|
llm_config = LLMConfig(
|
|
model_loading_config=dict(
|
|
model_id="llama-3.1-8b",
|
|
model_source="meta-llama/Llama-3.1-8B-Instruct",
|
|
),
|
|
deployment_config=dict(
|
|
autoscaling_config=dict(
|
|
min_replicas=1,
|
|
max_replicas=2,
|
|
)
|
|
),
|
|
accelerator_type="L4",
|
|
engine_kwargs=dict(
|
|
tensor_parallel_size=2,
|
|
max_model_len=8192,
|
|
),
|
|
)
|
|
|
|
# Deploy the application
|
|
app = build_openai_app({"llm_configs": [llm_config]})
|
|
serve.run(app, blocking=True)
|
|
# __cross_node_tp_example_end__
|
|
|
|
# __cross_node_pp_example_start__
|
|
from ray import serve
|
|
from ray.serve.llm import LLMConfig, build_openai_app
|
|
|
|
# Configure a model with pipeline parallelism across 2 GPUs
|
|
# Pipeline parallelism splits model layers across GPUs
|
|
llm_config = LLMConfig(
|
|
model_loading_config=dict(
|
|
model_id="llama-3.1-8b",
|
|
model_source="meta-llama/Llama-3.1-8B-Instruct",
|
|
),
|
|
deployment_config=dict(
|
|
autoscaling_config=dict(
|
|
min_replicas=1,
|
|
max_replicas=1,
|
|
)
|
|
),
|
|
accelerator_type="L4",
|
|
engine_kwargs=dict(
|
|
pipeline_parallel_size=2,
|
|
max_model_len=8192,
|
|
),
|
|
)
|
|
|
|
# Deploy the application
|
|
app = build_openai_app({"llm_configs": [llm_config]})
|
|
serve.run(app, blocking=True)
|
|
# __cross_node_pp_example_end__
|
|
|
|
# __cross_node_tp_pp_example_start__
|
|
from ray import serve
|
|
from ray.serve.llm import LLMConfig, build_openai_app
|
|
|
|
# Configure a model with both tensor and pipeline parallelism
|
|
# This example uses 4 GPUs total (2 TP * 2 PP)
|
|
llm_config = LLMConfig(
|
|
model_loading_config=dict(
|
|
model_id="llama-3.1-8b",
|
|
model_source="meta-llama/Llama-3.1-8B-Instruct",
|
|
),
|
|
deployment_config=dict(
|
|
autoscaling_config=dict(
|
|
min_replicas=1,
|
|
max_replicas=1,
|
|
)
|
|
),
|
|
accelerator_type="L4",
|
|
engine_kwargs=dict(
|
|
tensor_parallel_size=2,
|
|
pipeline_parallel_size=2,
|
|
max_model_len=8192,
|
|
enable_chunked_prefill=True,
|
|
max_num_batched_tokens=4096,
|
|
),
|
|
)
|
|
|
|
# Deploy the application
|
|
app = build_openai_app({"llm_configs": [llm_config]})
|
|
serve.run(app, blocking=True)
|
|
# __cross_node_tp_pp_example_end__
|
|
|
|
# __custom_placement_group_pack_example_start__
|
|
from ray import serve
|
|
from ray.serve.llm import LLMConfig, build_openai_app
|
|
|
|
# Configure a model with custom placement group using PACK strategy
|
|
# PACK tries to place workers on as few nodes as possible for locality
|
|
llm_config = LLMConfig(
|
|
model_loading_config=dict(
|
|
model_id="llama-3.1-8b",
|
|
model_source="meta-llama/Llama-3.1-8B-Instruct",
|
|
),
|
|
deployment_config=dict(
|
|
autoscaling_config=dict(
|
|
min_replicas=1,
|
|
max_replicas=1,
|
|
)
|
|
),
|
|
accelerator_type="L4",
|
|
engine_kwargs=dict(
|
|
tensor_parallel_size=2,
|
|
max_model_len=8192,
|
|
),
|
|
placement_group_config=dict(
|
|
bundles=[{"GPU": 1}] * 2,
|
|
strategy="PACK",
|
|
),
|
|
)
|
|
|
|
# Deploy the application
|
|
app = build_openai_app({"llm_configs": [llm_config]})
|
|
serve.run(app, blocking=True)
|
|
# __custom_placement_group_pack_example_end__
|
|
|
|
# __custom_placement_group_spread_example_start__
|
|
from ray import serve
|
|
from ray.serve.llm import LLMConfig, build_openai_app
|
|
|
|
# Configure a model with custom placement group using SPREAD strategy
|
|
# SPREAD distributes workers across nodes for fault tolerance
|
|
llm_config = LLMConfig(
|
|
model_loading_config=dict(
|
|
model_id="llama-3.1-8b",
|
|
model_source="meta-llama/Llama-3.1-8B-Instruct",
|
|
),
|
|
deployment_config=dict(
|
|
autoscaling_config=dict(
|
|
min_replicas=1,
|
|
max_replicas=1,
|
|
)
|
|
),
|
|
accelerator_type="L4",
|
|
engine_kwargs=dict(
|
|
tensor_parallel_size=4,
|
|
max_model_len=8192,
|
|
),
|
|
placement_group_config=dict(
|
|
bundles=[{"GPU": 1}] * 4,
|
|
strategy="SPREAD",
|
|
),
|
|
)
|
|
|
|
# Deploy the application
|
|
app = build_openai_app({"llm_configs": [llm_config]})
|
|
serve.run(app, blocking=True)
|
|
# __custom_placement_group_spread_example_end__
|
|
|
|
# __custom_placement_group_strict_pack_example_start__
|
|
from ray import serve
|
|
from ray.serve.llm import LLMConfig, build_openai_app
|
|
|
|
# Configure a model with custom placement group using STRICT_PACK strategy
|
|
# STRICT_PACK ensures all workers are placed on the same node
|
|
llm_config = LLMConfig(
|
|
model_loading_config=dict(
|
|
model_id="llama-3.1-8b",
|
|
model_source="meta-llama/Llama-3.1-8B-Instruct",
|
|
),
|
|
deployment_config=dict(
|
|
autoscaling_config=dict(
|
|
min_replicas=1,
|
|
max_replicas=2,
|
|
)
|
|
),
|
|
accelerator_type="A100",
|
|
engine_kwargs=dict(
|
|
tensor_parallel_size=2,
|
|
max_model_len=8192,
|
|
),
|
|
placement_group_config=dict(
|
|
bundles=[{"GPU": 1}] * 2,
|
|
strategy="STRICT_PACK",
|
|
),
|
|
)
|
|
|
|
# Deploy the application
|
|
app = build_openai_app({"llm_configs": [llm_config]})
|
|
serve.run(app, blocking=True)
|
|
# __custom_placement_group_strict_pack_example_end__
|