examlab .net 用最有效率的方法,考取最有價值的證照
本篇導覽 約 20 分鐘

SageMaker Feature Store — Online vs Offline

4,000 字 · 約 20 分鐘閱讀 ·

掌握 SageMaker Feature Store,對應 MLA-C01 Domain 1 Tasks 1.2 和 1.3 — online store 毫秒以下讀取 vs offline store S3 Parquet、feature group schema 與 record identifier 和 event time、point-in-time join 防止 training-serving skew、online store TTL、跨帳戶分享,以及大多數考生容易混淆的 online vs offline 考試陷阱。

立即做 20 題練習 → 免費 · 不用註冊 · MLA-C01

SageMaker Feature Store 是集中式、專為 ML 設計的儲存庫,用於保存訓練和推理所需的機器學習特徵。在 MLA-C01 考試中,它是 Domain 1(資料準備,28% 比重)中測試最多的服務之一。來自 Tutorials Dojo、ExamCert.App 和 K21 Academy 的社群學習指南都指出同一個痛點——考生混淆 online storeoffline store,而 AWS 持續設計考題要求你針對正確的存取模式選擇正確的一個。在考試中選錯,在產品中也會選錯:對即時詐騙評分選 offline store,模型就趕不上 50ms SLA;對訓練集生成選 online store,帳單就會爆炸,還會拿到錯誤的資料集。

本指南從 ML 工程師的視角撰寫。它涵蓋 SageMaker Feature Store 是什麼、兩個 store 為何並存、每個 feature group 必須遵守的 schema 規則、如何透過四條支援的路徑攝取特徵、如何讀取用於推理 vs 訓練、防止 training-serving skew 的 point-in-time join 機制、TTL 和特徵重用模式、跨帳戶分享、加密,以及讓大多數考生跌跌撞撞的 online vs offline 考試陷阱。

什麼是 SageMaker Feature Store?

SageMaker Feature Store 是一個完全託管、專為 ML 設計的儲存庫,用於儲存、分享和提供機器學習特徵。它的存在是因為在任何產品 ML 系統中,相同的特徵——例如「客戶過去 30 天的購買次數」——需要以兩種截然不同的存取模式提供。在模型訓練期間,你從 S3 批次讀取數百萬筆歷史特徵列來訓練模型;在線上推理期間,你在 10 毫秒以內對一個客戶執行單鍵查詢,以對即時詐騙預測進行評分。沒有 Feature Store,ML 團隊會為每種存取模式建構獨立的管線,並且不可避免地讓它們產生分歧——可怕的 training-serving skew,即模型在一種特徵定義下訓練,卻被用稍微不同定義計算的特徵提供服務。

為什麼集中式 Feature Store 存在

在 Feature Store 出現之前,每個團隊在各自的管線中重建相同的特徵。客戶 30 天購買次數在詐騙團隊的 Glue job、推薦團隊的 PySpark job 和行銷團隊的 Redshift 查詢中各自計算——三種實作、三個細微錯誤、三個偏差來源。Feature Store 透過成為單一真實來源解決了這個問題:特徵計算一次,寫入 store,每個需要它的模型都讀取它。重用降低計算成本,消除偏差,並把特徵轉變為跨團隊可分享的資產。

雙 Store 架構

每個 Feature Store feature group 都有兩個實體儲存後端:用於低延遲單筆記錄讀取的 online store,以及用於高吞吐量批次歷史讀取的 offline store。你可以啟用其中一個、另一個,或兩者——大多數產品設定兩者都啟用,因為相同模型的訓練和推理都會發生。Online store 是託管的記憶體內或 NoSQL key-value 後端,針對在幾毫秒內傳回特定 record identifier 的最新記錄的 GetRecord 呼叫進行最佳化。Offline store 是你自己的 S3 儲存桶,保存按 event time 分區的 append-only Parquet 文件,針對 Athena 和 Spark 對歷史特徵快照的查詢進行最佳化。

白話文解釋 SageMaker Feature Store

雙 store 分割是那種光靠命名就無法傳達取捨的概念。三個具體類比讓結構更容易記憶。

類比一 — 便利超商的備料台與倉庫

想像一間 24 小時不打烊的便利超商。店員有兩個儲存區域。在備料台上,伸手可及的地方放著已切好的配料、分裝好的食材、調味醬包——溫度控制但可立即取用。當客人點了一份關東煮,店員幾秒內就能完成備餐,符合客人等待的 SLA。在後倉,有整箱的備用庫存——大袋米、整箱飲料、下週要用的食材。當店員要補備料台的貨時,他去後倉把備品拿出來準備。

