Diferentes versões de CUDA mostradas por nvcc e NVIDIA-smi

122

Estou muito confuso com as diferentes versões do CUDA mostradas executando which nvcce nvidia-smi.

Eu tenho o cuda9.2 e o cuda10 instalados no meu ubuntu 16.04. Agora eu defino o PATH para apontar para cuda9.2. Então, quando eu corro:

 $ which nvcc
 /usr/local/cuda-9.2/bin/nvcc

No entanto, quando eu corro

$ nvidia-smi
Wed Nov 21 19:41:32 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.72       Driver Version: 410.72       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   53C    P0    26W /  N/A |    379MiB /  6078MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1324      G   /usr/lib/xorg/Xorg                           225MiB |
|    0      2844      G   compiz                                       146MiB |
|    0     15550      G   /usr/lib/firefox/firefox                       1MiB |
|    0     19992      G   /usr/lib/firefox/firefox                       1MiB |
|    0     23605      G   /usr/lib/firefox/firefox                       1MiB |

Então, estou usando cuda9.2 como which nvccsugere, ou estou usando cuda10 como nvidia-smisugere?

Eu vi essa resposta, mas ela não fornece uma resposta direta para a confusão, apenas nos pede para reinstalar o cudatoolkit, o que eu já fiz.

yuqli
fonte
29
Acho que vi essa pergunta exata surgir várias vezes nos últimos dias. Mas não consigo encontrar uma duplicata agora. A resposta é: nvidia-smi mostra a versão CUDA que seu driver suporta. Você tem um dos drivers 410.x recentes instalados que suportam CUDA 10. A versão que o driver suporta não tem nada a ver com a versão que você compilar e vincular seu programa. Um driver que suporta CUDA 10.0 também será capaz de executar um aplicativo que foi construído para CUDA 9.2…
Michael Kenzel
@MichaelKenzel entendo. Obrigado pelo esclarecimento! Acho que estou usando CUDA9.2 então ..
yuqli
Uma pergunta semelhante está aqui . @MichaelKenzel se você quiser adicionar uma resposta, eu votaria positivamente.
Robert Crovella
1
@RobertCrovella sim, era o que eu procurava. Eu só aprendi a resposta com o seu comentário lá, então se alguém merece um
voto positivo

Respostas:

179

CUDA tem 2 APIs primárias, o runtime e a API do driver. Ambos têm uma versão correspondente (por exemplo, 8.0, 9.0, etc.)

O suporte necessário para a API do driver (por exemplo, libcuda.so no linux) é instalado pelo instalador do driver GPU.

O suporte necessário para a API de tempo de execução (por exemplo, libcudart.so no linux e também nvcc) é instalado pelo instalador do kit de ferramentas CUDA (que também pode ter um instalador de driver de GPU incluído).

Em qualquer caso, a versão da API do driver (instalada) pode nem sempre corresponder à versão da API do tempo de execução (instalada), especialmente se você instalar um driver de GPU independentemente da instalação do CUDA (ou seja, o kit de ferramentas CUDA).

A nvidia-smiferramenta é instalada pelo instalador do driver da GPU e geralmente tem o driver da GPU em vista, não algo instalado pelo instalador do kit de ferramentas CUDA.

Recentemente (algo entre a versão do driver 410.48 e 410.73 no Linux), os poderosos da NVIDIA decidiram adicionar relatórios da versão da API do driver CUDA instalada pelo driver, na saída de nvidia-smi.

Isso não tem conexão com a versão de tempo de execução CUDA instalada.

nvcc, a ferramenta de driver de compilador CUDA instalada com o kit de ferramentas CUDA, sempre relatará a versão de tempo de execução CUDA que foi criada para reconhecer. Ele não sabe nada sobre qual versão do driver está instalada, ou mesmo se um driver de GPU está instalado.

Portanto, por design, esses dois números não correspondem necessariamente, pois eles refletem duas coisas diferentes.

Se você está se perguntando por que nvcc -Vexibe uma versão do CUDA que você não esperava (por exemplo, exibe uma versão diferente daquela que você pensa ter instalado) ou não exibe nada, em termos de versão, pode ser porque você não seguiu as instruções obrigatórias na etapa 7 (antes de CUDA 11) (ou etapa 6 no guia de instalação do Linux CUDA 11) do guia de instalação do cuda linux

Observe que, embora esta questão principalmente tenha o Linux em vista, os mesmos conceitos se aplicam às instalações do Windows CUDA. O driver possui uma versão de driver CUDA associada a ele (que pode ser consultada nvidia-smi, por exemplo). O tempo de execução CUDA também possui uma versão de tempo de execução CUDA associada a ele. Os dois não corresponderão necessariamente em todos os casos.

