VLLM V1 serve在线推理基本流程

离线推理参考之前的博客:

VLLM V1 offline推理1 - 基本流程_推理offline server-CSDN博客

VLLM V1 offline推理2 - Model Executor-CSDN博客

VLLM V1 part 3 - Scheduler-CSDN博客

等,可以看到在线和离线推理底层的一些组件是共用的。

offline执行架构图-单进程

online执行架构图-单进程

online执行架构图-多卡张量并行

AsyncLLM与LLMEngine看上去接口基本上是类似的,但是一个是async def,一个是常规python def。

V0架构简单对比

看了V1再看V0真是一团乱麻,V1架构确实更加简洁清晰易于理解。

VLLM V1在线推理example

export VLLM_USE_V1=1

vllm serve models/Qwen2.5-1.5B-Instruct # -tp 4
curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "models/Qwen2.5-1.5B-Instruct",
        "messages": [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "Who won the world series in 2020?"}
        ]
    }'

vllm serve调用入口:vllm.scripts.py调用vllm\entrypoints\openai\api_server.py的run_server

run_server重要工作之一:

async def run_server(args, **uvicorn_kwargs) -> None:
    # ...
    async with build_async_engine_client(args) as engine_client:
        app = build_app(args)

        model_config = await engine_client.get_model_config()
        await init_app_state(engine_client, model_config, app.state, args)

        shutdown_task = await serve_http(
            app,
            host=args.host,
            port=args.port)

@asynccontextmanager
async def build_async_engine_client(args: Namespace) -> AsyncIterator[EngineClient]:
    # Context manager to handle engine_client lifecycle
    # Ensures everything is shutdown and cleaned up on error/exit
    engine_args = AsyncEngineArgs.from_cli_args(args)
    async with build_async_engine_client_from_engine_args(engine_args, args.disable_frontend_multiprocessing) as engine:
        yield engine

@asynccontextmanager
async def build_async_engine_client_from_engine_args(
    engine_args: AsyncEngineArgs, disable_frontend_multiprocessing: bool = False,) -> AsyncIterator[EngineClient]:

    # AsyncLLMEngine.
    if (MQLLMEngineClient.is_unsupported_config(engine_args) or envs.VLLM_USE_V1 or disable_frontend_multiprocessing):
        engine_client: Optional[EngineClient] = None
        try:
            engine_client = AsyncLLMEngine.from_engine_args(
                engine_args=engine_args,
                usage_context=UsageContext.OPENAI_API_SERVER)
            yield engine_client

async def init_app_state(
    engine_client: EngineClient,
    model_config: ModelConfig,
    state: State,
    args: Namespace,
) -> None:
    state.openai_serving_models = OpenAIServingModels(
        engine_client=engine_client,
        model_config=model_config,
    )
    await state.openai_serving_models.init_static_loras()
    state.openai_serving_chat = OpenAIServingChat(
        engine_client,
        model_config,
        state.openai_serving_models,
    ) if model_config.runner_type == "generate" else None
    state.openai_serving_completion = OpenAIServingCompletion(
        engine_client,
        model_config,
        state.openai_serving_models,
    )

build_async_engine_client_from_engine_args返回的引擎是

engine_client类型: vllm.v1.engine.async_llm.AsyncLLM。

if (MQLLMEngineClient.is_unsupported_config(engine_args) or envs.VLLM_USE_V1 or disable_frontend_multiprocessing)使用AsyncLLMEngine否则MQLLMEngineClient。

MQLLMEngineClient和AsyncLLMEngine的区别?

这里是AsyncLLMEngine.from_engine_args,为何返回的却是engine.async_llm.AsyncLLM对象?

因为vllm\engine\async_llm_engine.py中虽然定义了个单独的AsyncLLMEngine但是V1实际上被覆盖为了vllm.v1.engine.async_llm.AsyncLLM:

# TODO(v1): Remove this class proxy when V1 goes default.
if envs.VLLM_USE_V1:
    from vllm.v1.engine.async_llm import AsyncLLM
    AsyncLLMEngine = AsyncLLM  # type: ignore

chat入口

@router.post("/v1/chat/completions")
@with_cancellation
async def create_chat_completion(request: ChatCompletionRequest,
                                 raw_request: Request):
    handler = chat(raw_request)
    # handler: OpenAIServingChat
    generator = await handler.create_chat_completion(request, raw_request)

    if isinstance(generator, ErrorResponse):
        return JSONResponse(content=generator.model_dump(), status_code=generator.code)

    elif isinstance(generator, ChatCompletionResponse):
        return JSONResponse(content=generator.model_dump())

    return StreamingResponse(content=generator, media_type="text/event-stream")

def chat(request: Request) -> Optional[OpenAIServingChat]:
    return request.app.state.openai_serving_chat

handler实际上是OpenAIServingChat。

generator可能是vllm.entrypoints.openai.protocol.ChatCompletionResponse

### LangChain4j 中 Qwen 和 vLLM 集成概述 LangChain 是一种用于构建基于大型语言模型的应用程序的框架,支持多种不同的大模型和工具链[^1]。对于 Java 生态中的开发者来说,LangChain4j 提供了一种方式来集成先进的语言模型如 Qwen 及高效的推理引擎如 vLLM。 #### 使用 Qwen 模型 Qwen 属于阿里云推出的大规模预训练模型系列,在自然语言理解和生成方面表现出色。为了在 LangChain4j 应用中使用 Qwen: - **引入依赖**:首先需确保项目已添加必要的 Maven 或 Gradle 依赖项以访问 Qwen SDK。 - **配置客户端**:创建并初始化 Qwen 客户端实例,设置好认证信息以便能够顺利调用远程API服务。 ```java // 创建 QwenClient 实例 QwenClient qwenClient = new DefaultQwenClient("<your-access-key-id>", "<your-secret>"); ``` #### 整合 vLLM 推理vLLM 能够加速 LLM 的部署过程,并简化其作为微服务运行的操作[^2]。当考虑将其与 LangChain4j 结合时, - **安装 vLLM**:按照官方文档指导完成 Python 环境下的安装工作。 - **启动 HTTP Server**:利用 vLLM 内置命令行工具开启 RESTful API 服务器,监听来自外部请求的数据流。 ```bash # 启动 vLLM server (假设已经设置了环境变量 VLLM_MODEL_PATH) vllm serve --model-path $VLLM_MODEL_PATH --port 8080 ``` #### 构建交互逻辑 借助上述组件之后,下一步就是定义应用程序内部的具体业务流程了。这通常涉及到接收用户输入、解析意图以及最终返回恰当的回答给前端展示层。 ```java public String processUserQuery(String userInput) { // 将用户的查询转发至 Qwen 进行情感分析或其他 NLP 处理... Map<String, Object> payload = new HashMap<>(); payload.put("prompt", userInput); HttpResponse response = qwenClient.post("/api/v1/inference", payload).execute(); JSONObject jsonResponse = JSON.parseObject(response.body().string()); String processedText = jsonResponse.getString("result"); // 如果有必要的话还可以进一步传递给 vLLM 来获取更加复杂的回复内容 return processedText; } ``` 通过这种方式,不仅实现了对本地化资源的有效管理和调度,同时也充分利用到了云端的强大计算能力,为用户提供高质量的服务体验[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Luchang-Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值