【vllm】EngineCoreProc 的run_engine_core 中才创建EngineCoreProc 对象,为什么? 这是什么用法?
EngineCoreProc 的run_engine_core 中才创建EngineCoreProc 对象为什么 这是什么用法你又一次提出了一个直击要害的优秀问题这涉及到 Pythonmultiprocessing库的设计理念和最佳实践尤其是关于如何安全、可靠地在子进程中初始化复杂对象如图形处理器相关的资源。简单来说在run_engine_core这个静态方法即子进程的入口函数内部才创建EngineCoreProc对象是为了确保所有与 GPU 相关的初始化操作都发生在子进程启动之后而不是在父进程中。这是一种**“延迟初始化” (Lazy Initialization)** 或“子进程内初始化” (In-Process Initialization)的设计模式。让我们来详细解释为什么必须这么做。1.multiprocessing的工作原理fork在 Linux 和 macOS 上multiprocessing默认使用fork方法来创建子进程。fork的含义当父进程调用fork()时操作系统会创建一个几乎与父进程一模一样的子进程副本。这个副本拥有父进程在fork()时刻的所有内存状态的拷贝采用了写时复制 Copy-on-Write 技术来优化。2. 在父进程中初始化 GPU 资源的危险性现在想象一下如果我们在父进程中即在调用Process.start()之前就创建了EngineCoreProc对象# 这是一个【错误的、危险的】示例frommultiprocessingimportProcessdefmain():# ... setup ...# 错误在父进程中创建了 EngineCoreProc 对象engine_core_instanceEngineCoreProc(...)# 这一步会初始化 CUDA、加载模型到 GPU# 尝试将这个已经初始化的对象或其一部分传给子进程pProcess(targetsome_function,args(engine_core_instance,))p.start()# 调用 fork# ...当p.start()调用fork()时会发生什么CUDA 状态被复制:engine_core_instance在父进程中已经初始化了 CUDA 上下文与 GPU 建立了连接甚至可能已经分配了显存。当fork发生时这些与 CUDA 驱动程序和 GPU 硬件相关的底层状态和文件描述符会被原封不动地复制到子进程的内存空间。状态冲突与死锁:子进程现在拥有一个从父进程那里“继承”来的、已经“被使用过”的 CUDA 状态。当子进程尝试使用这个继承来的 CUDA 状态去和 GPU 交互时CUDA 驱动程序会陷入混乱。它可能会认为这个状态仍然属于父进程或者两个进程现在共享了同一个不应该被共享的底层资源。这通常会导致未定义的行为最常见的结果是程序立即崩溃或者永久死锁。CUDA 明确禁止在fork()之后子进程使用父进程的 CUDA 上下文。其他资源的冲突: 不仅仅是 CUDA任何涉及到复杂系统资源如网络套接字、文件句柄、数据库连接、锁的对象在fork之后都可能出现类似的问题。父子进程会“争夺”同一个底层资源的所有权导致混乱。3. 正确的做法“子进程内初始化”vLLM 的EngineCoreProc.run_engine_core完美地遵循了正确的模式# vllm/v1/engine/core.pyclassEngineCoreProc(EngineCore):# ...staticmethoddefrun_engine_core(*args,**kwargs):Launch EngineCore busy loop in background process.# 此函数是子进程的入口点在 fork() 之后才被执行# ... (设置信号处理、日志等子进程专属环境) ...engine_core:EngineCoreProc|NoneNonetry:# --- 关键在这里 ---# 创建 EngineCoreProc 实例的操作发生在此处# 此时代码已经完全运行在子进程的上下文中了engine_coreEngineCoreProc(*args,**kwargs)# 现在engine_core 实例的所有初始化逻辑包括# - 创建 Executor# - 初始化 CUDA# - 加载模型到 GPU# - 创建 ZMQ 套接字# ... 都会在一个“干净”的子进程环境中发生。# 它不会从父进程继承任何危险的、已打开的资源状态。assertengine_coreisnotNoneengine_core.run_busy_loop()exceptExceptionase:# ...这种用法的逻辑流程是父进程 (manager.py):准备好所有可序列化的配置信息如vllm_config对象。这些都是纯数据不包含任何活动的系统资源。创建一个multiprocessing.Process对象指定targetEngineCoreProc.run_engine_core并将配置信息作为kwargs传递。调用proc.start()。这一步会执行fork。子进程 (core.py):子进程从fork中诞生它拥有父进程的数据副本。子进程的执行入口是EngineCoreProc.run_engine_core函数。在此函数内部它使用从父进程那里复制过来的配置数据从零开始创建EngineCoreProc实例。所有的资源初始化CUDA, ZMQ, 模型加载都是由子进程自己独立完成的确保了资源的独占性和状态的正确性。总结staticmethodrun_engine_core的用法是一种精心设计的**“进程启动器” (Process Launcher)** 模式。为什么不在父进程创建对象因为对象尤其是像EngineCoreProc这样复杂的对象可能包含无法被安全fork的系统资源如 GPU 上下文、网络连接。在fork之前创建它们会导致子进程中资源状态混乱、冲突和死锁。为什么在子进程的入口函数里创建对象这是为了延迟初始化确保所有资源的申请和初始化都发生在子进程“干净”的运行环境中与父进程完全隔离。这保证了程序的稳定性和正确性是编写健壮的多进程 GPU 程序的基本准则。这个设计模式体现了对底层操作系统和硬件交互原理的深刻理解是 vLLM 能够稳定运行在多进程环境下的基石。为什么在 run_engine_core 中创建 EngineCoreProc 对象这种设计是多进程架构的标准模式run_engine_core作为进程入口点在进程内部创建实例。设计原因1. 进程隔离与独立性staticmethoddefrun_engine_core(*args,dp_rank:int0,local_dp_rank:int0,**kwargs):Launch EngineCore busy loop in background process.# 在新进程中创建实例ifdata_parallelandvllm_config.model_config.is_moe:engine_coreDPEngineCoreProc(*args,**kwargs)else:engine_coreEngineCoreProc(*args,engine_indexdp_rank,**kwargs)engine_core.run_busy_loop()[1](#13-0)每个进程需要独立的 EngineCoreProc 实例确保-独立的内存空间-独立的 ZMQ 连接-独立的调度器状态#### 2. 静态方法作为进程入口run_engine_core 是静态方法可以-在不实例化类的情况下调用-作为 multiprocessing.Process 的 target 参数-在新进程启动时立即执行 python# CoreEngineProcManager 中创建进程self.processes.append(context.Process(targetEngineCoreProc.run_engine_core,# 静态方法作为入口namefEngineCore_DP{global_index},kwargscommon_kwargs|{dp_rank:global_index,local_dp_rank:local_index,},))[2](#13-1)#### 3. 进程初始化顺序在进程内部创建实例可以确保正确的初始化顺序1.**进程启动**→ run_engine_core 被调用2.**信号处理**→ 设置 SIGTERM/SIGINT 处理器3.**环境配置**→ 设置进程标题、追踪器等4.**实例创建**→ 根据配置创建合适的实例5.**运行循环**→ 启动 run_busy_loop()### 这种模式的优势#### 1. 清晰的进程边界-每个进程有独立的生命周期-进程间通过 ZMQ 通信不共享 Python 对象-错误隔离一个进程崩溃不影响其他进程#### 2. 灵活的实例化python# 根据配置选择不同的实现ifdata_parallelandvllm_config.model_config.is_moe:engine_coreDPEngineCoreProc(*args,**kwargs)else:engine_coreEngineCoreProc(*args,engine_indexdp_rank,**kwargs)[3](#13-2)#### 3. 资源管理-进程退出时自动清理资源-守护线程随进程结束-ZMQ 连接在进程终止时关闭### 使用场景这种模式在以下场景中特别有用1.**多进程部署**每个数据并行 rank 一个进程2.**进程监控**可以监控进程健康状态3.**动态扩缩容**可以启动/停止进程4.**故障恢复**进程崩溃后可以重启## Notes-这是 Python multiprocessing 的标准模式静态方法作为进程入口点-run_engine_core 类似于 C 语言的 main() 函数但针对特定任务-这种设计确保了 vLLM 的多进程架构能够正确隔离和管理资源-每个 EngineCore 进程都是完全独立的通过消息传递协调工作 Wiki pages you might want to explore:-[Overview(vllm-project/vllm)](/wiki/vllm-project/vllm#1)Wiki pages you might want to explore:-[Overview(vllm-project/vllm)](/wiki/vllm-project/vllm#1)### Citations**File:**vllm/v1/engine/core.py(L1023-1093)pythonstaticmethoddefrun_engine_core(*args,dp_rank:int0,local_dp_rank:int0,**kwargs):Launch EngineCore busy loop in background process.# Signal handler used for graceful termination.# SystemExit exception is only raised once to allow this and worker# processes to terminate without errorshutdown_requestedFalse# Ensure we can serialize transformer config after spawningmaybe_register_config_serialize_by_value()defsignal_handler(signum,frame):nonlocalshutdown_requestedifnotshutdown_requested:shutdown_requestedTrueraiseSystemExit()# Either SIGTERM or SIGINT will terminate the engine_coresignal.signal(signal.SIGTERM,signal_handler)signal.signal(signal.SIGINT,signal_handler)engine_core:EngineCoreProc|NoneNonetry:vllm_config:VllmConfigkwargs[vllm_config]parallel_config:ParallelConfigvllm_config.parallel_config data_parallelparallel_config.data_parallel_size1ordp_rank0ifdata_parallel:parallel_config.data_parallel_rank_locallocal_dp_rank maybe_init_worker_tracer(instrumenting_module_namevllm.engine_core,process_kindengine_core,process_namefEngineCore_DP{dp_rank},)set_process_title(EngineCore,fDP{dp_rank})else:maybe_init_worker_tracer(instrumenting_module_namevllm.engine_core,process_kindengine_core,process_nameEngineCore,)set_process_title(EngineCore)decorate_logs()ifdata_parallelandvllm_config.kv_transfer_configisnotNone:# modify the engine_id and append the local_dp_rank to it to ensure# that the kv_transfer_config is unique for each DP rank.vllm_config.kv_transfer_config.engine_id(f{vllm_config.kv_transfer_config.engine_id}_dp{local_dp_rank})logger.debug(Setting kv_transfer_config.engine_id to %s,vllm_config.kv_transfer_config.engine_id,)parallel_config.data_parallel_indexdp_rankifdata_parallelandvllm_config.model_config.is_moe:# Set data parallel rank for this engine process.parallel_config.data_parallel_rankdp_rank engine_coreDPEngineCoreProc(*args,**kwargs)else:# Non-MoE DP ranks are completely independent, so treat like DP1.# Note that parallel_config.data_parallel_index will still reflect# the original DP rank.parallel_config.data_parallel_size1parallel_config.data_parallel_size_local1parallel_config.data_parallel_rank0engine_coreEngineCoreProc(*args,engine_indexdp_rank,**kwargs)assertengine_coreisnotNoneengine_core.run_busy_loop()File:vllm/v1/engine/utils.py (L119-129)self.processes.append(context.Process(targettarget_fn,namefEngineCore_DP{global_index},kwargscommon_kwargs|{dp_rank:global_index,local_dp_rank:local_index,},))