Na maioria dos casos, se nvidia-smirelatar uma versão CUDA numericamente igual ou superior à relatada por nvcc -V, isso não é motivo de preocupação. Esse é um caminho de compatibilidade definido em CUDA (drivers / API de driver mais novos suportam kits de ferramentas / API de tempo de execução CUDA "mais antigos"). Por exemplo, se nvidia-smirelata CUDA 10.2 e nvcc -Vrelata CUDA 10.1, isso geralmente não é motivo de preocupação. Deve funcionar, e não significa necessariamente que "realmente instalou o CUDA 10.2 quando pretendia instalar o CUDA 10.1"

Se o nvcccomando não relatar nada (por exemplo Command 'nvcc' not found...), isso também pode ser devido a uma instalação CUDA incorreta, ou seja, as etapas obrigatórias mencionadas acima não foram realizadas corretamente. Você pode começar a descobrir isso usando um utilitário Linux como findou locate(use as páginas de manual para aprender como, por favor) para encontrar o seu nvccexecutável. Supondo que haja apenas um, o caminho para ele pode ser usado para corrigir sua variável de ambiente PATH.

Robert Crovella
fonte
1
@Rober Crovella Obrigado pela clareza. Eu tenho a mesma situação nvidia-smi mostra CUDA versão 10.1 e nvcc mostra 9.1. Agora é possível treinar a rede ou a instalação está correta e ainda funciona?
Dhiren Hamal
Eu segui os passos de pós-instalação, mas ainda assim, nvcc e nvidia-smi estão mostrando versões diferentes do cuda
BeingMIAkashs
Isso é perfeitamente possível. Se você instalou o driver mais recente (fazendo nvidia-smicom que o CUDA 10.2 seja exibido atualmente), mas uma versão anterior do CUDA (digamos, 10.1), haverá uma diferença relatada por nvidia-smiem comparação com nvcc. Não é um problema nesse caso.
Robert Crovella
O comentário é útil, mas não explica o que acontece se nvccrelatar uma versão superior (digamos 10.2) do que nvidia-smi(digamos 10.1). Nesse caso, o Cuda tenta compilá-lo como 10.2 e tenta executá-lo em 10.1. Isso geralmente resulta em erro de tempo de execução, "RuntimeError: CUDA error: no kernel image is available for execution on the device"por exemplo.
TheSaurus
5

nvccestá na pasta bin CUDA - como tal, verifique se a pasta bin CUDA foi adicionada ao seu $PATH.

Especificamente, certifique-se de ter executado as ações CUDA pós-instalação (por exemplo, a partir daqui ):

  1. Adicione o Bin CUDA ao $PATH(ou seja, adicione a seguinte linha ao seu ~/.bashrc)
export PATH=/usr/local/cuda-10.1/bin:/usr/local/cuda-10.1/NsightCompute-2019.1${PATH:+:${PATH}}

PS. Certifique-se de que os dois caminhos a seguir acima existam primeiro: /usr/local/cuda-10.1/bine /usr/local/cuda-10.1/NsightCompute-2019.1(o caminho NsightCompute pode ter um final um pouco diferente dependendo da versão do Nsight compute instalada ...

  1. Atualizar $LD_LIBRARY_PATH(ou seja, adicione a seguinte linha ao seu ~/bashrc).
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64\
                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

Depois disso, nvcce nvidia-smi(ou nvtop) relatam a mesma versão de CUDA ...

Ismail Moghul
fonte
Isso ocorre porque o $ PATH $ especifica o uso de CUDA 10. Mas alguns softwares exigem versões diferentes de CUDA.
yuqli
NsightCompute-2019.1é chamado NsightCompute-1.0em CUDA 10.0.
Astrid
Eu segui os passos de pós-instalação, mas ainda assim, nvcc e nvidia-smi estão mostrando versões diferentes do cuda
BeingMIAkashs
toda vez que abro o terminal, tenho que executar o comando de dois caminhos (da pós-instalação cuda na etapa 7). Existe uma maneira de persistir no estado e não ter que executar os comandos de caminho repetidamente?
monti
@monti Sim, você pode escrever o comando para .bashrcou bash_profilepara que ele carregue automaticamente para cada sessão bash. Veja aqui: stackoverflow.com/questions/14637979/…
yuqli
0

Se você estiver usando o cuda 10.2:

export PATH=/usr/local/cuda-10.2/bin:/opt/nvidia/nsight-compute/2019.5.0${PATH:+:${PATH}}

pode ajudar porque, quando verifiquei, não havia diretório para nsight-compute em cuda-10.2. Não tenho certeza se esse era apenas o meu problema ou então por que eles não mencionam isso na documentação oficial.

Ensolarado
fonte