Implemente Falcon-40B con DLC de inferencia de modelos grandes en Amazon SageMaker | Servicios web de Amazon

Implemente Falcon-40B con DLC de inferencia de modelos grandes en Amazon SageMaker | Servicios web de Amazon

La semana pasada, Instituto de Innovación Tecnológica (TII) lanzado TII Halcón LLM, un modelo de lenguaje grande (LLM) fundamental de código abierto. Entrenado con 1 billón de tokens con Amazon SageMaker, Falcon cuenta con un rendimiento de primer nivel (número 1 en el Tabla de clasificación de cara abrazada al momento de escribir este artículo) a la vez que es comparativamente liviano y menos costoso de alojar que otros LLM como llama-65B. En esta publicación, demostramos cómo implementar Falcon para aplicaciones como comprensión de idiomas y asistencia de escritura automatizada utilizando grandes contenedores de aprendizaje profundo de inferencia de modelos en SageMaker.

El Halcón ha aterrizado en SageMaker

TII es la organización de investigación aplicada dentro de Abu Dhabi Consejo de Investigación de Tecnología Avanzada; Su equipo de científicos, investigadores e ingenieros se dedica al descubrimiento de tecnologías transformadoras y al desarrollo de avances científicos que prepararán nuestra sociedad para el futuro. A principios de este año, TII se propuso capacitar un LLM de código abierto de última generación y utilizó la infraestructura, las herramientas y la experiencia de SageMaker para realizar el trabajo (para obtener más información sobre cómo se entrenó este modelo en SageMaker , Referirse a El Instituto de Innovación Tecnológica entrena el modelo de base Falcon LLM 40B de última generación en Amazon SageMaker). El resultado de este esfuerzo es TII Halcón LLM.

Entrenado con 1 billón de tokens, Falcon cuenta con un rendimiento de primer nivel frente al Arnés de evaluación del modelo de lenguaje de IA de Eleuther y actualmente es el número 1 en el Tabla de clasificación de cara abrazada Para precisión. El modelo está disponible en dos tamaños diferentes (Falcon-40B y Falcon-7B) y se puede utilizar para obtener un rendimiento de última generación en aplicaciones como comprensión del lenguaje, experiencias conversacionales y asistencia de escritura automatizada. Esta publicación lo ayudará a comenzar a implementar Falcon en SageMaker para realizar inferencias de alta precisión en este tipo de dominios.

Los DLC de inferencia de modelos grandes de SageMaker simplifican el alojamiento de LLM

Hospedar LLM como Falcon-40B y Falcon-7B puede ser un desafío. Los modelos más grandes suelen ser más precisos porque incluyen miles de millones de parámetros, pero su tamaño también puede dar como resultado una latencia de inferencia más lenta o un peor rendimiento. Alojar un LLM puede requerir más memoria GPU y núcleos optimizados para lograr un rendimiento aceptable. Para complicar aún más las cosas, aunque los modelos más pequeños como el Falcon-7B generalmente pueden caber en una sola GPU, como una instancia NVIDIA A10G que alimenta los tipos de instancias AWS G5, los modelos más grandes como el Falcon-40B no pueden. Cuando esto sucede, se deben utilizar estrategias como el paralelismo tensorial para fragmentar ese modelo más grande en varias partes y aprovechar la memoria de varias GPU. Las soluciones de alojamiento heredadas utilizadas para modelos más pequeños normalmente no ofrecen este tipo de funcionalidad, lo que aumenta la dificultad.

Los contenedores de aprendizaje profundo (DLC) de inferencia de modelos grandes (LMI) de SageMaker pueden ayudar. Los DLC de LMI son una solución completa de extremo a extremo para alojar LLM como Falcon-40B. En la parte frontal, incluyen un servidor de modelos de alto rendimiento (DJL Serving) diseñado para la inferencia de modelos grandes con características como transmisión de tokens y replicación automática de modelos dentro de una instancia para aumentar el rendimiento. En el backend, los DLC de LMI también incluyen varios motores paralelos de modelos de alto rendimiento, como DeepSpeed ​​y FasterTransformer, que pueden fragmentar y administrar parámetros de modelos en múltiples GPU. Estos motores también incluyen núcleos optimizados para modelos de transformadores populares, que pueden acelerar la inferencia hasta tres veces más rápido. Con los DLC de LMI, simplemente necesita crear un archivo de configuración para comenzar con el alojamiento LLM en SageMaker. Para obtener más información sobre los DLC de SageMaker LMI, consulte Paralelismo de modelos e inferencia de modelos grandes y nuestro lista de imágenes disponibles. También puede consultar nuestra publicación anterior sobre hosting Bloom-175B en SageMaker utilizando LMI DLC.

Resumen de la solución

