Usa el ajuste y la evaluación para mejorar el rendimiento de los LLM
En este documento, se muestra cómo crear un modelo remoto de BigQuery ML que hace referencia al modelo de base text-bison
de Vertex AI.
Luego, debes usar ajuste supervisado para ajustar el modelo con nuevos datos de entrenamiento, seguido de la evaluación del modelo con la función ML.EVALUATE
.
Esto puede ayudarte a abordar situaciones en las que necesitas personalizar el modelo alojado de Vertex AI, como cuando el comportamiento esperado del modelo es difícil de definir de forma concisa en un mensaje o cuando los mensajes no producen lo esperado resultados suficientes. El ajuste supervisado también influye en el modelo de las siguientes maneras:
- Guía al modelo para que devuelva estilos de respuesta específicos, por ejemplo, ser más conciso o más detallado.
- Enseña al modelo nuevos comportamientos, por ejemplo, responde a las instrucciones como un arquetipo específico.
- Hace que el modelo se actualice con información nueva.
Permisos necesarios
Para crear una conexión, necesitas el siguiente rol de Identity and Access Management (IAM):
roles/bigquery.connectionAdmin
Para otorgar permisos a la cuenta de servicio de la conexión, necesitas el siguiente permiso:
resourcemanager.projects.setIamPolicy
Para crear el modelo con BigQuery ML, necesitas los siguientes permisos de IAM:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.models.updateMetadata
Para ejecutar inferencias, necesitas los siguientes permisos:
bigquery.tables.getData
en la tablabigquery.models.getData
en el modelobigquery.jobs.create
Antes de comenzar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, Vertex AI, and Compute Engine APIs.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
- BigQuery: You incur costs for the queries that you run in BigQuery.
- BigQuery ML: You incur costs for the model that you create and the processing that you perform in BigQuery ML.
- Vertex AI: You incur costs for calls to and
supervised tuning of the
text-bison
model.
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Para obtener más información, consulta los siguientes recursos:
Crea un conjunto de datos
Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA:
En la consola de Google Cloud, ve a la página de BigQuery.
En el panel Explorador, haz clic en el nombre de tu proyecto.
Haz clic en
Ver acciones > Crear conjunto de datos.En la página Crear conjunto de datos, haz lo siguiente:
En ID del conjunto de datos, ingresa
bqml_tutorial
.En Tipo de ubicación, selecciona Multirregión y, luego, EE.UU. (varias regiones en Estados Unidos).
Los conjuntos de datos públicos se almacenan en la multirregión
US
. Para que sea más simple, almacena tu conjunto de datos en la misma ubicación.Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.
Crear una conexión
Crea una conexión de recurso de Cloud y obtén el ID de la cuenta de servicio de la conexión. Crea la conexión en la misma ubicación que el conjunto de datos que creaste en el paso anterior.
Selecciona una de las siguientes opciones:
Console
Ve a la página de BigQuery.
Para crear una conexión, haz clic en
Agregar y, luego, en Conexiones a fuentes de datos externas.En la lista Tipo de conexión, selecciona Modelos remotos de Vertex AI, funciones remotas y BigLake (Cloud Resource).
En el campo ID de conexión, escribe un nombre para tu conexión.
Haga clic en Crear conexión.
Haz clic en Ir a la conexión.
En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.
bq
En un entorno de línea de comandos, crea una conexión:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
El parámetro
--project_id
anula el proyecto predeterminado.Reemplaza lo siguiente:
REGION
: tu región de conexiónPROJECT_ID
: El ID del proyecto de Google Cloud.CONNECTION_ID
: Es un ID para tu conexión.
Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia con la conexión.
Solución de problemas: Si recibes el siguiente error de conexión, actualiza el SDK de Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupera y copia el ID de cuenta de servicio para usarlo en un paso posterior:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
El resultado es similar al siguiente:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
Agrega la siguiente sección a tu archivo main.tf
.
## This creates a cloud resource connection. ## Note: The cloud resource nested object has only one output only field - serviceAccountId. resource "google_bigquery_connection" "connection" { connection_id = "CONNECTION_ID" project = "PROJECT_ID" location = "REGION" cloud_resource {} }Reemplaza lo siguiente:
CONNECTION_ID
: Es un ID para tu conexión.PROJECT_ID
: El ID del proyecto de Google Cloud.REGION
: tu región de conexión
Otorga acceso a la cuenta de servicio
Otorga a tu cuenta de servicio el rol de agente de servicio de Vertex AI para que la cuenta de servicio pueda acceder a Vertex AI. Si no se otorga este rol, se produce un error. Selecciona una de las siguientes opciones:
Console
Ir a la página IAM y administración
Haz clic en
Otorgar acceso.Se abre el cuadro de diálogo Agregar principales.
En el campo Principales nuevas, escribe el ID de la cuenta de servicio que copiaste antes.
Haga clic en Selecciona un rol.
En Filtro, escribe
Vertex AI Service Agent
y, luego, selecciona ese rol.Haz clic en Guardar.
gcloud
Usa el comando gcloud projects add-iam-policy-binding
:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.serviceAgent' --condition=None
Reemplaza lo siguiente:
PROJECT_NUMBER
: Es el número de tu proyecto.MEMBER
: el ID de la cuenta de servicio que copiaste antes
La cuenta de servicio asociada con tu conexión es una instancia del agente de servicio de delegación de conexión de BigQuery, por lo que está bien asignarle un rol de agente de servicio.
Otorga acceso a la cuenta de servicio predeterminada de Compute Engine
Cuando habilitas la API de Compute Engine, a la Cuenta de servicio predeterminada de Compute Engine se le otorga de forma automática el rol de editor en el proyecto, a menos que tengas inhabilitado este comportamiento para tu proyecto. Si ese es el caso, debes volver a otorgar el rol de editor al acceso a la cuenta de servicio predeterminada de Compute Engine para que tenga permisos suficientes para crear y ajustar un modelo remoto.
Console
Ir a la página IAM y administración
Haz clic en
Otorgar acceso.En Principales nuevas, ingresa el ID de la cuenta de servicio, que es
PROJECT_NUMBER-compute@developer.gserviceaccount.com
.Haga clic en Selecciona un rol.
En Selecciona un rol, elige Básico y, luego, selecciona Editor.
Haz clic en Guardar.
gcloud
Usa el comando gcloud projects add-iam-policy-binding
:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/editor' --condition=None
Reemplaza lo siguiente:
PROJECT_NUMBER
: Es el número de tu proyecto.MEMBER
: el ID de la cuenta de servicio, que esPROJECT_NUMBER-compute@developer.gserviceaccount.com
.
Crea el agente de servicio de ajuste
Para crear una instancia del agente de servicio de ajuste de AI Platform, haz lo siguiente:
Usa el comando
gcloud beta services identity create
para crear el agente de servicio de ajuste:gcloud beta services identity create --service=aiplatform.googleapis.com --project=PROJECT_NUMBER
Reemplaza
PROJECT_NUMBER
por el número del proyecto.Usa el comando
gcloud projects add-iam-policy-binding
para otorgar al agente de servicio de ajuste el rol de agente de servicio de Vertex AI (roles/aiplatform.serviceAgent
):gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:service-PROJECT_NUMBER@gcp-sa-aiplatform-ft.iam.gserviceaccount.com' --role='roles/aiplatform.serviceAgent'
Reemplaza
PROJECT_NUMBER
por el número del proyecto.
Crea tablas de prueba
Crea tablas de datos de entrenamiento y evaluación basadas en el conjunto de datos
públicos de MTSamples de los informes médicos transcritos.
Este conjunto de datos tiene unainput_text
columna que contiene la transcripción médica y unaoutput_text
columna que contiene la etiqueta que describe mejor la categoría de la transcripción, por ejemplo Allergy/Immunology
, Dentistry
o Cardiovascular/Pulmonary
. Además, crea una tabla que contenga los datos
de la instrucción para la clasificación de transcripciones médicas.
Importarás los datos de transcripción médica desde un bucket de Cloud Storage público.
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración para crear una tabla de datos de evaluación:
LOAD DATA INTO `bqml_tutorial.medical_transcript_eval` FROM FILES(format='NEWLINE_DELIMITED_JSON', uris = ['gs://cloud-samples-data/vertex-ai/model-evaluation/peft_eval_sample.jsonl']);
En el editor de consultas, ejecuta la siguiente declaración para crear una tabla de datos de entrenamiento:
LOAD DATA INTO `bqml_tutorial.medical_transcript_train` FROM FILES(format='NEWLINE_DELIMITED_JSON', uris = ['gs://cloud-samples-data/vertex-ai/model-evaluation/peft_train_sample.jsonl']);
En el editor de consultas, ejecuta la siguiente declaración para crear una tabla de instrucciones:
CREATE OR REPLACE TABLE `bqml_tutorial.transcript_classification` AS (SELECT 'Please assign a label for the given medical transcript from among these labels [Allergy / Immunology, Autopsy, Bariatrics, Cardiovascular / Pulmonary, Chiropractic, Consult - History and Phy., Cosmetic / Plastic Surgery, Dentistry, Dermatology, Diets and Nutritions, Discharge Summary, ENT - Otolaryngology, Emergency Room Reports, Endocrinology, Gastroenterology, General Medicine, Hematology - Oncology, Hospice - Palliative Care, IME-QME-Work Comp etc., Lab Medicine - Pathology, Letters, Nephrology, Neurology, Neurosurgery, Obstetrics / Gynecology, Office Notes, Ophthalmology, Orthopedic, Pain Management, Pediatrics - Neonatal, Physical Medicine - Rehab, Podiatry, Psychiatry / Psychology, Radiology, Rheumatology, SOAP / Chart / Progress Notes, Sleep Medicine, Speech - Language, Surgery, Urology].' AS prompt);
Crea un modelo de referencia
Crear un
modelo remoto
sobre el modelo text-bison
de Vertex AI que puedes usar para clasificar
transcripciones médicas.
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración para crear un modelo remoto:
CREATE OR REPLACE MODEL `bqml_tutorial.text_bison_001` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT ='text-bison@001');
Reemplaza lo siguiente:
LOCATION
: la ubicación de la conexión.CONNECTION_ID
: el ID de la conexión de BigQuery.Cuando veas los detalles de conexión en la consola de Google Cloud, el
CONNECTION_ID
es el valor en la última sección del ID de conexión completamente calificado que se muestra en ID de conexión, por ejemploprojects/myproject/locations/connection_location/connections/myconnection
La consulta tarda varios segundos en completarse, después de eso, el modelo
text_bison_001
aparece en el conjunto de datosbqml_tutorial
en el panel Explorador. Debido a que la consulta usa una declaraciónCREATE MODEL
para crear un modelo, no hay resultados de consultas.
Verifica el rendimiento del modelo de referencia
Ejecuta la
función ML.GENERATE_TEXT
con el modelo remoto para ver cómo se desempeña en los datos de evaluación sin ningún
ajuste.
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
SELECT * FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.text_bison_001`, ( SELECT CONCAT( (SELECT prompt from `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT(TRUE AS flatten_json_output)) ORDER BY ml_generate_text_llm_result;
Si examinas los datos de salida y comparas los valores
ml_generate_text_llm_result
ylabel
, verás que, si bien el modelo de referencia predice muchas clasificaciones de transcripciones correctamente, clasifica algunas transcripciones de manera incorrecta. El siguiente es un ejemplo representativo de un resultado incorrecto. En este ejemplo, la clasificación correcta esCardiovascular / Pulmonary
, noRadiology
.+-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | ml_generate_text_llm_result | ml_generate_text_rai_result | ml_generate_text_status | prompt | label | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | Radiology | {"blocked":false,"categories": | | Please assign a label for the given medical | Cardiovascular / Pulmonary | | | ["Derogatory","Health", | | transcript from among these labels [Allergy / | | | | "Insult","Public Safety",... | | Immunology, Autopsy, Bariatrics, | | | | | | Cardiovascular / Pulmonary, Chiropractic, | | | | | | Consult - History and Phy., Cosmetic / | | | | | | Plastic Surgery, Dentistry, Dermatology, | | | | | | Diets and Nutritions, Discharge Summary, ENT | | | | | | - Otolaryngology, Emergency Room Reports, | | | | | | Endocrinology, Gastroenterology, General | | | | | | Medicine, Hematology - Oncology, Hospice - | | | | | | Palliative Care, IME-QME-Work Comp etc., | | | | | | Lab Medicine - Pathology, Letters, | | | | | | Nephrology, Neurology, Neurosurgery, | | | | | | Obstetrics / Gynecology, Office Notes, | | | | | | Ophthalmology, Orthopedic, Pain Management, | | | | | | Pediatrics - Neonatal, Physical Medicine - | | | | | | Rehab, Podiatry, Psychiatry / Psychology, | | | | | | Radiology, Rheumatology, SOAP / Chart / | | | | | | Progress Notes, Sleep Medicine, Speech - | | | | | | Language, Surgery, Urology]. | | | | | | TRANSCRIPT: | | | | | | INDICATIONS FOR PROCEDURE:, The patient has | | | | | | presented with atypical type right arm | | | | | | discomfort and neck discomfort. She had | | | | | | noninvasive vascular imaging demonstrating | | | | | | suspected right subclavian stenosis. Of note, | | | | | | there was bidirectional flow in the right | | | | | | vertebral artery, as well as 250 cm... | | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+
Evalúa el modelo de referencia
Para realizar una evaluación más detallada del rendimiento del modelo, usa la
función ML.EVALUATE
.
Esta función calcula las métricas del modelo, como
la precisión,
la recuperación y la
puntuación F1 para ver cómo se
comparan las respuestas del modelo con las respuestas ideales.
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.text_bison_001`, ( SELECT CONCAT( (SELECT prompt FROM `bqml_tutorial.transcript_classification`), ' ', input_text) AS input_text, output_text FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT('classification' AS task_type)) ORDER BY label;
El resultado es similar al siguiente:
+------------------------------+----------------------------------+-------------------------------------------------------------------------+ | precision | recall | f1_score | label | evaluation_status | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+ | 1.0 | 0.66666666666666663 | 0.8 | Allergy / Immunology | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+ --------------------+----------------------------+--------------------------------------------+ | 1.0 | 1.0 | 1.0 | Autopsy | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+--------------- -----+----------------------------+--------------------------------------------+ | 1.0 | 0.66666666666666663 | 0.8 | Bariatrics | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+
Si observas los resultados en la columna f1_score
, podrás ver que el rendimiento
del modelo varía entre las clases de transcripciones. Los valores de puntuación F1 más altos
indican un mejor rendimiento. El modelo de referencia funciona bien para la mayoría de las clases,
pero tiene un rendimiento deficiente en otras, por ejemplo, las clases Cardiovascular / Pulmonary
y
Chiropractic
. En función de esto, puedes observar que vale la pena realizar
un ajuste supervisado para ver si puedes mejorar el rendimiento del modelo para este caso de uso.
Crea un modelo ajustado
Crea un modelo remoto muy similar al que creaste en
Crear un modelo, pero esta vez especificando la
cláusula AS SELECT
para proporcionar los datos de entrenamiento para ajustar el modelo.
Esta consulta puede tomar un par de horas en completarse.
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración para crear un modelo remoto:
CREATE OR REPLACE MODEL `bqml_tutorial.text_bison_001_medical_transcript_tuned` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS ( endpoint = 'text-bison@001', max_iterations = 300, data_split_method = 'no_split') AS SELECT CONCAT( (SELECT prompt FROM `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_train`;
Reemplaza lo siguiente:
LOCATION
: la ubicación de la conexión.CONNECTION_ID
: el ID de la conexión de BigQuery.Cuando veas los detalles de conexión en la consola de Google Cloud, el
CONNECTION_ID
es el valor en la última sección del ID de conexión completamente calificado que se muestra en ID de conexión, por ejemploprojects/myproject/locations/connection_location/connections/myconnection
La consulta puede tardar varias horas en completarse. después de eso, el modelo
text_bison_001_medical_transcript_tuned
aparecerá en el conjunto de datosbqml_tutorial
en el panel Explorador. Debido a que la consulta usa una declaraciónCREATE MODEL
para crear un modelo, no hay resultados de consultas.
Verifica el rendimiento del modelo ajustado
Ejecuta la función ML.GENERATE_TEXT
para ver el rendimiento del modelo ajustado en los
datos de evaluación.
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
SELECT * FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.text_bison_001_medical_transcript_tuned`, ( SELECT CONCAT( (SELECT prompt from `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT(TRUE AS flatten_json_output)) ORDER BY ml_generate_text_llm_result;
Si examinas los datos de salida, verás que el modelo ajustado clasifica más transcripciones de forma correcta. El ejemplo que viste antes se clasifica de forma correcta como
Cardiovascular/ Pulmonary
.+-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | ml_generate_text_llm_result | ml_generate_text_rai_result | ml_generate_text_status | prompt | label | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | Cardiovascular/Pulmonary | {"blocked":false,"categories": | | Please assign a label for the given medical | Cardiovascular / Pulmonary | | | ["Derogatory","Health", | | transcript from among these labels [Allergy / | | | | "Insult","Public Safety",... | | Immunology, Autopsy, Bariatrics, | | | | | | Cardiovascular / Pulmonary, Chiropractic, | | | | | | Consult - History and Phy., Cosmetic / | | | | | | Plastic Surgery, Dentistry, Dermatology, | | | | | | Diets and Nutritions, Discharge Summary, ENT | | | | | | - Otolaryngology, Emergency Room Reports, | | | | | | Endocrinology, Gastroenterology, General | | | | | | Medicine, Hematology - Oncology, Hospice - | | | | | | Palliative Care, IME-QME-Work Comp etc., | | | | | | Lab Medicine - Pathology, Letters, | | | | | | Nephrology, Neurology, Neurosurgery, | | | | | | Obstetrics / Gynecology, Office Notes, | | | | | | Ophthalmology, Orthopedic, Pain Management, | | | | | | Pediatrics - Neonatal, Physical Medicine - | | | | | | Rehab, Podiatry, Psychiatry / Psychology, | | | | | | Radiology, Rheumatology, SOAP / Chart / | | | | | | Progress Notes, Sleep Medicine, Speech - | | | | | | Language, Surgery, Urology]. | | | | | | TRANSCRIPT: | | | | | | INDICATIONS FOR PROCEDURE:, The patient has | | | | | | presented with atypical type right arm | | | | | | discomfort and neck discomfort. She had | | | | | | noninvasive vascular imaging demonstrating | | | | | | suspected right subclavian stenosis. Of note, | | | | | | there was bidirectional flow in the right | | | | | | vertebral artery, as well as 250 cm... | | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+
Evalúa el modelo ajustado
Usa la función ML.EVALUATE
para ver cómo se comparan las respuestas del modelo ajustado
con las respuestas ideales.
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ejecuta la siguiente declaración:
SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.text_bison_001_medical_transcript_tuned`, ( SELECT CONCAT( (SELECT prompt from `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT('classification' AS task_type)) ORDER BY label;
El resultado es similar al siguiente:
+------------------------------+----------------------------------+-------------------------------------------------------------------------+ | precision | recall | f1_score | label | evaluation_status | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+ | 0.8571428571428571 | 0.66666666666666663 | 0.75 | Dermatology | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+ --------------------+----------------------------+--------------------------------------------+ | 0.54545454545454541 | 0.4 | 0.46153846153846156 | Discharge Summary | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+--------------- -----+----------------------------+--------------------------------------------+ | 1.0 | 1.0 | 1.0 | Diets and Nutritions | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+
Puedes ver que, aunque el conjunto de datos de entrenamiento usó solo 519 ejemplos, hay una mejora marcada en el rendimiento. Las puntuaciones F1 en las etiquetas en las que el modelo de referencia no funcionaba tan bien han mejorado, y el promedio de puntuaciones F1 en todas las etiquetas aumentó de 0.54 a 0.63.
Limpia
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.