相关新闻

SWE-MasterWorld: 打破SWE环境限制,打通训练全流程|人大高瓴“人工智能+”成果

SWE-MasterWorld: 打破SWE环境限制,打通训练全流程|人大高瓴“人工智能+”成果

引言:拉低代码智能体训练门槛 智能体训练的主流任务,大致可以按环境交互强度与工程成本分两类: (1)轻环境:如检索(Search Agent)、简单代码执行,环境相对简单&#xff1b…

2026/7/2 21:26:27 阅读更多 →
【图像加密】混合混沌移位变换对和修正Henon映射的图像加密进行密码分析【含Matlab源码 15119期】

【图像加密】混合混沌移位变换对和修正Henon映射的图像加密进行密码分析【含Matlab源码 15119期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

2026/7/5 14:59:53 阅读更多 →
Containerd容器运行时介绍与应用

Containerd容器运行时介绍与应用

以下是 Containerd 的详细部署指南,涵盖主流 Linux 发行版的安装和基础配置。 一、安装方式 1. 二进制包安装(推荐) 适用于大多数 Linux 发行版,获取最新版本。 # 下载最新版本(请从 GitHub Release 页面获取最新版本号…

2026/5/17 8:19:11 阅读更多 →

最新新闻

MockWebServer使用教程:在vb-android-app-quality项目中模拟网络请求的完整指南

