
你将要做的工作包括:
我们希望看到的资质:
如果感兴趣请联系:
微信:18867144803 简历投递: xiaozhao@nvidia.com
请备注投递的岗位方向如:姓名+深度学习性能优化
]]>剩下的, 占大部分的, 是类似如下的令人困惑的场景.
{"error": "OutOfMemoryError", "detail": "", "body": "", "errors": "CUDA out of memory. Tried to allocate 1024.00 MiB (GPU 0; 11.76 GiB total capacity; 7.92 GiB already allocated; 784.31 MiB free; 10.63 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF"} 根据对 memory_stats 的理解:
这部分内存去哪儿了呢? 为什么在用户申请的时候依然没有被回收呢?
当用户请求内存时, pytorch 的处理流程可以简化为:
get_free_block 去寻找满足要求的空闲 Blocktrigger_free_memory_callbacks 去回收已分配但不再使用的 Block 后, 再次尝试 get_free_blockalloc_block 去向 GPU 申请新的 Blockrelease_available_cached_blocks 将已申请但未分配的 Block 释放后再次尝试 alloc_blockrelease_cached_blocks 将所有已申请但未分配的 Block 释放, 再次尝试 alloc_block我们注意到 pytorch 向 GPU 申请和分配给用户的内存都以 Block 为单位. pytorch 向 GPU 申请的 Block 大小并不固定, 受当时用户请求内存大小的影响. 用户释放内存后, Block 返回给 pytorch 并成为空闲状态. 用户下次申请时优先会复用空闲 Block, 而不是直接向 GPU 申请.
如果用户申请的内存大小小于满足要求的空闲 Block, pytorch 会进行一次 split 操作. 将 Block 分割成两个 Block, 除去用户请求大小的内存会被分割成一个独立的 Block, 留待后用并通过双向链表和分配给用户的 Block 相关联.
trigger_free_memory_callbacks 的回收过程会将相邻的空闲 Block 合并, 提高后续分配的灵活性.
相较于其他内存管理机制, pytorch 的内存管理相对简略:
上述的两点, 造成了 pytorch 可能因为 Block 碎片化, 导致大量内存无法被使用.
假设在某次分配内存时, pytorch 根据用户请求向 GPU 申请了一个 256M 的 Block.
<-------------------------- 256M ----------------------------->
经过多次分配和回收, 其使用情况可能变成如下.
<-- 28M(allocated) --><-- 100M(free) --><-- 28M(allocated) --><-- 100M(free) -->
此时如果用户申请 160M 内存:
max_split_size_mb 的作用在于禁止 pytorch 对任何大于该大小的 Block 进行分割操作, 从而控制碎片化的程度. 我们上文讲诉的都是在未主动设置 max_split_size_mb 的情况下的逻辑, 此时 max_split_size_mb 取默认值 MAX_INT.
我们并没有找到官方推荐的 max_split_size_mb, 我们也不熟悉 pytorch 和 nvida, 很难给出一个很好的推荐值. 从实际使用来和直观逻辑来说, 128/256/512 之类的值都是可选的, 切实的避免了 OOM, 也没有导致明显的性能负担.
pytorch 默认仅在无法获取到合适的空闲 Block 时触发回收, 这个值可以控制当 allocated/capacity 超过此值时触发主动的回收.
pytorch 最新(>v2.0.1)的 master 分支中添加了 Expandable Segments, 可能也可以缓解碎片化的问题.
[ 发送简历到 ] :xiaozhao@nvidia.com
[ WeChat 可加微信 ] :18867144803
代码能力〉工作年限
Deep Learning Performance Architect-Compiler/LLM-TensorRT
主要做的是围绕深度学习端到端的 AI 软件全栈,包括但不限于训练框架、核心计算库、推理优化工具(比如 TensorRT ),AI 编译器,模型压缩等全栈软件栈。以及可以在 AI 软件全栈基础上影响到下一代甚至下两代硬件架构的特性设计。
Required skills: 良好 C++编程,熟悉 AI 软件栈底层或者计算机体系结构,熟悉上层算法与 Python 是加分项。
地点:北京与上海
Deep Learning Performance Architect-TensorRT
负责 NVIDIA 深度学习推理引擎 TensorRT 的设计、开发和维护工作(e.g. TensorRT 模型导入的流程和相关工具,图优化,算子的 CUDA 实现及代码生成,算子性能优化等),以及对当前主流的深度学习模型使用 TensorRT 进行推理的性能进行分析和优化。同时,还将与 NVIDIA GPU 体系结构设计团队合作来推动 NVIDIA 深度学习解决方案的软硬件协同设计和研发。
岗位基本要求: 熟练掌握 C++编程
其它密切相关的技能 /经验: 深度学习框架 /深度学习编译器开发,性能分析 /建模 /优化相关的方法论 /工具,计算机体系结构相关知识,CUDA kernel 开发 /优化
地点:北京与上海
Deep Learning Performance Architect-Operator
主要做的是针对不同 GPU 架构为 TensorRT, cuDNN, cuBLAS, cuSPARSE 等深度学习算子库提供高性能基础算子以及算子融合实现,包含在线代码生成,代码融合等相关开发工作,以及根据当代 GPU 优化瓶颈影响后续硬件架构特征设计和验证工作。
Required skills: 良好 C++编程,熟悉计算机体系结构, 有 TVM, MLIR 相关开发经验是加分项。
地点:上海与北京
Deep Learning Performance Architect
主要做的是围绕运算架构的全栈优化,包括但不限于深度学习模型分析与预测,架构的性能分析,编译器性能分析以及对主流运算架构,软件生态的分析。使 NVIDIA 软件生态与计算架构更好的支持主流应用。
Required skills: 良好 C++/Python ,熟悉 AI 软件或者计算机体系结构。
地点:北京与上海
Developer Technology Engineer-AI
客户的深度学习和高能性计算应用在 NVIDIA 生态上的移植和优化。这些应用包括大语言模型,CV ,Speech,推荐系统和分子动力学,计算力学,计算量子化学等。通过算法和工程优化,提供系统级的优化方案。深度与内部架构和产品团队合作,构建和完善 NVIDIA 软硬件加速生态。
Required skills: Required Skills: 良好 C/C++编程能力,分析能力和沟通能力,熟悉深度学习或 GPU 加速计算软件栈,扎实的深度学习理论基础或精通 GPU 架构和优化。
地点:北京,上海与深圳
]]>我的初步想法是把 CUDA 程序打包成 exe 或者.so 啥的,然后用 Python 调用,使用 Celery 实现分布式集群。
希望大家能有更好的想法
]]>因此,翻车了....。
目的:在不使用 cuda 自带的随机函数前提下,使用 cuda/opencl 的一个内核函数生成 10000 个高斯分布的随机数。
本人已尝试一下步骤:
1.在 cpu 生成 10000 的随机函数(应该是线性同余算法)
2.在 cpu 使用 The Box – Muller transform (听说和线性同余算法使用起来会翻车..)算法将步骤 1 的随机数转成正态分布
3.然后检验是否为正态分布,结果是对的.
4.至此,已经生成了一个 10000 个服从高斯分布的随机数啦,将其保存到数组 a。
事实上需要不断生成并使用数组 a。
因此考虑 GPU
分析:上述的 cpu 代码是序列进行的,也就是只有一个随机种子,然后在一个线程内完成了 10000 个随机数的生成。
然后将代码改改放到 GPU 上面来生成。(目标是实现与 cuda 的函数 curandGenerateNormal(cuda::generator, cudaRand, number, 0.0, 1.0); 一摸一样的功能)。
为了得到与 curandGenerateNormal 函数相同的结果,我尝试每个内核线程维护一个种子,也就是有 10000 个随机数种子。(调用一次内核,然后执行一万个线程,每隔线程使用自己的种子生成一个随机数,然后组合到数组 a 中) 但是目前,我做了试验中,如果每个内核线程维护一个种子,每个线程维护 a[i](i 为线程 id),最后的出来的并不服从高斯分布。
也就是说,纵向去看的话( cpu 串行)是可以得到高斯分布的随机数,横向并不行。
也就是说,假如有 a 数组,b 数组....z 数组中,每个数组自个是高斯分布,但是 a...z 中,各取一个出来,组合在一起,并不服从高斯分布。
而如果从直观上出发,上述应该也服从高斯分布,但是由于随机种子的问题,可能导致其 a....z 可能有相关性。具体原因我也不是很清楚。
不知道表达清楚没,各位兄台有没有了解过相关的信息?
一句话概括就是:curandGenerateNormal 函数相同的功能...
所以想问问大伙有做过相关的研究吗?
]]>不知道是不是编译的时候双精度需要添加一些其他指令?
下面是 kernel。
void CSR(int i,unsigned int N, unsigned int *xadj,unsigned int *adjncy, double *dataxx,double *datayy,double *datazz, double *Cspin, double *CHDemag,double *CH)
{
if(i < N) { double dot[3]={0,0,0}; for(int n = xadj[i] ; n < xadj[i+1]; n++) { unsigned int neigh=adjncy[n]; printf("%d\n",n); printf("%f,%f,%f\n",dataxx[n],datayy[n],datazz[n]); double val[3] = {dataxx[n],datayy[n],datazz[n]}; for(unsigned int co = 0 ; co < 3 ; co++) { dot[co]+=(val[co]*Cspin[3*neigh+co]); } } double a=CHDemag[3*i]; double b=CHDemag[3*i+1]; double c=CHDemag[3*i+2]; CH[3*i]=a+dot[0]; CH[3*i+1]=b+dot[1]; CH[3*i+2]=c+dot[2]; } }
通过显卡参数来看,rtx 应该是没有双精度计算单元的。而 titan v 的双精度应该还行。
而我跑的时候,titan v 比 rtx 慢了三分之一。。
求解
]]>不死心问一下笔记本 1050 支持 cudnn 吗?
既然支持 cuda,怎么会不成功呢?
]]>游戏卡的诱惑太大了啊,显存大,单元多...我知道专业卡在 CAD 方面可能有加成,但是不知道对于 CUDA 这种并行计算有没有优化,或者说可以更加稳定?
]]>之前花 30k 一块的价格,买了几块 tesla K40C ,装 ubuntu 跑深度学习了,运算能力真是强悍,但是另一位导师接受不了这个采购价格,只能买 5k 左右的卡,求推荐!能装 ubuntu 就行,(他之前有块泰坦,装 ubuntu 显示 unknown chipset maxwell ),应该是麦克斯韦架构的卡装不了 ubuntu ,我也不太清楚具体情况。
要求:在这张表里的卡 https://developer.nvidia.com/cuda-gpus
价格 5k 左右就行,给推荐点,谢谢各位
]]>把 float16 的近似物放在 rgba 中( a 几乎不能用),然后到 fragment 里面还原,最后输出到屏幕上的图像就是计算结果
大概在 650m 下面可以有 150Gflops+的成绩( float16 )
然后我在想这东西有什么卵用……(我知道这个世界上有个无人鸟的 webcl )
]]>