Esta publicación le explica cómo alojar Falcon-40B usando DeepSpeed ​​en SageMaker usando DLC LMI. Falcon-40B requiere que utilicemos varias GPU A10, mientras que Falcon-7B solo requiere una única GPU. También hemos preparado ejemplos a los que puede hacer referencia para alojar Falcon-40B y Falcon-7B utilizando DeepSpeed ​​y Accelerate. Puede encontrar nuestros ejemplos de código en GitHub.

Este ejemplo se puede ejecutar en instancias de notebook de SageMaker o Estudio Amazon SageMaker cuadernos. Para alojar Falcon-40B usando LMI y DeepSpeed, necesitamos usar una instancia ml.g5.24xlarge. Estas instancias proporcionan 4 GPU NVIDIA A10G, cada una de las cuales admite 96 GiB de memoria de GPU. Además, el host proporciona 96 vCPU y 384 GiB de memoria del host. El contenedor LMI ayudará a abordar gran parte del trabajo pesado indiferenciado asociado con el alojamiento de LLM, incluida la descarga del modelo y la partición del artefacto del modelo para que los parámetros que lo componen se puedan distribuir en múltiples GPU.

Las cuotas para las instancias de aprendizaje automático (ML) de SageMaker pueden variar entre cuentas. Si recibe un error que indica que ha excedido su cuota para instancias g5.24xlarge mientras sigue esta publicación, puede aumentar el límite a través de Consola de cuotas de servicio.

Tutorial del cuaderno

Para empezar, comenzamos instalando e importando las dependencias necesarias para nuestro ejemplo. Usamos el SDK de Boto3 y el SDK de SageMaker. Tenga en cuenta que utilizamos Servicio de almacenamiento simple de Amazon (Amazon S3) para almacenar los artefactos del modelo que necesitamos para que los utilicen SageMaker y LMI, por lo que configuramos una variable de prefijo S3 en consecuencia. Vea el siguiente código:

import sagemaker
import jinja2
from sagemaker import image_uris
import boto3
import os
import time
import json
from pathlib import Path
from sagemaker.utils import name_from_base role = sagemaker.get_execution_role() # execution role for the endpoint
sess = sagemaker.session.Session() # sagemaker session for interacting with different AWS APIs
bucket = sess.default_bucket() # bucket to house artifacts
model_bucket = sess.default_bucket() # bucket to house artifacts
s3_code_prefix_deepspeed = "hf-large-model-djl-/code_falcon40b/deepspeed" # folder within bucket where code artifact will go
region = sess._region_name
account_id = sess.account_id()
s3_client = boto3.client("s3")
sm_client = boto3.client("sagemaker")
smr_client = boto3.client("sagemaker-runtime")
jinja_env = jinja2.Environment()

Luego creamos una carpeta local para que nuestro espacio de trabajo almacene los artefactos de nuestro modelo:

!mkdir -p code_falcon40b_deepspeed

Primero creamos un serving.properties archivo de configuración en el directorio local que creamos. Este serving.properties El archivo indica al contenedor LMI y a la biblioteca de servicio DJL de front-end qué motor de optimización de inferencia y paralelización de modelos queremos usar. Puede encontrar las opciones de configuración para DeepSpeed ​​y Hugging Face Accelerate en Configuraciones y ajustes. Aquí, tenga en cuenta que configuramos el option.model_id parámetro para definir de qué modelo Hugging Face extraer. SageMaker simplifica el trabajo con los modelos Hugging Face, y esta línea es todo lo que necesita. Además, establecemos option.tensor_parallel_degree a un valor de 4 porque tenemos cuatro GPU en nuestra instancia ml.g5.24xlarge. Este parámetro define cuántas particiones del modelo crear y distribuir. Tenga en cuenta que si hubiéramos usado una instancia más grande con ocho GPU, como ml.g5.48xlarge, y todavía estableciésemos un valor de 4, entonces LMI crearía automáticamente dos réplicas del modelo (dos réplicas distribuidas en cuatro GPU cada una). Vea el siguiente código:

%%writefile ./code_falcon40b_deepspeed/serving.properties
engine=Python
#to deploy falcon-40b-instruct set the model_id value to 'tiiuae/falcon-40b-instruct'
option.model_id=tiiuae/falcon-40b
option.tensor_parallel_degree=4
#option.s3url = {{s3url}}

También puedes intercambiar tiiuae/falcon-40b tiiuae/falcon-40b-instruct si se adapta mejor a tus necesidades.

También incluimos un requirements.txt archivo que puede especificar para instalar los paquetes que necesita:

%%writefile ./code_falcon40b_deepspeed/requirements.txt
einops
torch==2.0.1

Lo último que necesitamos es el model.py archivo que se utilizará con su modelo:

%%writefile ./code_falcon40b_deepspeed/model.py
from djl_python import Input, Output
import os
import torch
from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
from typing import Any, Dict, Tuple
import warnings predictor = None def get_model(properties): model_name = properties["model_id"] local_rank = int(os.getenv("LOCAL_RANK", "0")) model = AutoModelForCausalLM.from_pretrained( model_name, low_cpu_mem_usage=True, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map="auto", ) tokenizer = AutoTokenizer.from_pretrained(model_name) generator = pipeline( task="text-generation", model=model, tokenizer=tokenizer, device_map="auto" ) return generator def handle(inputs: Input) -> None: global predictor if not predictor: predictor = get_model(inputs.get_properties()) if inputs.is_empty(): # Model server makes an empty call to warmup the model on startup return None data = inputs.get_as_json() text = data["text"] text_length = data["text_length"] outputs = predictor(text, do_sample=True, min_length=text_length, max_length=text_length) result = {"outputs": outputs} return Output().add_as_json(result)

¡Eso es todo! ¡En este punto, hemos creado todos los artefactos que necesitará para implementar Falcon-40B con DeepSpeed! Empaquetamos el directorio en un archivo *.tar.gz y lo subimos a Amazon S3. Tenga en cuenta que el modelo real no se ha descargado ni empaquetado en este archivo. El contenedor LMI descargará el modelo directamente desde Hugging Face. También tiene la opción de apuntar a un depósito S3 si desea tener su propia copia del modelo en una ubicación que tenga más rendimiento para descargar. LMI también incluye optimización para descargas desde Amazon S3 con alto rendimiento. Vea el siguiente código:

s3_code_artifact_deepspeed= sess.upload_data("model.tar.gz", bucket, s3_code_prefix_deepspeed)
print(f"S3 Code or Model tar for deepspeed uploaded to --- > {s3_code_artifact_deepspeed}")

Todo lo que queda por hacer en este punto es definir el contenedor que queremos usar y crear un objeto modelo:

inference_image_uri = ( f"763104351884.dkr.ecr.{region}.amazonaws.com/djl-inference:0.22.1-deepspeed0.8.3-cu118"
)
model_name_acc = name_from_base(f"falcon40b-model-ds")
create_model_response = sm_client.create_model( ModelName=model_name_acc, ExecutionRoleArn=role, PrimaryContainer={"Image": inference_image_uri, "ModelDataUrl": s3_code_artifact_deepspeed},
)
model_arn = create_model_response["ModelArn"]

Luego creamos una configuración de punto final y creamos el punto final:


