什么是AI算子开发

news2024/11/24 5:29:26

今天在某离职群里看到前同事聊天,说到国内某大厂的一个面试,本来求职面试的岗位是通信库,类似于英伟达的 nccl, 但是却被问到了很多与算子开发相关的问题

图片

看来算子开发岗位依然很稀缺。

联想到之前写过的一篇关于AI算子开发的文章,那时是一个做大模型的公司需要AI算子开发:有前途!大模型也需要AI算子开发岗。

不少小伙伴看了这篇文章之后,对算子开发这个岗位有了了解,也十分感兴趣。

刚好今天朋友圈不少人都发了一个图片,调侃大模型的算法开发,拥有优先择偶权。

图片不知真假,大家感受下。

图片

其实算子开发岗位,与算法岗位有相似之处,但又不是纯算法,还需要和硬件、芯片打交道。

需要对底层芯片很了解,才能把算法更好的部署在芯片上,实现推理的低延时高性能。

1、纯算法的传奇工资

很早之前网上就流传着一些算法工程师的传奇:毕业去大厂做算法,白菜价30-40w起步!

图片

这让工作了很多年的老工程师们都愤愤不平,纷纷大呼薪资被倒挂。

虽然这几年市场冷静了一些,但不可否认的是,搞算法依然是香饽饽,而与算法相关的岗位中,有一个独特的存在,那就是AI 算子开发工程师。

2、AI 算子开发是做什么的?

算子,英文名为 Operator,简称 OP。指的是神经网络中完成特定功能的一些算法节点。比如在CNN网络中,一个卷积节点就属于一个卷积算子。

往大了讲,甚至一个CNN网络也可以称作一个大算子,只不过这个大算子比较复杂。

AI算子开发的岗位主要集中在与底层芯片相关的公司的招聘需求中,或者需要对神经网络有优化需求的公司招聘需求中。

但是问题来了,现在哪个做AI的,稍微有点技术原创型的公司,无论用GPU,还是ASIC,不需要对神经网络做优化呢?

所以,需求很多。那这个职位具体是做什么的呢?

做过深度学习或者使用框架搭过神经网络的同学都知道,一个神经网络就是由一层层的算子构成的。

但在使用框架搭网络的过程,基本上是搭积木似的调用算子接口。

比如在 tensorflow 中调用一个卷积,一行代码就可以搞定:

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

看似很简单,但在这个过程中,你根本看不到这个卷积算法是如何实现的。

你唯一知道的是,给定了一个输入,这一行代码做了卷积运算。

而卷积运算的实际执行过程,恰恰就是算子开发工程师需要做的事:把卷积的运算,在更底层实现出来。

如果在x86的架构下实现,可能就是直接用循环嵌套的方式来实现了,比如:

#include <stdio.h>#define N 4 // 输入数组大小#define K 3 // 卷积核大小void conv2d(float input[N][N],            float kernel[K][K],            float output[N-K+1][N-K+1]) {  int i, j, m, n;      float sum;      // 遍历输出数组      for (i = 0; i < N-K+1; i++) {            for (j = 0; j < N-K+1; j++) {                  sum = 0;                  // 遍历卷积核                  for (m = 0; m < K; m++) {                        for (n = 0; n < K; n++) {                              // 对应元素相乘并累加                              sum += input[i+m][j+n] * kernel[m][n];                        }                  }                  output[i][j] = sum; // 存储卷积结果            }      }}

这是因为x86的架构和指令集并没有针对卷积这一算法做特殊的指令设计,因此我们要想实现这个功能,基本上也只能根据卷积的运算逻辑,来一层层的循环遍历完成。

而有些芯片作为专用AI加速部件,会为卷积这一运算单独设计硬件来完成计算,相对应的,也会设计单独的卷积指令。

因此,在AI芯片上,一个卷积的运算实现,可能就用一条指令,就可以完成很多个数据的乘累加操作,不需要再像上面的代码一样,写那么多循环来遍历卷积核。

当然实现出来只是第一步,更重要的是要优化。利用硬件架构的特性来完成算子的性能优化,从而实现计算加速。

3、算子开发需要什么技能?

了解了算子开发是干什么的,那大概就知道需要什么技能了。

首先,一定要对算法本身很熟悉,甚至是了熟于心才行。

因为算子开发是要真正实现这个算法,而不是在框架侧简单的进行一行python代码的调用。

要在芯片上实现一个算法,需要知道算法的每一个细节,只有这样,才能完成一个算法的功能交付。

