今天,我们很高兴地宣布,NVIDIA NeMo Retriever Llama3.2文本嵌入与重排名微服务现已在上线。通过这一发布,您可以部署NVIDIA优化的重排名和嵌入模型,从而在AWS上构建、实验并负责地扩展您的生成式AI创意。
本文将展示如何在SageMaker JumpStart上开始使用这些模型。
微服务与AWS管理服务(如、和)紧密集成,以支持大规模生成式AI模型的部署。作为NVIDIAAIEnterprise产品的一部分,NIM是一组用户友好的微服务,旨在简化并加速生成式AI的部署。这些预构建容器支持广泛的生成式AI模型,包括开源社区模型、NVIDIAAI基础模型(FM)和自定义模型。NIM微服务使用行业标准API易于集成,可通过几行代码或在SageMakerJumpStart控制台上的几次点击来部署。旨在实现无缝的大规模生成式AI推理,NIM帮助您部署生成式AI应用。
在这一节中,我们将概述本文中讨论的NVIDIA NeMo Retriever NIM微服务。
专为多语言和跨语言文本问答检索优化,支持长文档(最多8,192个标记)和动态嵌入大小(套娃嵌入)。该模型在26种语言上进行了评估,包括英语、阿拉伯语、孟加拉语、中文、捷克语等。它不仅支持多语言和跨语言的问答检索,还通过动态嵌入大小和支持更长的标记长度,减少了数据存储占用50倍,从而高效处理大规模数据集。
旨在提供一个表示文档与特定查询相关性的日志得分。该模型也经过多语言和跨语言文本问答检索的微调,支持长文档(最多8,192个标记)。
SageMakerJumpStart是一个完全托管的服务,提供各种用例(如内容写作、代码生成、问答、文案撰写、摘要、分类和信息检索)的先进基础模型(FM)。它提供了一系列可快速部署的预训练模型,使机器学习应用的开发与部署更快速便利。JumpStart的一个关键组件是模型中心,提供丰富的预训练模型目录。
现在,您可以在中发现并部署NeMoRetriever文本嵌入和重排名NIM微服务,或通过亚马逊SageMaker PythonSDK进行编程部署,从而利用SageMaker的功能(如、或容器日志)获取模型性能和MLOps控制。模型在安全的AWS环境和您的虚拟私有云(VPC)中部署,支持企业级的数据安全需求。
在接下来的部分中,我们将展示如何部署这些微服务并进行实时和批处理推理。
确保您的SageMaker
(IAM)服务角色具备AmazonSageMakerFullAccess
权限策略。
为了成功部署NeMo Retriever Llama3.2嵌入和重排名微服务,请确认以下任一项:
aws-marketplace:ViewSubscriptions
aws-marketplace:Unsubscribe
aws-marketplace:Subscribe
对于SageMaker JumpStart的新用户,我们将展示如何使用SageMaker Studio访问模型。以下截图展示了可用的NeMoRetriever文本嵌入和重排名微服务。
![NeMo Retriever文本嵌入和重排名微服务可在SageMaker删除)
部署任一服务时,请选择部署 选项。您可能会被提示通过AWS Marketplace订阅该模型。如果您已经订阅,可以直接选择第二个部署 按钮。部署完成后,您将看到一个端点被创建。您可以通过传递样本推理请求有效负载或者使用SDK的测试选项来测试该端点。
![部署NeMo删除)
订阅模型包的步骤如下:
将显示产品的亚马逊资源名称(ARN)。这是您在使用Boto3创建可部署模型时需要指定的模型包ARN。
在这一部分中,我们将通过SageMaker SDK部署NeMo Retriever文本嵌入NIM。部署NeMoRetriever文本重排名NIM的过程类似。
要使用SDK部署模型,请从前一步获取产品ARN,并在以下代码中的model_package_arn
中指定它:
# 定义模型细节
model_package_arn = "在此处指定模型包ARN" sm_model_name = "nim-llama-3-2-nv-
embedqa-1b-v2"
# 创建SageMaker模型
create_model_response = sm.create_model( ModelName=sm_model_name,
PrimaryContainer={ 'ModelPackageName': model_package_arn },
ExecutionRoleArn=role, EnableNetworkIsolation=True ) print("模型ARN: " +
create_model_response。为进一步提升性能,您还可以在SageMaker中使用NVIDIAHopper GPU(P5实例)。
```python
# 创建端点配置
endpoint_config_name = sm_model_name
create_endpoint_config_response = sm.create_endpoint_config(
EndpointConfigName=endpoint_config_name, ProductionVariants=[ { 'VariantName':
'AllTraffic', 'ModelName': sm_model_name, 'InitialInstanceCount': 1,
'InstanceType': 'ml.g5.xlarge', 'InferenceAmiVersion': 'al2-ami-sagemaker-
inference-gpu-2', 'RoutingConfig': {'RoutingStrategy':
'LEAST_OUTSTANDING_REQUESTS'}, 'ModelDataDownloadTimeoutInSeconds': 3600, #
指定模型下载超时(秒) 'ContainerStartupHealthCheckTimeoutInSeconds': 3600, # 指定健康检查超时(秒)
} ] ) print("端点配置ARN: " +
create_endpoint_config_response["EndpointConfigArn"]) ```
### 创建端点
使用前述端点配置创建新的SageMaker端点,并等待部署完成。成功部署后状态将更改为`InService`。
```python
# 创建端点
endpoint_name = endpoint_config_name create_endpoint_response =
sm.create_endpoint( EndpointName=endpoint_name,
EndpointConfigName=endpoint_config_name )
print("端点ARN: " + create_endpoint_response["EndpointArn"]) ```
### 部署NIM微服务
使用以下代码部署NIM微服务:
```python resp = sm.describe_endpoint(EndpointName=endpoint_name) status =
resp["EndpointStatus"] print("状态: " + status)
while status == "Creating": time.sleep(60) resp =
sm.describe_endpoint(EndpointName=endpoint_name) status =
resp["EndpointStatus"] print("状态: " + status)
print("ARN: " + resp["EndpointArn"]) print("状态: " + status) ```
输出结果如下:
`状态: 创建中 状态: 创建中 状态: 创建中 状态: 创建中 状态: 创建中 状态: 创建中 状态: InService ARN:
arn:aws:sagemaker:us-west-2:611951037680:endpoint/nim-llama-3-2-nv-
embedqa-1b-v2 状态: InService`
部署模型后,您的端点已准备好进行推理。在接下来的部分中,我们将使用样本文本进行一次推理请求。在推理请求格式方面,SageMaker上NIM支持OpenAIAPI推理协议(截至撰写本文时)。有关支持参数的说明,请参阅。
## 使用NeMo Retriever文本嵌入NIM微服务的推理示例
NVIDIA NeMo RetrieverLlama3.2嵌入模型经过优化,支持多语言和跨语言文本问答检索,支持长文档(最高8,192个标记)和动态嵌入大小。在这一节中,我们提供了实时推理和批处理推理的示例。
### 实时推理示例
以下代码示例演示了如何使用NeMo Retriever Llama3.2嵌入模型进行实时推理:
```python import pprint pp1 = pprint.PrettyPrinter(indent=2, width=80,
compact=True, depth=3)
input_embedding = '''{ "model": "nvidia/llama-3.2-nv-embedqa-1b-v2", "input":
["样本文本1", "样本文本2"], "input_type": "query" }'''
print("嵌入模型端点的示例输入数据:") print(input_embedding)
response = client.invoke_endpoint( EndpointName=endpoint_name,
ContentType="application/json", Accept="application/json",
Body=input_embedding )
print("\n嵌入端点响应:") response = json.load(response["Body"]) pp1.pprint(response)
我们获取到如下输出:
["样本文本1", "样本文本2"], "input_type": "query" }
嵌入端点响应: { 'data': [ {'embedding': [...], 'index': 0, 'object': 'embedding'},
{'embedding': [...], 'index': 1, 'object': 'embedding'}], 'model':
'nvidia/llama-3.2-nv-embedqa-1b-v2', 'object': 'list', 'usage':
{'prompt_tokens': 14, 'total_tokens': 14}} ```
### 批处理推理示例
当您有许多文档时,您可以使用`for`循环对每个文档进行向量化。这往往会导致许多请求。或者,您可以发送由批量文档组成的请求,以减少对API端点的请求数量。我们以下面的示例测试包含10个文档的数据集,天使用不同语言的文档。
`python documents = [ "量子计算在加密应用中的未来。", "神经网络在自动驾驶系统中的应用。",
"大数据在个性化健康解决方案中的作用分析。", "云计算在企业软件开发中的演变。", "评估物联网在智能城市基础设施中的影响。",
"边缘计算在实时数据处理中的潜力。", "评估人工智能在欺诈检测系统中的有效性。", "开发伦理AI算法的挑战与机遇。",
"将5G技术整合进增强物联网(IoT)连接。", "对安全交易的生物识别认证方法的进展。" ]`
以下代码演示了如何将文档分批处理并反复调用端点以向量化整个数据集。特别是,示例代码以5个文档为一批循环处理10个文档(`batch_size=5`)。
```python pp2 = pprint.PrettyPrinter(indent=2, width=80, compact=True,
depth=2)
encoded_data = [] batch_size = 5
# 按照批量大小的增量循环处理文档
for i in range(0, len(documents), batch_size): input = json.dumps({ "input":
documents[i:i + batch_size], "input_type": "passage", "model":
"nvidia/llama-3.2-nv-embedqa-1b-v2", })
response = client.invoke_endpoint(
EndpointName=endpoint_name,
ContentType="application/json",
Accept="application/json",
Body=input,
)
response = json.load(response["Body"])
# 将向量聚合到一个单一列表中,保留原始索引
encoded_data.extend({"embedding": data[1]["embedding"], "index": data[0]} for data in zip(range(i, i + batch_size), response["data"]))
# 打印响应数据
pp2.pprint(encoded_data)
我们获得了如下输出:
[ {'embedding': [...], 'index': 0}, {'embedding': [...], 'index': 1}, {'embedding': [...], 'index': 2}, {'embedding': [...], 'index': 3}, {'embedding': [...], 'index': 4}, {'embedding': [...], 'index': 5}, {'embedding': [...], 'index': 6}, {'embedding': [...], 'index': 7}, {'embedding': [...], 'index': 8}, {'embedding': [...], 'index': 9}]
NVIDIA NeMo RetrieverLlama3.2重排名NIM微服务经过优化,旨在提供一个表示文档与特定查询相关性的日志得分。该模型经过微调以支持多语言和跨语言文本问答检索,支持长文档(最多8,192个标记)。
在以下示例中,我们为多种语言的电子邮件列表创建输入负载:
{"text": "关于退货的电子邮件有哪些?"} documents = [ {"text":
"密码错误。您好,我已经尝试了一个小时访问我的账户,但仍然显示我的密码错误。您能帮我吗?"}, {"text": "未
Leave a Reply