備料台就是 online store——小、快、每單位空間成本高,只放最新鮮的備料。後倉就是 offline store——大、慢、每單位空間成本低,保存完整進貨記錄。接待單一客人是 online 推理中的單筆記錄查詢;補明天的備料是從 offline store 批次建構資料集。如果店員試圖從後倉直接服務每個客人(只有 offline store),服務速度慢到無法接受。如果店員試圖從備料台準備明天的備品(只有 online store),台上的貨根本不夠用。兩個 store 同時存在,是因為兩種存取模式同時存在,Feature Store 讓兩者保持同步,確保店員每次都用相同的配方。

類比二 — 圖書館參考台與書庫

想像一所研究圖書館。前面的參考台放著少量高需求的近期參考書——百科全書、最新期刊、引用最多的專著。讀者走過來問問題,圖書館員幾秒內就給出答案。地下室的書庫保存了三十年積累的資料——每份過期期刊、每個被取代的版本、每篇博士論文。撰寫論文的研究生會在書庫待上一整天,拿出六十份資料做文獻回顧。

參考台就是 online store——即時查閱、只有最新版本、書架空間昂貴。書庫就是 offline store——慢但便宜、完整的歷史記錄、非常適合批次檢索。即時推理是「讀者在台前需要立即得到答案」;訓練集建構是「研究生需要曾經討論過特徵 X 在時間 Y 的所有論文」。如果圖書館員只有書庫,每個讀者都要等一個小時。如果圖書館員只有參考台,就無法寫出任何論文。兩種書架同時存在,是因為兩種閱讀模式同時存在。目錄系統(Feature Store 的 record identifier 和 event time)讓研究者能重建參考台在過去任何一天的樣子——這正是防止 training-serving skew 的 point-in-time join 語義。

類比三 — 醫院病床旁的病歷表與醫療檔案室

想像一家醫院。在患者床邊,床邊病歷表保存著最新的生命徵象、目前的用藥和有效的護理計畫——每小時由護士更新,醫師查房時可立即讀取。在地下室,醫療檔案室保存著過去二十年每個患者的所有病歷——每次血液檢測、每份處方、每次手術記錄。當研究人員做結果研究或建構臨床風險模型時,他們會拉出數萬筆歷史記錄。

床邊病歷表就是 online store——只有當前狀態、毫秒存取、支援床邊臨床決策。檔案室就是 offline store——append-only 歷史、支援分析、訓練敗血症風險模型和品質審計。關鍵在於:當研究人員根據存檔資料訓練敗血症模型時,他們必須重建每個歷史決策點的床邊病歷表樣貌——不是我們現在知道的,而是醫師當晚凌晨三點實際看到的。把未來的知識讀進過去是標籤洩漏,而 point-in-time join 是防止它的規範。SageMaker Feature Store 的 offline 讀取搭配 point-in-time join,只返回 event time 早於預測時間的特徵值——恰好是那個時刻的床邊病歷表,而不是今天的。

Feature Group Schema — 基本建構區塊

Feature group 是描述一個實體(如客戶、產品或交易)的特徵集合。每個 feature group 都有嚴格的 schema,考試要求你熟記。

必填欄位 — Record Identifier 和 Event Time

每個 feature group 必須宣告恰好兩個結構性欄位。Record identifier 是記錄的唯一鍵——通常是 customer_idproduct_idtransaction_id。Online store 讀取使用 record identifier 作為 GetRecord 的鍵。Event time 是標記特徵值為真時的時間戳記——offline store 用它維護 append-only 歷史,point-in-time join 用它過濾到正確的 as-of 時刻。兩個欄位都是必填的。在 feature group 建立後都不能省略。

Feature Definitions — 型別系統

除了 record identifier 和 event time,你宣告每個特徵的名稱和型別。Feature Store 支援 StringIntegralFractional,以及(較新 SDK 版本的)集合型別。攝取時的型別不符會導致 put 失敗——schema 宣告 Integral 的欄位收到 String 值的記錄會被拒絕。Schema 演進支援透過 UpdateFeatureGroup 新增特徵,但你不能改變現有特徵的型別或移除特徵,而不重新建立群組。

Online Store 設定 — Standard vs In-Memory

