我们在配置深度学习环境的时候,除了安装各种库和框架外,如果需要 GPU 加速,还需要配置 CUDA。那 CUDA 是什么?它的作用是什么?
CUDA 编程介绍
什么是 CUDA?
CUDA (Compute Unified Device Architecture) 是通用的并行计算平台和编程模型,利用 Nvidia GPU 中的并行计算引擎能更有效地解决复杂的问题,如矩阵和线性代数等相关运算。
为什么需要 CUDA?
- GPU 是为高速并行计算而生的(我们常见的场景应该是游戏)
- 对于某些应用,通过 GPU 调用比 CPU 调用高 30-100 倍
- GPU 拥有 ALU (算术逻辑单元), 允许更多的并行计算结合。例如计算屏幕上每个像素的颜色等
CUDA 充分发挥 GPU 的作用,使得开发者通过编程释放 GPU 的并行计算能力。
进入 CUDA 编程的所需条件
CUDA 支持不同的编程语言(如上图) C / C++ / Python 等,最常用还是通过 CUDA C 进行编写。CUDA C 是标准 ANSI C 语言的扩展,支持异构编程。
实际上除了编程语言外,你或者更需要的是一块高性能显卡。当你缺少钞票的时候,公有云会是进入 CUDA 编程的最低成本选择。
Azure 机器学习让你零成本入坑 CUDA 编程
Azure 有非常强大的机器学习功能,我一直喜欢使用 Azure 机器学习来构建我的机器学习或深度学习方案。对于个人开发者和学生党都可以免费申领 Azure 。
这个额度足够你在 Azure 上使用一个 K80 的计算实例从 0 开始学习 CUDA 编程。(或者有些小伙伴希望 A100,但个人觉得 K80 对于初哥已经非常足够了)。以下是构建方式:
在 Azure 门户上创建 Azure 机器学习工作区
进入门户 ,点击“创建资源”,选择 AI + 机器学习, 再选择 Azure Machine Learning
进入 Azure Machine Learning 后,需要添加 Azure 机器学习工作区所在资源组和相关的名字,这里特别提示,Azure 上只有 West US 2 的区域提供了 GPU 相关的计算实例,所以在选用时,一定要选用 West US 2, 否则你没法使用 GPU 的计算实例。
当确认好后,点击 “审阅和创建”,确认无误后,再点击“创建”,稍等片刻就可以顺利地完成 Azure 机器学习工作区的创建。
创建完成后,直接进入创建好的 Azure 机器学习工作区。
点击工作室 Web URL 进入属于你的机器学习环境
创建 Azure 机器学习计算实例
Azure 机器学习计算实例是面向数据科学家的基于云的托管式工作站,它针对机器学习场景进行了优化,并结合 JupyterLab,Jupyter Notebook,VS Code 进行项目构建和模型部署。
我们通过左侧菜单,点击管理模块下的计算,选择新建,创建一个计算实例
因为涉及到 CUDA 编程,所以必须选择 GPU
注意:如果你希望获取更强的 GPU,可以点击“从所有选项中选择”,但你可能需要提交配额申请,该文章提及内容只针对通用的 K80。
点击创建后,稍等片刻,你的计算实例就创建成功了。
计算实例上的第一个 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 学习,太方便了。