Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Ajusta un modelo Llama 3.1 8B en AI Runtime con Mosaic LLM Foundry, una base de código para entrenar, realizar el ajuste fino, evaluar y desplegar modelos de lenguaje de gran tamaño, con soporte para estrategias de entrenamiento distribuido.
El cuaderno usa:
- Mosaic LLM Foundry: un marco para entrenar y ajustar las MÁQUINAS VIRTUALES con compatibilidad integrada con FSDP, carga eficaz de datos y integración de MLflow
- FSDP (datos totalmente particionados paralelos): distribuye los parámetros del modelo, los degradados y los estados del optimizador entre GPU.
- Databricks Serverless GPU: ejecuta el entrenamiento distribuido en recursos de cómputo GPU serverless conectados
- Catálogo de Unity: almacena puntos de control de modelo y registra modelos entrenados
- MLflow: realiza un seguimiento de experimentos y registra métricas de entrenamiento
Conectar al cómputo de GPU sin servidor
Este notebook requiere computación GPU sin servidor. Para conectarse:
- Haga clic en el selector de proceso del cuaderno en la parte superior derecha y seleccione GPU sin servidor.
- Abra el panel lateral Entorno en el lado derecho del cuaderno.
- Establecer acelerador en 8xH100
- Seleccione el entorno base estándar y establezca Versión del entorno en 5, que contiene las bibliotecas necesarias para ejecutar este ejemplo.
- Seleccione Aplicar y haga clic en Confirmar para aplicar este entorno al cuaderno.
Instalación de bibliotecas necesarias
Instale Mosaic LLM Foundry y sus dependencias para el entrenamiento distribuido. El paquete wheel precompilado flash-attn se instala primero para que pip lo reutilice en lugar de compilar flash-attention desde el código fuente (lo cual es lento) cuando resuelve llm-foundry[gpu]:
-
flash-attn: implementación de atención optimizada, instalada desde una rueda precompilada -
llm-foundry: marco básico para el entrenamiento y ajuste de LLM -
hf_transfer: descargas de modelos más rápidas de Hugging Face -
yamlmagic: Permite configuración YAML en las celdas del notebook.
%pip install --no-deps "https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp312-cp312-linux_x86_64.whl"
%pip install llm-foundry[gpu]==0.20.0
%pip install hf_transfer
%pip install git+https://github.com/josejg/yamlmagic.git
Reinicio del entorno de Python
Reinicie el kernel de Python para asegurarse de que los paquetes recién instalados están disponibles.
dbutils.library.restartPython()
Configuración de rutas de acceso del catálogo de Unity para el almacenamiento de modelos
Configure las ubicaciones del catálogo de Unity para almacenar puntos de control del modelo y registrar el modelo entrenado. La configuración usa parámetros de consulta que se pueden personalizar sin editar el código.
dbutils.widgets.text("uc_catalog", "main")
dbutils.widgets.text("uc_schema", "default")
dbutils.widgets.text("uc_model_name", "llama3_1-8b")
dbutils.widgets.text("uc_volume", "checkpoints")
UC_CATALOG = dbutils.widgets.get("uc_catalog")
UC_SCHEMA = dbutils.widgets.get("uc_schema")
UC_MODEL_NAME = dbutils.widgets.get("uc_model_name")
UC_VOLUME = dbutils.widgets.get("uc_volume")
MLFLOW_EXPERIMENT_NAME = '/Workspace/Shared/llm-foundry-sgc' # TODO: update this name
print(f"UC_CATALOG: {UC_CATALOG}")
print(f"UC_SCHEMA: {UC_SCHEMA}")
print(f"UC_MODEL_NAME: {UC_MODEL_NAME}")
print(f"UC_VOLUME: {UC_VOLUME}")
print(f"EXPERIMENT_NAME: {MLFLOW_EXPERIMENT_NAME}")
# Model selection - Choose based on your compute constraints
OUTPUT_DIR = f"/Volumes/{UC_CATALOG}/{UC_SCHEMA}/{UC_VOLUME}/{UC_MODEL_NAME}" # Save checkpoint to UC Volume
print(f"OUTPUT_DIR: {OUTPUT_DIR}")
Definición de la configuración de entrenamiento mediante YAML
Cargue la configuración de ajuste fino desde el formato YAML. La configuración especifica:
- Arquitectura del modelo y pesos previamente entrenados (Llama 3.1 8B)
- Configuración de FSDP para el entrenamiento distribuido
- Hiperparámetros de entrenamiento (velocidad de aprendizaje, tamaño de lote, optimizador)
- Configuración del conjunto de datos (mosaicml/dolly_hhrlhf)
- Registro de eventos y control de puntos de control de modelos en MLflow
- Callbacks para la supervisión y optimización
%load_ext yamlmagic
%%yaml config
seed: 17
model:
name: hf_causal_lm
pretrained: true
init_device: mixed
use_auth_token: true
use_flash_attention_2: true
pretrained_model_name_or_path: meta-llama/Llama-3.1-8B
loggers:
mlflow:
resume: true
tracking_uri: databricks
rename_metrics:
time/token: time/num_tokens
lr-DecoupledLionW/group0: learning_rate
log_system_metrics: true
experiment_name: "mlflow_experiment_name"
run_name: llama3_8b-finetune
model_registry_uri: databricks-uc
model_registry_prefix: main.linyuan
callbacks:
lr_monitor: {}
run_timeout:
timeout: 7200
scheduled_gc:
batch_interval: 1000
speed_monitor:
window_size: 10
memory_monitor: {}
runtime_estimator: {}
hf_checkpointer:
save_folder: "dbfs:/Volumes/main/sgc/checkpoints/llama3_1-8b-hf"
save_interval: "1ep"
precision: "bfloat16"
overwrite: true
mlflow_registered_model_name: "main.sgc.llama3_1_8b_full_ft"
mlflow_logging_config:
task: "llm/v1/completions"
metadata:
pretrained_model_name: "meta-llama/Llama-3.1-8B-Instruct"
optimizer:
lr: 5.0e-07
name: decoupled_lionw
betas:
- 0.9
- 0.95
weight_decay: 0
precision: amp_bf16
scheduler:
name: linear_decay_with_warmup
alpha_f: 0
t_warmup: 10ba
tokenizer:
name: meta-llama/Llama-3.1-8B
kwargs:
model_max_length: 1024
algorithms:
gradient_clipping:
clipping_type: norm
clipping_threshold: 1
autoresume: false
log_config: false
fsdp_config:
verbose: false
mixed_precision: PURE
state_dict_type: sharded
limit_all_gathers: true
sharding_strategy: FULL_SHARD
activation_cpu_offload: false
activation_checkpointing: true
activation_checkpointing_reentrant: false
max_seq_len: 1024
save_folder: "output_folder"
dist_timeout: 600
max_duration: 20ba
progress_bar: false
train_loader:
name: finetuning
dataset:
split: test
hf_name: mosaicml/dolly_hhrlhf
shuffle: true
safe_load: true
max_seq_len: 1024
packing_ratio: auto
target_prompts: none
target_responses: all
allow_pad_trimming: false
decoder_only_format: true
timeout: 0
drop_last: false
pin_memory: true
num_workers: 8
prefetch_factor: 2
persistent_workers: true
eval_interval: 1
save_interval: 1h
log_to_console: true
save_overwrite: true
python_log_level: debug
save_weights_only: false
console_log_interval: 10ba
device_eval_batch_size: 1
global_train_batch_size: 32
device_train_microbatch_size: 1
save_num_checkpoints_to_keep: 1
config["loggers"]["mlflow"]["experiment_name"] = MLFLOW_EXPERIMENT_NAME
config["save_folder"] = OUTPUT_DIR
config["callbacks"]["hf_checkpointer"]["save_folder"] = OUTPUT_DIR
config["callbacks"]["hf_checkpointer"]["mlflow_registered_model_name"] = f"{UC_CATALOG}.{UC_SCHEMA}.{UC_MODEL_NAME}"
Definición de la función de entrenamiento distribuido
Esta celda define la función de entrenamiento que se ejecutará mediante el decorador @distributed en 8 GPUs H100. La función :
- Configura el token de Hugging Face para el acceso al modelo.
- Habilita las descargas rápidas de modelos con
hf_transfer - Llama a la función LLM Foundry
train()con la configuración YAML. - Devuelve el identificador de ejecución de MLflow para realizar el seguimiento del experimento.
El decorador @distributed ejecuta la función en el entorno de computación GPU sin servidor conectado y se encarga de la orquestación del entrenamiento distribuido.
from serverless_gpu import distributed
from llmfoundry.command_utils.train import train
from omegaconf import DictConfig
import mlflow
from huggingface_hub import constants
HF_TOKEN = dbutils.secrets.get(scope="sgc-nightly-notebook", key="hf_token")
@distributed(gpus=8, gpu_type='H100')
def run_llm_foundry():
import os
import logging
os.environ["HUGGING_FACE_HUB_TOKEN"] = HF_TOKEN
constants.HF_HUB_ENABLE_HF_TRANSFER = True
train(DictConfig(config))
logging.info("\n✓ Training completed successfully!")
mlflow_run_id = None
if mlflow.last_active_run() is not None:
mlflow_run_id = mlflow.last_active_run().info.run_id
return mlflow_run_id
Ejecuta el trabajo de entrenamiento distribuido
Ejecute la función de entrenamiento en 8 GPU H100. La función devuelve el identificador de ejecución de MLflow, que se puede usar para realizar un seguimiento de las métricas, ver los registros y acceder al modelo entrenado en la interfaz de usuario de MLflow.
mlflow_run_id = run_llm_foundry.distributed()[0]
print(mlflow_run_id)
Pasos siguientes
- Entrenamiento distribuido con varias GPU y varios nodos
- Procedimientos recomendados para el proceso de GPU sin servidor
- Solución de problemas en el proceso de GPU sin servidor
- Documentación de Mosaic LLM Foundry
- Registro de modelos del catálogo de Unity