| import os |
| import tensorflow as tf |
| from transformers import TFT5ForConditionalGeneration, AutoTokenizer |
| from pathlib import Path |
|
|
| BASE_DIR = Path(__file__).resolve().parent.parent |
| MODEL_INPUT_DIR = BASE_DIR / "summarizer" / "models" / "flan_t5_custom" |
| TFLITE_OUTPUT_FILE = BASE_DIR / "summarizer" / "models" / "summarizer.tflite" |
|
|
| |
| MAX_LEN = 256 |
|
|
|
|
| def convert(): |
| print(f"🚀 Konwersja z wyrównaniem kształtów do {MAX_LEN}...") |
|
|
| model = TFT5ForConditionalGeneration.from_pretrained(MODEL_INPUT_DIR, from_pt=True) |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_INPUT_DIR) |
|
|
| class T5MergedModel(tf.Module): |
| def __init__(self, model): |
| super(T5MergedModel, self).__init__() |
| self.model = model |
|
|
| @tf.function(input_signature=[ |
| tf.TensorSpec([1, MAX_LEN], tf.int32, name="input_ids"), |
| tf.TensorSpec([1, MAX_LEN], tf.int32, name="decoder_input_ids") |
| ]) |
| def __call__(self, input_ids, decoder_input_ids): |
| |
| output = self.model(input_ids=input_ids, decoder_input_ids=decoder_input_ids, training=False) |
| return output.logits |
|
|
| t5_module = T5MergedModel(model) |
| converter = tf.lite.TFLiteConverter.from_concrete_functions( |
| [t5_module.__call__.get_concrete_function()], t5_module |
| ) |
|
|
| converter.target_spec.supported_ops = [ |
| tf.lite.OpsSet.TFLITE_BUILTINS, |
| tf.lite.OpsSet.SELECT_TF_OPS |
| ] |
|
|
| |
| converter.optimizations = [tf.lite.Optimize.DEFAULT] |
| converter.target_spec.supported_types = [tf.float32] |
|
|
| tflite_model = converter.convert() |
| with open(TFLITE_OUTPUT_FILE, "wb") as f: |
| f.write(tflite_model) |
|
|
| print(f"✨ Model gotowy: {TFLITE_OUTPUT_FILE}") |
|
|
|
|
| if __name__ == "__main__": |
| convert() |