vllm -- 源码学习1(寻找源码入口) (小白级教程)
vllm服务的启动命令通过启动命令去寻找源代码的入口。source .venv/bin/activate vllm serve facebook/opt-125m --dtypebfloat16来看第一条命令source .venv/bin/activate(注: 一定要替换成自己的目录哟)。这条命令用于激活本地用uv创建的虚拟环境。因为vllm是通过uv进行安装的所以要激活虚拟环境才能直接使用vllm命令。看下activate的源码。if ! [ -z ${SCRIPT_PATH_} ] ; then _OLD_SCRIPT_PATH$SCRIPT_PATH fi # Get script path (only used if environment is relocatable). if [ -n ${BASH_VERSION:x} ] ; then SCRIPT_PATH${BASH_SOURCE[0]} if [ $SCRIPT_PATH $0 ]; then # Only bash has a reasonably robust check for sourcedness. echo You must source this script: \$ source $0 2 exit 33 fi elif [ -n ${ZSH_VERSION:x} ] ; then SCRIPT_PATH${(%):-%x} elif [ -n ${KSH_VERSION:x} ] ; then SCRIPT_PATH${.sh.file} fi deactivate () { unset -f pydoc /dev/null 21 || true # reset old environment variables # ! [ -z ${VAR_} ] returns true if VAR is declared at all if ! [ -z ${_OLD_VIRTUAL_PATH:_} ] ; then PATH$_OLD_VIRTUAL_PATH export PATH unset _OLD_VIRTUAL_PATH fi if ! [ -z ${_OLD_VIRTUAL_PYTHONHOME_} ] ; then PYTHONHOME$_OLD_VIRTUAL_PYTHONHOME export PYTHONHOME unset _OLD_VIRTUAL_PYTHONHOME fi # The hash command must be called to get it to forget past # commands. Without forgetting past commands the $PATH changes # we made may not be respected hash -r 2/dev/null if ! [ -z ${_OLD_VIRTUAL_PS1_} ] ; then PS1$_OLD_VIRTUAL_PS1 export PS1 unset _OLD_VIRTUAL_PS1 fi unset VIRTUAL_ENV unset VIRTUAL_ENV_PROMPT if [ ! ${1-} nondestructive ] ; then # Self destruct! unset -f deactivate fi } # unset irrelevant variables deactivate nondestructive VIRTUAL_ENV/home/src/.venv if ([ $OSTYPE cygwin ] || [ $OSTYPE msys ]) $(command -v cygpath /dev/null) ; then VIRTUAL_ENV$(cygpath -u $VIRTUAL_ENV) fi export VIRTUAL_ENV # Unset the SCRIPT_PATH variable, now that the VIRTUAL_ENV variable # has been set. This is important for relocatable environments. if ! [ -z ${_OLD_SCRIPT_PATH_} ] ; then SCRIPT_PATH$_OLD_SCRIPT_PATH export SCRIPT_PATH unset _OLD_SCRIPT_PATH else unset SCRIPT_PATH fi _OLD_VIRTUAL_PATH$PATH PATH$VIRTUAL_ENV/bin:$PATH export PATH if [ xsrc ! x ] ; then VIRTUAL_ENV_PROMPTsrc else VIRTUAL_ENV_PROMPT$(basename $VIRTUAL_ENV) fi export VIRTUAL_ENV_PROMPT # unset PYTHONHOME if set if ! [ -z ${PYTHONHOME_} ] ; then _OLD_VIRTUAL_PYTHONHOME$PYTHONHOME unset PYTHONHOME fi if [ -z ${VIRTUAL_ENV_DISABLE_PROMPT-} ] ; then _OLD_VIRTUAL_PS1${PS1-} PS1(${VIRTUAL_ENV_PROMPT}) ${PS1-} export PS1 fi # Make sure to unalias pydoc if its already there alias pydoc 2/dev/null /dev/null unalias pydoc || true pydoc () { python -m pydoc $ } # The hash command must be called to get it to forget past # commands. Without forgetting past commands the $PATH changes # we made may not be respected hash -r 2/dev/null || true看起来这个文件很多很复杂如果简单理解这个文件的核心目的就是修改PATH环境变量。把虚拟环境的系统目录放到PATH的最前面。所以在你激活虚拟环境后执行python、vllm这些命令时系统会先从.venv/bin/目录下查找这些命令。理解了第一个命令再来看第二个命令vllm serve facebook/opt-125m --dtypebfloat16。自然而然就知道这个命令存放在.venv/bin/目录下。也可以用which命令验证下如下图。来看下vllm文件中写了什么#!/home/src/.venv/bin/python3 # -*- coding: utf-8 -*- import sys from vllm.entrypoints.cli.main import main if __name__ __main__: if sys.argv[0].endswith(-script.pyw): sys.argv[0] sys.argv[0][:-11] elif sys.argv[0].endswith(.exe): sys.argv[0] sys.argv[0][:-4] sys.exit(main())逐行解释代码的含义。import sys导入 Python 系统模块用来获取命令行参数、退出程序等。from vllm.entrypoints.cli.main import main从 vLLM 源码里导入真正的主函数 main ()对应的源码vllm/entrypoints/cli/main.py。if __name__ __main__:用于判断是否直接运行了这段代码如果别人import导入则不会执行后续逻辑。if sys.argv[0].endswith(-script.pyw):sys.argv[0] sys.argv[0][:-11]elif sys.argv[0].endswith(.exe):sys.argv[0] sys.argv[0][:-4]对字符串进行截取sys.exit(main())最后一句真正开始调用vllm的源码。看完启动脚本所有源码。所以总结vllm的源码从vllm/entrypoints/cli/main.py开始看。从下一遍笔记开始就真正开始阅读vllm源码心情无比激动(虽然进度有点缓慢)。