Generación de perfiles administrada con XProf
Puedes usar la generación de perfiles de XProf administrada cuando usas la supervisión de cargas de trabajo de ML Diagnostics, la CLI de ML Diagnostics o el SDK de ML Diagnostics. Managed XProf es una instancia de XProf con un backend escalable que la plataforma de diagnóstico de AA aprovisiona y administra en tu proyecto deGoogle Cloud , mientras que XProf autohospedado requiere que implementes y mantengas de forma manual tus propias instancias de XProf para ver tus perfiles.
XProf es una herramienta de generación de perfiles y análisis del rendimiento de código abierto para cargas de trabajo de aprendizaje automático (AA) y forma parte del ecosistema de OpenXLA. En comparación con XProf autohospedado, XProf administrado proporciona las siguientes funciones:
- Configuración cero: No requiere la instalación ni la configuración manual de los servidores de visualización de XProf ni de sus dependencias.
- Acceso centralizado a sesiones de perfiles de varias ejecuciones: Carga sesiones de perfiles en diferentes ejecuciones de AA con una sola instancia de XProf administrada por proyecto.
- Ajuste de escala automático y carga rápida: Acelera la carga de perfiles grandes y ajusta la escala de los recursos de backend automáticamente cuando varios usuarios ven perfiles al mismo tiempo.
- Colaboración y seguridad integradas: Genera vínculos para compartir para las sesiones de perfil, a la vez que protege las instancias de generación de perfiles de las vulnerabilidades de seguridad.
- Múltiples modos de captura de perfiles: Admite la captura de varios hosts, la creación de perfiles a pedido, la creación de perfiles continua en modo de instantánea y la captura automática de perfiles desde la supervisión de la carga de trabajo.
- Sin costo adicional de infraestructura: Proporciona recursos de procesamiento de XProf administrados sin cargo adicional, a diferencia de alojar una instancia de XProf de forma autónoma.
Rutas de acceso de Deployment
Puedes implementar y habilitar XProf administrado con el SDK de ML Diagnostics, la supervisión de cargas de trabajo o la CLI de ML Diagnostics.
La plataforma de ML Diagnostics implementa una instancia de XProf administrada con un backend escalable por proyecto. Puedes usar esta instancia para ver todas las sesiones de perfil capturadas en todas las ejecuciones de ML del proyecto. La captura de perfiles también requiere un bucket de Cloud Storage asociado con la ejecución de ML para almacenar los datos de perfil capturados.
Puedes habilitar XProf administrado y asociar un bucket de Cloud Storage con tu ejecución de ML de cualquiera de las siguientes maneras:
- SDK de ML Diagnostics: Cuando implementas tu
primera ejecución de AA con el SDK, la plataforma de ML Diagnostics habilita
e implementa automáticamente una instancia de XProf administrada en tu proyecto. Para especificar el bucket de Cloud Storage en el que se almacenarán los perfiles, configura el parámetro
gcs_pathcuando definas la ejecución de ML en el SDK. - Supervisión de cargas de trabajo: La supervisión de cargas de trabajo no habilita XProf administrado de forma predeterminada. En cambio, la primera vez que la captura automática de perfiles activa una sesión de perfil en tu proyecto, la plataforma de diagnóstico de AA aprovisiona y habilita automáticamente una instancia de XProf administrada. De forma predeterminada, el diagnóstico de AA también aprovisiona un bucket regional de Cloud Storage en tu proyecto.
- CLI de ML Diagnostics: Puedes actualizar cualquier ejecución de AA para habilitar la herramienta de XProf, que implementa la instancia de XProf administrada en tu proyecto, y asociar un bucket de Cloud Storage con la ejecución de AA.
Cómo capturar perfiles
El diagnóstico de ML admite cuatro métodos para capturar perfiles de XProf: captura programática, generación de perfiles a pedido, generación de perfiles continua en modo de instantánea y captura automática de perfiles desde la supervisión de cargas de trabajo. Estos métodos difieren en la forma en que se activa una captura y el período que registran.
En la siguiente tabla, se comparan los métodos de captura de perfiles:
| Método de captura | Descripción | Frameworks compatibles |
|---|---|---|
| Captura programática |
Incorpora comandos de generación de perfiles directamente en el código de tu carga de trabajo para iniciar y detener el registro de datos de perfil en pasos o funciones de entrenamiento específicos. Usa este método cuando quieras perfiles reproducibles de pasos de entrenamiento conocidos o secciones de código específicas. |
JAX, vLLM, Tunix, TorchTPU |
| Generación de perfiles a pedido |
Activa una captura de perfil en vivo desde la consola de Google Cloud o la gcloud CLI durante el tiempo que especifiques mientras se ejecuta tu carga de trabajo. Usa este método cuando quieras inspeccionar una carga de trabajo en ejecución en tiempo real sin modificar los rangos de pasos ni reiniciar la carga de trabajo. |
JAX, vLLM, Tunix, TorchTPU |
| Creación continua de perfiles en modo de instantánea (versión preliminar) |
Registra de forma continua un perfil de 2 GB de seguimientos de dispositivos en un búfer circular en tus hosts de TPU y guarda el búfer de 2 GB más reciente en tu bucket de Cloud Storage cuando activas una instantánea. Usa este método cuando necesites inspeccionar la actividad de la carga de trabajo que genera una ralentización o anomalía intermitente. |
JAX, vLLM, Tunix |
| Captura automática de perfiles desde la supervisión de cargas de trabajo (versión preliminar) |
Activa automáticamente una captura de perfil de XProf cuando un analizador de degradación del rendimiento de supervisión de cargas de trabajo informa un estado Usa este método cuando quieras que el Diagnóstico de AA capture datos de seguimiento en el momento en que se degrada el rendimiento sin esperar a que actives una captura de forma manual. |
JAX, vLLM, Tunix, TorchTPU |
Captura programática
Con la captura programática, incorporas comandos de generación de perfiles directamente en el código de tu
carga de trabajo para especificar de forma explícita cuándo iniciar y detener el registro de los datos
del perfil. Todos los perfiles escritos en el bucket de Cloud Storage especificado por el
parámetro gcs_path para tu ejecución de ML aparecen automáticamente como sesiones de perfil en
la instancia de XProf administrada de tu proyecto, que puedes ver en la
consola deGoogle Cloud o con Google Cloud CLI.
Puedes configurar la captura programática de cualquiera de las siguientes maneras:
- SDK de ML Diagnostics:
Usa los métodos
profen el SDK. Estos métodos unen las APIs de generación de perfiles subyacentes a nivel del framework, por lo que tu código de generación de perfiles se mantiene coherente en JAX, vLLM, Tunix y TorchTPU. - APIs de generación de perfiles nativas del framework: Llama directamente a los métodos de generación de perfiles integrados de tu framework de ML y guarda el resultado en el bucket de Cloud Storage de tu ejecución de ML:
Generación de perfiles on demand
La creación de perfiles on demand te permite activar una captura de perfiles en tiempo real mientras se ejecuta tu carga de trabajo. Cuando activas una captura a pedido, se registra un perfil durante el período que especifiques. Puedes habilitar la generación de perfiles a pedido directamente en el código de tu carga de trabajo o con el SDK de diagnóstico de ML.
Requisitos previos
Antes de capturar un perfil a pedido, completa los siguientes pasos de configuración:
Inicia un servidor de XProf en el puerto
9999de tu carga de trabajo para que responda a los activadores de captura a pedido:Directamente en JAX: Llama al método
profiler.start_serveren el puerto9999:profiler.start_server(port=9999)SDK de ML Diagnostics: Establece
on_demand_xprof=Trueenmachinelearning_runcuando definas tu ejecución de AA.
Configura el organizador de clústeres o el entorno de procesamiento:
- Google Kubernetes Engine (GKE) o Kubernetes autoadministrado: Implementa el operador y el webhook o el DaemonSet de diagnóstico de AA.
- Slurm administrado por Cluster Director o Slurm autoadministrado: Implementa el daemon de ML Diagnostics con una secuencia de comandos de prólogo de Slurm.
- Compute Engine: Implementa el daemon de ML Diagnostics con un script de inicio de instancia.
Captura un perfil a pedido
Puedes activar una captura de perfiles bajo demanda desde la consola deGoogle Cloud o la gcloud CLI. Cuando activas una captura, especifica los siguientes parámetros:
- Duration: Es la duración de la captura, en milisegundos o segundos. La duración máxima que puedes capturar depende de las características de tu carga de trabajo y de la cantidad de datos que caben dentro del límite de 2 GB del perfil.
- Destinos: Son los nodos de destino en los que deseas capturar el perfil:
- Consola deGoogle Cloud : Todos los nodos que ejecutan la carga de trabajo se propagan automáticamente, y puedes seleccionar todos o un subconjunto de nodos.
- gcloud CLI: Enumera los objetivos del generador de perfiles para la carga de trabajo y, luego, activa una captura para todos o un subconjunto de esos objetivos.
- Niveles de rastreador de dispositivo, host y Python: Es el nivel de detalle que se capturará para los seguimientos de dispositivo, host y Python.
Creación continua de perfiles en modo de instantánea
Cuando se habilita la creación continua de perfiles, la plataforma de diagnóstico de ML registra de forma continua un perfil de 2 GB en un búfer circular en tus hosts de TPU. Cuando activas una instantánea, Diagnóstico de ML guarda el perfil de 2 GB más reciente del búfer como una sesión de perfil en tu bucket de Cloud Storage. Esta instantánea te permite inspeccionar la actividad de la carga de trabajo que genera un problema. La generación de perfiles continua solo admite el seguimiento de dispositivos; no recopila seguimientos de host ni de Python.
Requisitos previos
Antes de comenzar con la generación de perfiles continua, asegúrate de que tu entorno cumpla con los siguientes requisitos:
- Versiones de biblioteca compatibles:
libtpuversión0.0.43o posterior.jaxversión0.11.0o posterior.
- Configuración del entorno de procesamiento o del organizador de clústeres:
- GKE o Kubernetes autoadministrado: Implementa el DaemonSet de diagnóstico de ML.
- Slurm administrado por Cluster Director o Slurm autoadministrado: Implementa el daemon de ML Diagnostics con una secuencia de comandos de prólogo de Slurm.
- Compute Engine: Implementa el daemon de ML Diagnostics con un script de inicio de instancia.
Inicia el servidor de XProf en el código de tu carga de trabajo llamando a
profiler.start_server(port=9999) o establece on_demand_xprof=True en
machinelearning_run cuando uses el SDK de diagnóstico
de AA.
Iniciar la creación continua de perfiles
Puedes iniciar la generación de perfiles continuos directamente en el código de tu carga de trabajo, con la gcloud CLI o en la consola de Google Cloud . Una vez iniciada, la creación continua de perfiles registra perfiles de 2 GB en un búfer circular en los hosts de TPU especificados.
Cuando inicies la generación de perfiles continua con gcloud CLI o la consola deGoogle Cloud , especifica los siguientes parámetros:
- Objetivos: Son los nodos de destino para generar perfiles de forma continua:
- Consola deGoogle Cloud : Todos los nodos que ejecutan la carga de trabajo se propagan automáticamente, y puedes seleccionar todos o un subconjunto de nodos.
- gcloud CLI: Enumera los destinos del generador de perfiles de la carga de trabajo y, luego, inicia la generación de perfiles continua para todos o un subconjunto de esos destinos.
- Nivel de rastreador de dispositivo: Es el nivel de seguimiento del dispositivo que se capturará de forma continua. El seguimiento de host y Python está inhabilitado durante la creación de perfiles continua.
Puedes iniciar la generación de perfiles continua directamente desde el código de tu carga de trabajo de Python, en gcloud CLI o en la consola de Google Cloud .
Código de carga de trabajo de Python
Para iniciar la generación de perfiles continua directamente desde el código de tu carga de trabajo de Python, llama a la
función start_continuous_profiling:
from xprof.api import continuous_profiling_snapshot
continuous_profiling_snapshot.start_continuous_profiling('localhost:9999', {})
Para obtener más información, consulta Generación de perfiles de JAX con XProf.
gcloud CLI
Para iniciar la generación de perfiles continua desde gcloud CLI, enumera los destinos activos del generador de perfiles y, luego, inicia la generación de perfiles continua en esos nodos con los siguientes comandos:
PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
RUN_ID="RUN_ID"
# 1. Discover active ProfilerTarget IDs on the ML run:
TARGETS=$(gcloud alpha mldiagnostics profiler-target list \
--machine-learning-run="${RUN_ID}" \
--location="${LOCATION}" \
--project="${PROJECT_ID}" \
--format="csv[no-heading](name.basename())" | paste -sd, -)
# 2. Start continuous profiling across the target nodes:
gcloud alpha mldiagnostics machine-learning-run start-continuous-profiling \
--machine-learning-run="${RUN_ID}" \
--location="${LOCATION}" \
--project="${PROJECT_ID}" \
--targets="${TARGETS}" \
--device-tracer-level=enabled
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto de Google Cloud .LOCATION: Es la región en la que se encuentra tu ejecución de ML.RUN_ID: Es el ID de tu ejecución de AA.
Consola deGoogle Cloud
Para iniciar la creación continua de perfiles en la consola de Google Cloud , completa los siguientes pasos:
- En la consola de Google Cloud , ve a Cluster Director o GKE > IA/AA > Ejecutar diagnóstico y selecciona tu ejecución de AA.
- Abre la pestaña Perfiles.
- En la barra de acciones de la parte superior, haz clic en Start continuous profiling.
- Selecciona los nodos para generar perfiles y el nivel de seguimiento del dispositivo y, luego, haz clic en Iniciar.
Después de que se inicia la creación continua de perfiles, el banner Capturing continuous profiles
muestra la hora de inicio de la sesión como Since START_TIME,
y la barra de acciones muestra Take snapshot y Stop continuous profiling.
Cómo capturar una instantánea
Mientras se ejecuta la creación continua de perfiles, puedes capturar una instantánea para guardar el perfil de 2 GB más reciente del búfer circular como una sesión de perfil en tu bucket de Cloud Storage. Puedes capturar una instantánea con gcloud CLI o en la consola de Google Cloud .
Cuando captures una instantánea de creación continua de perfiles, especifica los siguientes parámetros:
- Destinos: Todos o un subconjunto de los nodos de destino en los que se ejecuta la generación de perfiles continua:
- Consola deGoogle Cloud : Todos los nodos configurados para la creación de perfiles continuos se propagan automáticamente, y puedes seleccionar todos los nodos o un subconjunto de ellos.
- gcloud CLI: Especifica todos o un subconjunto de los destinos del generador de perfiles en los que se ejecuta la generación de perfiles continua.
- Nombre de la sesión del generador de perfiles: Es un nombre para la sesión de instantánea capturada.
Puedes capturar una instantánea con gcloud CLI o en la consola deGoogle Cloud .
gcloud CLI
Para capturar una instantánea de generación de perfiles continua con gcloud CLI, ejecuta el siguiente comando:
PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
RUN_ID="RUN_ID"
gcloud alpha mldiagnostics profiler-session capture "SNAPSHOT_NAME" \
--machine-learning-run="${RUN_ID}" \
--location="${LOCATION}" \
--project="${PROJECT_ID}" \
--targets="TARGET_NODES" \
--kind=snapshot
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto de Google Cloud .LOCATION: Es la región en la que se encuentra tu ejecución de ML.RUN_ID: Es el ID de tu ejecución de AA.SNAPSHOT_NAME: Es un nombre para la sesión de perfil capturada.TARGET_NODES: Es una lista separada por comas de los nodos de destino que se capturarán.
Consola deGoogle Cloud
Para capturar una instantánea de creación continua de perfiles en la consola de Google Cloud , completa los siguientes pasos:
- En la consola de Google Cloud , ve a Cluster Director o GKE > IA/ML > Ejecutar diagnósticos, selecciona tu ejecución de ML y abre la pestaña Perfiles.
- En la barra de acciones superior, haz clic en Tomar instantánea.
- En el panel Capturar instantánea de creación continua de perfiles, ingresa un nombre de perfil, selecciona los nodos de destino y haz clic en Enviar.
La instantánea aparece en la tabla Profiles. Si el vínculo no aparece de inmediato, haz clic en Actualizar.
Captura automática de perfiles desde la supervisión de cargas de trabajo
Con la captura automática de perfiles de la supervisión de cargas de trabajo, el diagnóstico de AA
captura automáticamente un perfil de XProf cuando un analizador de degradación del rendimiento
informa un estado "bad", en lugar de esperar a que actives de forma manual una
captura a pedido después de que se produzca un problema. Puedes configurar la captura automática de perfiles para que se active una captura a pedido o, si la creación continua de perfiles está habilitada, una instantánea de creación continua de perfiles. Este proceso te permite diagnosticar la
causa raíz de un problema con un perfil capturado en el momento del evento.
Para obtener instrucciones de configuración y requisitos previos, consulta Captura automática de perfiles en la documentación de supervisión de cargas de trabajo.
Análisis de perfiles de IA agéntica
El análisis de perfiles de IA agéntica analiza automáticamente los perfiles de rendimiento de XProf capturados para las cargas de trabajo de TPU y genera un informe de análisis en HTML a partir de los datos de seguimiento sin procesar de XProf. Con los modelos de Gemini en Vertex AI, el agente de análisis ejecuta las herramientas de generación de perfiles de XProf, resume los cuellos de botella de rendimiento y recomienda cambios en el código o la configuración. Cuando se habilitan las APIs requeridas, el Diagnóstico de ML genera un informe de análisis de perfiles de IA agéntica para cada perfil capturado en la plataforma.
El análisis de perfiles de IA agéntica usa las mismas herramientas y capacidades subyacentes que
el repositorio de habilidades de XProf de código abierto.
En lugar de usar el archivo de habilidad directamente o instalar la CLI de XProf que requiere
la habilidad de código abierto, ML Diagnostics importa las implementaciones de la herramienta XProf subyacente
para que el agente pueda llamarlas directamente. Como resultado, la salida del análisis en el Diagnóstico de ML equivale a ejecutar las habilidades de XProf de código abierto con la CLI de XProf en archivos xplane locales.
Requisitos previos
Antes de usar el análisis de perfiles de IA agéntica, completa los siguientes pasos de configuración en tu proyecto de Google Cloud .
Habilita las APIs obligatorias
Habilita la API de Vertex AI (aiplatform.googleapis.com) para que el agente de análisis
pueda ejecutar modelos de Gemini en tu proyecto:
- Consola deGoogle Cloud : En la Biblioteca de APIs, habilita la API de Vertex AI.
gcloud CLI: Ejecuta el siguiente comando:
gcloud services enable aiplatform.googleapis.com
Asigna roles de IAM
Otorga a tu cuenta de usuario uno de los siguientes roles de Identity and Access Management (IAM):
- Visualizador de Cluster Director (
roles/hypercomputecluster.viewer): Otorga acceso de solo lectura a los recursos de Cluster Director y de diagnóstico de ML, incluidos los informes de análisis generados en la Google Cloud consola en Ejecutar diagnósticos > Perfiles. - Rol personalizado (
hypercomputecluster.locations.analysis): Otorga permiso para ver los informes de análisis generados en la consola de Google Cloud en Ejecutar diagnósticos > Perfiles cuando se agrega a un rol personalizado.
Cómo funciona
Cuando se completa una captura de perfil programática, on demand, continua o automática, un trabajo en segundo plano aislado ejecuta el siguiente flujo de trabajo de análisis en el perfil de XProf:
- Recopilación de datos amplia: Ejecuta 15 herramientas de XProf en paralelo para recopilar una instantánea de estado que incluye el tiempo de paso, el uso del hardware, el uso de memoria, los límites de Roofline, las operaciones más lentas y las ineficiencias del compilador. En este paso, se normalizan los tiempos por paso de entrenamiento y se separan las operaciones en buen estado de los cuellos de botella.
- Investigación de IA enfocada: Revisa el resumen de estado recopilado. Si la
carga de trabajo tiene un uso de cómputo alto, una sobrecarga de comunicación y de inactividad baja,
y un riesgo bajo de memoria insuficiente, el agente omite las llamadas a la herramienta adicionales y
genera un informe de
OPTIMAL. Si se detectan cuellos de botella, el agente formula hipótesis y ejecuta hasta cuatro verificaciones de seguimiento específicas con herramientas adicionales de XProf para inspeccionar las operaciones circundantes en el grafo de procesamiento, los retrasos en el cronograma entre hosts y los kernels personalizados. - Generación de informes: Combina las métricas de XProf con el análisis de causa raíz
y las correcciones recomendadas del agente de IA. El informe de
summary.htmlgenerado se guarda en tu bucket de Cloud Storage y se muestra en la consola deGoogle Cloud en Ejecutar diagnósticos > Perfiles.
Este flujo de trabajo mantiene privados los datos y el análisis de tu perfil dentro de tu proyecto. Los seguimientos sin procesar del generador de perfiles y los informes HTML generados se almacenan en tu bucket de Cloud Storage, y todas las llamadas al modelo de IA se ejecutan a través de Vertex AI en tu proyecto de Google Cloud .
Herramientas de XProf
En la siguiente tabla, se describen las herramientas de XProf que ejecuta el agente durante el análisis:
| Categoría | Herramientas de XProf | Descripción |
|---|---|---|
| Descripción general de la carga de trabajo y el tiempo de los pasos |
get_xprof_overview,
get_step_trace,
get_kpi_metrics,
get_device_information,
get_hosts,
get_utilization_viewer,
get_smart_suggestions
|
Estas herramientas se ejecutan durante la recopilación de datos general, y la
herramienta
|
| Roofline y operaciones más lentas |
get_roofline_model,
get_hlo_op_profile
|
Estas herramientas se ejecutan durante la recopilación de datos general y la investigación de IA enfocada para verificar lo siguiente:
|
| Detectores de ineficiencia del compilador |
detect_layout_mismatch_copies,
detect_unfused_reshapes,
detect_unnecessary_convert_reduce,
list_hlo_modules
|
Estas herramientas se ejecutan durante la recopilación de datos generales para verificar lo siguiente:
|
| Memoria y riesgo de OOM |
get_memory_profile,
get_peak_allocations
|
Estas herramientas se ejecutan durante la recopilación de datos generales para verificar lo siguiente:
|
| Explorador de gráficos de procesamiento | get_hlo_neighborhood |
Esta herramienta se ejecuta durante la investigación de IA enfocada para verificar las operaciones inmediatamente antes y después de una operación lenta en el grafo de XLA y, además, identificar qué bloquea la fusión del compilador o fuerza el movimiento de datos. |
| Cronograma y tiempos del kernel |
aggregate_xplane_events,
get_kernel_stats
|
Estas herramientas se ejecutan durante la investigación de IA enfocada para verificar lo siguiente:
|
| Generador de perfiles de kernel personalizado |
llo_load,
llo_query
|
Estas herramientas se ejecutan durante la investigación de IA enfocada para verificar los seguimientos de ejecución de bajo nivel de los kernels personalizados, como Pallas o Mosaic, que parecen opacos para la generación de perfiles de alto nivel estándar. |
Informe de análisis de perfiles de IA
Cuando se completa el análisis de un perfil capturado, el Diagnóstico de ML guarda el informe de summary.html generado en tu bucket de Cloud Storage y lo muestra en la consola de Google Cloud en Ejecutar diagnóstico > Perfiles. Puedes
usar este informe para revisar el estado general de tu carga de trabajo, inspeccionar los principales
cuellos de botella de rendimiento y, además, identificar los cambios recomendados en el código o la
configuración.
Cada informe generado incluye las siguientes secciones:
- Resumen del análisis: Muestra un estado general de
OPTIMALoNEEDS_ATTENTION, un resumen de 3 a 5 oraciones y métricas de rendimiento clave, como el tiempo de paso, el uso de memoria y la eficiencia de Roofline. - Cuellos de botella priorizados y correcciones prácticas: Enumera los hallazgos priorizados
desde
P0para problemas críticos hastaP2para problemas menores. Cada hallazgo incluye lo siguiente:- Qué sucede: Es una explicación de la causa raíz, incluidas las formas y los diseños de los tensores cuando corresponda.
- Evidencia: Citas directas de las métricas y operaciones de XProf en las que se midió el cuello de botella.
- Impacto esperado y corrección: Es la cantidad de tiempo de paso o memoria afectada, junto con los cambios recomendados en el framework, la fragmentación o el compilador.
- Análisis detallado de la herramienta de XProf: Proporciona datos de respaldo y desgloses detallados de los siguientes análisis:
- Análisis de Roofline
- Análisis de memoria
- Análisis del perfil de operaciones del optimizador de alto nivel (HLO)
- Estadísticas de ejecución del kernel
- Análisis del kernel personalizado y del optimizador de bajo nivel