啟用 online store 時,你在 Standard(預設,由託管 key-value 服務支援,個位數毫秒讀取,適合大多數工作負載)和 In-Memory(由 ElastiCache for Redis 支援,毫秒以下讀取,適合高頻交易或即時競價等最嚴苛的延遲使用案例)之間選擇。In-Memory 成本更高,對大多數詐騙和推薦工作負載來說過於昂貴——考題中「最低可能延遲」指 In-Memory;「10ms 以內的即時推理」用 Standard 回答。

Offline Store 設定 — 你的 S3 儲存桶

Offline store 寫入你指定的 S3 儲存桶,以 Parquet 格式按 event time 的年、月、日、時分區。AWS Glue 自動把 offline store 在 Data Catalog 中登錄為資料表,讓 Athena 和 Spark 可以查詢它。儲存成本是你的 S3 費用;查詢成本是你的 Athena 掃描費用。feature group 建立時傳入的 IAM role 必須對儲存桶有 s3:PutObject 權限,如果設定了 SSE-KMS 則還需要 kms:GenerateDataKey

每個 SageMaker feature group 需要恰好兩個結構性欄位——record identifier(唯一鍵)和 event time(值為真的時間戳記)。 這兩個欄位不是可選的,建立後也不能新增或更改。Record identifier 驅動 online store 的 GetRecord 查詢和 offline store 的 join 鍵;event time 驅動 offline store 的 append-only 歷史和 point-in-time join 語義。在 MLA-C01 考試中,任何建議不含這兩個欄位之一的 feature group,或建議用「primary key」或「timestamp」等不同名稱但不具結構意義的答案,都是錯的。

Online Store — 毫秒以下的推理讀取

Online store 是 Feature Store 中即時推理使用的那一側。

延遲特性

Standard online store 單筆記錄讀取延遲在個位數毫秒。In-Memory online store 讀取延遲在毫秒以下。兩者都是為推理路徑設計的:收到客戶 12345 的請求,模型服務程式碼呼叫 GetRecord(feature_group_name="customer_features", record_identifier="12345"),取得群組中每個特徵的最新值,執行模型,返回預測結果。

Online Store 中「最新」的含義

Online store 每個 record identifier 只保留最新的記錄。如果你在 10:00 用客戶 12345 呼叫 PutRecord,在 11:00 再次呼叫,那麼在 11:30 呼叫 GetRecord 只會返回 11:00 的記錄。10:00 的記錄仍存在於 offline store(它是 append-only 的),但 online store 會丟棄被取代的值。這對推理來說是正確的行為——你想要最新的客戶狀態來餵給模型,而不是歷史記錄。

GetRecord vs BatchGetRecord

GetRecord 從一個 feature group 返回一個 record identifier 的一筆記錄。BatchGetRecord 在一次呼叫中從多個 feature group 返回最多 100 筆記錄——當一個推理請求需要同時取得客戶、產品和交易群組的特徵時很有用。兩者都在毫秒以下;BatchGetRecord 減少了連續呼叫的延遲開銷。

Online Store TTL — 讓過時特徵過期

每個 feature group 可以設定記錄級別的 TTL。超過 TTL 的記錄會從 online store 自動過期,但不會從 offline store(後者保留所有內容)。TTL 是讓不活躍客戶的客戶狀態老化並降低 online store 成本的正確方式——對典型的零售詐騙使用案例設定 30 或 90 天。考試很喜歡這個設定:形如「online store 持續增長,如何在不丟失訓練歷史的情況下控制成本」的題目,答案是 online store 的 TTL,同時保留 offline。

Online Store 不是什麼

Online store 不是特徵 store 查詢引擎。你不能對 online store 執行 SQL 查詢、不能按特徵值過濾記錄、不能在一次呼叫中 join 多個 feature group。它是 key-value 查詢。任何更複雜的操作都需要去 offline store,或把記錄拉到應用程式記憶體中在那裡過濾。

Offline Store — 訓練用的歷史快照

Offline store 是 Feature Store 中訓練和分析使用的那一側。

儲存格式與佈局

Offline store 把 Parquet 文件寫入你指定的 S3 前綴,按 event time 的 year=YYYY/month=MM/day=DD/hour=HH/ 分區。文件是 append-only 的——每次 PutRecord 都會追加一個新列,即使同一個 record identifier 已經有列了。這個 append-only 的特性使歷史查詢和 point-in-time join 成為可能。

從 Offline Store 讀取

