CUDA: Difference between revisions
CUDA Binary Cache moved to nix-community pt.2 |
mNo edit summary |
||
(5 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
NixOS supports using NVIDIA GPUs for pure computing purposes, not just for graphics. For example, many users rely on NixOS for machine learning both locally and on cloud instances. These use cases are supported by the [https://github.com/orgs/NixOS/ | NixOS supports using NVIDIA GPUs for pure computing purposes, not just for graphics. For example, many users rely on NixOS for machine learning both locally and on cloud instances. These use cases are supported by the [https://github.com/orgs/NixOS/teams/cuda-maintainers @NixOS/cuda-maintainers team] on GitHub ([https://github.com/orgs/NixOS/projects/27 project board]). If you have an issue using your NVIDIA GPU for computing purposes [https://github.com/NixOS/nixpkgs/issues/new/choose open an issue] on GitHub and tag <code>@NixOS/cuda-maintainers</code>. | ||
{{tip|1='''Cache''': Using the [https://app.cachix.org/cache/nix-community nix-community cache] is recommended! It will save you valuable time and electrons. Getting set up should be as simple as <code>cachix use nix-community</code>. Click [[#Setting up CUDA Binary Cache|here]] for more details.}} | {{tip|1='''Cache''': Using the [https://app.cachix.org/cache/nix-community nix-community cache] is recommended! It will save you valuable time and electrons. Getting set up should be as simple as <code>cachix use nix-community</code>. Click [[#Setting up CUDA Binary Cache|here]] for more details.}} | ||
Line 6: | Line 6: | ||
== <code>cudatoolkit</code>, <code>cudnn</code>, and related packages == | == <code>cudatoolkit</code>, <code>cudnn</code>, and related packages == | ||
{{outdated|scope=section|date=July 2024|reason=Note that these examples have been updated more recently (as of 2024-07-30). May not be the best solution. A better resource is likely the packaging CUDA sample code [https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/cuda-modules/cutensor here].}} | |||
The CUDA toolkit is available in a [https://search.nixos.org/packages?channel=unstable&from=0&size=50&buckets=%7B%22package_attr_set%22%3A%5B%22cudaPackages%22%5D%2C%22package_license_set%22%3A%5B%5D%2C%22package_maintainers_set%22%3A%5B%5D%2C%22package_platforms%22%3A%5B%5D%7D&sort=relevance&type=packages&query=cudatoolkit number of different versions]. Please use the latest major version. You can see where they're defined in nixpkgs [https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/cuda-modules/cudatoolkit/releases.nix here]. | The CUDA toolkit is available in a [https://search.nixos.org/packages?channel=unstable&from=0&size=50&buckets=%7B%22package_attr_set%22%3A%5B%22cudaPackages%22%5D%2C%22package_license_set%22%3A%5B%5D%2C%22package_maintainers_set%22%3A%5B%5D%2C%22package_platforms%22%3A%5B%5D%7D&sort=relevance&type=packages&query=cudatoolkit number of different versions]. Please use the latest major version. You can see where they're defined in nixpkgs [https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/cuda-modules/cudatoolkit/releases.nix here]. | ||
Line 12: | Line 12: | ||
* cuDNN is packaged [https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/cuda-modules/cudnn here]. | * cuDNN is packaged [https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/cuda-modules/cudnn here]. | ||
* cuTENSOR is packaged [https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/cuda-modules/cutensor here]. | * cuTENSOR is packaged [https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/cuda-modules/cutensor here]. | ||
There are some possible ways to setup a development environment using CUDA on NixOS. This can be accomplished in the following ways: | There are some possible ways to setup a development environment using CUDA on NixOS. This can be accomplished in the following ways: | ||
Line 19: | Line 17: | ||
* By making a FHS user env | * By making a FHS user env | ||
<syntaxhighlight lang="nix" line="1" start="1"># flake.nix, run with `nix develop` | |||
# Run with `nix-shell cuda-fhs.nix` | # Run with `nix-shell cuda-fhs.nix` | ||
{ pkgs ? import </nowiki><nixpkgs><nowiki> {} }: | { pkgs ? import </nowiki><nixpkgs><nowiki> {} }: | ||
(pkgs. | let | ||
# Change according to the driver used: stable, beta | |||
nvidiaPackage = pkgs.linuxPackages.nvidiaPackages.stable; | |||
in | |||
(pkgs.buildFHSEnv { | |||
name = "cuda-env"; | name = "cuda-env"; | ||
targetPkgs = pkgs: with pkgs; [ | targetPkgs = pkgs: with pkgs; [ | ||
Line 37: | Line 39: | ||
unzip | unzip | ||
cudatoolkit | cudatoolkit | ||
nvidiaPackage | |||
libGLU libGL | libGLU libGL | ||
xorg.libXi xorg.libXmu freeglut | xorg.libXi xorg.libXmu freeglut | ||
Line 49: | Line 51: | ||
profile = '' | profile = '' | ||
export CUDA_PATH=${pkgs.cudatoolkit} | export CUDA_PATH=${pkgs.cudatoolkit} | ||
# export LD_LIBRARY_PATH=${ | # export LD_LIBRARY_PATH=${nvidiaPackage}/lib | ||
export EXTRA_LDFLAGS="-L/lib -L${ | export EXTRA_LDFLAGS="-L/lib -L${nvidiaPackage}/lib" | ||
export EXTRA_CCFLAGS="-I/usr/include" | export EXTRA_CCFLAGS="-I/usr/include" | ||
''; | ''; | ||
}).env | }).env | ||
</ | </syntaxhighlight> | ||
* By making a nix-shell | * By making a nix-shell | ||
<syntaxhighlight lang="nix" line="1" start="1"> | |||
# Run with `nix-shell cuda-shell.nix` | # flake.nix, run with `nix develop`# Run with `nix-shell cuda-shell.nix` | ||
{ pkgs ? import </nowiki><nixpkgs><nowiki> {} }: | { pkgs ? import </nowiki><nixpkgs><nowiki> {} }: | ||
let | |||
nvidiaPackage = pkgs.linuxPackages.nvidiaPackages.stable; | |||
in | |||
pkgs.mkShell { | pkgs.mkShell { | ||
name = "cuda-env-shell"; | name = "cuda-env-shell"; | ||
Line 66: | Line 71: | ||
git gitRepo gnupg autoconf curl | git gitRepo gnupg autoconf curl | ||
procps gnumake util-linux m4 gperf unzip | procps gnumake util-linux m4 gperf unzip | ||
cudatoolkit | cudatoolkit nvidiaPackage | ||
libGLU libGL | libGLU libGL | ||
xorg.libXi xorg.libXmu freeglut | xorg.libXi xorg.libXmu freeglut | ||
Line 74: | Line 79: | ||
shellHook = '' | shellHook = '' | ||
export CUDA_PATH=${pkgs.cudatoolkit} | export CUDA_PATH=${pkgs.cudatoolkit} | ||
# export LD_LIBRARY_PATH=${ | # export LD_LIBRARY_PATH=${nvidiaPackage}/lib:${pkgs.ncurses}/lib | ||
export EXTRA_LDFLAGS="-L/lib -L${ | export EXTRA_LDFLAGS="-L/lib -L${nvidiaPackage}/lib" | ||
export EXTRA_CCFLAGS="-I/usr/include" | export EXTRA_CCFLAGS="-I/usr/include" | ||
''; | ''; | ||
} | } | ||
</ | </syntaxhighlight> | ||
* By making a flake.nix | |||
<syntaxhighlight lang="nix" line="1" start="1"># flake.nix, run with `nix develop` | |||
{ | |||
description = "CUDA development environment"; | |||
outputs = { | |||
self, | |||
nixpkgs, | |||
}: let | |||
system = "x86_64-linux"; | |||
pkgs = import nixpkgs { | |||
inherit system; | |||
config.allowUnfree = true; | |||
config.cudaSupport = true; | |||
config.cudaVersion = "12"; | |||
}; | |||
# Change according to the driver used: stable, beta | |||
nvidiaPackage = pkgs.linuxPackages.nvidiaPackages.stable; | |||
in { | |||
# alejandra is a nix formatter with a beautiful output | |||
formatter."${system}" = nixpkgs.legacyPackages.${system}.alejandra; | |||
devShells.${system}.default = pkgs.mkShell { | |||
buildInputs = with pkgs; [ | |||
ffmpeg | |||
fmt.dev | |||
cudaPackages.cuda_cudart | |||
cudatoolkit | |||
nvidiaPackage | |||
cudaPackages.cudnn | |||
libGLU | |||
libGL | |||
xorg.libXi | |||
xorg.libXmu | |||
freeglut | |||
xorg.libXext | |||
xorg.libX11 | |||
xorg.libXv | |||
xorg.libXrandr | |||
zlib | |||
ncurses | |||
stdenv.cc | |||
binutils | |||
uv | |||
]; | |||
shellHook = '' | |||
export LD_LIBRARY_PATH="${nvidiaPackage}/lib:$LD_LIBRARY_PATH" | |||
export CUDA_PATH=${pkgs.cudatoolkit} | |||
export EXTRA_LDFLAGS="-L/lib -L${nvidiaPackage}/lib" | |||
export EXTRA_CCFLAGS="-I/usr/include" | |||
export CMAKE_PREFIX_PATH="${pkgs.fmt.dev}:$CMAKE_PREFIX_PATH" | |||
export PKG_CONFIG_PATH="${pkgs.fmt.dev}/lib/pkgconfig:$PKG_CONFIG_PATH" | |||
''; | |||
}; | |||
}; | |||
}</syntaxhighlight> | |||
== Setting up CUDA Binary Cache == | == Setting up CUDA Binary Cache == |