Estou tentando iniciar um shell com Cuda. Eu tenho o seguinte arquivo shell.nix
{ pkgs ? import <nixpkgs> { } }:
pkgs.mkShell {
name = "cuda-env-shell";
buildInputs = with pkgs; [
unzip
# other packages
cudatoolkit
# other packages
binutils
];
}
Mas isso falha devido ao seguinte erro. Já enfrentei isso antes com arquivos grandes como o davinci-resolve, por exemplo. Para davinci-resolve, minha solução foi criar um novo flake usando axel com 10 conexões e funcionou bem todas as vezes. No momento estou enfrentando esse problema com Cuda.
[1/0/3 built, 4 copied (183.8/183.8 MiB), 42.8 MiB DL] building cuda_11.8.0_520.61.05_linux.run: Dload Upload Total Spent Left
error: builder for '/nix/store/idz14mzbsv4k5v5ims095jcjk2r50glr-cuda_11.8.0_520.61.05_linux.run.drv' failed with exit code 1;
last 7 log lines:
>
> trying https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
> % Total % Received % Xferd Average Speed Time Time Time Current
> Dload Upload Total Spent Left Speed
> 49 4135M 49 2044M 0 0 772k 0 1:31:20 0:45:08 0:46:12 0
> curl: (56) Recv failure: Connection reset by peer
Quero obter o Cuda, mas posso recuperar o src usando axel em vez de curl? Tentei algo como o seguinte, mas não parece ser uma sintaxe válida?
cudatoolkit.overrideAttrs
(finalAttrs: previousAttrs: {
pname = previousAttrs.pname + "-bar";
src = runCommandLocal "${previousAttrs.pname}.run" rec { } ''
axel \
--num-connections=10 \
--verbose \
--insecure \
--output $out \
"https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run"
'';
})
Erro:
at /nix/store/0g53xyh39z3y90p4d8r341wbqyjy1zhl-source/pkgs/stdenv/generic/make-derivation.nix:395:7:
394| depsHostHost = elemAt (elemAt dependencies 1) 0;
395| buildInputs = elemAt (elemAt dependencies 1) 1;
| ^
396| depsTargetTarget = elemAt (elemAt dependencies 2) 0;
error: Dependency is not of a valid type: element 13 of buildInputs for cuda-env-shell
Na primeira etapa, é necessário adicionar parênteses ao redor da expressão
(cudatoolkit.overrideAttrs (finalAttrs: previousAttrs: { .. }))
para evitar a quebra da lista.Na segunda etapa, é necessário adicionar um
outputHash
para permitir que o construtor aceite a fonte baixada. Inicialmente, você pode usarpara acionar um erro que exibe o hash da fonte. Neste caso, obtive o hash:
sha256-kiPErzrr5Ke77Zq9mxY7A6GzS4VfvCtKDRtwasCaWhY=
.Por fim, é necessário adicionar
axel
ao ambiente a execução do comando. Como ele é usado apenas para baixar a fonte, você pode adicioná-lo aonativeBuildInputs
arquivorunCommandLocal
. Além disso, você pode substituiraxel
no script por${pkgs.axel}/bin/axel
.