0. 背景介紹
小弟在美國念MS 但念的不是純軟而是Computer Architecture
目前在矽谷的ARM工作四年半
一開始是做ML Processor的Architecture/Microarchitecture Prototype
寫各種處理器的model然後做實驗 然後設計兩三年後的ML處理器該長什麼樣子
兩年前因緣際會開始碰了LLVM上的一種新的infrastructure - MLIR
prototype的目標從專用處理器轉向了ML compilation stack
簡單來說我們設計了一個新的Mid-level IR for ML backend target - TOSA
然後實現在LLVM/MLIR上
最後我們做的所有東西基本上都開源到了Tensorflow跟LLVM的upstream github repo上
另一部分則開源到了ARM自家的開源網站上
算是不小心點了很多原本沒想到的技能樹
一直以來都對寫前後端的純軟沒興趣 本來也沒有想要丟
剛好一個月前被Linkedin推了一下這個缺
發現JD很符合我正在做的事情就丟了
本來也沒打算換工作所以只丟了這一個
leetcode也只在onsite前三天內刷了10題左右
屬於佛系找工作法
但靠著不小心點的技能樹成功轉職到水果公司變成compiler engineer
1. 面試
A. Phone 1 - 過履歷
沒什麼特別的 應該是之後的manager 純粹過一下履歷而已
B. Phone 2 - Coding interview
開始之前面試官先murmur說Leetcode上的問題基本上都沒什麼屁用XD
然後問各種C++的features(主要是OOP相關):
- polymorphism pattern
比如說什麼情況要用virtual method以及C++是如何實現virtual的
為什麼polymorphism裡的destructor一般情況都是virtual
- template跟metaprogramming
- const class method
- move semantics
然後要我自己隨便寫一些example這樣
example能跑然後解釋一下發生什麼事情就好
[碎碎念]平常寫處理器模型都有在用所以還行
幸好沒問variadic template或一些C++14後的features
不然我也是死XD
C. Onsite 1 - Domain specific question
問Deep learning裡面的quantization
- 解釋int8 quantization怎麼運作的
- pre-training quantization怎麼做? fake-quant node要記錄那些資訊
- post-training quantization怎麼做
[碎碎念]我自己其實沒有任何real-world network training的經驗
平常是大組裡面的另一個組在做
好險平常大meeting沒有完全放空所以大致上還算懂
D. Onsite 2 - Coding interview
一樣先抱怨Leetcode的問題大多都沒屁用(到底是有多氣XD)
Build a simple directed graph (from scratch)
然後graph至少要有AddEdge(), AddNode(), RemoveEdge(), RemoveNode()
注意一下各種node跟edge的關聯 在加減node跟edge的時候記得會有連動
腦中有圖應該就沒什麼太大問題
E. Onsite 3 - Domain specific question
給一個簡化過的ML處理器
題目有給ALU的MACs, DMA bandwidth 然後給一個conv2d的workload
問:
- 什麼優化都不做 要花多少cycles
- tiling是什麼?
- 各種指令(execution/DMA) 有了tiling之後怎麼做pipeline
- 假如對input height/width做了2x2的tiling能變快多少
F. Onsite 4 - Domain specific question
問更多ML處理器的optimization
- 又問了一次tiling 問說跑conv2d的時候為什麼kernel不是1x1的時候會有overhead
- input stationary跟weight stationary的差別
- cascading是什麼? 好處跟限制分別是什麼?
[碎碎念] E跟F前兩年的處理器建模的經驗幫助很多
當時不是直接做compiler optimization但model也必須支援
所以基本上都有碰過
G. Onsite 5 - Coding interview
這個就是問類似Leetcode的問題
想像一個一維數線
然後定義
struct Interval {
int start;
int end;
};
input給std::vector<Internal>
每一個input的Internal可以重疊
問說所有Internal union之後
新的區間std::vector<Internal>是什麼
[碎碎念] 應該是很基礎的問題
但因為平常沒刷題當下又很緊張
我就用了最笨的方法
因為都是整數點 所以創了一個std::vector<bool>去紀錄
先掃過所有的input Intervals就能知道
[min(input), max(input)]之間的整數點是否被interval覆蓋
然後再用這個vector去reconstruct output
H. Onsite 6 - Coding interview
先問了MLIR跟LLVM的問題 比如說什麼是SSA
然後跟1-D一樣 要我寫一個Directed Graph
不一樣的點是可以假設基本功能有了
要怎麼做Dead Code Elimination(DCE)
口頭解釋了一下用DFS的話怎麼做
但最後我選擇直接找to_nodes.empty()做recursive
我其實很不習慣別人看著我寫code所以我寫很慢XD
還沒寫完時間就快用完了 但他有懂我要做什麼所以說這樣就可以了
I. Onsite 7 - 聊天(?)
大組的Director
基本上只是在問我履歷上的事情
老實說每一個面試大概都45分鐘
因為他們每一個人都對我在ARM做的open source MLIR project很有興趣
每個面試官都花了20-30分鐘問我在做什麼XD
剩下的真的被問問題的時間其實不多
算是滿幸運的
2. 談offer
我一開始面試前被HR問說有沒有在找別的公司
很傻很天真的說沒有XD
後來不小心看到levels.fyi有offer negotiation service
手癢就花了500美金買了XD
advisor建議你還是要說你有在面別的公司 就算你沒有也能說是剛開始面
才不會被吃得死死的
後來也按照他的建議算是談到了不錯的offer
建議也在美國找工作的人也能試試看
以上經驗希望能幫助到一些人
謝謝收看