Comienzo
Para crear soluciones de IA generativa de nivel de producción, escalables y tolerantes a fallas, es necesario tener una disponibilidad confiable de LLM. Sus terminales LLM deben estar listos para satisfacer la demanda al contar con computación dedicada solo para sus cargas de trabajo, subir la capacidad cuando sea necesario, tener una latencia constante, la capacidad de registrar todas las interacciones y precios predecibles. Para satisfacer esta exigencia, Databricks ofrece Puntos finales de rendimiento aprovisionados en una variedad de modelos de pulvínulo de parada rendimiento (todos los modelos principales de Fogosidad, DBRX, Mistral, etc.). Pero ¿qué tal si ofrecemos las variantes más nuevas y mejoradas de Fogosidad 3.1 y 3.2? NVIDIA Maniquí Nemotrón 70Buna transformación mejorada de Fogosidad 3.1, ha mostrado un rendimiento competitivo en una amplia variedad de puntos de remisión. Las innovaciones recientes en Databricks ahora permiten a los clientes hospedar fácilmente muchas variantes optimizadas de Fogosidad 3.1 y Fogosidad 3.2 con rendimiento aprovisionado.
Considere el ulterior atmósfera: un sitio web de parte ha acabado internamente buenos resultados utilizando Nemotron para difundir resúmenes de sus artículos de parte. Quieren implementar un proceso de inferencia por lotes de porción de producción que absorba todos los artículos nuevos para su publicación al manifestación de cada día y genere resúmenes. Repasemos el proceso simple de crear un punto final de rendimiento aprovisionado para Nemotron-70B en Databricks, realizar inferencia por lotes en un conjunto de datos y evaluar los resultados con MLflow para certificar que solo se envíen para su publicación resultados de adhesión calidad.
Preparando el punto final
Para crear un punto final de rendimiento aprovisionado para nuestro maniquí, primero debemos incluir el maniquí en Databricks. Registrar un maniquí en MLflow en Databricks es sencillo, pero descargar un maniquí como Nemotron-70B puede establecerse mucho espacio. En casos como estos es ideal utilizar Volúmenes de ladrillos de datos que aumentará automáticamente su tamaño a medida que se necesite más espacio en disco.
nemotron_model = "nvidia/Fogosidad-3.1-Nemotron-70B-Instruct-HF"
nemotron_volume = "/Volumes/ml/your_name/nemotron"
tokenizer = AutoTokenizer.from_pretrained(nemotron_model, cache_dir=nemotron_volume)
model = AutoModelForCausalLM.from_pretrained(nemotron_model, cache_dir=nemotron_volume)
Una vez descargado el maniquí, podemos registrarlo fácilmente en MLflow.
mlflow.set_registry_uri("databricks-uc")
with mlflow.start_run():
mlflow.transformers.log_model(
transformers_model={
"model": model,
"tokenizer": tokenizer
},
artifact_path="model",
task="llm/v1/chat",
registered_model_name="ml.your_name.nemotron"
)
El tarea El parámetro es importante para el rendimiento aprovisionado, ya que esto determinará la API que está acondicionado para nuestro punto final. El rendimiento aprovisionado puede soportar puntos finales de tipo chat, finalizaciones o incrustaciones. El nombre_modelo_registrado El argumento le indicará a MLflow que registre un nuevo maniquí con el nombre proporcionado y que comience a rastrear las versiones de ese maniquí. Necesitaremos un maniquí con un nombre registrado para configurar nuestro punto final de rendimiento aprovisionado.
Cuando el maniquí termine de registrarse en MLflow, podemos crear nuestro punto final. Los puntos finales se pueden crear a través de la interfaz de afortunado o API DESCANSO. Para crear un nuevo punto final mediante la interfaz de afortunado:
Inferencia por lotes (con ai_query)
Ahora que nuestro maniquí está acondicionado y sagaz para usar, necesitamos ejecutar un juego diario de artículos de parte a través del punto final con nuestro mensaje diseñado para obtener resúmenes. La optimización de las cargas de trabajo de inferencia por lotes puede resultar compleja. Según nuestra carga útil típica, ¿cuál es la concurrencia óptima a utilizar para nuestra nueva nemotrón punto final? ¿Deberíamos usar un pandas_udf ¿O escribir código de subprocesos personalizado? Lo nuevo de Databricks ai_query
La funcionalidad nos permite abstraernos de la complejidad y centrarnos simplemente en los resultados. El ai_query
La funcionalidad puede manejar inferencias individuales o por lotes en puntos finales de rendimiento aprovisionado de una modo simple, optimizada y escalable.
para usar ai_querycree una consulta SQL e incluya el nombre del punto final de rendimiento aprovisionado como primer parámetro. Agregue su mensaje y concatene la columna en la que desea aplicarlo como segundo parámetro. Puede realizar una concatenación simple usando ||
o concat()
o puede realizar una concatenación más compleja con múltiples columnas y títulos, usando format_string()
.
Afición ai_query
se realiza a través de Pyspark SQL y se puede realizar directamente en SQL o en código Python de Pyspark.
%sql
SELECT
news_blurb,
ai_query(
'nemo_your_name',
CONCAT('Summarize the following news blurb into 1 sentence. Provide only the summary and no introductory/preceding text. Blurb: ', news_blurb)
) as sentence_summary
FROM users.your_name.news_blurbs
LIMIT 10
Se puede realizar la misma indicación en código PySpark:
news_summaries_df = spark.sql("""
SELECT
news_blurb,
ai_query(
'nemo_your_name',
CONCAT('Summarize the following news blurb into 1 sentence. Provide only the summary and no introductory/preceding text. Blurb: ', news_blurb)
) as sentence_summary
FROM users.your_name.news_blurbs
LIMIT 10
""")
display(news_summaries_df)
¡Es así de simple! No es necesario crear funciones complejas definidas por el afortunado ni manejar operaciones complicadas de Spark. Siempre que sus datos estén en una tabla o perspicacia, puede ejecutar esto fácilmente. Y adecuado a que esto aprovecha un punto final de rendimiento aprovisionado, distribuirá y ejecutará automáticamente inferencias en paralelo, hasta la capacidad designada del punto final, ¡lo que lo hace mucho más eficaz que una serie de solicitudes secuenciales!
ai_query
asimismo ofrece argumentos adicionales que incluyen designación de tipo de devolución, registro de estado de error y parámetros LLM adicionales (max_tokens, temperatura y otros que usaría en una solicitud LLM típica). Asimismo podemos atender las respuestas a una tabla en Unity Catalog con sobrado facilidad en la misma consulta.
%sql
...
ai_query(
'nemo_your_name',
CONCAT('Summarize the following news blurb into 1 sentence. Provide only the summary and no introductory/preceding text. Blurb: ', news_blurb),
modelParameters => named_struct('max_tokens', 100,'temperature', 0.1)
...
Evaluación de resultados resumidos con MLflow Evaluate
Ahora hemos generado nuestros resúmenes de parte para los artículos de parte, pero queremos revisar automáticamente su calidad antaño de publicarlos en nuestro sitio web. La evaluación del desempeño de LLM se simplifica a través de mlflow.evaluate()
. Esta funcionalidad aprovecha un maniquí para evaluar, métricas para su evaluación y, opcionalmente, un conjunto de datos de evaluación para comparar. ofrece métricas predeterminadas (respuesta de preguntas, recopilación de texto y métricas de texto), así como la capacidad de crear sus propias métricas personalizadas. En nuestro caso, queremos que un LLM califique la calidad de nuestros resúmenes generados, por lo que definiremos un métrica personalizada. Luego, evaluaremos nuestros resúmenes y filtraremos los resúmenes de desaparecido calidad para su revisión manual.
Echemos un vistazo a un ejemplo:
- Defina métricas personalizadas a través de MLflow.
from mlflow.metrics.genai import make_genai_metric summary_quality = make_genai_metric( name="news_summary_quality", definition=( "News Summary Quality is how well a 1-sentence news summary captures the most important information in a news article."), grading_prompt=( """News Summary Quality: If the 1-sentence news summary captures the most important information from the news article give a high rating. If the summary does not capture the most important information from the news article give a low rating. - Score 0: This isn't a 1-sentence summary, there is extra text generated by the LLM. - Score 1: The summary does not well capture the most important information from the news article. - Score 2: The 1-sentence summary does a great job capturing the most important information from the news article.""" ), model="endpoints:/nemo_your_name", parameters={"temperature": 0.0}, aggregations=("mean", "variance"), greater_is_better=True ) print(summary_quality)
- Ejecute MLflow Evaluate utilizando la métrica personalizada definida anteriormente.
news_summaries = spark.table("users.your_name.news_blurb_summaries").toPandas() with mlflow.start_run() as run: results = mlflow.evaluate( None, # We don't need to specify a model as our data is already ready. data = news_summaries.rename(columns={"news_blurb": "inputs"}), # Pass in our input data, specify the 'inputs' column (the news articles) predictions="sentence_summary", # The name of the column in the data that contains the prediction summaries extra_metrics=(summary_quality) # our custom summary quality metric )
- ¡Observe los resultados de la evaluación!
# Observe overall metrics and evaluation results print(results.metrics) display(results.tables("eval_results_table")) # Filter rows to quality scores 2.0 and above (good quality summary) and below 2.0 (needs review) eval_results = results.tables("eval_results_table") needs_manual_review = eval_results(eval_results("news_summary_quality/v1/score") < 2.0) summaries_ready = eval_results(eval_results("news_summary_quality/v1/score") >= 2.0)
Los resultados de mlflow.evaluate()
se registran automáticamente en una ejecución de experiencia y se pueden escribir en una tabla en Unity Catalog para consultarlas fácilmente más delante.
Conclusión
En esta publicación de blog, mostramos un caso de uso hipotético de una estructura de parte que crea una aplicación de IA generativa mediante la configuración de un nuevo y popular LLM basado en Fogosidad en rendimiento aprovisionado, generando resúmenes a través de inferencia por lotes con ai_query
y evaluar los resultados con una métrica personalizada utilizando mlflow.evaluar. Estas funcionalidades permiten sistemas de IA generativa de nivel de producción que equilibran el control sobre los modelos que se utilizan, la confiabilidad de la producción del alojamiento de modelos dedicado y menores costos al nominar el maniquí de mejor tamaño para una tarea determinada y fertilizar solo por la computación que se utiliza. Toda esta funcionalidad está acondicionado directamente internamente de sus flujos de trabajo normales de Python o SQL en su entorno de Databricks, con control de datos y modelos en Unity Catalog.