你像讀取任何 S3 支援的資料表一樣讀取 offline store。Athena 查詢 Feature Store 自動登錄的 Glue Data Catalog 資料表。EMR 或 Glue 中的 Spark 直接讀取 Parquet。SageMaker Processing jobs 把它讀進 Spark 或 pandas DataFrames。查詢是你的責任——Feature Store 不提供超出標準 S3 + Athena + Glue 堆疊的查詢層。

Build Dataset API — 便利層

對於訓練集建構,SageMaker Python SDK 提供了一個 create_dataset 建構器,它包裝了 Athena 查詢,按 record identifier 和 event time join 多個 feature group,並套用 point-in-time 語義。建構器把結果以單個 CSV 或 Parquet 形式寫入 S3,準備好供 Estimator.fit() 使用。用它做典型的訓練集建構;對複雜的特徵工程,對底層的資料表撰寫你自己的 Athena 或 Spark 邏輯。

Offline Store 不是什麼

Offline store 不是即時的。攝取的記錄不能立即可見——通常有幾分鐘的緩衝和延遲。如果你的模型在幾分鐘前的資料上訓練且這是可接受的,沒問題。如果你需要即時分析,offline store 是錯誤的工具——用一個同時寫入 Feature Store 和即時分析目標的 streaming 管線。

攝取特徵 — 四條路徑

特徵可以透過四條支援的路徑寫入,每條路徑有不同的延遲和吞吐量特性。

路徑一 — PutRecord API(即時、同步)

PutRecord API 呼叫同步寫入一筆記錄。兩個 store 都收到記錄(online 立即,offline 在緩衝後)。從 streaming 消費者、Lambda 函式或任何需要立即特徵可用性的應用程式程式碼使用此路徑。吞吐量限制是每秒每帳戶;對非常高的吞吐量,改用批次攝取。

路徑二 — 透過 SageMaker Processing 批次攝取

對大型歷史回填或定期批次重算,執行 SageMaker Processing job,讀取來源資料、計算特徵,並透過 SDK 或直接寫入 offline S3 儲存桶來寫入 Feature Store。Processing 模式高效處理數十億列,是團隊用於定期特徵更新的方式。

路徑三 — Data Wrangler 匯出

SageMaker Data Wrangler flows 可以直接把最終轉換後的資料集匯出到 feature group。匯出 job 底層建立了一個 Processing job,並寫入 online 和 offline store。這是資料科學家在 Data Wrangler 中互動式建構特徵並把它們推送到產品 feature store 的標準路徑,無需單獨的工程步驟。

路徑四 — 直接 Offline Store 寫入加 Iceberg 或 Glue

對繞過 API 限制的非常大規模攝取,你可以使用相同的分區佈局直接把 Parquet 文件寫入 offline S3 儲存桶。較新版本的 Feature Store 支援 Apache Iceberg 作為 offline 格式,它加入了 ACID 語義和高效的時間旅行查詢。直接寫入跳過 online store;如果你需要兩者,對 online 端執行額外的 PutRecord 流程或混合模式。

當兩個 store 都啟用時,PutRecord 寫入 online 和 offline store,但可見時間不同——online 是立即的,offline 有通常幾分鐘的緩衝延遲。 建構監控儀表板或期望「我剛寫的可以立即查詢」的工程師會誤讀這一點並追蹤幽靈 bug。正確的心智模型是:online store 在毫秒內反映寫入,是推理的真實;offline store 在緩衝後反映寫入,是訓練和歷史分析的真實。如果即時推理路徑需要看到新寫入的特徵,該路徑必須從 online store 讀取,絕不能從 offline store。混淆兩者的時間語義是 Feature Store 部署中最常見的產品 bug 之一,也是熱門的 MLA-C01 考試陷阱。

Point-In-Time Join — 防止 Training-Serving Skew

Point-in-time join 是 Feature Store 中最重要的概念,也是考試最高產值的主題。

什麼是 Training-Serving Skew

Training-serving skew 是這樣一個 bug:模型在以某種方式準備的資料上訓練,在推理時卻被以略微不同方式準備的資料提供服務。典型的 skew:在訓練時,你在標籤觀察後的那天計算了 30_day_purchase_count(所以計數包含了被標記的購買行為本身),但在推理時你在預測前一天計算它。模型在人工獲得未來資訊的特徵上訓練,在推理時卻被剝奪了那個訊號——效能在產品中崩潰。

什麼是標籤洩漏

