๐ก ๋ณธ ๋ฌธ์๋ '[Linux] NVIDIA Multi-CUDA ์ค์น ๋ฐ CUDA ๋ฒ์ ๋ณ๊ฒฝํ๊ธฐ'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
๋ณธ ๊ธ์์๋ CUDA ์ค์น ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ฃน๋๋ค. ํนํ ์ฌ๋ฌ ์คํ์์ค๋ฅผ ์คํํด์ผํ๋ ๊ฒฝ์ฐ, CUDA๋ฅผ ์ฌ๋ฌ๊ฐ ์ค์นํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ด ๋ฐ์ํ๊ธฐ์ Multi CUDA์ค์น ๋ฐฉ๋ฒ๊น์ง ๊ฐ์ด ์ ๋ฆฌํ์์ผ๋ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
1. ์ค์น ๊ฐ๋ฅํ CUDA๋ฒ์ ํ์ธ
pytorch ๋ฒ์ ํธํ ์ค์น๊ธ์ '2. CUDA ๋ฒ์ ํธํ ์ฒดํฌ'๋ฅผ ๋ณด๊ณ ๋ณด์ ์ค์ธ GPU์์ ์ค์น ํ ์ ์๋ ์ต์ CUDA๋ฒ์ ์ ํ์ธ ํฉ๋๋ค.
2. ์ค์น ํ์ธ
์๋ฌ๊ฐ ๋ฐ์ ํ ์๋ ์์ต๋๋ค. ํ ์์ ์์ ์๋ฌ๋ ์๊ด์์ต๋๋ค.
$ nvidia-smi # ๊ทธ๋ํฝ ๋๋ผ์ด๋ฒ ์ค์น ํ์ธ
$ nvcc --version # cuda๋ฒ์ ํ์ธ
$ ls -l /usr/local # ์ค์น๋ cuda ๋ฒ์ ํ์ธ
3. ๊ธฐ์กด CUDA ์ ๊ฑฐ
์ ํ ์ฌํญ์ ๋๋ค. 2๋ฒ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฑฐ๋, ํ์ฌ ์ค์น๋ CUDA๋ฒ์ ์ด ๋ฎ์ ๊ฒฝ์ฐ ์คํํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
Sudo apt-get purge nvidia* # apt๋ก ์ค์น๋ dirver์ ๊ฑฐ. โป ์ฃผ์ nvidia-docker๊ฐ ์ ๊ฑฐ ๋ ์ ์์. ์ด ๊ฒฝ์ฐ $apt list nvidia* ๊ฒฐ๊ณผ ๋ณด๊ณ ํ๋์ฉ ์ ๊ฑฐ
Sudo apt-get autoremove # nvidia* ํจํค์ง ์์กด์ฑ์ ์ํด ์ค์น๋ ๋ค๋ฅธ ํจํค์ง๋ ์ ๊ฑฐ
Sudo apt-get autoclean # ์ค๋๋ฌ๊ฑฐ๋ ๋ถ์์ ํ ํจํค์ง ์ ๊ฑฐ
Sudo rm -rf /usr/local/cuda* # CUDA ์ ๊ฑฐ
4. CUDA ์ค์น
์ฐ์ , (1์ ์ฐธ์กฐํ์ฌ) ์ค์น ๊ฐ๋ฅํ ๊ฐ์ฅ ๋์ CUDA๋ฒ์ ํ์ธ ํ, ํ์ํ CUDA ๋ฒ์ ์ link ์์ ๋ค์ด๋ก๋ ํฉ๋๋ค.
์ ๋ ์ GPU๊ฐ ์ง์ํ๋ ๊ฐ์ฅ ๋์ ๋ฒ์ ์ธ CUDA 12.4์ ํ์๋ก ํ๋ CUDA 11.3๋ฅผ ๋ค์ด๋ฐ์์ต๋๋ค.
installation instruction์ ๋ฐ๋ผ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํฉ๋๋ค. ๊ฐ์ด๋ ์ธ์ ์ถ๊ฐ๋ก ๊ถํ ์ค์ ์ด ํ์๋ก ํฉ๋๋ค.
$ wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_linux.runsudo
$ chmod 777 cuda_12.4.0_550.54.14_linux.run
$ sh cuda_12.4.0_550.54.14_linux.run
๋ง์ง๋ง ๋ช ๋ น์ด์์ ๋ง์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ๊ฐ ์๊ณ ์๋ ์๋ฌ์ ๊ดํด ๊ธ ํ๋จ์ ์ ๋ฆฌํด๋์์ต๋๋ค.
์กฐ๊ธ๋ง ๊ธฐ๋ค๋ฆฌ๋ฉด ์๋ ๋ฉ์์ง๊ฐ ๋น๋๋ค.
accept ์ ๋ ฅํด์ค๋๋ค.
์ ๊ฐ์ ๊ฒฝ์ฐ์ Demo suite, Documentation์ ๋ถํ์ํด์ ์ค์น ์ ์ธํ์ต๋๋ค. ์ฌ๊ธฐ์ CUDA 12.4๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ, Driver๋ง ์ค์นํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์๋์ ๊ฐ์ด ํ์๋๋ฉด ์ ๋๋ก ์ค์น๋ ๊ฒ ์ ๋๋ค.
nvidia-smi ๋ช ๋ น์ด๋ก ์ค์น๊ฐ ๋ฌ๋์ง ํ์ธํด์ค๋๋ค.
(Multi CUDA ์ค์นํ์ค ๋ถ์) ๋์ผํ๊ฒ 11.8์ ์ค์นํฉ๋๋ค.
$ wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
$ sudo chmod 777 cuda_11.8.0_520.61.05_linux.run
$ sudo sh cuda_11.8.0_520.61.05_linux.run
์ต์ ๋ฒ์ ๊ณผ ๋ค๋ฅด๊ฒ ์ค์นํด์ผํ๋ ๋ถ๋ถ์ ์ฌ๊ธฐ์ ๋๋ค. Driver๋ ์ต์ ๋ฒ์ ์ผ๋ก ์ค์น๋์์ผ๋ฏ๋ก, CUDA Toolkit๋ง ์ค์นํด์ค๋๋ค.
๋ค์๋จ๊ณ์์ update-alternatives๋ก CUDA ๋ฒ์ ์ ์ ํํ๊ฒ ๋ง๋ค ๊ฒ์ด๋ฏ๋ก, No๋ฅผ ์ ํํฉ๋๋ค. (์ด๋ฏธ์ง ์บก์ณ ์๋ชป๋ฌ๋ค์.)
nvidia-smi๋ฅผ ์ ๋ ฅํ๋ฉด ๋์ผํ๊ฒ CUDA 12.4์ด๋ผ๊ณ ํ์๋ฉ๋๋ค. CUDA 11.8์ ์คํํ๋๋ฐ ํฐ ๋ฌธ์ ๋ ์์ต๋๋ค. ๊ณ ์ง์ ์ธ ํ์ ๋ฌธ์ ๋ผ๊ณ ํฉ๋๋ค(link).
ํ์ฌ ์ ์ฉ๋ CUDA ๋ฒ์ ์ ํ์ธํ๊ธฐ ์ํด์ nvcc -V ๋๋ nvcc --version๋ฅผ ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค. nvcc ๋ช ๋ น์ด๊ฐ ์๋๋ค๋ฉด, ์ฐ๊ฒฐ์ด ํ์ํฉ๋๋ค.
$ nvcc -V
Command 'nvcc' not found, but can be installed with:
sudo apt install nvidia-cuda-toolkit
์ด๋ผ๊ณ ํ์๋๋ฉด 'sudo apt install nvidia-cuda-toolkit'๋ฅผ ํ์ง ๋ง๊ณ
$ vi ~/.bashrc
๊ฐ์ฅ ์๋ซ์ค์ 2์ค ์ถ๊ฐ
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
$ source ~/.bashrc
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
2. ๋ฆฌ๋ ์ค(Linux) ํ๊ฒฝ์์ cuda ๋ฒ์ ผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ
1) symlink /usr/local/cuda
$ nano ~/.bashrc
...
export PATH="/usr/local/cuda-11.3/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH"
# <<< conda initialize <<<
alias cuda118='export PATH="/usr/local/cuda-11.3/bin:$PATH" && export LD_LIBRARY_PATH="/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH"'
alias cuda121='export PATH="/usr/local/cuda-12.1/bin:$PATH" && export LD_LIBRARY_PATH="/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH"'
$ source ~/.bashrc
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
2) update-alternatives
update-alternatives๋ฅผ ํตํด cuda๋ฒ์ ์ ์ฌ๋ฌ๊ฐ ์ ํ ํ ์ ์๊ฒ ํฉ๋๋ค. --install๋ก ๋ฒ์ ์ ๋ฑ๋กํ๊ณ , --config๋ก ์ ํ ํ ์ ์๊ฒ ํฉ๋๋ค.
$ sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-11.8 118
update-alternatives: using /usr/local/cuda-11.8 to provide /usr/local/cuda (cuda) in auto mode
$ sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-12.4 124
update-alternatives: using /usr/local/cuda-12.4 to provide /usr/local/cuda (cuda) in auto mode
$ sudo update-alternatives --config cuda
There are 2 choices for the alternative cuda (providing /usr/local/cuda).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/local/cuda-12.4 124 auto mode
1 /usr/local/cuda-11.8 118 manual mode
2 /usr/local/cuda-12.4 124 manual mode
Press <enter> to keep the current choice[*], or type selection number: 2
$ ls -l /usr/local
..
lrwxrwxrwx 1 root root 22 4์ 28 01:03 cuda -> /etc/alternatives/cuda
drwxr-xr-x 16 root root 4096 4์ 4 02:28 cuda-11.8
drwxr-xr-x 16 root root 4096 4์ 4 01:59 cuda-12.4
...
/usr/local/cuda๊ฐ /etc/alternatives/cuda์ ์ฐ๊ฒฐ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
3) switch-cuda
[Github] switch-cuda: https://github.com/phohenecker/switch-cuda
+ CUDA Verseion์ ๋ง๋ GCC version ์ธํ ํ๊ธฐ
Check the maximum supported GCC version for your CUDA version:
Set an env var for that GCC version. For example, for CUDA 10.2:
MAX_GCC_VERSION=8
Make sure you have that version installed:
sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
Add symlinks within CUDA folders:
sudo ln -s /usr/bin/gcc-$MAX_GCC_VERSION /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-$MAX_GCC_VERSION /usr/local/cuda/bin/g++
(or substitute /usr/local/cuda with your CUDA installation path, if it's not there)
See this GitHub gist for more information on the CUDA-GCC compatibility table.
์ฐธ๊ณ
- [StackOverFlow] CUDA incompatible with my gcc version: https://stackoverflow.com/questions/6622454/cuda-incompatible-with-my-gcc-version
- [Blog] CUDA ์ค์น & Multi CUDA ์ค์น: https://xoft.tistory.com/86
- [Blog] Ubuntu 20.04 CUDA 11.2 GCC 10 python3.7 ํ๊ฒฝ ์ธํ : https://backenddeveloper.tistory.com/184
- [Blog] ๋ฆฌ๋ ์ค(Linux) ํ๊ฒฝ์์ cuda ๋ฒ์ ผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ: https://yangchanghee2251.github.io/ubuntu/cuda/