diff --git a/nix-builder/lib/checks.nix b/nix-builder/lib/checks.nix index d5be9d5d..8f3d7044 100644 --- a/nix-builder/lib/checks.nix +++ b/nix-builder/lib/checks.nix @@ -103,6 +103,43 @@ let } ]; }; + testFlattenSystemsPtxasVersion = { + expr = flattenSystems [ (validVersion // { ptxasVersion = "13.4"; }) ]; + expected = [ + { + torchVersion = "2.13"; + cudaVersion = "13.0"; + ptxasVersion = "13.4"; + system = "x86_64-linux"; + bundleBuild = true; + } + { + torchVersion = "2.13"; + cudaVersion = "13.0"; + ptxasVersion = "13.4"; + system = "aarch64-linux"; + bundleBuild = true; + } + ]; + }; + testFlattenSystemsPtxasVersionPerSystem = { + expr = flattenSystems [ (validVersion // { ptxasVersion.aarch64-linux = "13.4"; }) ]; + expected = [ + { + torchVersion = "2.13"; + cudaVersion = "13.0"; + system = "x86_64-linux"; + bundleBuild = true; + } + { + torchVersion = "2.13"; + cudaVersion = "13.0"; + ptxasVersion = "13.4"; + system = "aarch64-linux"; + bundleBuild = true; + } + ]; + }; testFlattenSystemsValidates = { expr = throws (flattenSystems [ (validVersion // { cudaVerison = "13.0"; }) ]); expected = true; diff --git a/nix-builder/lib/mk-build-set.nix b/nix-builder/lib/mk-build-set.nix index 199e0acb..2e14ace6 100644 --- a/nix-builder/lib/mk-build-set.nix +++ b/nix-builder/lib/mk-build-set.nix @@ -39,11 +39,14 @@ let self: super: { cuda_nvcc = super.cuda_nvcc.overrideAttrs (prevAttrs: { # Do this before the original postInstall, so that subsequent - # postInstall steps are applied. + # postInstall steps are applied. Since CUDA 13, nvvm is not + # part of cuda_nvcc anymore, but a separate libnvvm package. postInstall = '' cp ${ptxasPackages.cuda_nvcc.src}/bin/ptxas $out/bin/ptxas cp ${ptxasPackages.cuda_nvcc.src}/bin/nvlink $out/bin/nvlink - cp ${ptxasPackages.cuda_nvcc.src}/nvvm/bin/* $out/nvvm/bin/ + if [ -d ${ptxasPackages.cuda_nvcc.src}/nvvm/bin ]; then + cp ${ptxasPackages.cuda_nvcc.src}/nvvm/bin/* $out/nvvm/bin/ + fi '' + prevAttrs.postInstall or ""; }); diff --git a/nix-builder/lib/torch-version-utils.nix b/nix-builder/lib/torch-version-utils.nix index 4614ca31..e9aa62b3 100644 --- a/nix-builder/lib/torch-version-utils.nix +++ b/nix-builder/lib/torch-version-utils.nix @@ -41,13 +41,37 @@ rec { version ); + # `ptxasVersion` is either a version string that applies to all systems, + # or an attrset { = ; } to override ptxas only on some + # systems. Resolve it for a single system; `null` means: use the ptxas + # from `cudaVersion`. + ptxasVersionForSystem = + version: system: + let + ptxasVersion = version.ptxasVersion or null; + in + if builtins.isAttrs ptxasVersion then ptxasVersion.${system} or null else ptxasVersion; + # Expand { systems = [ a b ]; .. } to [ { system = a; ..} { system = b; .. } ] flattenSystems = versions: lib.foldl' ( acc: version: acc - ++ map (system: (builtins.removeAttrs version [ "systems" ]) // { inherit system; }) version.systems + ++ map ( + system: + let + ptxasVersion = ptxasVersionForSystem version system; + in + (builtins.removeAttrs version [ + "systems" + "ptxasVersion" + ]) + // { + inherit system; + } + // lib.optionalAttrs (ptxasVersion != null) { inherit ptxasVersion; } + ) version.systems ) [ ] (map validateTorchVersion versions); backend = diff --git a/nix-builder/versions.nix b/nix-builder/versions.nix index 5abf043a..12e8e305 100644 --- a/nix-builder/versions.nix +++ b/nix-builder/versions.nix @@ -30,6 +30,8 @@ { torchVersion = "2.10"; cudaVersion = "13.0"; + # ptxas 13.0 segfaults on aarch64 compiling large sm90 kernels (flash-attn3). + ptxasVersion.aarch64-linux = "13.4"; systems = [ "x86_64-linux" "aarch64-linux" @@ -83,6 +85,8 @@ { torchVersion = "2.11"; cudaVersion = "13.0"; + # ptxas 13.0 segfaults on aarch64 compiling large sm90 kernels (flash-attn3). + ptxasVersion.aarch64-linux = "13.4"; systems = [ "x86_64-linux" "aarch64-linux" @@ -152,6 +156,8 @@ { torchVersion = "2.12"; cudaVersion = "13.0"; + # ptxas 13.0 segfaults on aarch64 compiling large sm90 kernels (flash-attn3). + ptxasVersion.aarch64-linux = "13.4"; systems = [ "x86_64-linux" "aarch64-linux" @@ -216,6 +222,8 @@ { torchVersion = "2.13"; cudaVersion = "13.0"; + # ptxas 13.0 segfaults on aarch64 compiling large sm90 kernels (flash-attn3). + ptxasVersion.aarch64-linux = "13.4"; systems = [ "x86_64-linux" "aarch64-linux" @@ -283,6 +291,8 @@ { torchVersion = "2.14"; cudaVersion = "13.0"; + # ptxas 13.0 segfaults on aarch64 compiling large sm90 kernels (flash-attn3). + ptxasVersion.aarch64-linux = "13.4"; systems = [ "x86_64-linux" "aarch64-linux"