目錄

GPU 伺服器

深度學習、圖像渲染、科學計算、挖礦這些複雜計算的場景都需要使用 GPU 進行大量計算,但是當你拿到一台 GPU 伺服器以後,你該如何入手學習呢,如何進行調試呢。

小編主要說明一些 GPU 相關的知識,從 GPU 簡單介紹開始,然後到 Linux 下如何查看 GPU 相關指標,最後講解如何偵錯呼叫 GPU,並使用 GPU 執行簡單程式。

GPU 知識介紹

GPU 簡單介紹

GPU 全名為 graphics processing unit,中文譯為圖形處理器,又稱顯示核心、視覺處理器、顯示晶片。

通常一般的程式任務直接是由 CPU 完成,但對於密集型運算任務,就需要藉助 GPU 來完成了。我們對 CPU 結構非常熟悉,一顆處理器其實是由幾個或幾十個運算核心組合而成的,而 GPU 卻擁有上百顆甚至上千個運算核心,所以 GPU 具有強大的運算能力。

CUDA 簡單介紹

要使用 GPU 進行運算,就需要有介面來呼叫 GPU,CUDA 就實現了完整的 GPU 調度方案。 CUDA 是 NVIDIA 公司推出的基於 GPU 的通用平行運算平台,提供了硬體的直接存取介面。 CUDA 採用 C 語言作為程式語言提供大量的高效能運算指令開發能力,使開發者能夠在 GPU 的強大運算能力的基礎上建立起一種效率更高的密集資料運算解決方案。

上面簡單對 GPU 做了個介紹,下面就直接進入實操部分吧。

Linux 的 GPU 查看

查看 GPU 硬體

查看 GPU 簡略訊息

				
					lspci | grep -i vga | grep -i nvidia

				
			
可以看到伺服器有10塊 NVIDIA 的顯示卡

查看某一塊顯示卡的具體詳細信息

				
					lspci -v -s 0001:16:00.0

				
			

直接查看所有顯示卡詳細資訊-1

				
					lspci -vnn | grep -i vga -A 12

				
			

直接查看所有顯示卡詳細資料-2

				
					lshw -C display

				
			

查看系統所使用的顯示卡驅動名稱

				
					lshw -c video | grep configuration
				
			

安裝顯示卡驅動

停用系統預設顯示卡驅動 nouveau
nouveau 是第三方開源的 NVIDIA 驅動,一般 Linux 系統安裝的時候都會預設安裝這個驅動,這個驅動會與 NVIDIA 官方的驅動衝突。

				
					lsmod | grep nouveau
vim /usr/lib/modprobe.d/nvidia.conf 
blacklist nouveau
options nouveau modeset=0

# Uncomment the following line to enable kernel modesetting support.
# There is NO graphical framebuffer (like OSS drivers) at the moment; this is
# only for Wayland. For Gnome, you also require an EGLStream build of Mutter.
# options nvidia-drm modeset=1

建立新的鏡像
dracut /boot/initramfs-$(uname -r).img $(uname -r) --force
reboot
lsmod | grep nouveau
-----------------------------------

				
			

從NVIDIA官網: https://www.nvidia.com/Download/Find.aspx 下載對應顯示卡版本的驅動安裝版本套件。

				
					wget https://us.download.nvidia.com/XFree86/Linux-x86_64/460.56/NVIDIA-Linux-x86_64-460.56.run
chmod +x NVIDIA-Linux-x86_64-460.56.run

安裝系統對應的 gcc 和 kernel-devel,驅動在安裝過程種需要編譯 kernel module
yum install -y gcc kernel-devel-$(uname -r)
安裝 dkms,註冊 nvidia 驅動到 dkms 中,透過 dkms 管理,當核心更新的時候,會自動 build 新的 nvidia 核心模組
yum install -y dkms

