腾讯机器学习平台部
约 2132 字大约 7 分钟
2025-03-23
一面
这个当时没记录,现在来看有些问题记不得了。 面试官首先做了自我介绍,和部门业务的介绍,感觉还挺好的。随后拷打简历上的项目,和寻问到岗时间。
- 多线程中问题,锁与条件变量
- 移动语义,移动完之后,再访问会遇见什么问题。
- C++多态,虚函数
- TCP三次握手和四次挥手的区别
- 给了一个多线程的代码,问我那里有问题,相当于伪代码,他说不要讲究语法。
std::vector<std::string> buffer_;
std::mutex mutex_;
vod GetBuffer(int bucket_id, std::string* result) {
std::lock_guard<std::mutex> guard(mutex_);
result->clear();
*result = buffer_[bucket_id];
buffer[bucket_id]->clear();
}
void main() {
// 把数据加载到buffer
。。。
// 以下多线程执行
{
std::string result;
uint32_t i = rand() % buffer_.size();
// 获取并打印
GetBuffer(i, &result);
std::cout << result << "\n";
}
}
我就说了一个锁的粒度,然后在他提示下说出来第7行那里可以用move,就这两个问题
- 场景题,给你10亿个数据如何寻找中位数,这题被力扣hot100给害了。说一个最大堆和一个最小堆,实际上这两个堆都会拓展的。内存会爆掉。后面我还说了归并排序的思路,也是力扣上寻找两个有序数组中位数的思路,但感觉也没说明白。 最后面试官说应该用分桶来做,大概就是0-1000w的数据分一下,1000w-2000w来分一下,类似于这样,然后统计每个桶的大小,然后再细分就能找到中位数了。
其他问题想起来再更新
接着就是手撕,手写智能指针,他给了模板 当时写的磕磕绊绊的,也是在他提醒下写对了
template<typename T>
class sharePtr {
public:
sharePtr(T *newptr);
sharePtr(sharePtr &sharePtr);
~sharePtr();
sharePtr & operator=(sharePtr &sharePtr);
};
然后问了模型量化的基本原理,问我知道哪一个。
还出了一道智力题:一条马路半小时有车经过的概率是90%,求5分钟有车经过的概率。 其实是概率题,他也提示了5分钟看成独立事件,但感觉我最后答的还是有些问题。 后面想了一会,应该是假设5分钟有车经过的概率是 p,那么五分钟没有车的概率是 1−p。 那么 0.9=1−(1−p)6
最后又问了我一下到岗时间,我和他实话实话6月份,因为6月份有学校的中期。他说他们内部在讨论一下,当时给我吓坏了。
二面
一开始还是自我介绍了部门业务,做混元大模型的。
基本上从简历入手,问了一下研究生期间的方向。
先聊项目,让我挑一个熟的讲,我讲的CMU的哪个Neddle 深度学习框架。讲到矩阵乘的时候打断提问,其实就是写了个kernel,接着问我和标准库比较过没有,性能差多少。我说我没比较过,但是我看过cutlass的gemm实现,把gemm实现和他说一堆。
得知我的实现是使用了共享内存,就是一个他说他也不知道答案的问题,就是想知道我的理解。就是为什么GPU会对缓存进行编程,可以把共享内存理解成缓存嘛,而CPU这么多年,都没有对缓存编程。我说可能因为GPU是异构计算,而CPU在计算机里面占主要地位,他要无时无刻运行操作系统的指令,所以不能对他缓存进行编程。我想说的其实有点是这两个有点像房子装修的时候承重墙和非承重墙的区别。
又问了GEMM是访存密集型还是计算机密集型,答访存密集型。然后讲CPU一般实现的策略,假如C=A*B。问题会出按列读取B的时候,会造成缓存低下的问题,他问我解决策略,我说B转置,但是转置本身就会造成这样的问题。以及还说了一个错误的点,就是我提了一嘴Neddl里数组实现的那种逻辑计算索引的策略,但实际上没有改变内存存放。接着我就想到了分片,讲道理这个应该最先想到的,他说应该如何分高效,我说就CPU的一个缓存块可以把分片矩阵的一行都给放进去。
和面试官聊了好久RDMA的分离式内存。首先介绍了一下RDMA的通信流程,以及为什么高效,还是需要CPU的,但是会缺少CPU参与数据复制的那个过程。就是减少两次用户态和内核态切换的开销,以及在不使用0拷贝技术从内核缓冲区到用户缓冲区再到网卡缓冲区的过程。这一开始我说的很粗糙,面试官一步一步引导我说出来的。他从socket的recv引导我说了这些。
以及两台机子RDMA 8+8内存跑起来,和一台机器16内存跑起来哪个快,我说一台机子快。因我RDMA达不到内存的速度,接着就是内存的访问速率,我说在纳秒级,他说你直接说吞吐量,多少/s。我想了想说几百G-几千G,记不清了。 他反问我和分布式哪个好,我说分布式好。这个问题之前我也想过,因为分布式会多一个参与计算的节点。
接着又问了简历上的了解TVM,这个我之前跑过,大概就是从pytorch或者onnx模型导入tvm,生成中间件relay,之后会有一些自动调优的过程。这个时间有点久了,只记得这些了。第三个项目Lox解释器,我说参考书上实现的。说了一下编译原理的步骤,词法分析,语法分析,中间代码生成,后端代码生成和优化。词法分析那里说了一下NFA,DFA和正则表达式的内容,语法分析那说了递归下降语法分析和LL(1)语法,中间代码生成那里提了一下SSA模式,后端代码优化那里聊了一个mem2reg的优化。接着他举了一个for循环的例子,问我怎么解析。
然后问了简历上写的模型压缩方法,我说了剪枝和量化。感觉他挺满意的。
最后时间不够了他问了一道题,说思路就可以了。
两个有序数组求交集,第一反应就是双指针。他说还有没有什么高效的,其实当时想过一秒钟的二分法,毕竟有序。但被我否决了。后来又说了set,他说有开销。后来他提醒了一下,假如极端条件下一个很多,一个很少,我和他说二分,少的数组在多的数组里面二分查找左边界。
我当时觉得,已经有序的情况下,讲道理双指针跳起来应该很快的时间复杂度应该O(m+n);而二分应该不如双指针快的。
最后反问,部门氛围,轻松,但是也有压力。现在业务主要是all for 混元大模型。新人培养,有导师带,一开始不会特别难。
上下班时间,他说实习生早上有固定时间,晚上他们部门不会走的太早,但是是双休。我顺便拉踩了下拼多多。
最后我好像听到他提了一句,后面应该会推进流程,窃喜。
总结
TEG 机器学习平台部
- 3.13打电话介绍业务并约面,时间约在3.14号晚上。
- 3.14晚面完之后,当晚秒过。
- 3.17打电话约复试,约3.19号。
- 3.19面完之后,第二天3.20,会议消失,流程显示还在复试中,以为有第三面。
- 3.21流程显示进入HR面,当晚HR约面,定在3.24。并且当晚发了云证。
- 期待3.24HR面之后的后续流程。期待offer
- 3.24 下午17.30hr面,大概十分钟。晚上19.40二面面试官打电话过来说没问题,流程走完之后加我个微信。
- 3.31 正式邮件offer
更新日志
b2c6b
-update search engine于