当前位置: 首页 > news >正文

派福利!通过 Azure 零成本进入 CUDA 编程

我们在配置深度学习环境的时候,除了安装各种库和框架外,如果需要 GPU 加速,还需要配置 CUDA 。那 CUDA 是什么 ?它的作用是什么 ?

CUDA 编程介绍

什么是 CUDA?

CUDA (Compute Unified Device Architecture) 是通用的并行计算平台和编程模型,利用 Nvidia GPU 中的并行计算引擎能更有效地解决复杂的问题,如矩阵和线性代数等相关运算。

为什么需要 CUDA ?

  1. GPU 是为高速并行计算而生的(我们常见的场景应该是游戏)

  2. 对于某些应用,通过 GPU 调用比 CPU 调用高 30-100 倍

  3. GPU 拥有 ALU (算术逻辑单元), 允许更多的并行计算结合。例如计算屏幕上每个像素的颜色等

CUDA 充分发挥 GPU 的作用 ,使得开发者通过编程释放 GPU 的并行计算能力。

进入 CUDA 编程的所需条件

 

CUDA 支持不同的编程语言(如上图) C / C++ / Python 等,最常用还是通过 CUDA C 进行编写。 CUDA C 是标准 ANSI C 语言的扩展,支持异构编程。

实际上除了编程语言外,你或者更需要的是一块高性能显卡。当你缺少钞票的时候,公有云会是进入 CUDA 编程的最低成本选择。

Azure 机器学习让你零成本入坑 CUDA 编程

Azure 有非常强大的机器学习功能, 我一直喜欢使用 Azure 机器学习来构建我的机器学习或深度学习方案。对于个人开发者和学生党都可以免费申领 Azure 。

对于个人开发者,你只需要一张信用卡,通过以下地址,就可以申领 Azure 200 美金的免费额度

Create Your Azure Free Account Today | Microsoft Azure

对于学生党,你只需要有一个 edu 邮箱 ,通过以下地址,就可以申领 Azure 100 美金的免费额度

面向学生的 Azure - 免费帐户额度 | Microsoft Azure

这个额度足够你在 Azure 上使用一个 K80 的计算实例从 0 开始学习 CUDA 编程。(或者有些小伙伴希望 A100 ,但个人觉得 K80 对于初哥已经非常足够了)

以下是构建方式

1. 在 Azure 门户上创建 Azure 机器学习工作区

进入门户 ,点击“创建资源”,选择 AI + 机器学习 , 再选择 Azure Machine Learning

进入 Azure Machine Learning 后,需要添加 Azure 机器学习工作区所在资源组和相关的名字,这里特别提示, Azure 上只有 West US 2 的区域提供了 GPU 相关的计算实例,所以在选用时,一定要选用 West US 2, 否则你没法使用 GPU 的计算实例

当确认好后,点击 “审阅和创建”,确认无误后,再点击“创建”,稍等片刻就可以顺利地完成 Azure 机器学习工作区的创建。

创建完成后,直接进入创建好的 Azure 机器学习工作区。

 点击工作室 Web URL 进入属于你的机器学习环境

2. 创建 Azure 机器学习计算实例

Azure 机器学习计算实例是面向数据科学家的基于云的托管式工作站,它针对机器学习场景进行了优化,并结合 JupyterLab, Jupyter Notebook , VS Code 进行项目构建和模型部署。

我们通过左侧菜单,点击管理模块下的计算,选择新建,创建一个计算实例

 因为涉及到 CUDA 编程,所以必须选择 GPU

注意: 如果你希望获取更强的 GPU ,可以点击“从所有选项中选择”,但你可能需要提交配额申请,该文章提及内容只针对通用的 K80

 点击创建后,稍等片刻,你的计算实例就创建成功了。

3. 计算实例上的第一个 CUDA 程序

在创建好的计算实例中选择终端

你可以通过终端分别输入一下命令查看相关 cuda 对应信息

 
进入后创建一个 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 申请 Create Your Azure Free Account Today | Microsoft Azure

  2. 学生免费 Azure 申请 面向学生的 Azure - 免费帐户额度 | Microsoft Azure

  3. 了解 Azure 机器学习 什么是 Azure 机器学习? - Azure Machine Learning | Microsoft Learn

  4. 了解 CUDA 编程 CUDA Toolkit Documentation

相关文章:

  • 10.6日作业
  • Mybatis,动态代理方式的CRUD
  • Linux 进程管理类
  • 魔法方阵(CSP-J模拟赛)
  • 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
  • 【axios】二次封装——避免重复发送请求
  • 没有那么难,基于 Echarts + Python Flask 动态实时大屏轻松可以实现
  • 【每日一算法】高精度算法 | 加法 | 减法_模板应用
  • 2022华为杯A题第一问详细思路
  • Qt5.14.2开发Mqtt应用程序
  • 【U3D小游戏】愤怒的小鸟(三)猪的相关
  • 【UEFI实战】LinuxBoot
  • Linux: kernel: 调试:DYNAMIC_DEBUG
  • 开发一个Canvas小游戏 实现一个游戏“引擎”
  • Java Spring MVC框架 II
  • 《Java编程思想》读书笔记-对象导论
  • C# 免费离线人脸识别 2.0 Demo
  • ECMAScript入门(七)--Module语法
  • HTTP 简介
  • JavaScript中的对象个人分享
  • java取消线程实例
  • Java小白进阶笔记(3)-初级面向对象
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PHP面试之三:MySQL数据库
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 码农张的Bug人生 - 初来乍到
  • 排序算法之--选择排序
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 新版博客前端前瞻
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 交换综合实验一
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • #define、const、typedef的差别
  • (42)STM32——LCD显示屏实验笔记
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (实战篇)如何缓存数据
  • (五)网络优化与超参数选择--九五小庞
  • (转)JAVA中的堆栈
  • (转)Linux整合apache和tomcat构建Web服务器
  • ***利用Ms05002溢出找“肉鸡
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 设计模式初探
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET企业级应用架构设计系列之开场白
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @KafkaListener注解详解(一)| 常用参数详解
  • @property括号内属性讲解
  • [ 蓝桥杯Web真题 ]-布局切换
  • [Android]使用Git将项目提交到GitHub