- Дата публикации
Как безопасно дообучать LLM на AWS, не ломая политику доступа Databricks Unity Catalog
Что нового
AWS и Databricks предлагают готовый паттерн, как дообучать большие языковые модели на Amazon SageMaker AI, не обходя Databricks Unity Catalog и его политику доступа.
Конкретно, что теперь можно сделать по шагам:
- Хранить и управлять данными через Unity Catalog, при этом физически данные лежат в Amazon S3.
- Предобрабатывать эти данные в Apache Spark на Amazon EMR Serverless, не поднимая кластеры вручную.
- Дообучать LLM Ministral-3-3B-Instruct-2512 на Amazon SageMaker AI Training с:
- 3 млрд параметров;
- контекстом 1024 токена при обучении в примере из ноутбука;
- загрузкой в FP8 и дообучением через LoRA (тренируется 1–2% параметров).
- Сохранить артефакты модели в S3, управляемом Unity Catalog, а затем зарегистрировать модель в ML Registry Unity Catalog.
- Построить сквозную линию происхождения данных (data lineage): от сырой таблицы до версии модели, включая внешние джобы EMR и SageMaker.
Ключевые технические элементы:
- Unity Catalog управляет метаданными и правами, а S3 — фактическим хранением.
- EMR Serverless скачивает библиотеку Delta Lake
io.delta:delta-spark_2.12:3.2.0из Maven Central, поэтому ему нужен доступ в интернет. - Доступ к Databricks — через OAuth для service principal, секреты лежат в AWS Secrets Manager.
- Для внешних джобов (EMR, SageMaker) Unity Catalog использует External Metadata API и External Lineage API, чтобы строить lineage по данным и моделям.
Вся логика собрана в одном Jupyter-ноутбуке LLM_Finetunig_SageMaker_AI_Unity_Catalog.ipynb, который запускается в SageMaker AI Studio.
Как это работает
Архитектура завязана на несколько сервисов сразу:
- Amazon SageMaker AI Studio (JupyterLab Space) — точка входа. Отсюда вы запускаете предобработку и обучение.
- Amazon EMR Serverless — Spark-приложение для подготовки данных.
- Databricks Unity Catalog — каталог метаданных, права доступа, таблицы, модели, lineage.
- Amazon S3 — единое хранилище для сырых данных, подготовленных датасетов и артефактов модели.
- Hugging Face Hub — источник базовой модели Ministral-3-3B-Instruct-2512.
- AWS Secrets Manager — хранит OAuth-клиент и секрет Databricks service principal.
Высокоуровневый сценарий:
-
Подготовка инфраструктуры AWS
- Создаёте S3-бакет, который Unity Catalog будет считать "managed".
- Загружаете туда датасет SEC EDGAR (формы 10-K и 10-Q S&P 500 за 2023–2024 годы) в JSON.
- В AWS Secrets Manager создаёте секрет
databricks/...с OAuth client_id и client_secret. - Создаёте две IAM-ролли:
- runtime-роль для EMR Serverless;
- execution-роль для SageMaker AI.
Пример политики для роли EMR Serverless:
emr_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
f"arn:aws:s3:::{UC_MANAGED_BUCKET}/*",
f"arn:aws:s3:::{UC_MANAGED_BUCKET}"
]
},
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
f"arn:aws:secretsmanager:{AWS_REGION}:{AWS_ACCOUNT_ID}:secret:databricks/*"
]
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": f"arn:aws:logs:{AWS_REGION}:{AWS_ACCOUNT_ID}:*"
}
]
}
Пример политики для SageMaker AI execution role:
sagemaker_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
f"arn:aws:s3:::{UC_MANAGED_BUCKET}/*",
f"arn:aws:s3:::{UC_MANAGED_BUCKET}"
]
},
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
f"arn:aws:secretsmanager:{AWS_REGION}:{AWS_ACCOUNT_ID}:secret:databricks/*"
]
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Resource": f"arn:aws:logs:{AWS_REGION}:{AWS_ACCOUNT_ID}:*"
},
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
"Resource": "*"
}
]
}
-
Настройка Databricks Unity Catalog
- Регистрируете S3-бакет как External Location.
- Создаёте структуру в Unity Catalog:
UNITY_CATALOG_NAME
├── UNITY_SCHEMA_DATA (raw)
│ └── UNITY_TABLE_NAME (external table → UC_MANAGED_BUCKET/raw/)
├── UNITY_SCHEMA_TRAINING (curated)
│ └── таблица с подготовленными данными
└── UNITY_SCHEMA_MODEL (ml)
└── артефакты и версии моделей
-
Выдаёте service principal права:
- USE CATALOG на каталог;
- USE SCHEMA на схемы raw/curated/ml;
- SELECT на сырую таблицу;
- CREATE TABLE на схемы curated и ml.
-
Инициализируете Databricks SDK из ноутбука в SageMaker AI Studio и проверяете доступ к таблице:
from databricks.sdk import WorkspaceClient
w = WorkspaceClient(
host=UNITY_WORKSPACE_URL,
client_id=DATABRICKS_CLIENT_ID,
client_secret=DATABRICKS_CLIENT_SECRET
)
table_info = w.tables.get(f"{UNITY_CATALOG_NAME}.{UNITY_SCHEMA_DATA}.{UNITY_TABLE_NAME}")
print(f"Table: {table_info.name}")
print(f"Storage Location: {table_info.storage_location}")
print(f"Table Format: {table_info.data_source_format}")
# Пример вывода:
# Table: risk_factors
# Storage Location: s3://aws-blog-smai-uc-bucket-ACCOUNTID/raw/risk_factors
# Table Format: DataSourceFormat.DELTA
-
EMR Serverless и Delta Lake
- Создаёте EMR Serverless application в VPC с доступом в интернет.
- EMR в этой конфигурации не содержит Delta Lake "из коробки", поэтому Spark-приложение подтягивает JAR-файлы Delta из Maven Central.
- Без интернета скачивание
io.delta:delta-spark_2.12:3.2.0не произойдёт, и чтение Delta-таблиц упадёт ещё при старте.
-
Предобработка данных на EMR Serverless
-
Пишете Spark-скрипт, который:
- читает сырые SEC EDGAR risk factors из Delta-таблицы;
- чистит текст, фильтрует записи;
- формирует промпты в стиле instruction-following для дообучения;
- сохраняет результат как Delta-таблицу в
curated-раздел S3.
-
Для поддержки Delta указываете
sparkSubmitParameters:
-
jobDriver={
'sparkSubmit': {
'sparkSubmitParameters': ' '.join([
'--packages io.delta:delta-spark_2.12:3.2.0',
'--conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension',
'--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog'
])
}
}
- После успешной джобы создаёте в Unity Catalog таблицу в
UNITY_SCHEMA_TRAINING, которая указывает на путь с подготовленными данными.
-
Дообучение Ministral-3-3B-Instruct на SageMaker AI
-
В ноутбуке создаёте training script и загружаете его в S3.
-
Скрипт делает:
- загрузку базовой модели Ministral-3-3B-Instruct-2512 с Hugging Face;
- квантование до FP8 для экономии памяти;
- настройку LoRA и обучение только 1–2% параметров;
- чтение подготовленных данных с контекстом 1024 токена;
- сохранение артефактов модели в S3-бакет Unity Catalog.
-
Запускаете SageMaker AI Training job на одном экземпляре
ml.g5.16xlarge. Эта конфигурация даёт достаточно GPU-памяти для 3B-модели с FP8 и LoRA.
-
-
Регистрация модели в Unity Catalog
- Через Databricks SDK создаёте MLflow experiment и регистрируете модель в Unity Catalog в схеме
UNITY_SCHEMA_MODEL. - В MLflow логируете:
- гиперпараметры;
- исходную таблицу с данными;
- идентификатор SageMaker Training job;
- путь к артефактам в S3.
- Unity Catalog создаёт объект Model с версиями, правами и описанием.
- Через Databricks SDK создаёте MLflow experiment и регистрируете модель в Unity Catalog в схеме
-
Внешний data lineage в Unity Catalog
-
Для EMR Serverless job и SageMaker AI Training job создаёте объекты внешних метаданных через External Metadata API.
-
Через External Lineage API описываете связи:
Для EMR Serverless:
- upstream:
raw-таблица → EMR job; - downstream: EMR job →
curated-таблица.
Для SageMaker AI:
- upstream:
curated-таблица → SageMaker Training job; - downstream: SageMaker Training job → конкретная версия модели в Unity Catalog.
- upstream:
-
После этого в интерфейсе Unity Catalog можно увидеть граф: сырые данные → предобработка → подготовленный датасет → обучение → версия модели.
-
-
Очистка ресурсов
После эксперимента есть список того, что нужно удалить, чтобы не платить лишнее:
- EMR Serverless Application;
- S3-бакеты и объекты;
- IAM-ролли и политики;
- секреты в AWS Secrets Manager;
- ресурсы VPC (если создавали специально);
- объекты Unity Catalog (catalog, schemas, tables, service principal).
Что это значит для вас
Для кого это вообще нужно
Этот паттерн полезен, если вы:
- уже используете Databricks Unity Catalog как единый слой управления данными;
- храните данные в Amazon S3 и строите ML-стек вокруг AWS;
- хотите дообучать LLM на своих данных, но не хотите терять аудит и контроль доступа.
Если вы просто хотите "поиграться" с LLM, это избыточно. Здесь много шагов по IAM, сетям и каталогам. Зато для банков, телекомов, публичных компаний и любого бизнеса с комплаенсом это практичная схема.
Где это помогает
-
Дообучение LLM на чувствительных данных
- Риск-факторы из SEC EDGAR — хороший пример: это юридически значимый текст.
- Через Unity Catalog вы можете чётко задать, кто может читать какую таблицу, и не терять эту логику при работе через SageMaker.
-
Сквозной аудит: какие данные обучили какую модель
- Если регулятор или внутренний аудит спрашивает: "На каких данных обучена эта модель?", вы открываете lineage в Unity Catalog.
- Видно: таблица сырья → EMR job → curated-таблица → SageMaker job → версия модели.
-
Мультисервисная архитектура без хаоса в правах
- Вы продолжаете использовать Databricks для каталога и прав, но при этом пользуетесь:
- EMR Serverless для Spark;
- SageMaker AI для обучения.
- Не нужно дублировать политику доступа в каждом сервисе вручную.
- Вы продолжаете использовать Databricks для каталога и прав, но при этом пользуетесь:
-
Оптимизация затрат на обучение
- Ministral-3-3B-Instruct-2512 — компактная модель на 3 млрд параметров.
- FP8 + LoRA позволяют обучать её на одном
ml.g5.16xlarge, а не на ферме из нескольких GPU.
Где лучше не использовать
- Если у вас нет Unity Catalog и вся аналитика крутится только в AWS, проще строить пайплайн на Glue/EMR/SageMaker без Databricks.
- Если вы обучаете огромные модели (70B+) и у вас нет строгих требований по lineage, этот паттерн можно упростить, не прописывая внешний lineage.
- Если ваша команда не готова управлять:
- IAM-политиками,
- VPC и интернет-доступом для EMR,
- OAuth для Databricks, — вам придётся сначала подтянуть инфраструктурную экспертизу.
Доступность и ограничения для России
Все описанные сервисы — AWS и Databricks. Доступ к ним из России может потребовать VPN и юридическую проработку. Перед внедрением нужно проверить ограничения по аккаунтам и биллингу в вашей юрисдикции.
Место на рынке
Этот паттерн не конкурирует напрямую с GPT-4o или Claude 3 по качеству текстов. Здесь речь про архитектуру и управление данными, а не про сравнение моделей по бенчмаркам.
С чем его логично сравнить:
-
"Чистый" Databricks без AWS ML
- Плюс Databricks-only: один стек, меньше интеграций.
- Плюс описанного решения: вы можете использовать специализированные сервисы AWS — EMR Serverless и SageMaker AI Training — не теряя управления через Unity Catalog.
-
"Чистый" AWS без Unity Catalog
- Плюс AWS-only: меньше внешних зависимостей, всё в одном облаке.
- Плюс описанного решения: если у вас уже есть Databricks с Unity Catalog и вы не хотите переносить каталоги и политику в AWS Glue или Lake Formation, этот паттерн позволяет сохранить текущий центр управления.
-
Другие подходы к lineage
- Многие платформы логируют метаданные обучения, но здесь Unity Catalog даёт единый граф lineage, включая внешние джобы.
- Для компаний, которые уже живут в экосистеме Databricks, это удобнее, чем собирать lineage по кускам в разных системах.
Чётких чисел по скорости обучения или стоимости в сравнении с альтернативами в описании нет. Но из приведённой конфигурации можно сделать практичный вывод: 3B-модель с FP8 и LoRA укладывается в один ml.g5.16xlarge, что заметно дешевле, чем полноценное обучение больших LLM.
Как запустить
Ниже — краткий чек-лист, как повторить архитектуру с ноутбуком LLM_Finetunig_SageMaker_AI_Unity_Catalog.ipynb.
1. SageMaker AI Studio
- Зайдите в Amazon SageMaker AI Console.
- Если домена Studio ещё нет — создайте его через Quick Setup.
- Зайдите в SageMaker AI Studio.
- Создайте JupyterLab Space с параметрами:
- Instance Type:
ml.m5.2xlarge; - Image:
Sagemaker Distribution 3.8.0; - Storage:
5 GB.
- Instance Type:
- Загрузите ноутбук
LLM_Finetunig_SageMaker_AI_Unity_Catalog.ipynb. - Откройте его и выберите ядро
Python3 (ipykernel).
2. Данные в S3
- Скачайте данные SEC EDGAR (10-K и 10-Q для S&P 500, 2023–2024).
- Сформируйте структуру в 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/
Каждая запись в JSON должна содержать CIK, тикер, название компании, тип формы, период и текст секции Risk Factors.
3. Databricks OAuth в Secrets Manager
- В Databricks создайте service principal.
- Сгенерируйте OAuth secret (OAuth M2M) по документации Databricks.
- В AWS Secrets Manager создайте секрет
databricks/...и сохраните туда client_id и client_secret.
4. IAM-ролли и EMR Serverless
- Создайте IAM-роль для EMR Serverless с политикой
emr_policyвыше. - Создайте IAM-роль для SageMaker AI с политикой
sagemaker_policyвыше. - Настройте VPC и подсети с доступом в интернет (NAT Gateway или Internet Gateway).
- Создайте EMR Serverless application, привяжите VPC и runtime-роль.
5. Unity Catalog
- Зарегистрируйте S3-бакет как External Location.
- Создайте каталог
UNITY_CATALOG_NAME. - Создайте схемы:
UNITY_SCHEMA_DATA(raw);UNITY_SCHEMA_TRAINING(curated);UNITY_SCHEMA_MODEL(ml).
- Создайте внешнюю таблицу
UNITY_TABLE_NAMEвUNITY_SCHEMA_DATA, указывающую на.../raw/risk_factorsв S3. - Выдайте service principal права USE CATALOG, USE SCHEMA, SELECT, CREATE TABLE.
- В ноутбуке инициализируйте
WorkspaceClientи проверьте доступ к таблице (код выше).
6. Предобработка на EMR Serverless
- В ноутбуке напишите Spark-скрипт для чтения таблицы
risk_factorsиз Delta, очистки и формирования промптов. - При запуске EMR job используйте
sparkSubmitParameters:
jobDriver={
'sparkSubmit': {
'sparkSubmitParameters': ' '.join([
'--packages io.delta:delta-spark_2.12:3.2.0',
'--conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension',
'--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog'
])
}
}
- Запишите результат как Delta-таблицу в
curated-раздел S3. - Через Databricks SQL Warehouse создайте таблицу в
UNITY_SCHEMA_TRAINING, указывающую на этот путь.
7. Обучение на SageMaker AI
- В ноутбуке создайте training script, который:
- загружает Ministral-3-3B-Instruct-2512 из Hugging Face;
- включает FP8 и LoRA;
- читает подготовленные данные с контекстом 1024 токена;
- сохраняет артефакты в S3.
- Загрузите скрипт в S3.
- Настройте SageMaker Training job на
ml.g5.16xlarge, укажите путь к данным и роль execution. - Дождитесь завершения и убедитесь, что артефакты модели лежат в
UC_MANAGED_BUCKET/ml/....
8. Регистрация модели и lineage
- Через Databricks SDK создайте MLflow experiment.
- Зарегистрируйте модель в Unity Catalog в
UNITY_SCHEMA_MODEL. - Создайте объекты внешних метаданных для EMR Serverless job и SageMaker Training job.
- Через External Lineage API опишите связи между таблицами, джобами и версией модели.
- Откройте Unity Catalog и посмотрите граф lineage для модели.
Если вы уже живёте на стыке Databricks и AWS, этот паттерн даёт понятный способ дообучать LLM и при этом не терять контроль над тем, какие данные куда уходят и какие модели на них строятся.