跳到内容

在vLLM OSS CI/CD上更新PyTorch版本

vLLM目前的策略是在CI/CD中始终使用最新的PyTorch稳定版本。当新的PyTorch稳定版本发布时,尽早提交PR更新PyTorch版本是标准做法。由于PyTorch版本发布之间的间隔,这个过程并非易事。以 Pull Request #16859为例,本文档概述了实现此更新的常见步骤,以及潜在问题列表和如何解决这些问题。

测试PyTorch候选发布版本 (RCs)

在PyTorch正式发布后才更新vLLM中的PyTorch是不理想的,因为届时发现的任何问题只能通过等待下一个版本或在vLLM中实施临时变通方案来解决。更好的解决方案是在每次发布之前,使用PyTorch候选发布版本 (RC) 来测试vLLM,以确保兼容性。

PyTorch候选发布版本可以从PyTorch测试索引下载。例如,可以使用以下命令安装torch2.7.0+cu12.8 RC:

uv pip install torch torchvision torchaudio \
    --index-url https://download.pytorch.org/whl/test/cu128

当最终的RC版本准备好进行测试时,将在PyTorch dev-discuss论坛上向社区公布。在此公告之后,我们可以通过遵循此三步流程起草拉取请求来开始vLLM集成测试:

  1. 更新requirements文件,使其指向torchtorchvisiontorchaudio的新版本。

  2. 使用以下选项获取最终候选发布版本的wheel包。一些常见的平台是cpucu128rocm6.2.4

    --extra-index-url https://download.pytorch.org/whl/test/<PLATFORM>
    
  3. 由于vLLM使用uv,请确保应用以下索引策略:

    • 通过环境变量
    export UV_INDEX_STRATEGY=unsafe-best-match
    
    • 或通过CLI标志
    --index-strategy unsafe-best-match
    

如果在拉取请求中发现故障,请将其作为问题在vLLM上提出,并抄送PyTorch发布团队以启动关于如何解决它们的讨论。

更新CUDA版本

PyTorch发布矩阵包括稳定版和实验性CUDA版本。由于限制,只有最新的稳定版CUDA版本(例如,torch2.7.0+cu12.6)被上传到PyPI。然而,vLLM可能需要不同的CUDA版本,例如用于Blackwell支持的12.8。这使得过程复杂化,因为我们不能使用现成的pip install torch torchvision torchaudio命令。解决方案是在vLLM的Dockerfiles中使用--extra-index-url

  • 目前重要的索引包括
平台 --extra-index-url
CUDA 12.8 https://download.pytorch.org/whl/cu128
CPU https://download.pytorch.org/whl/cpu
ROCm 6.2 https://download.pytorch.org/whl/rocm6.2.4
ROCm 6.3 https://download.pytorch.org/whl/rocm6.3
XPU https://download.pytorch.org/whl/xpu
  • 更新以下文件以匹配步骤1中的CUDA版本。这确保了发布版的vLLM wheel在CI上得到测试。
    • .buildkite/release-pipeline.yaml
    • .buildkite/scripts/upload-wheels.sh

解决vLLM构建时间过长的问题

当使用新的PyTorch/CUDA版本构建vLLM时,vLLM sccache S3存储桶中将不存在缓存,这可能导致CI上的构建作业超过5小时并超时。此外,由于vLLM的fastcheck流水线以只读模式运行,它不会填充缓存,因此重新运行它来预热缓存是无效的。

尽管 #17419等持续努力从源头解决构建时间过长的问题,目前的权宜之计是在Buildkite上手动触发构建时,将VLLM_CI_BRANCH设置为@khluu提供的自定义分支(VLLM_CI_BRANCH=khluu/use_postmerge_q)。这个分支实现了两件事:

  1. 将超时限制增加到10小时,以防止构建超时。
  2. 允许将编译后的工件写入vLLM sccache S3存储桶以进行预热,从而加快未来的构建速度。

更新依赖

几个vLLM依赖项,例如FlashInfer,也依赖于PyTorch,需要相应地进行更新。与其等待所有依赖项都发布新版本(这会花费太多时间),不如从源代码构建它们以解除更新过程的阻塞。

FlashInfer

以下是如何在vLLM的Dockerfile中,使用torch2.7.0+cu128从源代码构建并安装FlashInfer:

export TORCH_CUDA_ARCH_LIST='7.5 8.0 8.9 9.0 10.0+PTX'
export FLASHINFER_ENABLE_SM90=1
uv pip install --system \
    --no-build-isolation "git+https://github.com/flashinfer-ai/[email protected]"

一个注意事项是,从源代码构建FlashInfer会使vLLM的构建时间增加大约30分钟。因此,最好将wheel包缓存到公共位置以进行即时安装,例如此FlashInfer wheel链接。对于未来的版本,如果您希望在那里发布软件包,请联系PyTorch发布团队。

xFormers

与FlashInfer类似,以下是如何从源代码构建和安装xFormers:

export TORCH_CUDA_ARCH_LIST='7.0 7.5 8.0 8.9 9.0 10.0+PTX'
MAX_JOBS=16 uv pip install --system \
    --no-build-isolation "git+https://github.com/facebookresearch/[email protected]"

Mamba

uv pip install --system \
    --no-build-isolation "git+https://github.com/state-spaces/[email protected]"

causal-conv1d

uv pip install 'git+https://github.com/Dao-AILab/[email protected]'

更新所有不同的vLLM平台

与其尝试在一个拉取请求中更新所有vLLM平台,不如分别处理某些平台更易于管理。vLLM CI/CD中不同平台的需求文件和Dockerfiles的分离允许我们有选择地选择要更新的平台。例如,更新XPU需要来自Intel Extension for PyTorch(英特尔)的相应版本。虽然 Pull Request #16859将vLLM更新到PyTorch 2.7.0(CPU、CUDA和ROCm),但 Pull Request #17444完成了XPU的更新。