跳至内容

在vLLM开源CI/CD中更新PyTorch版本

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

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

在官方发布后更新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开发讨论论坛上向社区发布公告。公告发布后,我们可以按照以下三步流程起草拉取请求,开始测试vLLM集成:

  1. 更新requirements文件以指向torchtorchvisiontorchaudio的新版本。

  2. 使用以下选项获取最终候选版本的wheel包。一些常见平台包括 cpu, cu128, 和 rocm6.2.4

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

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

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

更新CUDA版本

PyTorch的发布矩阵包含稳定版和实验版的CUDA版本。由于限制条件,只有最新的稳定版CUDA版本(例如torch 2.7.1+cu126)会被上传到PyPI。然而vLLM可能需要不同的CUDA版本,比如支持Blackwell架构的12.8版本。这使得流程复杂化,因为我们无法直接使用开箱即用的pip install torch torchvision torchaudio命令。解决方案是在vLLM的Dockerfiles中使用--extra-index-url参数。

  • 当前重要的指标包括:
Platform --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
  • Update the below files to match the CUDA version from step 1. This makes sure that the release vLLM wheel is tested on 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从源代码构建和安装:

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官方渠道,请联系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]"

因果卷积1d

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

更新所有不同的vLLM平台

与其尝试在单个拉取请求中更新所有vLLM平台,更易于管理的方式是分开处理某些平台。vLLM CI/CD中针对不同平台分离需求和Dockerfile的设计,使我们能够选择性更新特定平台。例如,更新XPU需要等待英特尔发布相应版本的Intel Extension for PyTorch。虽然 Pull Request #16859已在CPU、CUDA和ROCm平台上将vLLM更新至PyTorch 2.7.0,但 Pull Request #17444最终完成了XPU平台的更新。

优云智算