其次,还需要对AI芯片的架构特别了解。

需要知道芯片上有哪些硬件模块可以实现这个算法,这些硬件模块之间有什么依赖关系,如何并行、如何同步、如何做优化等,做到了这一点,才能完成一个算法的性能交付。

可以说,算子开发,是一个软硬兼具的岗位。

除此之外,C++/python语言也是不可少的。

因此,算子开发需要的技能,可以大概有3方面:扎实的算法基础、扎实的硬件知识(计算机体系结构相关)以及扎实的编程技能。

4、算子开发的岗位待遇如何?

我从boss直聘上找了一个比较有代表性的职位描述和薪资。

图片

图片

这是北京某公司招聘的5年经验算子岗位的职位和薪资描述。

感兴趣的同学可以去Boss直聘上搜一搜看看。

我个人感觉,算子开发岗的薪资与纯算法岗位其实差不多,但是对算法的要求应该是没有纯算法岗位高的。

因为AI算子开发需要的能力不单单是算法能力,还需要一些硬件知识,甚至是编译器知识。

在现在纯算法工程师越来越卷,恨不得把leetcode刷一遍都不一定过得了纯算法岗面试的情况下,如果你具备算法+硬件+编程能力的技能,不妨试试算子开发岗。

试问,这种可以拥有优先择偶权的岗位,谁不喜欢呢?

参考:^ AI算子开发是什么​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关闭EasyConnect进程详细步骤

1、不关闭导致的问题 nacos浏览器可以正常访问&#xff0c;但idea启动的时候连不上nacos&#xff0c;而且第二次启动都启动不了&#xff0c;一直卡在那里&#xff0c;排查了半天&#xff0c;怀疑是装的EasyConnect的VPN导致的&#xff0c;于是停止掉相关服务即可。但直接结束进…

Ubuntu中安装rabbitMQ

一、安装 RabbitMQ ①&#xff1a;更新源 sudo apt-get update②&#xff1a;安装Rrlang语言 由于RabbitMq需要erlang语言的支持&#xff0c;在安装RabbitMq之前需要安装erlang sudo apt-get install erlang-nox③&#xff1a;安装rabbitMQ sudo apt-get install rabbitmq-s…

