GitHub Actions#

GitHub Actions 是一种在 GitHub 上托管的代码自动运行测试的流行方式。

GitHub 的免费套餐包含基本运行器(运行您代码的机器),而付费套餐则支持托管型 NVIDIA GPU 运行器。这使得 GPU 特定的代码可以作为 CI 工作流的一部分进行测试。

费用#

由于免费套餐不包含 GPU 运行器,项目将不得不为 GPU CI 资源付费。通常,GPU 运行器每分钟费用为几美分,更多信息请查看GitHub 文档

我们建议项目在其账户/组织上设置支出限额。这样,您的月度账单就不会出乎意料了。

我们还建议您仅有意愿地运行 GPU CI,而不是对每位贡献者的每个拉取请求都运行。更多信息请查看最佳实践部分。

入门#

设置您的 GPU 运行器#

首先,您需要设置向 GitHub 付款的方式。您可以通过向组织添加支付方式来完成此操作。

在您的计费设置中,您还应决定您希望在 GPU CI 功能上花费的最高金额,然后在您的账户上设置支出限额

接下来,您可以进入您账户的 GitHub Actions 设置并配置大型运行器。您可以通过访问 https://github.com/organizations/<YOUR_ORG>/settings/actions/runners 来找到此设置页面。

Screenshot of the GitHub Actions runner configuration page with the new runner button highlighted

接下来,您需要为您的运行器命名,例如 linux-nvidia-gpu,稍后配置工作流时需要记住此名称。然后您需要选择运行器设置

  • 在“平台 (Platform)”下选择“Linux x64”

  • 在“镜像 (Image)”下切换到“合作伙伴 (Partner)”选项卡,然后选择“NVIDIA GPU-Optimized Image for AI and HPC”

  • 在“大小 (Size)”下切换到“GPU 加速 (GPU-powered)”选项卡,然后选择您偏好的 NVIDIA 硬件

Screenshot of the GitHub Actions runner configuration page a new GPU runner configured

然后设置您偏好的最大并发数,然后选择“创建运行器 (Create runner)”。

配置您的工作流#

要将工作流配置为使用新的 GPU 运行器,您需要将 runs-on 属性设置为与您为运行器组指定的名称一致。

name: GitHub Actions GPU Demo
run-name: ${{ github.actor }} is testing out GPU GitHub Actions 🚀
on: [push]
jobs:
  gpu-workflow:
    runs-on: linux-nvidia-gpu
    steps:
      - name: Check GPU is available
        run: nvidia-smi

最佳实践#

向项目中添加需要付费的 GitHub Actions 运行器,需要您额外考虑何时运行这些工作流。设置支出上限可以让您控制花费的金额,但您仍然希望物有所值。以下是关于何时在项目中有效使用 GPU 运行器的一些技巧。

使用标签触发工作负载#

您可以使用标签来触发工作流,而不是总是在每次推送或拉取请求时触发 GPU 工作流。如果您的项目是公开的,并且任何人都可以提交包含任意代码的拉取请求,这是一个很好的选择。您可能希望有一个机制,由受信任的维护者或协作者手动触发 GPU 工作流。

scikit-learn 项目通过设置一个触发工作流的标签来解决了这个问题。

name: NVIDIA GPU workflow
on:
  pull_request:
    types:
      - labeled

jobs:
  tests:
    if: contains(github.event.pull_request.labels.*.name, 'GPU CI')
    runs-on:
      group: linux-nvidia-gpu
    steps: ...

上述配置指定了只有当拉取请求被添加 GPU CI 标签时,工作流才应运行。他们随后有一个第二个标签移除工作流,该工作流再次移除标签,这使得维护者可以在将来再次添加它,以便在审查拉取请求期间多次触发 GPU CI 工作流。

夜间运行#

有些项目可能不需要对每个拉取请求都运行 GPU 测试,而是可能更喜欢运行夜间回归测试,以确保已合并的内容没有破坏 GPU 功能。

您可以配置 GitHub Actions 工作流按计划运行,并使用一个操作在工作流失败时开启一个议题 (issue)。

name: Nightly GPU Tests

on:
  schedule:
    - cron: "0 0 * * *" # Run every day at 00:00 UTC

jobs:
  tests:
    name: GPU Tests
    runs-on: linux-nvidia-gpu
    steps:
      - uses: actions/checkout@v4
      - name: Run tests
        run: |
          # Run tests here
      - name: Notify failed build
        uses: jayqi/failed-build-issue-action@v1
        if: failure() && github.event.pull_request == null
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}

仅在某些代码路径上运行#

您可能还希望仅在某些路径下的代码被修改时运行 GPU CI 测试。为此,您可以使用on.push.paths 过滤器

name: GPU Tests
on:
  push:
    paths:
      - "src/gpu_submodule/**/*.py"

jobs:
  tests:
    name: GPU Tests
    runs-on: linux-nvidia-gpu
    steps: ...

延伸阅读#