MockWebServer使用教程:在vb-android-app-quality项目中模拟网络请求的完整指南

MockWebServer使用教程:在vb-android-app-quality项目中模拟网络请求的完整指南 【免费下载链接】vb-android-app-quality Sample android project using Gradle, with basic quality tools set up. 项目地址: https://gitcode.com/gh_mirrors/vb/vb-android-app…

2026/7/5 16:37:01 阅读更多 →
SeaTunnel Web 任务调度与管理:如何高效管理海量数据同步任务

SeaTunnel Web 任务调度与管理:如何高效管理海量数据同步任务

SeaTunnel Web 任务调度与管理:如何高效管理海量数据同步任务 【免费下载链接】seatunnel-web SeaTunnel is a distributed, high-performance data integration platform for the synchronization and transformation of massive data (offline & real-time). …

2026/7/5 16:37:01 阅读更多 →
使用glibc-all-in-one的10个实用技巧:从基础下载到高级调试

使用glibc-all-in-one的10个实用技巧:从基础下载到高级调试

使用glibc-all-in-one的10个实用技巧:从基础下载到高级调试 【免费下载链接】glibc-all-in-one 🎁A convenient glibc binary and debug file downloader and source code auto builder 项目地址: https://gitcode.com/gh_mirrors/gl/glibc-all-in-one…

2026/7/5 16:35:01 阅读更多 →
Stocksera数据源揭秘:从Yahoo Finance到SEC.gov的完整集成方案

Stocksera数据源揭秘:从Yahoo Finance到SEC.gov的完整集成方案

Stocksera数据源揭秘:从Yahoo Finance到SEC.gov的完整集成方案 【免费下载链接】Stocksera Finance application that provides more than 60 different alternative data to retail investors 项目地址: https://gitcode.com/gh_mirrors/st/Stocksera Stock…

2026/7/5 16:35:01 阅读更多 →
WeKnora智能知识平台:如何在3小时内构建企业级RAG与自主推理系统

WeKnora智能知识平台:如何在3小时内构建企业级RAG与自主推理系统

WeKnora智能知识平台:如何在3小时内构建企业级RAG与自主推理系统 【免费下载链接】WeKnora Open-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki. 项目地址: https://git…

2026/7/5 16:33:00 阅读更多 →
{{date}} 日志

{{date}} 日志

{{date}} 日志 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/gh_mirrors/ob/OB_Template 天气:☀️ 今日计划&…

2026/7/5 16:33:00 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