【Proteus仿真】【Arduino单片机】数码管显示

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用TM1637、共阳数码管等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示数字、字符。 二、软件设计 /* 作者&#xff1a;嗨小易&am…

如何手动获取spring/springboot中的IOC容器(全局上下文对象)?

IDE&#xff1a;IntelliJ IDEA 2022.2.3 x64 操作系统&#xff1a;win10 x64 位 家庭版 JDK: 1.8 文章目录 前言一、如何手动获取spring容器[ApplicationContext]&#xff1f;方式①&#xff1a;在启动类中获取spring容器方式②&#xff1a;自定义工具类实现ServletContextList…

6.1二叉树的递归遍历(LC144,LC15,LC94)

什么是递归函数&#xff1f; 递归函数是一种函数调用自身的编程技巧。 在递归函数中&#xff0c;函数通过不断调用自身来解决一个问题&#xff0c;直到达到基本情况&#xff08;递归终止条件&#xff09;并返回结果。 递归函数在解决一些问题时非常有用&#xff0c;特别是那些…

kmp算法详解+next数组求解

KMP算法是一种高效的字符串匹配算法&#xff0c;其核心思想是利用已经匹配的部分信息&#xff0c;尽可能减少匹配次数。KMP算法通过预处理阶段计算一个最大前后缀长度数组&#xff08;也称为“部分匹配表”或“失败函数”&#xff09;&#xff0c;用于在匹配失败时确定模式串应…

互联网Java工程师面试题·Spring篇·第七弹

目录 36、什么是基于 Java 的 Spring 注解配置? 给一些注解的例子. 37、什么是基于注解的容器配置? 38、怎样开启注解装配&#xff1f; 39、Required 注解 40、Autowired 注解 41、Qualifier 注解 42、在 Spring 框架中如何更有效地使用 JDBC? 43、JdbcTemplate 44…

网络安全(黑客)-零基础自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

NowCoder | 环形链表的约瑟夫问题

NowCoder | 环形链表的约瑟夫问题 OJ链接 思路&#xff1a; 创建带环链表带环链表的删除节点 代码如下&#xff1a; #include<stdlib.h>typedef struct ListNode ListNode; ListNode* ListBuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node…

基于springboot+vue的图书馆管理系统

图书馆管理系统 springboot32阿博图书馆管理系统 源码合集&#xff1a; www.yuque.com/mick-hanyi/javaweb 源码下载&#xff1a;博主私 摘 要 随着社会的发展&#xff0c;计算机的优势和普及使得阿博图书馆管理系统的开发成为必需。阿博图书馆管理系统主要是借助计算机&…

vue3高德地图+搜索+点击获取经纬度

首先 安装依赖 npm i amap/amap-jsapi-loader --save html&#xff08;设置一个容器&#xff09;点击位置控制台可以打印到数据 如果想要回显到input 只需在input内绑定v-modal即可 <template><div><input style"width: 80%; height: 30px" v-mode…

Java进阶篇--线程池之ScheduledThreadPoolExecutor

目录 ScheduledThreadPoolExecutor简介 构造方法 特有方法 可周期性执行的任务-ScheduledFutureTask DelayedWorkQueue 什么是DelayedWorkQueue&#xff1f; 为什么要使用DelayedWorkQueue呢&#xff1f; DelayedWorkQueue的数据结构 ScheduledThreadPoolExecutor执行…

uniApp页面通讯

Uniapp 是一款基于 Vue.js 开发的框架&#xff0c;它可以用来开发多端应用&#xff0c;包括微信小程序、H5、APP 等。在 Uniapp 中&#xff0c;页面通讯分为三种方式&#xff1a;事件总线、Vuex 和 uni.$emit。 事件总线&#xff08;EventBus&#xff09;&#xff1a;事件总线是…

挖掘非结构化数据潜能——向量数据库的探索之路

“ 摸着石头过河&#xff0c;一直向前&#xff0c;不断尝试 ” 整理 | 小白 出品&#xff5c;极新 IDC 预测&#xff0c;到 2025 年&#xff0c;中国的数据量将增长到 48.6ZB&#xff0c;80% 是非结构化数据&#xff0c;并且将成为全球最大的数据圈。在我们的日常生活中&…

rancher或者其他容器平台使用非root用户启动jar

场景&#xff1a; java程序打成镜像&#xff0c;在rancher上运行&#xff0c;默认是root账户&#xff0c;发现hdfs或者hive不允许root账户操作&#xff1b;所以打算用费root账户启动jar&#xff0c;使其具有hive和hdfs的操作权限。 Dockerfile entrypoint.sh 思路就是上面这样…

git and svn 行尾风格配置强制为lf

git CLI配置&#xff1a; // 提交时转换为LF&#xff0c;检出时转换为CRLF git config --global core.autocrlf true // 提交时转换为LF&#xff0c;检出时不转换 git config --global core.autocrlf input // 提交检出均不转换 git config --global core.autocrlf f…

C# wpf 实现任意控件(包括窗口)更多拖动功能

系列文章目录 第一章 Grid内控件拖动 第二章 Canvas内控件拖动 第三章 任意控件拖动 第四章 窗口拖动 第五章 附加属性实现任意拖动 第六章 拓展更多拖动功能&#xff08;本章&#xff09; 文章目录 系列文章目录前言一、添加的功能1、任意控件MoveTo2、任意控件DragMove3、边…

19 款Agent产品工具合集

原文&#xff1a;19 款Agent产品工具合集 什么是Agent? 你告诉GPT完成一项任务&#xff0c;它就会完成一项任务。 如果你不想为GPT提出所有任务怎么办&#xff1f;如果你想让GPT自己思考怎么办&#xff1f; 想象一下&#xff0c;你创建了一个AI&#xff0c;你可以给它一个…

第一章:IDEA

系列文章目录 文章目录 系列文章目录前言一、IDEA 的使用1.1 IDEA 工作界面1.2 IDEA 的基本介绍和使用1.3 IDEA 使用技巧和经验1.4 IDEA编译与源文件1.5 IDEA 常用快捷键1.6 IDEA模板/自定义模板 总结 前言 IDEA 全称 IntelliJ IDEA&#xff0c;在业界被公认为最好的 Java 开发…

C++进阶-模板

模板 模板的概念函数模板函数模板语法函数模板注意事项案例-实现数据的排序函数模板与普通函数的区别普通函数与函数模板的调用规则 模板的局限性类模板的基本语法类模板与函数模板的区别类模板中成员函数创建时机类模板对象做函数参数类模板与继承类模板成员函数类外实现类模板…