Creating document embeddings with Hugging Face's Transformers & Amazon SageMaker
Welcome to this getting started guide. We will use the Hugging Face Inference DLCs and Amazon SageMaker Python SDK to create a real-time inference endpoint running a Sentence Transformers for document embeddings. Currently, the SageMaker Hugging Face Inference Toolkit supports the pipeline feature from Transformers for zero-code deployment. This means you can run compatible Hugging Face Transformer models without providing pre- & post-processing code. Therefore we only need to provide an environment variable HF_TASK
and HF_MODEL_ID
when creating our endpoint and the Inference Toolkit will take care of it. This is a great feature if you are working with existing pipelines.
If you want to run other tasks, such as creating document embeddings, you can the pre- and post-processing code yourself, via an inference.py
script. The Hugging Face Inference Toolkit allows the user to override the default methods of the HuggingFaceHandlerService
.
The custom module can override the following methods:
model_fn(model_dir)
overrides the default method for loading a model. The return valuemodel
will be used in thepredict_fn
for predictions.model_dir
is the the path to your unzippedmodel.tar.gz
.
input_fn(input_data, content_type)
overrides the default method for pre-processing. The return valuedata
will be used inpredict_fn
for predictions. The inputs are:input_data
is the raw body of your request.content_type
is the content type from the request header.
predict_fn(processed_data, model)
overrides the default method for predictions. The return valuepredictions
will be used inoutput_fn
.model
returned value frommodel_fn
methondprocessed_data
returned value frominput_fn
method
output_fn(prediction, accept)
overrides the default method for post-processing. The return valueresult
will be the response to your request (e.g.JSON
). The inputs are:predictions
is the result frompredict_fn
.accept
is the return accept type from the HTTP Request, e.g.application/json
.
In this example are we going to use Sentence Transformers to create sentence embeddings using a mean pooling layer on the raw representation.
NOTE: You can run this demo in Sagemaker Studio, your local machine, or Sagemaker Notebook Instances
Development Environment and Permissions
Installation
Install git
and git-lfs
Permissions
If you are going to use Sagemaker in a local environment (not SageMaker Studio or Notebook Instances). You need access to an IAM Role with the required permissions for Sagemaker. You can find here more about it.
inference.py
script
Create custom an To use the custom inference script, you need to create an inference.py
script. In our example, we are going to overwrite the model_fn
to load our sentence transformer correctly and the predict_fn
to apply mean pooling.
We are going to use the sentence-transformers/all-MiniLM-L6-v2 model. It maps sentences & paragraphs to a 384 dimensional dense vector space and can be used for tasks like clustering or semantic search.
model.tar.gz
with inference script and model
Create To use our inference.py
we need to bundle it into a model.tar.gz
archive with all our model-artifcats, e.g. pytorch_model.bin
. The inference.py
script will be placed into a code/
folder. We will use git
and git-lfs
to easily download our model from hf.co/models and upload it to Amazon S3 so we can use it when creating our SageMaker endpoint.
- Download the model from hf.co/models with
git clone
.
- copy
inference.py
into thecode/
directory of the model directory.
- Create a
model.tar.gz
archive with all the model artifacts and theinference.py
script.
- Upload the
model.tar.gz
to Amazon S3:
HuggingfaceModel
Create custom After we have created and uploaded our model.tar.gz
archive to Amazon S3. Can we create a custom HuggingfaceModel
class. This class will be used to create and deploy our SageMaker endpoint.
HuggingfacePredictor
Request Inference Endpoint using the The .deploy()
returns an HuggingFacePredictor
object which can be used to request inference.
Delete model and endpoint
To clean up, we can delete the model and endpoint.
Conclusion
We managed to inference.py
provide a custom inference script to overwrite default methods for model loading and running inference. This allowed us to use Sentence Transformers models for creating sentence embeddings with minimal code changes.
Custom Inference scripts are an easy and nice way to customize the inference pipeline of the Hugging Face Inference Toolkit when your pipeline is not represented in the pipelines API of Transformers or when you want to add custom logic.
Thanks for reading! If you have any questions, feel free to contact me, through Github, or on the forum. You can also connect with me on Twitter or LinkedIn.