nixpkgs-cuda-ci
本项目已停止维护,转而支持 Nixpkgs 树内发布的 CUDA 支持版本, 构建于 "community Hydra" 并缓存于 nix-community.cachix.org 属于 nix-community 基础设施团队的 工作。 Nix-Community 的基础设施通过 OpenCollective 项目 获得资助:请考虑承诺每月捐款,以确保其持续可用。
原始描述
首先,一个警告:这只是一个开发仓库,日后应当被可持续的替代品所取代。关于 nixpkgs 中 CUDA 的最新信息,请查阅:
- #cuda:nixos.org
- https://nixos.wiki/wiki/CUDA
- https://nixos.org/manual/nixpkgs/unstable/#cuda
- discourse.nixos.org
考虑到上述情况,让我们继续。
最新警告
2024-08-15: 自 https://github.com/SomeoneSerge/nixpkgs-cuda-ci/pull/33 起, 本仓库不再维护任何 jobsets,而是转而使用在 Nixpkgs 中维护的新
release-cuda.nix2024-06-09: 我遇到了 Hercules CI 的 "effects" 队列堵塞的问题, 这实际上关闭了 "flake-update" 效果。这些 效果已被禁用,并替换为一个 flake-update github action,该 action 会触发 HCI 针对新的 master 重新构建 "default" job。其他 job 有时可能会构建过时的 nixpgs 修订版... 这一切相当不稳定,我还没有时间调试这个问题。
2023-03-05: 该仓库不再试图成为 nixpkgs 的直接替代品。我们 只是进行构建。flake 现在用于跟踪所有 nixpkgs 分支(-> flake.lock 变得大得多),并且使用 hercules CI 的
onSchedule,而不是 GitHub workflow,来触发构建。关于 nixpkgs 的直接替代品 参见 numtide/nixpkgs-unfree我们以不同的频率为不同的 cuda 架构进行构建, 这意味着要利用缓存,你可能需要导入 nixpkgs, 例如
import <nixpkgs> { ...; config.cudaCapabilities = [ "8.6" ]; }。 详见 flake这是什么
该仓库用于构建并缓存 nixpkgs 世界,使用
cudaSupport = true。 参见仪表板:https://hercules-ci.com/github/SomeoneSerge/nixpkgs-cuda-ci
这意味着你可以使用 Nix 预构建的 pytorch、tensorflow、jax 和 blender
这也意味着当开发分支出现问题时,我们 会注意到并可以采取措施。 我们构建:
master,nixos-unstable,nixpkgs-unstable,- 以及撰写本文时的最新发行版 -
nixos-23.05我们可能会以不同的频率构建不同的分支。我们也可能 优先处理某些
cudaCapabilities。cachix 的空间有限且启用了垃圾回收。这意味着 你需要保持最新状态才能从缓存中受益(随着我们构建更新的 软件包,旧缓存最终会被丢弃)
构建目前运行在志愿者的机器上。我们计划很快在 wiki 上创建并维护确切的列表。每台机器 使用自己的密钥将构建结果推送到 cachix,并且这些密钥可以被 撤销而不会破坏整个链条。你只需使用一个列在 https://cuda-maintainers.cachix.org/ 的公钥。 cachix
cuda-maintainers缓存和 cachix 密钥目前由 @samuela 管理。我们的 cachix 空间由 @domenkozar 提供。我们希望有一天能找到一个更可持续且更值得信赖的解决方案, 但目前我们将其作为一个概念验证来开发。
如何使用
要使用缓存,请获取 cachix,并执行:
cachix use cuda-maintainers要在 NixOS 上使用缓存,请检查您的
configuration.nix模块中的以下代码片段:nix.binaryCachePublicKeys = [ "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" ]; nix.binaryCaches = [ "https://cuda-maintainers.cachix.org" ];您还可以向您的 flake 用户建议使用该缓存,方法如下
# ... nixConfig = { extra-substituters = [ "https://cuda-maintainers.cachix.org" ]; extra-trusted-public-keys = [ "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" ]; }; outputs = { ... }: { # ... };当用户与您的 flake 交互时,系统会询问他们是否希望使用该缓存并信任该密钥。
从 nixpkgs 使用 cuda 支持包的最一致但也是最昂贵的方式, 是通过全局
config.cudaSupport导入它们:pkgs = import nixpkgs { config.allowUnfree = true; config.cudaSupport = true; }有了这个,
pkgs.python3Packages.jax、pkgs.python3Packages.pytorch等将评估为带有 cuda 支持的包。此 flake 试图作为
nixpkgs的即插即用替代品(更准确地说,是一个代理)。 以下用法预计可以正常工作:
执行
nix run github:SomeoneSerge/nixpkgs-unfree/nixpkgs-unstable#blender以运行带有 cuda 支持的 blender在 flake 输入中使用:
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixpkgs-unstable; inputs.nixpkgs-unfree.url = github:SomeoneSerge/nixpkgs-unfree; inputs.nixpkgs-unfree.inputs.nixpkgs.follows = "nixpkgs";已弃用:在 flake 输入中作为 nixpkgs 的即插即用替代品使用(除非有人做了特殊处理)
inputs.nixpkgs.url = github:SomeoneSerge/nixpkgs-unfree/nixpkgs-unstable; inputs.home-manager.inputs.nixpkgs.follows = "nixpkgs";已弃用:作为 nixpkgs 导入:
inputs.nixpkgs = github:SomeoneSerge/nixpkgs-unfree/nixpkgs-unstable; outputs = { nixpkgs }: let system = "x86_64-linux"; overlay = final: prev: { }; pkgs = import nixpkgs { overlays = [ overlay ]; }; in { # ... }请注意,如果您在参数中传递
config,您必须再次包含cudaSupport和allowUnfree注意:将
<nixpkgs>指向此仓库已被证明是一种相当痛苦 的体验。大多数问题集中在使用import <nixpkgs/lib>. 目前 ./lib 中有一个代理,使这些导入 能够正常工作,但几乎肯定是以再下载一份 nixpkgs 为代价的...如果你仅在项目级别或用户级别启用缓存,可能需要在
/etc/nix/nix.conf中设置trusted-users = ${yourName}。