ONNX версия модели

#1
by hiauiarau - opened

Привет, будут ли выпущены ONNX версии модели? например O3, O4?

Да это возможно, возьмем в проработку. Спасибо,что пользуетесь нашим решением.

А GGUF не планируете сделать ? при попытке прогнать через gguf-my-repo ругается на отсутствие токенайзера:
INFO:hf-to-gguf:Set model tokenizer
Traceback (most recent call last):
File "/home/user/app/./llama.cpp/convert_hf_to_gguf.py", line 5140, in
main()
File "/home/user/app/./llama.cpp/convert_hf_to_gguf.py", line 5134, in main
model_instance.write()
File "/home/user/app/./llama.cpp/convert_hf_to_gguf.py", line 440, in write
self.prepare_metadata(vocab_only=False)
File "/home/user/app/./llama.cpp/convert_hf_to_gguf.py", line 433, in prepare_metadata
self.set_vocab()
File "/home/user/app/./llama.cpp/convert_hf_to_gguf.py", line 4316, in set_vocab
raise FileNotFoundError(f"File not found: {tokenizer_path}")
FileNotFoundError: File not found: downloads/tmpbc6nm1xl/FRIDA/spiece.model

поддерживаю насчёт gguf
ни конвертнуть, ни в ollama не запустить

@hiauiarau , @ai-forever , модель, в целом, и так конвертируется в onnx.

  1. Конвертация:
import torch

from transformers import T5EncoderModel, AutoTokenizer
from pathlib import Path

MODEL_SOURCE_PATH = "ai-forever_frida" # Директория, в которой содержится модель 
MODEL_TARGET_PATH = Path("ai-forever_frida-onnx")
if not MODEL_TARGET_PATH.exists():
    MODEL_TARGET_PATH.mkdir()

tokenizer = AutoTokenizer.from_pretrained(MODEL_SOURCE_PATH)
model = T5EncoderModel.from_pretrained(MODEL_SOURCE_PATH)
model.eval()

dummy_input = tokenizer(
    "Инпут для конвертации", max_length=512, padding=True, truncation=True, return_tensors="pt"
)["input_ids"]

torch.onnx.export(
    model,
    dummy_input,
    (MODEL_TARGET_PATH / "t5_encoder.onnx").as_posix(),
    input_names=["input_ids"],
    output_names=["hidden_states"],
    dynamic_axes={
        "input_ids": {0: "batch_size", 1: "sequence_length"},
        "hidden_states": {0: "batch_size", 1: "sequence_length"},
    }
)
tokenizer.save_pretrained(MODEL_TARGET_PATH)
  1. Инференс:
import numpy as np
import onnxruntime as ort
from transformers import AutoTokenizer
from pathlib import Path

MODEL_PATH = Path("ai-forever_frida-onnx/t5_encoder.onnx")
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH.parent.as_posix())
model = ort.InferenceSession(MODEL_PATH)

my_input = tokenizer(
    "search_query: Проверяем, работает ли onnx.", max_length=512, padding=True, truncation=True, return_tensors="np"
)["input_ids"]

outputs = model.run(None, {"input_ids": my_input})[0][:, 0][0]
embeddings = outputs / np.linalg.norm(outputs)
print(embeddings)

Косинусое расстояние между полученными векторами на 130 семплах (Клиент SentenceTransformers и ONNX) в среднем 0.99624.
Главное учитывать передачу в энкодер prompt_name.

Sign up or log in to comment