我們在配置深度學習環境的時候,除了安裝各種庫和框架外,如果需要 GPU 加速,還需要配置 CUDA 。那 CUDA 是什么 ?它的作用是什么 ?
CUDA 編程介紹
01
什么是 CUDA?
CUDA (Compute Unified Device Architecture) 是通用的并行計算平臺和編程模型,利用 Nvidia GPU 中的并行計算引擎能更有效地解決復雜的問題,如矩陣和線性代數等相關運算。
02
為什么需要 CUDA ?
GPU 是為高速并行計算而生的(我們常見的場景應該是游戲)
對于某些應用,通過 GPU 調用比 CPU 調用高 30-100 倍
GPU 擁有 ALU (算術邏輯單元), 允許更多的并行計算結合。例如計算屏幕上每個像素的顏色等
CUDA 充分發揮 GPU 的作用 ,使得開發者通過編程釋放 GPU 的并行計算能力。
03
進入 CUDA 編程的所需條件
CUDA 支持不同的編程語言(如上圖) C / C++ / Python 等,最常用還是通過 CUDA C 進行編寫。CUDA C 是標準 ANSI C 語言的擴展,支持異構編程。
實際上除了編程語言外,你或者更需要的是一塊高性能顯卡。當你缺少鈔票的時候,公有云會是進入 CUDA 編程的最低成本選擇。
Azure 機器學習讓你零成本
入坑 CUDA 編程
Azure 有非常強大的機器學習功能, 我一直喜歡使用 Azure 機器學習來構建我的機器學習或深度學習方案。對于個人開發者和學生黨都可以免費申領 Azure 。
對于個人開發者,你只需要一張信用卡,通過以下地址,就可以申領 Azure 200 美金的免費額度:https://azure.com/free
對于學生黨,你只需要有一個 edu 郵箱 ,通過以下地址,就可以申領 Azure 100 美金的免費額度:https://aka.ms/studentgetazure
這個額度足夠你在 Azure 上使用一個 K80 的計算實例從 0 開始學習 CUDA 編程。(或者有些小伙伴希望 A100 ,但個人覺得 K80 對于初哥已經非常足夠了)。以下是構建方式:
01
在 Azure 門戶上創建?
Azure 機器學習工作區
進入門戶 ,點擊“創建資源”,選擇 AI + 機器學習 , 再選擇 Azure Machine Learning
進入 Azure Machine Learning 后,需要添加 Azure 機器學習工作區所在資源組和相關的名字,這里特別提示, Azure 上只有 West US 2 的區域提供了 GPU 相關的計算實例,所以在選用時,一定要選用 West US 2, 否則你沒法使用 GPU 的計算實例。
當確認好后,點擊 “審閱和創建”,確認無誤后,再點擊“創建”,稍等片刻就可以順利地完成 Azure 機器學習工作區的創建。
創建完成后,直接進入創建好的 Azure 機器學習工作區。
點擊工作室 Web URL 進入屬于你的機器學習環境
02
創建 Azure 機器學習計算實例
Azure 機器學習計算實例是面向數據科學家的基于云的托管式工作站,它針對機器學習場景進行了優化,并結合 JupyterLab, Jupyter Notebook , VS Code 進行項目構建和模型部署。
我們通過左側菜單,點擊管理模塊下的計算,選擇新建,創建一個計算實例
因為涉及到 CUDA 編程,所以必須選擇 GPU
注意:如果你希望獲取更強的 GPU ,可以點擊“從所有選項中選擇”,但你可能需要提交配額申請,該文章提及內容只針對通用的 K80。
點擊創建后,稍等片刻,你的計算實例就創建成功了。
03
計算實例上的第一個 CUDA 程序
在創建好的計算實例中選擇終端
你可以通過終端分別輸入一下命令查看相關 cuda 對應信息
nvidia-smi
nvcc -V
進入后創建一個 code 文件夾, 進入 code 文件夾后,通過 vim 創建一個 helloworld.cu
mkdir?code
cd?code
vim helloworld.cu
在 helloworld.cu 添加如下內容
#include<stdio.h>
#include<stdlib.h> __global__ void print_from_gpu(void) {printf("Hello World! from thread [%d,%d] \From device\n", threadIdx.x,blockIdx.x);
}int main(void) { printf("Hello World from host!\n"); print_from_gpu<<<1,1>>>();cudaDeviceSynchronize();
return 0;
}
通過輸入 :wq! 保存該文件
在終端運行以下指令
nvcc?-arch=sm_37?helloworld.cu?-o?helloworld
./helloworld
運行成功,如下圖
注意:因為 K80 相對比較舊的架構,所以你需要設定好編譯時的對應的相關設定,否則你沒法順利執行 GPU 的相關調用,以下是相關的架構對應圖
為 CUDA 編程
添加 Notebook ?持
喜歡使用 Jupyter Notebook 是開發人員的使用習慣, 網上有很多都是針對友商的環境的設定,但這個你需要佛跳墻。所以我做了一下調整,讓他可以在 Azure 機器學習環境中進行,步驟如下,在作者區域選擇 “Notebooks”,創建一個 notebook 文件夾,選擇創建一個新文件。
Azure 計算實例還是很方便的,因為你不需要配置任何東西,就可以把 Nvidia 驅動, CUDA , CUDNN 等東西配置好了。大家終于不用因為環境而從入門到放棄了!
選擇 Kernel 為 Python3.8 - Azure ML
在新創建的 Notebook 添加一行 Cell, 輸入如下命令
!pip3 install git+https://github.com/kinfey/nvcc4jupyter.git
繼續添加一行 Cell,輸入如下命令
%load_ext azureml_nvcc_plugin
再添加一行 Cell,輸入如下命令
%%cu #include <stdio.h>
__global__ void helloFromHost();
__device__ int helloFromDevice(int tid);
int main()
{helloFromHost<<<1,5>>>();cudaDeviceReset();return 0;
}
__global__ void helloFromHost()
{int tid=threadIdx.x;printf("Hello world From __global__ kernel: %d\n",tid);int tid1=helloFromDevice(tid);printf("tid1 : %d\n",tid1);
}__device__ int helloFromDevice(int tid)
{printf("Hello world Form __device__ kernel: %d\n",tid);return tid+1;
}
然后輸入運行,結果如下 :
這個時候你就可以用 Notebook 去運行 CUDA 程序了。
當然 Azure 機器學習可以支持本地 VS Code 的編寫,你只需要選擇在 VS Code 中編輯,你就可以在本地 VS Code 編寫你的 CUDA 代碼,這樣更方便。
補充:當你不用時 ,切記把計算實例關閉,否則很容易會消耗完,雖然 K80 是 0.9 美元每小時,對于免費額度還是足夠完成所有 CUDA 編程學習,但是也是能省則省。
后記
通過 Azure 你可以免費搭建一個 GPU 的環境進行 CUDA 學習,太方便了。或者 CUDA 學習還有一段很長的路, 但解決了硬件問題,是各位學生黨和個人開發者的福音啊!還不來嘗試一下?
相關資源
1.個人免費 Azure 申請 https://azure.com/free
2.學生免費 Azure 申請 https://aka.ms/studentgetazure
3.了解Azure 機器學習https://learn.microsoft.com/zh-cn/azure/machine-learning/overview-what-is-azure-machine-learning
4.了解 CUDA 編程 https://docs.nvidia.com/cuda
CA周記往期回顧:
更多原創文章與資源共享
請關注Kinfey Techtalk