AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


【AI】来Get下CUDA
发布日期:2024-06-07 06:11:06 浏览次数: 1666


最近在GPU上部署模型,才了解到CUDA,废话少说,来了解下CUDA!

看效果

这是2个向量的加法的加法,使用GPU来计算的!

话原理

概念

CUDA stands for Compute Unified Device Architecture,是英伟达开发的并行计算和编程的框架,使得开发者可以使用GPU用于通用处理任务,而不仅仅局限于图形渲染!

这里我们理解下GPU,对比CPU的计算单元,可以看到GPU的计算很多!

NVIDIA GPU 的并行计算的工作流程,在代码上分为两步:

1. CPU 调用核函数的函数,该函数由 GPU 执行。

2. GPU 根据给定的并行量,并行执行该函数。

CUDA 中,执行核函数的一个基本单位被称为线程(thread)。若干个 thread 组合成线程块(block),而一次调用中所有的线程块组成了一个网格(grid)

CPU 调用核函数的同时,会指定执行该核函数的线程块数量和每个线程块中线程的数量。这也就意味着,核函数中的内容会被并行地执行线程块的数量 ×每个线程块内的线程数量次!

核函数

  • __global__ 是 CUDA C/C++ 的函数修饰符,表示该函数为核函数

  • 核函数会在 GPU 上执行,但由主机代码调用

  • 返回类型必须为 void

  • 在调用kernel函数时,函数名后的<<<b, t>>>:b代表线程块的数目,t代表每个线程块的线程数目。

__global__ void myKernel() {printf("Hello world\n");}int main(int argc, char const *argv[]) {myKernel<<<4,2>>>();return 0;}

比如这个代码,是4个线程块和每个线程块中2个线程来执行,就会输出8个 hello world

其他,比如内存的分配和回收;主机(CPU)和设备(GPU)之前的数据传输,错误处理等

本次的CUDA编程会涉及到如下的环节

1)定义CUDA核函数vectoradd,是__global__ void

这里说明了向量相加,,这个就是核函数,是GPU来运行

2)定义主函数 main,

  • 定义参数

  • 分配GPU的内存

  • 初始化数据

  • 将数据从主机内存复制到设备内存

  • 调用CUDA核函数

  • 将结果从设备内存复制回主机内存

  • 打印结果

  • 释放GPU内存

来实践

1)先申请GPU或本地有,我申请是RTX 4090,大概¥2.7一个小时,内存120G,CPU 16核
2)安装cuda toolkit,我是直接云镜像安装了,cuda 11
3)配置cuda变量环境
Sudo vi /root/ .bashrc
4)创建cuda文件
sudo vim cuda_program.cu
文件中的代码如下
// 示例:vector_add.cu#include// CUDA核函数,对两个向量进行加法操作__global__ void vectorAdd(int *a, int *b, int *c, int n) { int tid = blockIdx.x * blockDim.x + threadIdx.x; if (tid < n) c[tid] = a[tid] + b[tid];}int main() { int n = 10; int a[n], b[n], c[n]; int *dev_a, *dev_b, *dev_c; // 分配GPU内存 cudaMalloc((void**)&dev_a, n * sizeof(int)); cudaMalloc((void**)&dev_b, n * sizeof(int)); cudaMalloc((void**)&dev_c, n * sizeof(int)); // 初始化数据 for (int i = 0; i < n; i++) { a[i] = i; b[i] = i * i; } // 将数据从主机内存复制到设备内存 cudaMemcpy(dev_a, a, n * sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(dev_b, b, n * sizeof(int), cudaMemcpyHostToDevice); // 定义CUDA核函数调用配置 dim3 blocksPerGrid(1); dim3 threadsPerBlock(n); // 调用CUDA核函数 vectorAdd<<>>(dev_a, dev_b, dev_c, n); // 将结果从设备内存复制回主机内存 cudaMemcpy(c, dev_c, n * sizeof(int), cudaMemcpyDeviceToHost); // 打印结果 printf("Vector addition result:\n"); for (int i = 0; i < n; i++) { printf("%d + %d = %d\n", a[i], b[i], c[i]); } // 释放GPU内存 cudaFree(dev_a); cudaFree(dev_b); cudaFree(dev_c); return 0;}
5) nvcc编译
nvcc -o cuda_program cuda_program.cu
这里会生成一个可执行的cuda_program文件
6) 执行
. / cuda_program

写在最后

最近去周末闲着去看了下教育房子,看到好的教育资源这么近,仿佛是另外一个世界,第一次这么现实,难免感概!(如果上天....我愿意苦10年让我的孩子能接受更好的教育)简直是一个太振奋人心的信息!

也像一个梦,一个奋斗的梦,这个梦是我期望我的后代的接受教育,我们都生活在现实中!有真实的现在!我是否应该去四处奔走争取,未来12年后,会为了这次的没去争取而遗憾吗......

模型的部署的比想象中的麻烦,我申请好了云GPU,预装了CUDA镜像,但是,模型咋都下载不下来,我现在正在从公hugging face上下载,,巨慢已经下载近2天了...keep moving!

beads 珠子

Paleolithic period 旧石器时代

slabs 厚板

in galleries immediately off the inhabited areas of caves

bare walls裸露的墙壁

no backdrops(背景) or environmental trappings

depicted(描绘) in cave art

sought to 寻求

evidence of chips(碎片) in the painted figures

chief motivation

herds of game成群的猎物

explicitly revealed

bovines牛科动物

meatier 多肉的

tusks and horns 象牙和角

unpredctability

mammoths(长毛象), bovines, and horses

reindeer 驯鹿

was not confined to 不局限于

shafts 竖井

notation 符号,记号

artworks 艺术品

an expression of a desire for fertility 渴望生育

参考

https://dingfen.github.io/mpi&openmp/2021/10/08/cuda-beginer.html


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询