Hugging Face文本生成推理服务已在AWS Inferentia2上推出
我们很高兴地宣布,Hugging Face文本生成推理(TGI)已在AWS Inferentia2和Amazon SageMaker上全面推出。
文本生成推理(TGI)是一个专门为大规模生产工作负载部署和提供大型语言模型(LLM)的解决方案。TGI利用张量并行和连续批处理,为最流行的开放LLM(包括Llama、Mistral等)实现高性能文本生成。Text Generation Inference已在Grammarly、Uber、Deutsche Telekom等公司投入生产使用。
TGI与Amazon SageMaker的集成,结合AWS Inferentia2,提供了一个强大的解决方案,是构建生产LLM应用程序的GPU的有效替代方案。这种无缝集成确保了模型的轻松部署和维护,使LLM在各种生产用例中更易于访问和扩展。
借助Amazon SageMaker上新的适用于AWS Inferentia2的TGI,AWS客户可以从与HuggingChat、OpenAssistant和Hugging Face Hub上LLM的无服务器端点相同技术中受益,这些技术支持高并发、低延迟的LLM体验。
在AWS Inferentia2上使用Amazon SageMaker部署Zephyr 7B
本教程展示了在AWS Inferentia2上使用Amazon SageMaker部署最先进的LLM(如Zephyr 7B)是多么容易。Zephyr是mistralai/Mistral-7B-v0.1的一个7B微调版本,它使用直接偏好优化(DPO)在公开可用和合成数据集的混合上进行训练,详细描述见技术报告。该模型根据Apache 2.0许可发布,确保了广泛的可访问性和使用。
我们将向您展示如何:
- 设置开发环境
- 获取TGI Neuronx镜像
- 将Zephyr 7B部署到Amazon SageMaker
- 运行推理并与模型聊天
让我们开始吧。
1. 设置开发环境
我们将使用sagemaker
python SDK将Zephyr部署到Amazon SageMaker。我们需要确保已配置AWS账户并安装了sagemaker
python SDK。
!pip install transformers "sagemaker>=2.206.0" --upgrade --quiet
如果您要在本地环境中使用SageMaker。您需要访问一个具有SageMaker所需权限的IAM角色。您可以在此处了解更多信息。
import sagemaker
import boto3
sess = sagemaker.Session()
# sagemaker session bucket -> used for uploading data, models and logs
# sagemaker will automatically create this bucket if it doesn't exist
sagemaker_session_bucket=None
if sagemaker_session_bucket is None and sess is not None:
# set to default bucket if a bucket name is not given
sagemaker_session_bucket = sess.default_bucket()
try:
role = sagemaker.get_execution_role()
except ValueError:
iam = boto3.client('iam')
role = iam.get_role(RoleName='sagemaker_execution_role')['Role']['Arn']
sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)
print(f"sagemaker role arn: {role}")
print(f"sagemaker session region: {sess.boto_region_name}")
2. 获取TGI Neuronx镜像
新的Hugging Face TGI Neuronx DLC可用于在AWS Inferentia2上运行推理。您可以使用sagemaker
SDK的get_huggingface_llm_image_uri
方法,根据您期望的backend
、session
、region
和version
检索相应的Hugging Face TGI Neuronx DLC URI。您可以在此处找到所有可用版本。
注意:在撰写此博客文章时,Hugging Face LLM DLC的最新版本尚无法通过get_huggingface_llm_image_uri
方法获得。我们将转而使用原始容器URI。
from sagemaker.huggingface import get_huggingface_llm_image_uri
# retrieve the llm image uri
llm_image = get_huggingface_llm_image_uri(
"huggingface-neuronx",
version="0.0.20"
)
# print ecr image uri
print(f"llm image uri: {llm_image}")
4. 将Zephyr 7B部署到Amazon SageMaker
Inferentia2上的文本生成推理(TGI)支持流行的开放LLM,包括Llama、Mistral等。您可以在此处查看支持的模型(文本生成)的完整列表。
编译用于Inferentia2的LLM
在撰写本文时,AWS Inferentia2 不支持推理的动态形状,这意味着我们需要提前指定序列长度和批次大小。为了方便客户充分利用 Inferentia2 的强大功能,我们创建了一个神经元模型缓存,其中包含最流行 LLM 的预编译配置。缓存配置通过模型架构(Mistral)、模型大小(7B)、神经元版本(2.16)、Inferentia 核心数(2)、批次大小(2)和序列长度(2048)来定义。
这意味着我们不需要自己编译模型,而是可以使用缓存中的预编译模型。例如,mistralai/Mistral-7B-v0.1和HuggingFaceH4/zephyr-7b-beta。您可以在Hugging Face Hub上找到已编译/缓存的配置。如果您的所需配置尚未缓存,您可以使用Optimum CLI自行编译,或在缓存仓库中提交请求。
对于本文,我们使用以下命令和参数在`inf2.8xlarge`实例上重新编译了`HuggingFaceH4/zephyr-7b-beta`,并将其推送到Hub,位于aws-neuron/zephyr-7b-seqlen-2048-bs-4-cores-2。
# compile model with optimum for batch size 4 and sequence length 2048
optimum-cli export neuron -m HuggingFaceH4/zephyr-7b-beta --batch_size 4 --sequence_length 2048 --num_cores 2 --auto_cast_type bf16 ./zephyr-7b-beta-neuron
# push model to hub [repo_id] [local_path] [path_in_repo]
huggingface-cli upload aws-neuron/zephyr-7b-seqlen-2048-bs-4 ./zephyr-7b-beta-neuron ./ --exclude "checkpoint/**"
# Move tokenizer to neuron model repository
python -c "from transformers import AutoTokenizer; AutoTokenizer.from_pretrained('HuggingFaceH4/zephyr-7b-beta').push_to_hub('aws-neuron/zephyr-7b-seqlen-2048-bs-4')"
如果您正在尝试编译尚未缓存配置的LLM,这可能需要长达45分钟。
部署TGI Neuronx 端点
在将模型部署到Amazon SageMaker之前,我们必须定义TGI Neuronx端点配置。我们需要确保定义以下附加参数:
HF_NUM_CORES
:用于编译的Neuron核心数量。HF_BATCH_SIZE
:用于编译模型的批处理大小。HF_SEQUENCE_LENGTH
:用于编译模型的序列长度。HF_AUTO_CAST_TYPE
:用于编译模型的自动转换类型。
我们仍然需要定义传统的TGI参数:
HF_MODEL_ID
:Hugging Face模型ID。HF_TOKEN
:用于访问受限模型的Hugging Face API令牌。MAX_BATCH_SIZE
:模型可以处理的最大批处理大小,等于用于编译的批处理大小。MAX_INPUT_LENGTH
:模型可以处理的最大输入长度。MAX_TOTAL_TOKENS
:模型可以生成的最大总token数,等于用于编译的序列长度。
import json
from sagemaker.huggingface import HuggingFaceModel
# sagemaker config & model config
instance_type = "ml.inf2.8xlarge"
health_check_timeout = 1800
# Define Model and Endpoint configuration parameter
config = {
"HF_MODEL_ID": "HuggingFaceH4/zephyr-7b-beta",
"HF_NUM_CORES": "2",
"HF_BATCH_SIZE": "4",
"HF_SEQUENCE_LENGTH": "2048",
"HF_AUTO_CAST_TYPE": "bf16",
"MAX_BATCH_SIZE": "4",
"MAX_INPUT_LENGTH": "1512",
"MAX_TOTAL_TOKENS": "2048",
}
# create HuggingFaceModel with the image uri
llm_model = HuggingFaceModel(
role=role,
image_uri=llm_image,
env=config
)
创建`HuggingFaceModel`后,我们可以使用`deploy`方法将其部署到Amazon SageMaker。我们将使用`ml.inf2.8xlarge`实例类型部署模型。
# Deploy model to an endpoint
llm = llm_model.deploy(
initial_instance_count=1,
instance_type=instance_type,
container_startup_health_check_timeout=health_check_timeout,
)
SageMaker将创建我们的端点并将模型部署到其中。这可能需要10-15分钟。
5. 运行推理并与模型聊天
部署完端点后,我们可以使用`predictor`的`predict`方法在其上运行推理。我们可以提供不同的参数来影响生成,将它们添加到有效载荷的`parameters`属性中。您可以在此处或TGI的OpenAPI规范中的swagger文档中找到支持的参数。
`HuggingFaceH4/zephyr-7b-beta`是一个对话式聊天模型,这意味着我们可以使用以下提示结构与它聊天:
<|system|>\nYou are a friendly.</s>\n<|user|>\nInstruction</s>\n<|assistant|>\n
手动准备提示容易出错,因此我们可以使用分词器的`apply_chat_template`方法来帮助解决这个问题。它期望一个采用众所周知的OpenAI格式的`messages`字典,并将其转换为模型所需的正确格式。让我们看看Zephyr是否知道一些关于AWS的事实。
from transformers import AutoTokenizer
# load the tokenizer
tokenizer = AutoTokenizer.from_pretrained("aws-neuron/zephyr-7b-seqlen-2048-bs-4-cores-2")
# Prompt to generate
messages = [
{"role": "system", "content": "You are the AWS expert"},
{"role": "user", "content": "Can you tell me an interesting fact about AWS?"},
]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
# Generation arguments
payload = {
"do_sample": True,
"top_p": 0.6,
"temperature": 0.9,
"top_k": 50,
"max_new_tokens": 256,
"repetition_penalty": 1.03,
"return_full_text": False,
"stop": ["</s>"]
}
chat = llm.predict({"inputs":prompt, "parameters":payload})
print(chat[0]["generated_text"][len(prompt):])
# Sure, here's an interesting fact about AWS: As of 2021, AWS has more than 200 services in its portfolio, ranging from compute power and storage to databases,
太棒了,我们已成功将Zephyr部署到Amazon SageMaker的Inferentia2上,并与它进行了聊天。
6. 清理
为了清理,我们可以删除模型和端点。
llm.delete_model()
llm.delete_endpoint()
结论
Hugging Face文本生成推理(TGI)与AWS Inferentia2和Amazon SageMaker的集成,为部署大型语言模型(LLM)提供了一种经济高效的替代解决方案。
我们正在积极努力支持更多模型,简化编译过程,并完善缓存系统。