Дата публикации
ai_products

Как безопасно дообучать LLM на AWS, не ломая политику доступа Databricks Unity Catalog

Что нового

AWS и Databricks предлагают готовый паттерн, как дообучать большие языковые модели на Amazon SageMaker AI, не обходя Databricks Unity Catalog и его политику доступа.

Конкретно, что теперь можно сделать по шагам:

  1. Хранить и управлять данными через Unity Catalog, при этом физически данные лежат в Amazon S3.
  2. Предобрабатывать эти данные в Apache Spark на Amazon EMR Serverless, не поднимая кластеры вручную.
  3. Дообучать LLM Ministral-3-3B-Instruct-2512 на Amazon SageMaker AI Training с:
    • 3 млрд параметров;
    • контекстом 1024 токена при обучении в примере из ноутбука;
    • загрузкой в FP8 и дообучением через LoRA (тренируется 1–2% параметров).
  4. Сохранить артефакты модели в S3, управляемом Unity Catalog, а затем зарегистрировать модель в ML Registry Unity Catalog.
  5. Построить сквозную линию происхождения данных (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.

Высокоуровневый сценарий:

  1. Подготовка инфраструктуры 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": "*"
  }
 ]
}
  1. Настройка 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
  1. 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-таблиц упадёт ещё при старте.
  2. Предобработка данных на 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, которая указывает на путь с подготовленными данными.
  1. Дообучение 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.

  2. Регистрация модели в Unity Catalog

    • Через Databricks SDK создаёте MLflow experiment и регистрируете модель в Unity Catalog в схеме UNITY_SCHEMA_MODEL.
    • В MLflow логируете:
      • гиперпараметры;
      • исходную таблицу с данными;
      • идентификатор SageMaker Training job;
      • путь к артефактам в S3.
    • Unity Catalog создаёт объект Model с версиями, правами и описанием.
  3. Внешний 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.
    • После этого в интерфейсе Unity Catalog можно увидеть граф: сырые данные → предобработка → подготовленный датасет → обучение → версия модели.

  4. Очистка ресурсов

    После эксперимента есть список того, что нужно удалить, чтобы не платить лишнее:

    • 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, сетям и каталогам. Зато для банков, телекомов, публичных компаний и любого бизнеса с комплаенсом это практичная схема.

Где это помогает

  1. Дообучение LLM на чувствительных данных

    • Риск-факторы из SEC EDGAR — хороший пример: это юридически значимый текст.
    • Через Unity Catalog вы можете чётко задать, кто может читать какую таблицу, и не терять эту логику при работе через SageMaker.
  2. Сквозной аудит: какие данные обучили какую модель

    • Если регулятор или внутренний аудит спрашивает: "На каких данных обучена эта модель?", вы открываете lineage в Unity Catalog.
    • Видно: таблица сырья → EMR job → curated-таблица → SageMaker job → версия модели.
  3. Мультисервисная архитектура без хаоса в правах

    • Вы продолжаете использовать Databricks для каталога и прав, но при этом пользуетесь:
      • EMR Serverless для Spark;
      • SageMaker AI для обучения.
    • Не нужно дублировать политику доступа в каждом сервисе вручную.
  4. Оптимизация затрат на обучение

    • 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 по качеству текстов. Здесь речь про архитектуру и управление данными, а не про сравнение моделей по бенчмаркам.

С чем его логично сравнить:

  1. "Чистый" Databricks без AWS ML

    • Плюс Databricks-only: один стек, меньше интеграций.
    • Плюс описанного решения: вы можете использовать специализированные сервисы AWS — EMR Serverless и SageMaker AI Training — не теряя управления через Unity Catalog.
  2. "Чистый" AWS без Unity Catalog

    • Плюс AWS-only: меньше внешних зависимостей, всё в одном облаке.
    • Плюс описанного решения: если у вас уже есть Databricks с Unity Catalog и вы не хотите переносить каталоги и политику в AWS Glue или Lake Formation, этот паттерн позволяет сохранить текущий центр управления.
  3. Другие подходы к lineage

    • Многие платформы логируют метаданные обучения, но здесь Unity Catalog даёт единый граф lineage, включая внешние джобы.
    • Для компаний, которые уже живут в экосистеме Databricks, это удобнее, чем собирать lineage по кускам в разных системах.

