
SGLang源码笔记(2)- Model权重加载相关

从server启动到加载模型权重
仍然是从launch_server开始看,sglang/launch_server.py中启动server入口:
1 | if __name__ == "__main__": |
进入http_server中的launch_server:
1 | def launch_server( |
然后进入_launch_subprocesses启动子进程(Scheduler, TokenizerManager和DetokenizerManager)
1 | def _launch_subprocesses( |
仍然重点关心Scheduler子进程:
1 | def run_scheduler_process( |
进入event_loop,这里我们看event_loop_normal
1 |
|
从这个event_loop进去执行再往后的过程就是上一篇笔记里的流程,在关注模型权重加载时这里可以先不看event_loop,重点是Scheduler的__init__的时候,会初始化TpModelWorker,进而初始化ModelRunner,在ModelRunner里面会加载模型。
看下Scheduler的init:
1 | class Scheduler( |
进而看一下TpModelWorker的初始化:(tp_worker_overlap会维护一个异步的TpModelWorker,与这个同步版本在使用时是互斥的,在tp_worker_overlap里实现了一个TpWorkerClient类,实际上就是把这个同步版本的Worker做了一个向上的解耦,对于模型加载等任务还是使用的同步版本里的实现,具体实现在另一个文件sglang/srt/managers/tp_worker_overlap_thread.py里)
1 | class TpModelWorker: |
进而看一下ModelRunner的初始化:
1 | class ModelRunner: |
1 | def initialize(self, min_per_gpu_memory: float): |
1 | def load_model(self): |
这里就调用了get_model来具体获取模型信息。
1 | def get_model( |
看一下model loader:
1 | def get_model_loader(load_config: LoadConfig) -> BaseModelLoader: |
看默认的DefaultModelLoader:
1 | class DefaultModelLoader(BaseModelLoader): |
load_weights_and_postprocess里调用的model.load_weights是sglang给每个模型实现的单独的优化过的加载模型函数,以deepseek_v2为例:
1 | # ...... |
里面会根据模型特性处理权重和参数,然后在最后会调用weight_loader来进行具体的权重加载,看一下default_weight_loader的加载函数:
1 | # ...... |
其实就是把处理后的权重拷贝到模型参数里去。
至此,初始化阶段对于模型权重的加载就完成了。
- Title: SGLang源码笔记(2)- Model权重加载相关
- Author: Ethan Xu
- Created at : 2025-06-16 19:29:03
- Updated at : 2025-09-17 19:38:58
- Link: https://ethanx.netlify.app/2025/06/16/sglang-learning-2/
- License: This work is licensed under CC BY-NC-SA 4.0.