endpoint_config_name = f"{model_name}-config"
endpoint_name = f"{model_name}-endpoint"
endpoint_config_response = sm_client.create_endpoint_config( EndpointConfigName=endpoint_config_name, ProductionVariants=[ { "VariantName": "variant1", "ModelName": model_name, "InstanceType": "ml.g5.24xlarge", "InitialInstanceCount": 1, "ModelDataDownloadTimeoutInSeconds": 3600, "ContainerStartupHealthCheckTimeoutInSeconds": 3600, # "VolumeSizeInGB": 512 }, ],
)
endpoint_config_response create_endpoint_response = sm_client.create_endpoint( EndpointName=f"{endpoint_name}", EndpointConfigName=endpoint_config_name
)
print(f"Created Endpoint: {create_endpoint_response['EndpointArn']}")

Elementos de configuración a tener en cuenta para un alojamiento exitoso

Una consideración importante para el alojamiento de modelos grandes es garantizar que haya tiempo suficiente para descargar el modelo desde Hugging Face. En nuestras pruebas, el Falcon-40B tardó unos 90 minutos en descargarse en la instancia. Un conjunto clave de configuraciones para permitir esto es ContainerStartupHealthCheckTimeoutInSeconds y ModelDataDownloadTimeoutInSeconds. Asegúrese de que la configuración del punto final de SageMaker tenga un valor de 3600 para cada uno de estos. Además, es mucho más fácil descargar desde Amazon S3 en lugar del modelo zoológico original usando los contenedores LMI que están especialmente diseñados para LLMS que usan la utilidad S5cmd, lo que reduce el tiempo de descarga del modelo a alrededor de 10 minutos.

Puede monitorear el estado del punto final llamando DescribeEndpoint, que te indicará cuando todo esté completo. ¡Su punto final ahora está listo para responder a solicitudes de inferencia! Debido a que LMI maneja la partición y orquestación del modelo por usted, cada solicitud se procesará utilizando las 4 GPU disponibles en nuestra instancia ml.g5.12xlarge. Esto nos permite alojar LLM y aumentar el rendimiento si escalamos los aceleradores de GPU horizontalmente. Vea el siguiente código:

response_model = smr_client.invoke_endpoint( EndpointName=endpoint_name, Body=json.dumps({"text": "What is the purpose of life?", "text_length": 150}), ContentType="application/json",
) response_model["Body"].read().decode("utf8")

Si ha terminado y desea eliminar la configuración del punto final, el punto final y el objeto del modelo, puede ejecutar los siguientes comandos:

sm_client.delete_endpoint(EndpointName=endpoint_name)
sm_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)
sm_client.delete_model(ModelName=model_name)

Este código que mencionamos en esta publicación se puede encontrar en el completo cuaderno en GitHub.

Conclusión

SageMaker Hosting y LMI DLC le facilitan el alojamiento de LLM como Falcon-40B. Asume el trabajo pesado indiferenciado de orquestar lo que se requiere para alojar modelos en múltiples GPU y proporciona opciones configurables para satisfacer sus necesidades. Además, el uso de modelos Hugging Face se vuelve muy sencillo, con soporte integrado para estos modelos.

En esta publicación, mostramos cómo puede usar SageMaker para alojar el modelo Falcon-40B usando DeepSpeed. Además, proporcionamos ejemplos en GitHub para albergar Falcon-40B usando Accelerate y los modelos más pequeños Falcon-7B. Le recomendamos que pruebe esto en SageMaker con LMI y que pruebe el LLM disponible públicamente con mejor rendimiento hasta la fecha.


Sobre los autores

Implemente Falcon-40B con DLC de inferencia de modelos grandes en Amazon SageMaker | Amazon Web Services PlatoBlockchain Inteligencia de datos. Búsqueda vertical. Ai.James Park es arquitecto de soluciones en Amazon Web Services. Trabaja con Amazon.com para diseñar, crear e implementar soluciones tecnológicas en AWS y tiene un interés particular en la IA y el aprendizaje automático. En su tiempo libre le gusta buscar nuevas culturas, nuevas experiencias y mantenerse al día con las últimas tendencias tecnológicas. Puede encontrarlo en Etiqueta LinkedIn.

Implemente Falcon-40B con DLC de inferencia de modelos grandes en Amazon SageMaker | Amazon Web Services PlatoBlockchain Inteligencia de datos. Búsqueda vertical. Ai.Abhi Shivaditya es arquitecto sénior de soluciones en AWS y trabaja con organizaciones empresariales globales estratégicas para facilitar la adopción de los servicios de AWS en áreas como la inteligencia artificial, la computación distribuida, las redes y el almacenamiento. Su experiencia radica en el Aprendizaje Profundo en los dominios de Procesamiento del Lenguaje Natural (PNL) y Visión por Computador. Abhi ayuda a los clientes a implementar modelos de aprendizaje automático de alto rendimiento de manera eficiente dentro del ecosistema de AWS.

Implemente Falcon-40B con DLC de inferencia de modelos grandes en Amazon SageMaker | Amazon Web Services PlatoBlockchain Inteligencia de datos. Búsqueda vertical. Ai.Roberto Van Dusen es gerente sénior de productos en Amazon SageMaker. Lidera la optimización de modelos de aprendizaje profundo para aplicaciones como la inferencia de modelos grandes.

Implemente Falcon-40B con DLC de inferencia de modelos grandes en Amazon SageMaker | Amazon Web Services PlatoBlockchain Inteligencia de datos. Búsqueda vertical. Ai.Evandro Franco es un arquitecto de soluciones especializado en inteligencia artificial y aprendizaje automático que trabaja en Amazon Web Services. Ayuda a los clientes de AWS a superar los desafíos comerciales relacionados con AI/ML sobre AWS. Tiene más de 15 años trabajando con tecnología, desde desarrollo de software, infraestructura, serverless, hasta aprendizaje automático.

Implemente Falcon-40B con DLC de inferencia de modelos grandes en Amazon SageMaker | Amazon Web Services PlatoBlockchain Inteligencia de datos. Búsqueda vertical. Ai.qing-lan es ingeniero de desarrollo de software en AWS. Ha estado trabajando en varios productos desafiantes en Amazon, incluidas soluciones de inferencia ML de alto rendimiento y un sistema de registro de alto rendimiento. El equipo de Qing lanzó con éxito el primer modelo de mil millones de parámetros en Amazon Advertising con una latencia muy baja requerida. Qing tiene un conocimiento profundo sobre la optimización de la infraestructura y la aceleración del aprendizaje profundo.

Implemente Falcon-40B con DLC de inferencia de modelos grandes en Amazon SageMaker | Amazon Web Services PlatoBlockchain Inteligencia de datos. Búsqueda vertical. Ai.franco liu es un ingeniero de software para AWS Deep Learning. Se centra en la creación de herramientas innovadoras de aprendizaje profundo para ingenieros de software y científicos. En su tiempo libre, le gusta ir de excursión con amigos y familiares.

Sello de tiempo:

Mas de Aprendizaje automático de AWS