当您在使用Amazon SageMaker AI微调大型语言模型(LLM)时,如果同时使用Databricks Unity Catalog,可能会面临独特挑战,例如如何在利用最佳机器学习服务的同时维护严格的数据治理。
Unity Catalog负责管理元数据和权限,而当您选择AWS作为Databricks工作空间的云环境时,底层数据存储在Amazon Simple Storage Service (Amazon S3) 中。当SageMaker AI训练作业访问这些数据时,必须保留且不能绕过Unity Catalog的细粒度授权模型。没有结构化的集成模式,您将面临策略执行不一致、审计漏洞和合规风险。例如,如果SageMaker AI训练作业在读取S3对象时绕过Unity Catalog的授权模型,您将无法获知哪些数据训练了哪些模型。这在受监管行业和生产工作负载中会带来严重的合规风险。
本文演示了如何构建一个安全的、完整的LLM微调工作流,将Unity Catalog与Amazon SageMaker AI集成,并使用Amazon EMR Serverless进行预处理。该解决方案展示了如何安全访问受治理的数据、跨服务保持数据血缘、微调Ministral-3-3B-Instruct模型,并将训练好的工件注册回Unity Catalog。通过这种方法,您可以继续使用现有服务,同时保持中央治理,在不影响安全或合规要求的情况下追踪数据血缘。
解决方案概述
本工作流实现了以下功能:
- 从Unity Catalog管理的表中读取带有适当治理控制的训练数据
- 使用EMR Serverless和Apache Spark预处理数据
- 使用SageMaker AI训练作业微调Ministral-3-3B-Instruct模型
- 在Unity Catalog中追踪从源数据到训练模型的整个数据血缘
架构图如下:

