--- title: "在 Dcard 我們如何用 Python 打造推薦系統 - 陳子元" tags: PyConTW2023, 2023-organize, 2023-共筆 --- # 在 Dcard 我們如何用 Python 打造推薦系統 - 陳子元 {%hackmd H6-2BguNT8iE7ZUrnoG1Tg %} <iframe src=https://app.sli.do/event/qDmLwJDxPbvDLgmAWKZD86 height=450 width=100%></iframe> > Collaborative writing start from below > 從這裡開始共筆 推薦系統100%用python寫 採用python跟其他語言的搭配 dcard,台灣的社群網站 ### Dcard的推薦系統 分成兩個- + 首頁推薦 ⬅️ 今天講這個 + 相關文章推薦 ## why we choose python to bulid a recommendation system? - skillset for our team members - end to end data science - 目的:每個參與的人都能從頭到尾參與這個系統 - 相關書籍:[Designing Machine Learning Systems](https://www.oreilly.com/library/view/designing-machine-learning/9781098107956/) - data collection and preperation - data exploration and analysis - feature engineering - model development - evaluation and validation - **deployment** *who train model and who deploy mode - context contextual insights ### Benefit of More Context + add a realtime feature + e.g. member's subscription status + using PyFlink + add a batch updated feature + using Airflow + add a new model + using PyTorch + add a new serving strategy + using FastAPI End-to-end data science lead to - less communition overhead - Avoiding Fingerpointing and Blame Games (?) - faster iteration - greater ownership (我覺得是ownership是講者打錯成ownship) challenge of - Limitations of individuals - Skillset ## Dcard如何處理 ### slow python #### History 在很大一段時間,Python很慢對Dcard不是問題 - Version1: Batch Prediction - Daily job慢沒關係 - 但對重度使用者體驗不佳 -> Version2 - Version2: Near realtime prediction - Batch prediction cannot satisfy heavy users - Publish task after some criteria - read N posts - subscribe forums - online in last 20 minutes - Cannot immeditately response user's action - Cannot response latest posts - 例:剛訂閱後,還在Queue裡面,無法馬上在首頁看到 - Version3: Realtime prediction #### How we enhance python speed? 優化python速度的方法 > 不要讓優化速度變得像膝跳反應一樣,你要知道自己想優化哪段、如何優化 > "If you can't measure it your can't improve it" —— 卡內基 - Profiling & Tracing - Tracing Result - 80% IO - Cache - Feature store migration - Preload data in background jobs - Asynchronous data loading - 20% Inference Decard時間都花在這三件事情上: 1. Feature transform(sklearn) * Sklearn要保證自己的model是general的 -> 重寫套件 - Custom with sparse -> np.array - remove redundant parts according to our usage 3. Raw data construction * List[dict] -> DataFrame 5. model inference ## Summary + 最初速度不會是最大的問題 + 要提升速度,先做tracing找出問題在哪裡 ## How we organize Python code **Some general things** * PEP8 * clean codes - naming - short function - SOLID (一個 function 只做一件事) * Unit tests * Linter * Formatter * pre-commit **Dependency management** + pipenv + always pin versions + 目前嘗試用Rye + 解決Local Python格式不同的問題(eg. M1 & Intel) + ### Training architecture #### split stages to 好處: - rerun 實驗比較快 - allocate different resources #### Configuration(寫成code) - 把Config寫成Code - 解決事後找不到當初Train的config的問題 - Recored feature definition - Feature definition - Why不用現成的?(例如yaml, hydra) - 自己寫比較彈性 - 可以有繼承 - 可以做`__post_init__` ### feature definition - scikit-learn pipeline ### configs alternatives ### inherit config ### build pipeline & transformer ### trainer vs logger ### using inheritance - 可以用繼承來解決 - Logger專門紀錄 - Trainer繼承Logger -> Trainer傳進Logger ### composition or dependency injection ### challenge of code review ### code review for experimental codes ### summmary adhering to coding ### takeaway - end to end data science - speed is not a problem in early stage ## QA + 腥煽色暴力等等的內容對受眾很有吸引力,在引入推薦系統時有考慮過推薦系統是否會過度推薦這類貼文?團隊有沒有觀察到系統的推薦是否都是令人產生負面情緒的貼文? + 的確有吸引力 + 有營運團隊在確認這是否會有影響 + 如果 MLE 做整個 End-to-End,那在 dcard 的 DE 只參與最前面的資料收集進到 BigQuery 的部分嗎? + DE的時間花在架設這些系統,比起叫他們做Query更值得 + 找不到那麼多人可以一條龍的E2E的話,目前Dcard的策略是部分提供部分做compoment team嗎? + Dcard公司主要使用哪個雲平台(AWS、GCP、Azure ?) + GCP + 有沒有推薦的profilling and tracing tools? + Open t什麼的 + 現階段 Dcard 內部還沒採用Gpu 訓練模型嗎,是的話想知道是否為內部實驗出來與 SOTA 的結論 ( deep model 可以超越傳統線性或FM model)不同? + 首頁推薦是用NN + Dcard資料比較像是Tabular data,許多論文提到這種data使用NN不一定特別有優勢 + 如果要不想自己維持順序,或許可以用 numpy 的 [structured array](https://numpy.org/doc/stable/user/basics.rec.html) + 加速interface有試過其他interface engine 如 tensorRt + 請問Dcard如何驗證推薦系統的成效? + 用戶滿意很難衡量 + Slide + https://drive.google.com/file/d/1TRHSuSLWHQNOj8E8RuZ58RiTnNj1sXwv/view + DDD or TDD? + TDD有 + DDD還沒,評估中 + 如何學習DS? + 有考慮Docker? + 沒 Below is the part that speaker updated the talk/tutorial after speech 講者於演講後有更新或勘誤投影片的部份