CUDA: Difference between revisions
Jackyliu16 (talk | contribs) m The link to the location has moved. |
Improve cuda team github links |
||
(2 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/ | 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/ | {{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='''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 83: | Line 83: | ||
== Setting up CUDA Binary Cache == | == Setting up CUDA Binary Cache == | ||
The [https:// | The [https://nix-community.org/cache/ Nix-community 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 90: | Line 90: | ||
=== NixOS === | === NixOS === | ||
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: | ||
Line 96: | Line 95: | ||
nix.settings = { | nix.settings = { | ||
substituters = [ | substituters = [ | ||
"https:// | "https://nix-community.cachix.org" | ||
]; | ]; | ||
trusted-public-keys = [ | trusted-public-keys = [ | ||
" | "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" | ||
]; | ]; | ||
}; | }; | ||
Line 109: | Line 108: | ||
<syntaxHighlight lang="console"> | <syntaxHighlight lang="console"> | ||
$ cachix use | $ cachix use nix-community | ||
</syntaxHighlight> | </syntaxHighlight> | ||
Line 115: | Line 114: | ||
{{file|/etc/nix/nix.conf|nix|<nowiki> | {{file|/etc/nix/nix.conf|nix|<nowiki> | ||
trusted-public-keys = | trusted-public-keys = nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs= | ||
trusted-substituters = https:// | trusted-substituters = https://nix-community.cachix.org | ||
trusted-users = root @wheel | trusted-users = root @wheel | ||
</nowiki>}} | </nowiki>}} | ||
Line 123: | Line 122: | ||
{{file|~/.config/nix/nix.conf|nix|<nowiki> | {{file|~/.config/nix/nix.conf|nix|<nowiki> | ||
substituters = https:// | substituters = https://nix-community.cachix.org | ||
</nowiki>}} | </nowiki>}} | ||
Latest revision as of 10:38, 27 February 2025
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 @NixOS/cuda-maintainers team on GitHub (project board). If you have an issue using your NVIDIA GPU for computing purposes open an issue on GitHub and tag @NixOS/cuda-maintainers
.
The CUDA toolkit is available in a number of different versions. Please use the latest major version. You can see where they're defined in nixpkgs here.
Several "CUDA-X" libraries are packages as well. In particular,
There are some possible ways to setup a development environment using CUDA on NixOS. This can be accomplished in the following ways:
- By making a FHS user env

cuda-fhs.nix
# Run with `nix-shell cuda-fhs.nix`
{ pkgs ? import <nixpkgs> {} }:
(pkgs.buildFHSUserEnv {
name = "cuda-env";
targetPkgs = pkgs: with pkgs; [
git
gitRepo
gnupg
autoconf
curl
procps
gnumake
util-linux
m4
gperf
unzip
cudatoolkit
linuxPackages.nvidia_x11
libGLU libGL
xorg.libXi xorg.libXmu freeglut
xorg.libXext xorg.libX11 xorg.libXv xorg.libXrandr zlib
ncurses5
stdenv.cc
binutils
];
multiPkgs = pkgs: with pkgs; [ zlib ];
runScript = "bash";
profile = ''
export CUDA_PATH=${pkgs.cudatoolkit}
# export LD_LIBRARY_PATH=${pkgs.linuxPackages.nvidia_x11}/lib
export EXTRA_LDFLAGS="-L/lib -L${pkgs.linuxPackages.nvidia_x11}/lib"
export EXTRA_CCFLAGS="-I/usr/include"
'';
}).env
- By making a nix-shell

cuda-shell.nix
# Run with `nix-shell cuda-shell.nix`
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
name = "cuda-env-shell";
buildInputs = with pkgs; [
git gitRepo gnupg autoconf curl
procps gnumake util-linux m4 gperf unzip
cudatoolkit linuxPackages.nvidia_x11
libGLU libGL
xorg.libXi xorg.libXmu freeglut
xorg.libXext xorg.libX11 xorg.libXv xorg.libXrandr zlib
ncurses5 stdenv.cc binutils
];
shellHook = ''
export CUDA_PATH=${pkgs.cudatoolkit}
# export LD_LIBRARY_PATH=${pkgs.linuxPackages.nvidia_x11}/lib:${pkgs.ncurses5}/lib
export EXTRA_LDFLAGS="-L/lib -L${pkgs.linuxPackages.nvidia_x11}/lib"
export EXTRA_CCFLAGS="-I/usr/include"
'';
}
Setting up CUDA Binary Cache
The Nix-community 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 Using a binary cache page.
NixOS
Add the cache to substituters
and trusted-public-keys
inside your system configuration:

/etc/nixos/configuration.nix
nix.settings = {
substituters = [
"https://nix-community.cachix.org"
];
trusted-public-keys = [
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
];
};
Non-NixOS
If you have cachix installed and set up, all you need to do is run:
$ cachix use nix-community
Else, you have to add substituters
and trusted-public-keys
to /etc/nix/nix.conf
:

/etc/nix/nix.conf
trusted-public-keys = nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=
trusted-substituters = https://nix-community.cachix.org
trusted-users = root @wheel
If your user is in trusted-users
, you can also add the cache in your home directory:

~/.config/nix/nix.conf
substituters = https://nix-community.cachix.org
Some things to keep in mind when setting up CUDA in NixOS
- Some GPUs, like Tesla K80, don't work with the latest drivers, so you must specify them in the option
hardware.nvidia.package
getting the value from your selected kernel, for example,config.boot.kernelPackages.nvidia_x11_legacy470
. You can check which driver version your GPU supports by visiting the nvidia site and checking the driver version. - Even with the drivers correctly installed, some software, like Blender, may not see the CUDA GPU. Make sure your system configuration has the option
hardware.opengl.enable
enabled. - By default, software packaged in source code form has CUDA support disabled, because of the unfree license. To solve this, you can enable builds with CUDA support with a nixpkgs wide configuration, or use binary packaged CUDA compatible software such as blender-bin.
CUDA under WSL
This (surprisingly) works just fine using nixpkgs 23.05 provided that you prefix the LD_LIBRARY_PATH
in your interactive environment with the WSL library directory. For nix shell this looks like:

cuda-shell.nix
shellHook = ''
export CUDA_PATH=${pkgs.cudatoolkit}
export LD_LIBRARY_PATH=/usr/lib/wsl/lib:${pkgs.linuxPackages.nvidia_x11}/lib:${pkgs.ncurses5}/lib
export EXTRA_LDFLAGS="-L/lib -L${pkgs.linuxPackages.nvidia_x11}/lib"
export EXTRA_CCFLAGS="-I/usr/include"
'';