组件说明
- Amazon SageMaker AI Studio – JupyterLab空间:工作流编排和模型训练
- Amazon EMR Serverless:基于Spark的数据预处理,无需集群管理
- Databricks Unity Catalog:元数据目录、治理和血缘追踪
- Hugging Face:访问预训练模型
- Amazon S3:存储数据和模型工件
- AWS Secrets Manager:凭证管理
在此解决方案中,用户登录SageMaker AI Studio,并使用EMR Serverless作业启动数据预处理。EMR Serverless作业通过Unity Catalog的开放REST API(使用存储在AWS Secrets Manager中的OAuth凭证)访问和处理Unity Catalog管理的S3桶中的数据。处理数据后,在Unity Catalog中创建一个包含处理数据的表。然后,SageMaker AI训练作业从Hugging Face检索Ministral-3-3B-Instruct模型,对处理后的表进行微调,并将生成的模型工件存储回Unity Catalog管理的S3桶。最后,在Unity Catalog中注册模型并创建外部数据血缘。
前提条件
开始前,请确保您具备以下条件:
| 服务 | 要求 | 详细信息 | |------|------|----------| | AWS | AWS账户 | 以下AWS服务的权限 | | Amazon SageMaker AI | 已配置 | | | Amazon EMR Serverless | 已配置 | | | Amazon S3 | 已配置 | | | AWS Secrets Manager | 已配置 | | | AWS IAM | 已配置 | | | Amazon VPC | 已配置 | | | Amazon CloudWatch Logs | 已配置 | | | Amazon ECR | 已配置 | | | Amazon VPC | VPC和安全组配置了互联网访问 | | | Databricks | 为工作空间设置Unity Catalog | 按照Databricks文档设置Unity Catalog | | Databricks | 设置外部访问 | 在Metastore上启用外部数据访问(默认关闭) | | Databricks | 生成OAuth凭证 | 创建用于Databricks编程访问的OAuth凭证(客户端ID和密钥) |
详细步骤
第一步:AWS设置
完成此步骤后,您将完成以下设置:
- 创建由Unity Catalog管理的S3桶并上传数据
- 在AWS Secrets Manager中创建存储Databricks OAuth凭证的密钥
- 创建SageMaker AI执行角色和EMR Serverless作业运行时角色
笔记本使用SEC EDGAR(美国证券交易委员会电子数据收集、分析和检索系统)的申报数据用于LLM微调。SEC EDGAR是SEC的公司申报公共数据库。该解决方案通过SEC的公共API获取2023-2024年标普500公司的10-K和10-Q表格,下载申报文档,提取“风险因素”部分,并将数据上传到Amazon S3桶。文件以JSON格式存储,每条记录包含公司标识符(CIK)、股票代码、实体名称、申报类型、会计期间以及风险因素披露的全文。上传后,您将在S3桶中看到以下结构:
s3://aws-blog-smai-uc-bucket-ACCOUNTID/
├── raw/
│ └── risk_factors/
│ ├── form_type=10-K/
│ │ └── fiscal_year=2024/
│ │ └── cik=0000320193/
│ │ └── risk_factors.json
│ └── form_type=10-Q/
│ └── fiscal_year=2024/
│ └── quarter=1/
│ └── cik=0000320193/
│ └── risk_factors.json
├── curated/
└── ml/存储Databricks凭证
Databricks支持多种身份验证和授权方法来控制对资源的访问。本解决方案使用服务主体的OAuth(OAuth M2M),为服务主体提供短期OAuth令牌。使用OAuth 2.0是访问Databricks控制台外的首选身份验证协议。OAuth授权需要客户端ID和客户端密钥。首先,按照Databricks文档创建服务主体并生成OAuth密钥。然后,将客户端ID和密钥存储在AWS Secrets Manager中以安全管理和检索。
创建IAM角色
后续步骤中,您将使用EMR Serverless作业和SageMaker AI训练作业。两者都需要IAM角色来访问其他AWS服务并执行作业。请参阅相关文档了解EMR Serverless和SageMaker AI如何与IAM配合使用。以下是每个IAM角色的示例策略。
第二步:Databricks Unity Catalog设置
接下来,在Databricks Unity Catalog端完成以下设置步骤,并通过Databricks SDK确认对Unity Catalog表的访问。
要求:
- 配置外部位置:将S3桶注册为Unity Catalog中的外部位置,以设置对S3中数据的访问。
- 创建Unity Catalog数据库对象:在Unity Catalog环境中设置以下数据库对象:目录、模式、外部表。
- 授予权限:为服务主体授予必要的权限。
完成后,您将拥有以下Unity Catalog结构,并为服务主体配置了适当的权限:
UNITY_CATALOG_NAME
├── UNITY_SCHEMA_DATA (raw)
│ └── UNITY_TABLE_NAME (指向UC_MANAGED_BUCKET/raw/的外部表)
├── UNITY_SCHEMA_TRAINING (curated)
│ └── (处理后的训练数据)
└── UNITY_SCHEMA_MODEL (ml)
└── (模型工件和版本)Unity Catalog设置完成后,初始化Databricks客户端并测试到Unity Catalog的连接。笔记本使用AWS Secrets Manager检索客户端ID和密钥。成功认证后,您可以检索Unity Catalog表的详细信息,例如存储位置和表格式。
第三步:EMR Serverless应用程序设置
在此步骤中,您将创建一个使用具有互联网访问的VPC的EMR Serverless应用程序。该解决方案首先从Unity Catalog识别S3桶位置,然后EMR Serverless作业读取并写入该S3桶中的Delta表。由于截至2026年2月,EMR Serverless默认不包含Delta Lake支持,Spark应用程序必须在初始化期间从Maven中央仓库通过互联网下载Delta Lake JAR文件。如果没有互联网访问,此下载将失败,Spark应用程序无法解析Delta表格式,导致作业启动失败。请配置您的EMR Serverless应用程序使用具有互联网访问的现有子网,或参考相关部分设置VPC。
(注:原文较长,此处为改写后的内容,保留了所有重要细节。)