Views
No views yet
config.json, tokenizer files (vocab.json, merges.txt, tokenizer_config.json, special_tokens_map.json, added_tokens.json, spiece.model, generation_config.json), and this README.md.fp32/ directory: Contains the FP32 ONNX models (encoder_model.onnx, decoder_model.onnx, decoder_with_past_model.onnx).int8/ directory: Contains the INT8 quantized ONNX models (encoder_model.onnx, decoder_model.onnx).onnxruntime, you can use the following Python code snippet. This example demonstrates how to load the encoder and decoder models and perform a generation step.1from transformers import AutoTokenizer
2import onnxruntime
3import numpy as np
4import os
5
6# --- Configuration ---
7# Path to the directory containing the ONNX models and tokenizer files
8# Make sure to download the model files from this repository first.
9# Example:
10# huggingface-cli download Mitchins/codet5-small-terminal-describer-ONNX --local-dir ./codet5-small-terminal-describer-ONNX
11model_dir = "." # Current directory if downloaded locally
12
13# --- Load Tokenizer and Config ---
14tokenizer = AutoTokenizer.from_pretrained(model_dir)
15
16# --- Load ONNX Sessions (FP32 example) ---
17encoder_session = onnxruntime.InferenceSession(os.path.join(model_dir, 'fp32/encoder_model.onnx'))
18decoder_session = onnxruntime.InferenceSession(os.path.join(model_dir, 'fp32/decoder_model.onnx'))
19decoder_with_past_session = onnxruntime.InferenceSession(os.path.join(model_dir, 'fp32/decoder_with_past_model.onnx'))
20
21# For INT8 models:
22# encoder_session_int8 = onnxruntime.InferenceSession(os.path.join(model_dir, 'int8/encoder_model.onnx'))
23# decoder_session_int8 = onnxruntime.InferenceSession(os.path.join(model_dir, 'int8/decoder_model.onnx'))
24
25# --- Inference Function ---
26def generate_description_onnx(command, max_length=50, current_encoder_session=encoder_session, current_decoder_session=decoder_session, current_decoder_with_past_session=decoder_with_past_session):
27 input_text = f'describe: {command}'
28 input_ids = tokenizer(input_text, return_tensors='np').input_ids
29 attention_mask = np.ones(input_ids.shape, dtype=np.int64)
30
31 # 1. Encode input
32 encoder_outputs = current_encoder_session.run(None, {
33 "input_ids": input_ids,
34 "attention_mask": attention_mask
35 })
36 encoder_hidden_states = encoder_outputs[0]
37
38 # 2. Initialize decoder input
39 decoder_input_ids = np.array([[tokenizer.pad_token_id]], dtype=np.int64) # Start with pad_token_id
40
41 generated_tokens = []
42 past_decoder_key_values = None
43 past_encoder_key_values = None
44
45 for _ in range(max_length):
46 if past_decoder_key_values is None:
47 # First step: use decoder_session
48 decoder_outputs = current_decoder_session.run(None, {
49 "input_ids": decoder_input_ids,
50 "encoder_hidden_states": encoder_hidden_states,
51 "encoder_attention_mask": attention_mask
52 })
53 logits = decoder_outputs[0]
54
55 # Collect all present key-value pairs from the first decoder output
56 past_decoder_key_values = []
57 past_encoder_key_values = []
58 # Assuming 6 layers for CodeT5-small, each with 2 key/value pairs for decoder and 2 for encoder
59 for i in range(1, len(decoder_outputs), 4):
60 past_decoder_key_values.append(decoder_outputs[i]) # present.X.decoder.key
61 past_decoder_key_values.append(decoder_outputs[i+1]) # present.X.decoder.value
62 past_encoder_key_values.append(decoder_outputs[i+2]) # present.X.encoder.key
63 past_encoder_key_values.append(decoder_outputs[i+3]) # present.X.encoder.value
64
65 else:
66 # Subsequent steps: use decoder_with_past_session
67 decoder_inputs = {
68 "input_ids": decoder_input_ids[:, -1:], # Only pass the last generated token
69 "encoder_attention_mask": attention_mask # Encoder attention mask is constant
70 }
71
72 # Add past_key_values to decoder_inputs
73 # Assuming 6 layers for CodeT5-small
74 for i in range(6):
75 decoder_inputs[f"past_key_values.{i}.decoder.key"] = past_decoder_key_values[i*2]
76 decoder_inputs[f"past_key_values.{i}.decoder.value"] = past_decoder_key_values[i*2+1]
77 decoder_inputs[f"past_key_values.{i}.encoder.key"] = past_encoder_key_values[i*2]
78 decoder_inputs[f"past_key_values.{i}.encoder.value"] = past_encoder_key_values[i*2+1]
79
80 decoder_outputs = current_decoder_with_past_session.run(None, decoder_inputs)
81 logits = decoder_outputs[0]
82
83 # Update only the decoder key-value pairs from the output of decoder_with_past_session
84 new_past_decoder_key_values = []
85 for i in range(1, len(decoder_outputs), 2): # Iterate in groups of 2 for decoder key/value
86 new_past_decoder_key_values.append(decoder_outputs[i]) # present.X.decoder.key
87 new_past_decoder_key_values.append(decoder_outputs[i+1]) # present.X.decoder.value
88 past_decoder_key_values = new_past_decoder_key_values
89
90 next_token_logits = logits[:, -1, :]
91 next_token = np.argmax(next_token_logits, axis=-1)
92
93 if next_token.item() == tokenizer.eos_token_id:
94 break
95
96 generated_tokens.append(next_token.item())
97 decoder_input_ids = np.concatenate([decoder_input_ids, next_token.reshape(1, 1)], axis=-1)
98
99 description = tokenizer.decode(generated_tokens, skip_special_tokens=True)
100 return description
101
102# --- Example Usage ---
103command_input = "ls -l"
104description = generate_description_onnx(command_input)
105print(f"Command: {command_input}")
106print(f"Description: {description}")
107
108# Example with INT8 models (uncomment to use)
109# encoder_session_int8 = onnxruntime.InferenceSession(os.path.join(model_dir, 'int8/encoder_model.onnx'))
110# decoder_session_int8 = onnxruntime.InferenceSession(os.path.join(model_dir, 'int8/decoder_model.onnx'))
111# description_int8 = generate_description_onnx(command_input, current_encoder_session=encoder_session_int8, current_decoder_session=decoder_session_int8)
112# print(f"Description (INT8): {description_int8}")