緊密相關:標籤洩漏是指訓練時的特徵值編碼了標籤觀察後的資訊。如果詐騙標記交易的 30_day_purchase_count 包含了詐騙交易本身,這個計數就是詐騙的完美預測器——但只在訓練時,當標籤是已知的。在推理時計數不能包含未標記的交易(從模型的視角看,它還沒發生)。

Point-In-Time Join 如何解決兩者

Point-in-time join 強制執行規則:當你建構 join 標籤資料表與 feature group 的訓練集時,只有 event time 嚴格小於標籤的 event time 的特徵值才有資格。Offline store 的 append-only 歷史使這個查詢可行——對每個標籤列,join 掃描該 record identifier 的特徵歷史,過濾到 event time < 標籤時間,並選取最新的合格列。結果是訓練時的特徵值完全符合那個歷史時刻推理時的最新值。Skew 消除,洩漏消除。

在 Athena 或 Build Dataset 中實作 Point-In-Time Join

Build Dataset API 在你提供標籤資料表並指定 join 鍵加 event time 欄位時自動執行 point-in-time join。在原始 Athena 中,你撰寫相關子查詢:對標籤資料表中的每一列,選取 event time 最大且小於標籤時間的特徵列。Iceberg 支援的 offline store 有原生時間旅行 SQL 語法,把查詢簡化為 SELECT ... FOR TIMESTAMP AS OF <label_time>

沒有 point-in-time join 從 offline store 讀取會產生標籤洩漏,並讓訓練指標在產品中崩潰。 工程師經常寫 SELECT * FROM feature_table JOIN label_table USING (customer_id),以為這個 join 是正確的——其實不是。那個 join 把今天的特徵值附加到歷史標籤上,洩漏了未來資訊。正確的 join 把特徵 event time 過濾到標籤 event time。如果你的訓練準確率高得可疑而產品準確率低很多,point-in-time join 違規是第一個要檢查的。MLA-C01 考試把這個模式作為答案對:一個選項用天真的 join,另一個用 MAX(event_time) WHERE event_time < label_time 語義。第二個是正確答案;第一個是洩漏陷阱。

跨團隊和模型的特徵重用

重用故事是讓 Feature Store 值得運行的核心。

相同特徵,多個模型

客戶 30 天購買次數對詐騙、流失和推薦模型都是有用的特徵。沒有 Feature Store,三個團隊以三種不同方式計算它。有了 Feature Store,資料工程團隊計算一次,寫入客戶 feature group,三個建模團隊都 GetRecord 它。成本節省在成熟的 ML 組織中跨數百個特徵和數十個模型複利增長。

特徵發現

SageMaker Studio Feature Store 瀏覽器列出帳戶中每個 feature group,帶有可搜索的 metadata、schema 和統計資料。團隊發現現有特徵而非重建複製品——可發現性是僅次於一致性的第二大好處。

特徵血緣

Feature Store 整合 SageMaker ML Lineage Tracking,記錄哪個 feature group 被哪個訓練 job 讀取、訓練產生了哪個模型、模型部署到了哪個 endpoint。血緣查詢回答「哪些模型依賴此特徵」,在特徵被棄用或其計算邏輯變更之前。

跨帳戶特徵分享

在擁有多個 AWS 帳戶的組織中,Feature Store 支援考試會詢問的跨帳戶存取模式。

Feature Group 的資源策略

Feature group 支援授予其他 AWS 帳戶 sagemaker:GetRecordsagemaker:BatchGetRecordsagemaker:PutRecord 和 offline store 讀取存取的資源策略。模式:資料工程帳戶擁有 feature group;不同帳戶中的建模團隊在各自帳戶中附加 IAM 策略,feature group 上的跨帳戶資源策略授予存取。

Offline Store 跨帳戶 S3

Offline store S3 儲存桶可以透過標準的 S3 跨帳戶儲存桶策略分享,消費帳戶還需要 S3 讀取權限。通過 Lake Formation 的 Glue Data Catalog 跨帳戶存取完成了從另一個帳戶進行 Athena 查詢的流程。

跨帳戶的加密

用於加密 online store 和 offline store 的 KMS 金鑰必須有允許消費帳戶解密的金鑰策略。如果金鑰策略缺少消費帳戶 ID,跨帳戶存取會以 KMS 拒絕而靜默失敗。考試把這個設定為「feature group 已分享但另一個團隊無法讀取」的排查題——答案是 KMS 金鑰策略。