Чётких чисел по скорости обучения или стоимости в сравнении с альтернативами в описании нет. Но из приведённой конфигурации можно сделать практичный вывод: 3B-модель с FP8 и LoRA укладывается в один ml.g5.16xlarge, что заметно дешевле, чем полноценное обучение больших LLM.

Как запустить

Ниже — краткий чек-лист, как повторить архитектуру с ноутбуком LLM_Finetunig_SageMaker_AI_Unity_Catalog.ipynb.

1. SageMaker AI Studio

  1. Зайдите в Amazon SageMaker AI Console.
  2. Если домена Studio ещё нет — создайте его через Quick Setup.
  3. Зайдите в SageMaker AI Studio.
  4. Создайте JupyterLab Space с параметрами:
    • Instance Type: ml.m5.2xlarge;
    • Image: Sagemaker Distribution 3.8.0;
    • Storage: 5 GB.
  5. Загрузите ноутбук LLM_Finetunig_SageMaker_AI_Unity_Catalog.ipynb.
  6. Откройте его и выберите ядро 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

  1. В Databricks создайте service principal.
  2. Сгенерируйте OAuth secret (OAuth M2M) по документации Databricks.
  3. В AWS Secrets Manager создайте секрет databricks/... и сохраните туда client_id и client_secret.

4. IAM-ролли и EMR Serverless

  1. Создайте IAM-роль для EMR Serverless с политикой emr_policy выше.
  2. Создайте IAM-роль для SageMaker AI с политикой sagemaker_policy выше.
  3. Настройте VPC и подсети с доступом в интернет (NAT Gateway или Internet Gateway).
  4. Создайте EMR Serverless application, привяжите VPC и runtime-роль.

5. Unity Catalog

  1. Зарегистрируйте S3-бакет как External Location.
  2. Создайте каталог UNITY_CATALOG_NAME.
  3. Создайте схемы:
    • UNITY_SCHEMA_DATA (raw);
    • UNITY_SCHEMA_TRAINING (curated);
    • UNITY_SCHEMA_MODEL (ml).
  4. Создайте внешнюю таблицу UNITY_TABLE_NAME в UNITY_SCHEMA_DATA, указывающую на .../raw/risk_factors в S3.
  5. Выдайте service principal права USE CATALOG, USE SCHEMA, SELECT, CREATE TABLE.
  6. В ноутбуке инициализируйте WorkspaceClient и проверьте доступ к таблице (код выше).

6. Предобработка на EMR Serverless

  1. В ноутбуке напишите Spark-скрипт для чтения таблицы risk_factors из Delta, очистки и формирования промптов.
  2. При запуске 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'
        ])
    }
}
  1. Запишите результат как Delta-таблицу в curated-раздел S3.
  2. Через Databricks SQL Warehouse создайте таблицу в UNITY_SCHEMA_TRAINING, указывающую на этот путь.

7. Обучение на SageMaker AI

  1. В ноутбуке создайте training script, который:
    • загружает Ministral-3-3B-Instruct-2512 из Hugging Face;
    • включает FP8 и LoRA;
    • читает подготовленные данные с контекстом 1024 токена;
    • сохраняет артефакты в S3.
  2. Загрузите скрипт в S3.
  3. Настройте SageMaker Training job на ml.g5.16xlarge, укажите путь к данным и роль execution.
  4. Дождитесь завершения и убедитесь, что артефакты модели лежат в UC_MANAGED_BUCKET/ml/....

8. Регистрация модели и lineage

  1. Через Databricks SDK создайте MLflow experiment.
  2. Зарегистрируйте модель в Unity Catalog в UNITY_SCHEMA_MODEL.
  3. Создайте объекты внешних метаданных для EMR Serverless job и SageMaker Training job.
  4. Через External Lineage API опишите связи между таблицами, джобами и версией модели.
  5. Откройте Unity Catalog и посмотрите граф lineage для модели.

Если вы уже живёте на стыке Databricks и AWS, этот паттерн даёт понятный способ дообучать LLM и при этом не терять контроль над тем, какие данные куда уходят и какие модели на них строятся.


Читайте также