# 資訊科技產業專案設計課程作業 3 ## [Resume](https://drive.google.com/file/d/1ZtXSh2u2gMrE0lWJDyN0-2jb-GT0c8Yn/view?usp=sharing) ## [Google - Software Engineer II, Diagnostics, Tools, Google Cloud Platform](https://www.google.com/about/careers/applications/jobs/results/93255956128768710-software-engineer-ii-diagnostics-tools-google-cloud-platform?location=Tainan%20City%2C%20Taiwan&location=Taipei%2C%20Taiwan&location=Taiwan&q=%22Software%20Engineer%22) ### JD - Develop tools and **diagnostics** in support of system health verification, performance characterization, and on-going **reliability** of machine learning and AI acceleration platforms. - Develop software that executes in multiple systems in parallel, and develop **dashboards** to analyze the results. Enable the testing and decision making on hardware and software design and deployment. - Enhance the quality, performance processes, or coverage of the diagnostic tool or utility of the **Google Cloud platform**. - **Collaborate** with Google Software, Firmware, and Hardware teams to design, plan, implement and debug. #### 所需能力 - 軟體開發技能 - 熟悉多語言開發,例如 Python、C++、Go - 熟悉分散式系統和多系統的開發 - 熟悉 GCP 工具開發 - 系統診斷知識 - 理解系統健康檢查、性能測試和可靠度相關知識 - 設計診斷指標 - 團隊合作與協作 - git 版本、資源管理已利跨團隊開發 - 能將技術數據和診斷 insight 順利傳達 - 科技簡報讓無參與會議、不同 team 的人快速了解下階段各 team 的努力方向 #### 匹配分析 - 專業技能 - 對運算資源的使用狀況設計 metrics 做 observability 分析 - 使用過 AWS service,對 cloud service 有概念 - 會 Tableau 資料視覺化工作建 dashboards - 跨團隊協作經驗 - 於成大資料分析社時期有頻繁和不同領域背景(e.g. 策略、行銷)同學合作的經驗,可以快速了解不同的 domain knowledge - 過去實習為 SRE team member,針對了不同 RD 團隊設計不同的敏感資料偵測方法,過程中頻繁與不同團隊溝通現況、痛點 - 劣勢 - 對 Go 不熟、也沒有正式開發雲端工具的經驗 - 缺乏系統診斷知識,也沒有實際案例或經驗可以借鑒 ### 可能面試題目 #### Q1:如何對 cloud service 的健康狀態進行監控和診斷? 首先對於雲端服務的健康狀態,要去評估就必須要有評估的依據,就是指標,我覺得以 Colab 服務來說,核心關注指標可以為以下幾個: 1. CPU 和 GPU 使用率 2. RAM 使用量 3. 網絡延遲與頻寬 4. I/O 使用情況 5. 系統錯誤和異常種類 而有了指標後,就必須做追蹤、管理,首先對於指標如何被儲存也是一個議題,寫好 log 的格式是很重要的,再者對於監測,必須先收集資料才能計算指標,data pipeline 也是要設計過的,要在系統上的哪些 endpoint 收數據回來、用什麼方法(e.g. API)讓資料流回來、若有資料遺失要如何處理等等都需要考慮。 最後是自動化通知異常的功能,假設某些關鍵指標達到預設閾值,就能自動發送 alarm,讓相關團隊快速知道目前可能發生的問題為何,針對對應問題即時處理。 #### Q2:什麼方法可以檢測機器學習模型在硬體上的記憶體瓶頸? 我覺得主要可以確認記憶體使用量,簡單舉例幾個具體可以檢測記憶體使用量的方法: 1. 最直接的方式就是利用硬體本身內建 command 檢視,像是 nvidia-smi 就能讓我們查看 GPU 的記憶體使用情況,若 GPU 記憶體被耗盡,就會影響模型的訓練效率 2. 在訓練過程也可以檢視記憶體消耗,可以透過像 torch.cuda.memory_allocated() 等 PyTorch 提供的 API 來定期檢查模型訓練過程中所需的 GPU 記憶體 3. 透過模擬硬體行為也可以檢測,像是 Google 的 TensorFlow Lite 就可以透過輕量架構初步估算可能需要的運算資源用量,或是提早發現在怎樣的 batch size 配置時會遇到瓶頸 ## [Spotify - Data Engineer@Personalization](https://www.lifeatspotify.com/jobs/data-engineer-personalization-2) ### JD - Build **large-scale data pipelines** with data processing frameworks like Scio, BigQuery, Google Cloud Platform and Apache Beam - Develop, deploy, and operate Java services that impact millions of users Work on machine learning projects powering the experience that suits each user **individually** - **Collaborate** with other engineers, product managers and stakeholders, taking on learning and leadership opportunities that will arise every single day - **Deliver** scalable, testable, maintainable, and high-quality code Share knowledge, promote standard methodologies, making your team the best version of itself through mentorship and constructive accountability. #### 所需能力 - 開發技能 - 熟悉大規模數據處理框架 - 熟悉機器學習,特別是個人化推薦系統 - 有開發和運維 Java 服務的經驗 - 快速團隊協作 - 能快速調整策略/方法以因應產業趨勢 - 能將技術數據 insight 順利和非專業背景的人傳達 #### 匹配分析 - 本身是重度用戶,可以假設多樣用戶情境設計推薦演算法 - 專業技能 - 在實習中都有遇到巨量資料處理,熟悉 numpy, pandas 等等經典資料處理 tools - 大學畢業專題為推薦系統,對經典方法運作有基本理解、也可快速理解 - 有 CI/CD 及 IaC 經驗,更好 deliver good code - 跨團隊協作經驗 - 於成大資料分析社時期有頻繁和不同領域背景(e.g. 策略、行銷)同學合作的經驗,可以快速了解不同的 domain knowledge - 有策略相關專案,懂得建立問題假說去驗證,有利於個性化的達成 - 劣勢 - 不熟 Java - 較少接觸過音訊格式的資料 ### 可能面試題目 #### Q1:如何向非技術同事解釋某個 module 的作用? 假設以一個在做特徵工程的 module 來說,可以把這個 module 想像成我們在做分析或訓練模型之前,會收集到很多原始數據,但這些數據可能沒有直接的分析價值,或者它們的格式不適合直接用來做預測。 舉例來說我們有一個記錄音樂播放次數的欄位,這是一個很簡單的資料,但如果我們能把這個數據轉換成『這首歌在某段時間內的流行趨勢』,那麼這樣的資料對於我們要做推薦會更有用。特徵工程 module 的作用就是自動完成這些轉換,幫助我們提取出更有價值的資訊。 像這樣,在解釋的時候,我會盡量避免專業術語,且透過一些舉例說明 module 的效用和具體在遇到、處理問題時是怎麼做的。 #### Q2:如何設計個性化推薦的 data pipeline? 設計這種 pipeline 可以拆解成幾個步驟去想: 1. 資料收集:先從用戶的行為數據開始,比如他聽了哪些歌、喜歡的歌大部分為哪些類型、跳過了什麼、還有播放時長這些細節,在這邊也可以同時去多加延伸資料可能創造的價值,比如建立一些假說透過資料去驗證,更好去理解用戶的 behavior pattern,讓後續達成個性化的效果更好 2. 資料處理:也就是資料清洗,過濾掉沒有用的資訊,像是可能因網路斷線造成的資料損失,或是將某些資料轉換成模型較好理解的格式 3. 特徵工程:把行為數據轉換成數字特徵,比如用戶對某類型音樂的偏好程度、將文字描述轉為詞向量等等 其中這些步驟之間的資料流還涉及如何設計資料傳輸的 API、和用戶端的資料存取權限為何、收集到資料後如何存放在 database 中等等 data engineering 的議題,都是需要去考慮的。 ## [Microsoft - Software Engineer 2](https://jobs.careers.microsoft.com/global/en/job/1773282/Software-Engineer-2) ### JD - Full Software Development Lifecycle: As a key contributor, Design, develop, test, deploy, and monitor high volume, high scale services running on the Cloud based platform. - Data Pipeline Management: Build and manage data pipelines processing the data driven features and intelligence to drive Ads business growth. - Development & Ownership: Drive and build customer-focused features from planning and design through to release and maintenance. - Cross-Functional Collaboration: Work with partners, engineers, and program managers within Microsoft to deliver compelling solutions. - Infra builder for AI Empowered Scenarios: Act as a Designated Responsible Individual (DRI), development the intelligent questions answering and insights provider feature to bring convincing insights and actionable recommendations to customers - Adaptability: Proactively seek new knowledge and adapt to new trends and technical solutions to enhance the performance and reliability of our products. #### 所需能力 - 開發技能 - 熟悉 SDLC(包括需求分析、設計、開發、測試、部署和監控) - 熟悉大規模數據流的工具和框架,例如 Apache, Spark 等 - 可以掌握各個技術領域的新工具推出、趨勢 - AI infrastructure - 團隊合作與協作 - 能夠與其他工程師、PM 等合作,了解問題、需求分析,設計對應 feature/function #### 匹配分析 - 專業技能 - 過去實習有 CI/CD 及 IaC 經驗,可以基礎掌握 SDLC 中後期如何運作 - 大學專題將 ML/NLP 應用在日常議題上,對於 AI 如何應用在客戶場景中稍有經驗 - 有做過 data-driven business value/行銷 EDM 相關專案 - 過去實習為 SRE team member,較熟悉整個 RD 完整的 SDLC,也常與不同團隊人員互動 - 劣勢 - 沒有讓 AI model 上雲的經驗 - cloud 工具沒有用過 Azure - 目前用過工具不多,要掌握新技術叫沒有頭緒 ### 可能面試題目 #### Q1:如何設計和實現一個基於內部技術文件的 AI chatbot? 我覺得可以透過 RAG 的方法來實現: 首先就是 retrieval,將輸入的問題轉換為向量,可能可以用一些 word2vec model 處理,生成向量後再取相似找到最相關的文件段落,在丟給處理生成的 model。 再來就是 augmented generation,可以透過目前現有的 LLM 搭配 prompt 去生成可以清楚傳遞資訊且易於理解的回答;prompt 可能像是: ``` 根據以下公司內部技術文件的內容回答問題: 內容:{retrieved_content} 問題:{user_query} ``` 而整個系統的話大概會分為三個主要 module: 前端 UI:提供視覺化好理解的界面,比如 web 或 Slack 等等通訊軟體 後端查詢:接收問題、轉換 request、處理查詢結果 AI(NLP):和後端互動、生成自然語言回答(就是剛剛提到 RAG 的方法) #### Q2:如何和 PM 了解一個新的 feature? 由於 PM 通常非技術背景的合作夥伴,且是相對了解專案全局的人,我會特別注意兩個部分,一是需求、二是相關資源有何: 對於理解需求,這通常和用戶行為、團隊/專案目標、當前問題為何有關係,我會問一些具體的問題,例如:這個功能的目的是什麼?如果基於現有 XX feature 去優化可以達到預期效果嗎?等等。 涉及一個 feature 的相關資源包含開發時間、回饋機制(用戶端、PM 端、PM 經驗)、有無其他開發人員會參與或協助、可能用到的資料來源為何...等等,詳細去確認開發過程中可能遇到的狀況。 除了這兩個我特別關注的事情,關於技術面也很重要,比如功能架構、開發工具和語言選擇都是可以提出討論的面向。