from transformers import Pipeline import torch.nn.functional as F import torch
defmean_pooling(model_output, attention_mask): token_embeddings = model_output[0] #First element of model_output contains all token embeddings input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float() return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
classSentenceEmbeddingPipeline(Pipeline): def_sanitize_parameters(self, **kwargs): # we don't have any hyperameters to sanitize preprocess_kwargs = {} return preprocess_kwargs, {}, {}
## 测试单条推理时效 start = time.time() for text in tqdm(text_lst): optimized_emb(text) end = time.time() print('单条onnxruntime: {}s'.format(round((end - start) / len(text_lst), 5)))
start = time.time() for text in tqdm(text_lst): ori_emb.encode(text) end = time.time() print('单条sentence transformer: {}s'.format(round((end - start) / len(text_lst), 5)))
## 测试批量推理时效 batch_size = 32 start = time.time() for i in tqdm(range(0, len(text_lst), batch_size)): optimized_emb(text_lst[i:i + batch_size]) end = time.time() print('(batch)onnxruntime: {}s'.format(round((end - start) / len(text_lst), 5)))
start = time.time() for i in tqdm(range(0, len(text_lst), batch_size)): ori_emb.encode(text_lst[i:i + batch_size]) end = time.time() print('(batch)sentence transformer: {}s'.format(round((end - start) / len(text_lst), 5)))