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
来找到此设置页面。
接下来,您需要为您的运行器命名,例如 linux-nvidia-gpu
,稍后配置工作流时需要记住此名称。然后您需要选择运行器设置
在“平台 (Platform)”下选择“Linux x64”
在“镜像 (Image)”下切换到“合作伙伴 (Partner)”选项卡,然后选择“NVIDIA GPU-Optimized Image for AI and HPC”
在“大小 (Size)”下切换到“GPU 加速 (GPU-powered)”选项卡,然后选择您偏好的 NVIDIA 硬件
然后设置您偏好的最大并发数,然后选择“创建运行器 (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: ...