./NVIDIA-Linux-x86_64-460.56.run --dkms --silent
--silent 靜默安裝,不彈出圖形化 UI 介面
安裝成功後可以執行 nvidia-smi

如果要卸載可以執行
./NVIDIA-Linux-x86_64-460.56.run --uninstall --silent
檢查是否有 nvidia 軟體包,可以 yum remove 卸載乾淨
rpm -qa | grep -i nvidia
-----------------------------------


				
			

安裝後驗證
查看系統已安裝的NVIDIA module

				
					lsmod|grep nvidia
				
			

查看nvidia的路徑與版本等信息

				
					modinfo nvidia
				
			

nvidia-smi 的使用

nvidia-smi 可以直接查看 GPU 目前使用情況

				
					nvidia-smi
				
			
				
					GPU:表示顯示卡編號,從0開始;
Fan:表示風扇轉速,數值在0到100%之間,是電腦期望的風扇轉速,如果電腦不是透過風扇冷卻或風扇壞了,顯示出來就是N/A;
Name:表示顯示卡名稱;
Temp:表示顯示卡內部的溫度,單位是攝氏度,GPU溫度過高會導致GPU頻率下降;
Perf:表示性能狀態,從P0到P12,P0表示最大性能,P12表示狀態最小性能;
Pwr:表示能耗,上方的Persistence-M表示是持續模式的狀態,持續模式雖然耗能大,但是在新的GPU應用啟動時,花費的時間更少,這裡顯示的是off的狀態;
Bus-Id:表示GPU匯流排的相關訊息,domain:bus:device.function;
Disp.A:即Display Active,表示GPU的顯示是否初始化;
Memory Usage:表示顯存使用率;
Volatile GPU-Util:浮動的GPU利用率;
ECC:是否開啟錯誤檢查和修正技術,0/DISABLED, 1/ENABLED;
Compute M:計算模式0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED;

最下邊一欄的Processes表示每塊GPU上每個進程所使用的顯存情況,其中Type 有C和G,C表示計算的進程,G表示影像處理的進程。

顯示卡佔用和GPU佔用是兩個不一樣的東西,顯示卡是由GPU和顯示卡等組成的,顯示卡和GPU的關係有點類似記憶體和CPU的關係,兩個指標的佔用率不一定是互相對應的。
				
			

結合watch指令動態監控GPU使用情況

				
					watch -n 1 nvidia-smi
				
			

安裝 cuda

cuda下載網址: https://developer.nvidia.com/cuda-toolkit-archive

				
					wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda-repo-rhel7-11-2-local-11.2.0_460.27.04-1.x86_64.rpm
rpm -ivh cuda-repo-rhel7-11-2-local-11.2.0_460.27.04-1.x86_64.rpm 
yum install -y cuda

				
			

查看安裝資訊

				
					/usr/local/cuda/bin/nvcc -V
				
			

程式呼叫 GPU

下面講解如何使用 python 程式呼叫 GPU

pycuda安裝

pycuda 是一個可以存取 NVIDIA的 CUDA 的 python 函式庫

				
					pip3 install pycuda==2018.1.1 -i https://pypi.mirrors.ustc.edu.cn/simple/

				
			

可能會出現以下錯誤訊息:

				
					gcc -pthread -Wno-unused-result -Wsign-compare -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -O3 -DNDEBUG -fPIC -DBOOST_ALL_NO_LIB=1 -DBOOST_THREAD_BUILD_DLL=1 -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION=1 -DBOOST_PYTHON_SOURCE=1 -Dboost=pycudaboost -DBOOST_THREAD_DONT_USE_CHRONO=1 -DPYGPU_PACKAGE=pycuda -DPYGPU_PYCUDA=1 -DHAVE_CURAND=1 -Isrc/cpp -Ibpl-subset/bpl_subset -I/usr/local/lib64/python3.6/site-packages/numpy/core/include -I/usr/include/python3.6m -c src/cpp/cuda.cpp -o build/temp.linux-x86_64-3.6/src/cpp/cuda.o
    In file included from src/cpp/cuda.cpp:4:0:
    src/cpp/cuda.hpp:14:18: fatal error: cuda.h: No such file or directory
     #include <cuda.h>
                      ^
    編譯中斷。
    error: command 'gcc' failed with exit status 1
    
    ----------------------------------------
Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-slw8h082/pycuda/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-ig9vl5ig-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-slw8h082/pycuda/

				
			