加密與安全

兩個 store 預設用 AWS 管理的金鑰加密靜態資料。對合規工作負載,設定客戶管理的 KMS 金鑰。

Online Store 加密

Online store 在 feature group 建立時接受 KMS 金鑰。所有寫入 online store 的記錄都用該金鑰加密。對金鑰有 kms:Decrypt 的主體讀取時自動解密。

Offline Store 加密

Offline store S3 儲存桶可以使用 SSE-S3、SSE-KMS 或 SSE-C。SSE-KMS 是集中金鑰管理的推薦選項。feature group 的 offline store writer 使用的 IAM role 必須對金鑰有 kms:GenerateDataKey

網路隔離

對高度受監管的工作負載,設定 SageMaker Studio domain 或 notebook instance 透過 VPC endpoints 存取 Feature Store(online 的 com.amazonaws.<region>.sagemaker.featurestore-runtime 和控制平面的 com.amazonaws.<region>.sagemaker.api)。VPC endpoint 策略可以限制從特定 VPC 可存取哪些 feature group。

在產品環境中,feature group 建立時務必傳入明確的 KMS 金鑰和 IAM role——不要依賴 AWS 管理的金鑰。 客戶管理的 KMS 金鑰讓你對誰可以解密特徵資料有金鑰策略層級的控制、透過 CloudTrail KMS 事件審計存取、按計畫輪換金鑰,並在事故時透過停用金鑰來撤銷存取。AWS 管理的預設缺乏所有這些控制。客戶管理金鑰的成本是每月一美元加上每次 API 呼叫的費用——相比安全和審計好處,微不足道。考題中「我們如何在加密層限制對 PII 特徵的存取」用客戶管理的 KMS 金鑰加上特徵群組特定的金鑰策略來回答。

SageMaker Feature Store 常見考試陷阱

MLA-C01 考試對 Feature Store 設置了一套一致的陷阱。把所有七個都記住。

陷阱一 — Online Store 用於訓練集生成

情境問「我們需要從客戶 feature group 建構一百萬列的訓練資料集」。錯誤答案:對 online store 的分頁 GetRecord 呼叫。正確答案:透過 Athena 查詢 offline store。Online store 無法傳回歷史記錄,只能傳回最新的,即使分頁成本和延遲也是錯誤的。

陷阱二 — Offline Store 用於即時推理

情境問「即時詐騙評分需要在 10ms 以內查詢特徵」。錯誤答案:Athena 查詢 offline store。正確答案:online store 的 GetRecord。Athena 查詢要幾秒,不是毫秒。

陷阱三 — Online Store 的 TTL 影響 Offline Store

考生假設設定 online store 的 TTL 也會讓 offline 記錄過期。錯。Offline store 是 append-only 的,忽略 TTL。TTL 只讓 online 記錄過期。這是刻意設計的——你想讓熱推理狀態老化,同時保留完整的訓練歷史。

陷阱四 — 無 Point-In-Time 語義的天真 Join

上面介紹的洩漏陷阱。任何 join feature group 和標籤資料表而不過濾 event time 的答案都是錯的。

陷阱五 — 建立後新增必填欄位

考生建議「我們忘記新增 event time,讓我們更新 feature group」。錯。Record identifier 和 event time 是結構性的,建立 CreateFeatureGroup 後不能新增或更改。正確路徑是重新建立 feature group、把歷史資料攝取到新群組,並遷移消費者。

陷阱六 — Standard vs In-Memory Online Store 混淆

情境問「我們需要高頻交易的毫秒以下讀取」。正確答案是由 ElastiCache 支援的 In-Memory online store。Standard online store 提供個位數毫秒讀取,對大多數工作負載足夠,但不能滿足最嚴苛的延遲 SLA。

陷阱七 — 忘記跨帳戶 KMS

情境描述跨帳戶分享的 feature group,資源策略已授予存取,但消費者無法讀取。正確答案是加密金鑰的 KMS 金鑰策略——跨帳戶分享需要 KMS 金鑰策略加上 IAM 加上資源策略,三者都需要。

Online store 等於只有最新記錄、毫秒以下讀取、適合推理;offline store 等於 append-only 歷史、S3 Parquet、適合訓練和分析。它們共享相同的 record identifier 和 event time,但回答不同的問題。 這是每個 MLA-C01 Feature Store 題目都要記住的一句話。如果情境詞是「即時」、「單筆記錄」、「對延遲敏感」或「推理」,回答 online。如果情境詞是「歷史」、「訓練集」、「Athena」、「Spark」、「數百萬列」或「分析」,回答 offline。如果情境詞是「兩者一致」,回答「用 PutRecord 寫入兩個 store,兩者都啟用」。雙 store 架構就是 Feature Store 的本質——整個服務都是為管理兩者之間的一致性而建構的。

