CUDA: Difference between revisions
Replace nix-community binary cache with cache.nixos-cuda.org |
|||
| (4 intermediate revisions by 2 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/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>. | 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 | {{tip|1='''Cache''': Using the binary cache is recommended! It will save you valuable time and electrons. Click [[#Setting up CUDA Binary Cache|here]] for more details.}} | ||
{{tip|1='''Data center GPUs''': Note that you may need to adjust your driver version to use "data center" GPUs like V100/A100s. See [https://discourse.nixos.org/t/how-to-use-nvidia-v100-a100-gpus/17754 this thread] for more info.}} | {{tip|1='''Data center GPUs''': Note that you may need to adjust your driver version to use "data center" GPUs like V100/A100s. See [https://discourse.nixos.org/t/how-to-use-nvidia-v100-a100-gpus/17754 this thread] for more info.}} | ||
| Line 17: | 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 | { pkgs ? import <nixpkgs> {} }: | ||
let | |||
# Change according to the driver used: stable, beta | |||
nvidiaPackage = pkgs.linuxPackages.nvidiaPackages.stable; | |||
in | |||
(pkgs.buildFHSEnv { | (pkgs.buildFHSEnv { | ||
name = "cuda-env"; | name = "cuda-env"; | ||
| Line 35: | Line 39: | ||
unzip | unzip | ||
cudatoolkit | cudatoolkit | ||
nvidiaPackage | |||
libGLU libGL | libGLU libGL | ||
xorg.libXi xorg.libXmu freeglut | xorg.libXi xorg.libXmu freeglut | ||
| Line 47: | 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 64: | 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 72: | 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"> | * By making a flake.nix | ||
# flake.nix, run with `nix develop` | <syntaxhighlight lang="nix" line="1" start="1"># flake.nix, run with `nix develop` | ||
{ | { | ||
description = "CUDA development environment"; | description = "CUDA development environment"; | ||
| Line 94: | Line 101: | ||
config.cudaVersion = "12"; | config.cudaVersion = "12"; | ||
}; | }; | ||
# Change according to the driver used: stable, beta | |||
nvidiaPackage = pkgs.linuxPackages.nvidiaPackages.stable; | |||
in { | in { | ||
# alejandra is a nix formatter with a beautiful output | # alejandra is a nix formatter with a beautiful output | ||
| Line 103: | Line 112: | ||
cudaPackages.cuda_cudart | cudaPackages.cuda_cudart | ||
cudatoolkit | cudatoolkit | ||
nvidiaPackage | |||
cudaPackages.cudnn | cudaPackages.cudnn | ||
libGLU | libGLU | ||
| Line 115: | Line 124: | ||
xorg.libXrandr | xorg.libXrandr | ||
zlib | zlib | ||
ncurses | |||
stdenv.cc | stdenv.cc | ||
binutils | binutils | ||
| Line 122: | Line 131: | ||
shellHook = '' | shellHook = '' | ||
export LD_LIBRARY_PATH="${ | export LD_LIBRARY_PATH="${nvidiaPackage}/lib:$LD_LIBRARY_PATH" | ||
export CUDA_PATH=${pkgs.cudatoolkit} | export CUDA_PATH=${pkgs.cudatoolkit} | ||
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" | ||
export CMAKE_PREFIX_PATH="${pkgs.fmt.dev}:$CMAKE_PREFIX_PATH" | export CMAKE_PREFIX_PATH="${pkgs.fmt.dev}:$CMAKE_PREFIX_PATH" | ||
| Line 131: | Line 140: | ||
}; | }; | ||
}; | }; | ||
} | }</syntaxhighlight> | ||
</syntaxhighlight> | |||
== Setting up CUDA Binary Cache == | == Setting up CUDA Binary Cache == | ||
The | The binary cache contains pre-built CUDA packages. By adding it to your system, Nix will fetch these packages instead of building them, saving valuable time and processing power. | ||
For more information, refer to the [[Binary Cache#Using a binary cache Using a binary cache|Using a binary cache]] page. | For more information, refer to the [[Binary Cache#Using a binary cache Using a binary cache|Using a binary cache]] page. | ||
| Line 145: | Line 153: | ||
Add the cache to <code>substituters</code> and <code>trusted-public-keys</code> inside your system configuration: | Add the cache to <code>substituters</code> and <code>trusted-public-keys</code> inside your system configuration: | ||
{{file| | {{file|3=<nowiki> | ||
nix.settings = { | nix.settings = { | ||
substituters = [ | substituters = [ | ||
"https:// | "https://cache.nixos-cuda.org" | ||
]; | ]; | ||
trusted-public-keys = [ | trusted-public-keys = [ | ||
" | "cache.nixos-cuda.org:74DUi4Ye579gUqzH4ziL9IyiJBlDpMRn9MBN8oNan9M=" | ||
]; | ]; | ||
}; | }; | ||
</nowiki>}} | </nowiki>|name=/etc/nixos/configuration.nix|lang=nix}} | ||
=== Non-NixOS === | === Non-NixOS === | ||
You have to add <code>substituters</code> and <code>trusted-public-keys</code> to <code>/etc/nix/nix.conf</code>: | |||
{{file| | {{file|3=<nowiki> | ||
trusted-public-keys = | trusted-public-keys = cache.nixos-cuda.org:74DUi4Ye579gUqzH4ziL9IyiJBlDpMRn9MBN8oNan9M= | ||
trusted-substituters = https:// | trusted-substituters = https://cache.nixos-cuda.org | ||
trusted-users = root @wheel | trusted-users = root @wheel | ||
</nowiki>}} | </nowiki>|name=/etc/nix/nix.conf|lang=nix}} | ||
If your user is in <code>trusted-users</code>, you can also add the cache in your home directory: | If your user is in <code>trusted-users</code>, you can also add the cache in your home directory: | ||
{{file| | {{file|3=<nowiki> | ||
substituters = https:// | trusted-public-keys = cache.nixos-cuda.org:74DUi4Ye579gUqzH4ziL9IyiJBlDpMRn9MBN8oNan9M= | ||
</nowiki>}} | trusted-substituters = https://cache.nixos-cuda.org | ||
</nowiki>|name=~/.config/nix/nix.conf|lang=nix}} | |||
== Some things to keep in mind when setting up CUDA in NixOS == | == Some things to keep in mind when setting up CUDA in NixOS == | ||