出現上面報錯是因為cuda的相關的指令沒有加入環境變量

				
					# 新增環境變數即可
export PATH=/usr/local/cuda-11.2/bin:/usr/local/cuda/bin:$PATH

				
			

程式調用

vim gpu.py

				
					import pycuda.autoinit
from pycuda.compiler import SourceModule
import time
mod = SourceModule("""
    #include <stdio.h>
    __global__ void work()
    {
      printf("Manage GPU success!\\n");
    }
    """)
func = mod.get_function("work")


func(block=(1,1,1))
time.sleep(30)

				
			

執行 python gpu.py
使用 nvidia-smi 查看可以發現 Process 裡面有進程使用 GPU 顯示卡,表示我們的程式呼叫 GPU 成功

GPU 調用機器

預設是使用第 0 個 GPU,如果要使用其他 GPU:

				
					1.可以使用 CUDA_VISIBLE_DEVICES=1 python3 gpu.py 表示使用第一個 1 塊顯示卡;

2.可使用 CUDA_DEVICE=0,1,2 python3 gpu.py 表示使用第 0 塊、1 塊、2 塊顯示卡,當第 0 塊顯示卡顯存使用完畢後,會自動使用第1塊,以此類推;

3.或者直接將呼叫的設定寫在程式裡
import time,os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
注意必須寫在 import pycuda.autoinit 前面
				
			

進化版:同時使用多個GPU
work.py

				
					import time,os
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2,3,4,5,6,7,8,9"
import pycuda.autoinit
from pycuda.compiler import SourceModule
mod = SourceModule("""
    #include <stdio.h>
    __global__ void work()
    {
      printf("Manage GPU success!\\n");
    }
    """)
func = mod.get_function("work")


func(block=(1,1,1))
time.sleep(60)

				
			

mul_gpu.py

				
					import os,threading
cmd = "export PATH=/usr/local/cuda-11.2/bin:/usr/local/cuda/bin:$PATH;/usr/bin/python3 /root/mul_gpu.py"
threads = []


def test():
    os.system(cmd)


for i in range(80):
    t = threading.Thread(target=test,args=())
    t.start()
    threads.append(t)


for i in threads:
    i.join()

				
			

運行 python3 mul_gpu.py
可以看到跑多個任務時,第0塊GPU跑滿後,會接著調度第1塊GPU。

RTX - 3090 GPU 主機

視頻渲染、科學模擬和機器學習
支援 DeepSeek-R1 32B

實例

8卡 NVIDIA RTX-4090 24G

數量

1

全台唯一提供高階 AI / GPU 主機租用

價格殺很大 / 量大可談

RTX - 4090 GPU 主機

視頻渲染、科學模擬和機器學習
支援 DeepSeek-R1 70B

實例

8卡 NVIDIA RTX-4090 24G

數量 庫存緊張,欲租從速

1

全台唯一提供高階 AI / GPU 主機租用

價格殺很大 / 量大可談

HGX H100 GPU 主機

原價 499,999元/月 特惠價 450,000元/月
支援 DeepSeek-R1 671B 滿血版

實例

8顆 NVIDIA HGX H100 80G

數量

1

全台唯一提供高階 AI / GPU 主機租用

價格殺很大 / 量大可談

TAKI Cloud 雲端主機 只要470元起
TAKI GPU 雲端主機 只要6,163元起
TAAI 人工智慧 GPU 主機 只要7,350元起

By taki

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *