用 SageMaker Feature Store 新能力加速 ML 特征管线

2026-05-19 27 预计阅读时间:1 分钟
来源:aws.amazon.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:8 分钟

Amazon SageMaker Python SDK v3.8.0 带来了三项面向 Feature Store 的更新,直击特征工程管线里最拖节奏的环节:数据治理审批慢、表格式切换成本高、离线/在线同步配置繁琐。下面逐项拆解,并给出可以直接跑的代码。

Lake Formation 治理集成:特征表不再"裸奔"

过去往 Feature Store 写特征组,数据权限基本靠手动在 S3 和 Glue 上配 IAM policy。团队大了之后,谁能读哪张特征表、谁能写哪个列,全靠人记,审批流程一卡就是半天。

v3.8.0 把 AWS Lake Formation 的细粒度访问控制直接接进了 Feature Store 的创建流程。创建特征组时可以声明受 Lake Formation 管辖,之后列级权限、行级过滤都走 Lake Formation 的统一授权模型,不再需要单独拼 IAM。

核心变化在 FeatureGroup 定义里多了一个治理模式参数:

import boto3
from sagemaker.feature_store.feature_group import FeatureGroup

sagemaker_session = boto3.Session().client("sagemaker")
fg = FeatureGroup(
    name="user_purchase_stats",
    sagemaker_session=sagemaker_session,
)

# 关键:启用 Lake Formation 治理
fg.create(
    record_identifier_name="user_id",
    event_time_name="event_time",
    feature_definitions=[
        {"FeatureName": "user_id",       "FeatureType": "String"},
        {"FeatureName": "event_time",    "FeatureType": "String"},
        {"FeatureName": "total_amount",  "FeatureType": "Fractional"},
        {"FeatureName": "order_count",   "FeatureType": "Integral"},
    ],
    online_store_config=False,  # 仅离线,走 Lake Formation
    offline_store_config={
        "S3StorageConfig": {
            "S3Uri": "s3://my-feature-bucket/user_purchase_stats/",
        },
        "EnableGlueTableCreation": True,
    },
    table_format="Iceberg",          # 新能力之二,后面展开
    governance_config={
        "LakeFormationGovernance": "ENABLED",
    },
)

启用后,在 Lake Formation 控制台里对 user_purchase_stats 表授权时,可以精确到列——比如只让推理服务读 total_amountorder_count,不让它看 user_id 原始值。这在金融和医疗场景下几乎是上线前置条件。

完整端到端 Notebook 在 SageMaker Python SDK 仓库的 examples/lake_formation_governance/ 目录下。

Iceberg 表格式:离线特征终于能增量更新

Feature Store 的离线存储之前默认用 Glue 的非分区 Parquet 表。问题很明显:每次特征回填或修正都要全量覆写,S3 上堆出一堆快照目录,下游 Spark/Athena 查询还得手动选最新版本。

v3.8.0 正式支持把离线特征组存为 Apache Iceberg 格式。Iceberg 自带快照隔离、时间旅行查询、行级 upsert,特征修正从"全量覆写"变成"增量 merge",管线耗时直接砍掉大半。

创建时只需指定 table_format="Iceberg"(上面代码已经用了),之后写入特征数据的方式不变:

import pandas as pd
from datetime import datetime

df = pd.DataFrame({
    "user_id":       ["u001", "u002", "u003"],
    "event_time":    [datetime.now().isoformat()] * 3,
    "total_amount":  [128.5,  45.0,   310.2],
    "order_count":   [5,      2,      12],
})

fg.ingest(data_frame=df, max_workers=3, max_processes=1)

但底层行为变了:Iceberg 写入会生成新快照而非新目录。下游用 Athena 查最新数据时,不再需要猜哪个路径是最新的:

-- Athena 查询 Iceberg 特征表,自动读最新快照
SELECT user_id, total_amount, order_count
FROM my_glue_database.user_purchase_stats
WHERE event_time > '2025-06-01'

如果需要回溯历史特征版本,Iceberg 的时间旅行查询一条 SQL 就搞定:

-- 查看某次训练时用的特征快照(指定 snapshot_id)
SELECT *
FROM my_glue_database.user_purchase_stats FOR SYSTEM_VERSION AS OF 123456789
WHERE user_id = 'u001'

对应的完整 Notebook 在 SDK 仓库的 examples/iceberg_table_properties/ 目录。

特征组属性配置更精细

第三项更新是离线特征组的 Iceberg 表属性(table properties)现在可以在创建时直接传入。比如控制压缩策略、快照保留数量、分区演化行为等,不再需要创建后再用 Glue API 或 Spark 去改。

offline_store_config = {
    "S3StorageConfig": {
        "S3Uri": "s3://my-feature-bucket/user_purchase_stats/",
    },
    "EnableGlueTableCreation": True,
    "TableFormat": "Iceberg",
    "IcebergTableConfig": {
        # 写入优化:小文件合并阈值
        "write.target-file-size-bytes": "134217728",   # 128 MB
        # 快照保留:只保留最近 5 个,避免元数据膨胀
        "history.expire.max-snapshot-age-ms": "432000000",
        "clean.orphan-files.min-retention-ms": "432000000",
    },
}

这些属性直接影响 Iceberg 表的维护成本。特征管线高频写入时,如果不控快照数量,元数据文件会快速膨胀,Athena 和 Spark 的计划阶段越来越慢。提前在创建时设好,省掉后续运维踩坑。

上手清单

三项能力组合起来,特征管线的搭建思路可以这样调整:

环节 之前 现在
权限管理 手拼 IAM policy Lake Formation 列级授权
特征修正 全量覆写 Parquet Iceberg 行级 upsert
版本回溯 手动找 S3 最新路径 FOR SYSTEM_VERSION AS OF
表属性调优 创建后手动改 创建时直接传 IcebergTableConfig

落地时注意几点:

  1. Lake Formation 治理只支持离线存储。在线特征组(低延迟推理场景)目前不走 Lake Formation,权限仍靠 IAM。如果你的场景需要在线+离线同步,离线表加治理,在线表继续用 IAM,两套权限要分别维护。
  2. Iceberg 格式要求 Glue 4.0 以上。确认你的 Glue Catalog 版本兼容,否则 Athena 查询会报格式不支持。
  3. SDK 版本要 ≥ 3.8.0。升级命令:
pip install --upgrade sagemaker>=3.8.0

升级后跑一下 sagemaker.__version__ 确认。如果项目里锁了旧版 SDK,建议在独立环境里先验证再合并。

  1. 已有 Parquet 特征组不能原地切 Iceberg。需要新建特征组、迁移数据、切换下游查询指向。建议先在新特征组上跑通全流程,再逐步迁移旧表,不要一刀切。

这三项更新本质上是在补 Feature Store 的"基础设施短板"——治理和表格式是数据平台成熟之后绕不开的问题。如果你的特征管线还在用裸 Parquet + 手动 IAM,v3.8.0 是个值得花半天升级的节点。


相关推荐