Merge pull request #164338 from samuela/samuela/cudnn

cudnn: 8.3.0 -> 8.3.2
This commit is contained in:
Samuel Ainsworth 2022-03-17 13:10:52 -07:00 committed by GitHub
commit 7c6eaf9be2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 115 additions and 59 deletions

View file

@ -1,23 +1,29 @@
# The following version combinations are supported:
# * cuDNN 7.4.2, cudatoolkit 10.0
# * cuDNN 7.6.5, cudatoolkit 10.2
# * cuDNN 8.1.1, cudatoolkit 11.0-11.2
# * cuDNN 8.3.0, cudatoolkit 11.0-11.5
# * cuDNN 7.6.5, cudatoolkit 10.0-10.1
# * cuDNN 8.1.1, cudatoolkit 10.2-11.2
# * cuDNN 8.3.2, cudatoolkit 10.2-11.5
{ callPackage
, cudatoolkit_10
, cudatoolkit_10_0
, cudatoolkit_10_1
, cudatoolkit_10_2
, cudatoolkit_11
, cudatoolkit_11_0
, cudatoolkit_11_1
, cudatoolkit_11_2
, cudatoolkit_11_3
, cudatoolkit_11_4
, cudatoolkit_11_5
, fetchurl
, lib
}:
let
generic = args: callPackage (import ./generic.nix (removeAttrs args [ "cudatoolkit" ])) {
inherit (args) cudatoolkit;
};
urlPrefix = "https://developer.download.nvidia.com/compute/redist/cudnn";
in
rec {
# cuDNN 7.x
@ -25,53 +31,88 @@ rec {
cudnn_7_4_cudatoolkit_10_0 = generic rec {
version = "7.4.2";
cudatoolkit = cudatoolkit_10_0;
srcName = "cudnn-${cudatoolkit.majorVersion}-linux-x64-v7.4.2.24.tgz";
sha256 = "18ys0apiz9afid2s6lvy9qbyi8g66aimb2a7ikl1f3dm09mciprf";
# See https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn_742/cudnn-support-matrix/index.html#cudnn-cuda-hardware-versions__table-cudnn-cuda-hardware-versions.
minCudaVersion = "9.2.88";
maxCudaVersion = "10.0.99999";
mkSrc = _: fetchurl {
url = "${urlPrefix}/v${version}/cudnn-10.0-linux-x64-v7.4.2.24.tgz";
hash = "sha256-Lt/IagK1DRfojEeJVaMy5qHoF05+U6NFi06lH68C2qM=";
};
};
# The only overlap between supported and packaged CUDA versions is 10.0.
# The `cudnn` alias still points to this in all-packages.nix. It should be
# upgraded at some point.
cudnn_7_6_cudatoolkit_10_2 = generic rec {
cudnn_7_6_cudatoolkit_10_0 = generic rec {
version = "7.6.5";
cudatoolkit = cudatoolkit_10_2;
srcName = "cudnn-${cudatoolkit.majorVersion}-linux-x64-v7.6.5.32.tgz";
sha256 = "084c13vzjdkb5s1996yilybg6dgav1lscjr1xdcgvlmfrbr6f0k0";
cudatoolkit = cudatoolkit_10_0;
# See https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn_765/cudnn-support-matrix/index.html#cudnn-versions-763-765.
minCudaVersion = "9.2.148";
maxCudaVersion = "10.1.243";
mkSrc = cudatoolkit: fetchurl {
url = "${urlPrefix}/v${version}/cudnn-${cudatoolkit.majorVersion}-linux-x64-v7.6.5.32.tgz";
hash = {
"10.0" = "sha256-KDVeOV8LK5OsLIO2E2CzW6bNA3fkTni+GXtrYbS0kro=";
"10.1" = "sha256-fq7IA5osMKsLx1jTA1iHZ2k972v0myJIWiwAvy4TbLM=";
}."${cudatoolkit.majorVersion}";
};
};
cudnn_7_6_cudatoolkit_10 = cudnn_7_6_cudatoolkit_10_2;
cudnn_7_6_cudatoolkit_10_1 = cudnn_7_6_cudatoolkit_10_0.override { cudatoolkit = cudatoolkit_10_1; };
# cuDNN 8.x
# cuDNN 8.1 is still used by tensorflow at the time of writing (2022-02-17).
# See https://github.com/NixOS/nixpkgs/pull/158218 for more info.
cudnn_8_1_cudatoolkit_11_0 = generic rec {
cudnn_8_1_cudatoolkit_10_2 = generic rec {
version = "8.1.1";
cudatoolkit = cudatoolkit_11_0;
# 8.1.0 is compatible with CUDA 11.0-11.2:
# https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn-811/support-matrix/index.html
srcName = "cudnn-11.2-linux-x64-v8.1.1.33.tgz";
hash = "sha256-mKh4TpKGLyABjSDCgbMNSgzZUfk2lPZDPM9K6cUCumo=";
cudatoolkit = cudatoolkit_10_2;
# See https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn-811/support-matrix/index.html#cudnn-versions-810-811.
minCudaVersion = "10.2.00000";
maxCudaVersion = "11.2.99999";
mkSrc = cudatoolkit:
let v = if lib.versions.majorMinor cudatoolkit.version == "10.2" then "10.2" else "11.2"; in
fetchurl {
url = "${urlPrefix}/v${version}/cudnn-${v}-linux-x64-v8.1.1.33.tgz";
hash = {
"10.2" = "sha256-Kkp7mabpv6aQ6xm7QeSVU/KnpJGls6v8rpAOFmxbbr0=";
"11.2" = "sha256-mKh4TpKGLyABjSDCgbMNSgzZUfk2lPZDPM9K6cUCumo=";
}."${v}";
};
};
cudnn_8_1_cudatoolkit_11_1 = cudnn_8_1_cudatoolkit_11_0.override { cudatoolkit = cudatoolkit_11_1; };
cudnn_8_1_cudatoolkit_11_2 = cudnn_8_1_cudatoolkit_11_0.override { cudatoolkit = cudatoolkit_11_2; };
cudnn_8_1_cudatoolkit_11 = cudnn_8_1_cudatoolkit_11_2;
cudnn_8_1_cudatoolkit_11_0 = cudnn_8_1_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11_0; };
cudnn_8_1_cudatoolkit_11_1 = cudnn_8_1_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11_1; };
cudnn_8_1_cudatoolkit_11_2 = cudnn_8_1_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11_2; };
cudnn_8_1_cudatoolkit_10 = cudnn_8_1_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_10; };
cudnn_8_1_cudatoolkit_11 = cudnn_8_1_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11; };
# cuDNN 8.3 is necessary for the latest jaxlib, esp. jaxlib-bin. See
# https://github.com/google/jax/discussions/9455 for more info.
cudnn_8_3_cudatoolkit_11_0 = generic rec {
# 8.3.0 is the last version to respect the folder structure that generic.nix
# expects. Later versions have files in a subdirectory `local_installers`.
# See eg https://developer.download.nvidia.com/compute/redist/cudnn/v8.3.1/.
version = "8.3.0";
cudatoolkit = cudatoolkit_11_0;
# 8.3.0 is compatible with CUDA 11.0-11.5:
# https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn-830/support-matrix/index.html
srcName = "cudnn-11.5-linux-x64-v8.3.0.98.tgz";
hash = "sha256-RMb1rVyxL7dPoMmh58qvTwTXVa3xGi5bbJ5BfaN2srI=";
};
cudnn_8_3_cudatoolkit_11_1 = cudnn_8_3_cudatoolkit_11_0.override { cudatoolkit = cudatoolkit_11_1; };
cudnn_8_3_cudatoolkit_11_2 = cudnn_8_3_cudatoolkit_11_0.override { cudatoolkit = cudatoolkit_11_2; };
cudnn_8_3_cudatoolkit_11_3 = cudnn_8_3_cudatoolkit_11_0.override { cudatoolkit = cudatoolkit_11_3; };
cudnn_8_3_cudatoolkit_11_4 = cudnn_8_3_cudatoolkit_11_0.override { cudatoolkit = cudatoolkit_11_4; };
cudnn_8_3_cudatoolkit_11_5 = cudnn_8_3_cudatoolkit_11_0.override { cudatoolkit = cudatoolkit_11_5; };
cudnn_8_3_cudatoolkit_11 = cudnn_8_3_cudatoolkit_11_5;
cudnn_8_3_cudatoolkit_10_2 =
generic
rec {
version = "8.3.2";
cudatoolkit = cudatoolkit_10_2;
# See https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn-832/support-matrix/index.html#cudnn-cuda-hardware-versions.
minCudaVersion = "10.2.00000";
maxCudaVersion = "11.5.99999";
mkSrc = cudatoolkit:
let v = if lib.versions.majorMinor cudatoolkit.version == "10.2" then "10.2" else "11.5"; in
fetchurl {
# Starting at version 8.3.1 there's a new directory layout including
# a subdirectory `local_installers`.
url = "https://developer.download.nvidia.com/compute/redist/cudnn/v${version}/local_installers/${v}/cudnn-linux-x86_64-8.3.2.44_cuda${v}-archive.tar.xz";
hash = {
"10.2" = "sha256-1vVu+cqM+PketzIQumw9ykm6REbBZhv6/lXB7EC2aaw=";
"11.5" = "sha256-VQCVPAjF5dHd3P2iNPnvvdzb5DpTsm3AqCxyP6FwxFc=";
}."${v}";
};
}
;
cudnn_8_3_cudatoolkit_11_0 = cudnn_8_3_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11_0; };
cudnn_8_3_cudatoolkit_11_1 = cudnn_8_3_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11_1; };
cudnn_8_3_cudatoolkit_11_2 = cudnn_8_3_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11_2; };
cudnn_8_3_cudatoolkit_11_3 = cudnn_8_3_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11_3; };
cudnn_8_3_cudatoolkit_11_4 = cudnn_8_3_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11_4; };
cudnn_8_3_cudatoolkit_11_5 = cudnn_8_3_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11_5; };
cudnn_8_3_cudatoolkit_10 = cudnn_8_3_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_10; };
cudnn_8_3_cudatoolkit_11 = cudnn_8_3_cudatoolkit_10_2.override { cudatoolkit = cudatoolkit_11; };
}