必記 Feature Store 關鍵數字與事實

Feature Group Schema

  • 必填:record identifier 和 event time(建立後不能更改)
  • 特徵型別:String、Integral、Fractional,以及較新 SDK 中的集合型別
  • Schema 演進:新增特徵可以,更改型別或移除特徵不行

Online Store

  • Standard:個位數毫秒 GetRecord 延遲
  • In-Memory(ElastiCache for Redis 支援):毫秒以下 GetRecord 延遲
  • 每個 record identifier 只保留最新記錄
  • TTL 可設定以讓過時記錄過期
  • 跨 feature group 一次呼叫的 BatchGetRecord

Offline Store

  • S3 Parquet,按 event time 的年/月/日/時分區
  • Append-only 歷史
  • PutRecord 的緩衝延遲,通常幾分鐘
  • 透過自動登錄的 Glue 資料表可用 Athena 和 Spark 查詢
  • Iceberg 格式選項提供 ACID 和時間旅行

攝取路徑

  1. PutRecord API(即時、同步)
  2. SageMaker Processing 批次攝取
  3. Data Wrangler flow 匯出
  4. 直接 offline store 寫入加 Iceberg 或 Glue catalog

Point-In-Time Join

  • 過濾特徵 event time 嚴格小於標籤 event time
  • 防止 training-serving skew 和標籤洩漏
  • Build Dataset API 自動執行此操作

跨帳戶分享

  • Feature group 資源策略
  • Offline store S3 跨帳戶儲存桶策略
  • KMS 金鑰策略授予消費帳戶解密
  • 三者都需要才能跨帳戶讀取

MLA-C01 exam priority — SageMaker Feature Store — Online vs Offline — MLA-C01 ML Engineer 學習筆記. This topic carries weight on the MLA-C01 exam. Master the trade-offs, decision boundaries, and the cost/performance triggers each AWS service exposes — the exam will test scenarios that hinge on knowing which service is the wrong answer, not just which is right.

FAQ — SageMaker Feature Store 常見問題

Q1 — 何時應只啟用 online store、只啟用 offline store,還是兩者都啟用?

預設兩者都啟用——大多數產品 ML 系統需要即時推理和批次訓練,兩個 store 的總成本相比維護兩條獨立管線導致 training-serving skew bug 的成本是微小的。只啟用 online store,如果你的特徵來自 streaming 來源,且你有一個不需要同一特徵副本的獨立分析倉儲(罕見)。只啟用 offline store,如果 feature group 純粹用於訓練集建構,且從不在推理時讀取(例如批次評分系統中只在訓練時使用的人口統計特徵)。有疑問時,兩者都啟用——Feature Store 是假設兩個 store 都存在而設計的,許多 SDK 便利 API 需要兩者。

Q2 — 使用 Feature Store 時如何避免 training-serving skew?

機制性答案:建構訓練集時始終使用 point-in-time join,推理時始終使用與訓練時相同的 feature group。規範性答案:把特徵計算邏輯一次寫在一個地方,透過 PutRecord 寫入 Feature Store——不要在訓練管線和推理管線中複製邏輯。Build Dataset API 預設強制 point-in-time 語義;如果你自己撰寫 Athena 查詢,在已知的歷史時間戳記上計算相同特徵並與 offline store 返回的進行比較來驗證它們。產品中的 Skew 偵測使用 SageMaker Model Monitor 的資料品質監控器——訓練和推理之間的特徵分佈漂移是儘管盡了最大努力 skew 仍然發生的產品端訊號。

Q3 — 如何讓 online store 中的舊資料過期而不丟失訓練歷史?

在 feature group 的 online store 上設定記錄級別的 TTL。TTL 只套用於 online store;offline store 是 append-only 的,完全忽略 TTL。根據特徵在推理讀取應把它視為缺失之前可以多舊來設定 TTL——典型零售客戶狀態設 30 天,移動較慢的特徵設 90 天,非常熱的 session 級特徵設 1 天。Offline store 無論如何都保留每筆記錄,所以任何歷史時間範圍的訓練集建構仍然有效。這是控制 online store 成本的推薦模式,考題中「online store 成本在增長,如何在不破壞訓練的情況下控制它」用 TTL 來回答。

Q4 — 如何與另一個 AWS 帳戶的模型團隊分享 feature group?

三個權限面必須都對齊。第一,擁有者帳戶中的 feature group 資源策略授予消費帳戶主體對 sagemaker:GetRecordsagemaker:BatchGetRecord 和其他相關操作的存取。第二,offline store S3 儲存桶策略授予消費帳戶對儲存桶和前綴的讀取存取。第三,online 和 offline 加密金鑰上的 KMS 金鑰策略授予 kms:Decrypt 給消費帳戶。加上消費帳戶必須附加 IAM 策略,給其主體呼叫這些操作的權限。忘記 KMS 金鑰策略是最常見的 bug——資源策略看起來正確,IAM 看起來正確,但讀取因 KMS 存取拒絕而失敗。

Q5 — 對從 Kinesis stream 計算的 streaming 特徵,應使用哪種攝取模式?

Lambda 或 Kinesis Data Analytics 消費者,每個事件呼叫 PutRecord 是標準模式。當兩個 store 都啟用時,PutRecord 在毫秒內更新 online 側,用於即時推理。對非常高吞吐量的 stream(每秒數萬次),把事件批次化並使用 EMR 或 Glue 上的 Spark Structured Streaming job,透過 SageMaker Feature Store Spark connector 寫入——connector 高效批次 PutRecord 呼叫,避免觸及每秒帳戶限制。取捨是延遲與吞吐量:純 Lambda 給中等吞吐量提供最低延遲,Spark 給略高延遲提供最高吞吐量。兩條路徑都使用 Feature Store 作為目標。

Q6 — 在 offline store 資料上訓練模型時如何防止標籤洩漏?

使用 point-in-time join 語義:對時間 T 的每個標籤列,只包含 event time 嚴格小於 T 的特徵值。SageMaker Python SDK 中的 Build Dataset API,當你提供帶有 event time 欄位的標籤資料表和要 join 的 feature group 時,自動執行此操作。如果直接撰寫 Athena 查詢,模式是 SELECT ... FROM labels l LEFT JOIN features f ON l.id = f.id AND f.event_time < l.event_time,然後選取每個標籤的最大 event time 特徵列。Iceberg 支援的 offline store 用原生的 FOR TIMESTAMP AS OF 語法簡化了這個操作。透過抽樣驗證:選取一個已知的歷史標籤,計算那個標籤時間存在的特徵值,與你的訓練集有的進行比較——它們必須完全一致。

Q7 — 我能更改現有 feature group 的 schema 嗎?

部分可以。你可以透過 UpdateFeatureGroup 對現有 feature group 新增特徵,歷史記錄的新特徵預設為 null。你不能更改現有特徵的型別、移除特徵、更改 record identifier 或更改 event time 欄位——這些是結構性的,需要重新建立 feature group。重建路徑:用所需 schema 建立新 feature group,執行回填 Processing job 從舊群組的 offline store 讀取並寫入新群組,更新消費者應用程式指向新群組,並在過渡期後退役舊群組。這個遷移並不簡單,這也是考試指南強調在建立時把 schema 設計正確的原因。

延伸閱讀 — Feature Store 官方 AWS 文件

權威的 AWS 來源包括:SageMaker Feature Store 概覽頁面(概念、雙 store 架構、何時使用)、Create Feature Group 文件(schema 規則、online vs offline 設定、KMS)、Ingest Data 文件(PutRecord、批次攝取、Data Wrangler、Spark connector)、Build Datasets 文件(point-in-time join、Build Dataset API)以及跨帳戶存取文件(資源策略、S3 儲存桶策略、KMS)。

AWS Machine Learning Blog 有多篇 Feature Store 深度文章,包括 streaming 攝取模式、特徵重用案例研究以及 In-Memory online store 的介紹。AWS Well-Architected ML Lens 在資料準備階段涵蓋 Feature Store。SageMaker Examples GitHub repository 包含展示 PutRecord、GetRecord、point-in-time join 和跨帳戶分享的端到端 notebook 範例。SageMaker Python SDK 文件中的 Feature Store 類 API 參考直接對應 MLA-C01 考試中的概念——如果某個設定參數行為在文件中不清楚,閱讀 SDK 原始碼。

官方資料來源

更多 MLA-C01 主題