| |
| |
| """Example Python client for embedding API using vLLM API server |
| NOTE: |
| start a supported embeddings model server with `vllm serve`, e.g. |
| vllm serve intfloat/e5-small |
| """ |
|
|
| import argparse |
| import json |
|
|
| import requests |
| import torch |
|
|
| from vllm.entrypoints.pooling.utils import ( |
| MetadataItem, |
| build_metadata_items, |
| decode_pooling_output, |
| ) |
| from vllm.utils.serial_utils import EMBED_DTYPES, ENDIANNESS |
|
|
|
|
| def post_http_request(prompt: dict, api_url: str) -> requests.Response: |
| headers = {"User-Agent": "Test Client"} |
| response = requests.post(api_url, headers=headers, json=prompt) |
| return response |
|
|
|
|
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--host", type=str, default="localhost") |
| parser.add_argument("--port", type=int, default=8000) |
|
|
| return parser.parse_args() |
|
|
|
|
| def main(args): |
| base_url = f"http://{args.host}:{args.port}" |
| models_url = base_url + "/v1/models" |
| embeddings_url = base_url + "/v1/embeddings" |
|
|
| response = requests.get(models_url) |
| model = response.json()["data"][0]["id"] |
|
|
| embedding_size = 0 |
|
|
| input_texts = [ |
| "The best thing about vLLM is that it supports many different models", |
| ] * 2 |
|
|
| |
| |
| for embed_dtype in EMBED_DTYPES: |
| for endianness in ENDIANNESS: |
| prompt = { |
| "model": model, |
| "input": input_texts, |
| "encoding_format": "bytes", |
| "embed_dtype": embed_dtype, |
| "endianness": endianness, |
| } |
| response = post_http_request(prompt=prompt, api_url=embeddings_url) |
| metadata = json.loads(response.headers["metadata"]) |
| body = response.content |
| items = [MetadataItem(**x) for x in metadata["data"]] |
|
|
| embedding = decode_pooling_output(items=items, body=body) |
| embedding = [x.to(torch.float32) for x in embedding] |
| embedding = torch.stack(embedding) |
| embedding_size = embedding.shape[-1] |
| print(embed_dtype, endianness, embedding.shape) |
|
|
| |
| |
| |
| for embed_dtype in EMBED_DTYPES: |
| for endianness in ENDIANNESS: |
| prompt = { |
| "model": model, |
| "input": input_texts, |
| "encoding_format": "bytes_only", |
| "embed_dtype": embed_dtype, |
| "endianness": endianness, |
| } |
| response = post_http_request(prompt=prompt, api_url=embeddings_url) |
| body = response.content |
|
|
| items = build_metadata_items( |
| embed_dtype=embed_dtype, |
| endianness=endianness, |
| shape=(embedding_size,), |
| n_request=len(input_texts), |
| ) |
| embedding = decode_pooling_output(items=items, body=body) |
| embedding = [x.to(torch.float32) for x in embedding] |
| embedding = torch.stack(embedding) |
| print(embed_dtype, endianness, embedding.shape) |
|
|
|
|
| if __name__ == "__main__": |
| args = parse_args() |
| main(args) |
|
|