View file

@ -1,11 +1,9 @@
{ version
, srcName
, hash ? null
, sha256 ? null
{ minCudaVersion
, maxCudaVersion
, mkSrc
, version
}:
assert (hash != null) || (sha256 != null);
{ stdenv
, lib
, cudatoolkit
@ -25,19 +23,18 @@ stdenv.mkDerivation {
name = "cudatoolkit-${cudatoolkit.majorVersion}-cudnn-${version}";
inherit version;
src = let
hash_ = if hash != null then { inherit hash; } else { inherit sha256; };
in fetchurl ({
# URL from NVIDIA docker containers: https://gitlab.com/nvidia/cuda/blob/centos7/7.0/runtime/cudnn4/Dockerfile
url = "https://developer.download.nvidia.com/compute/redist/cudnn/v${version}/${srcName}";
} // hash_);
# It's often the case that the src depends on the version of cudatoolkit it's
# being linked against, so we pass in `cudatoolkit` as an argument to `mkSrc`.
src = mkSrc cudatoolkit;
nativeBuildInputs = [ addOpenGLRunpath ];
# Some cuDNN libraries depend on things in cudatoolkit, eg.
# libcudnn_ops_infer.so.8 tries to load libcublas.so.11. So we need to patch
# cudatoolkit into RPATH. See also https://github.com/NixOS/nixpkgs/blob/88a2ad974692a5c3638fcdc2c772e5770f3f7b21/pkgs/development/python-modules/jaxlib/bin.nix#L78-L98.
#
# Note also that version <=8.3.0 contained a subdirectory "lib64/" but in
# version 8.3.2 it seems to have been renamed to simply "lib/".
installPhase = ''
runHook preInstall
@ -46,14 +43,16 @@ stdenv.mkDerivation {
patchelf --set-rpath "''${p:+$p:}${lib.makeLibraryPath [ stdenv.cc.cc cudatoolkit.lib ]}:${cudatoolkit}/lib:\$ORIGIN/" $1
}
for lib in lib64/lib*.so; do
fixRunPath $lib
for sofile in {lib,lib64}/lib*.so; do
fixRunPath $sofile
done
mkdir -p $out
cp -a include $out/include
cp -a lib64 $out/lib64
[ -d "lib/" ] && cp -a lib $out/lib
[ -d "lib64/" ] && cp -a lib64 $out/lib64
'' + lib.optionalString removeStatic ''
rm -f $out/lib/*.a
rm -f $out/lib64/*.a
'' + ''
runHook postInstall
@ -77,10 +76,21 @@ stdenv.mkDerivation {
};
meta = with lib; {
# Check that the cudatoolkit version satisfies our min/max constraints (both
# inclusive). We mark the package as broken if it fails to satisfies the
# official version constraints (as recorded in default.nix). In some cases
# you _may_ be able to smudge version constraints, just know that you're
# embarking into unknown and unsupported territory when doing so.
broken = let cudaVer = lib.getVersion cudatoolkit; in
!(
lib.versionAtLeast cudaVer minCudaVersion
&& lib.versionAtLeast maxCudaVersion cudaVer
);
description = "NVIDIA CUDA Deep Neural Network library (cuDNN)";
homepage = "https://developer.nvidia.com/cudnn";
license = licenses.unfree;
platforms = [ "x86_64-linux" ];
maintainers = with maintainers; [ mdaiter ];
maintainers = with maintainers; [ mdaiter samuela ];
};
}

View file

@ -4600,21 +4600,26 @@ with pkgs;
cudnnPackages = callPackages ../development/libraries/science/math/cudnn { };
inherit (cudnnPackages)
cudnn_7_4_cudatoolkit_10_0
cudnn_7_6_cudatoolkit_10_2
cudnn_7_6_cudatoolkit_10
cudnn_7_6_cudatoolkit_10_0
cudnn_7_6_cudatoolkit_10_1
cudnn_8_1_cudatoolkit_10_2
cudnn_8_1_cudatoolkit_11_0
cudnn_8_1_cudatoolkit_11_1
cudnn_8_1_cudatoolkit_11_2
cudnn_8_1_cudatoolkit_10
cudnn_8_1_cudatoolkit_11
cudnn_8_3_cudatoolkit_10_2
cudnn_8_3_cudatoolkit_11_0
cudnn_8_3_cudatoolkit_11_1
cudnn_8_3_cudatoolkit_11_2
cudnn_8_3_cudatoolkit_11_3
cudnn_8_3_cudatoolkit_11_4
cudnn_8_3_cudatoolkit_11_5
cudnn_8_3_cudatoolkit_10
cudnn_8_3_cudatoolkit_11;
cudnn = cudnn_7_6_cudatoolkit_10;
# TODO(samuela): This is old and should be upgraded to 8.3 at some point.
cudnn = cudnn_7_6_cudatoolkit_10_1;
cutensorPackages = callPackages ../development/libraries/science/math/cutensor { };
inherit (cutensorPackages)