Резюме
Недавно я работаю над моделью размером примерно 500 МБ, которая оказалась довольно вычислительно дорогой. Таким образом, я решил уменьшить размер путем обрезки и тому подобного, как упомянуто здесь . Но оказалось, что размер модели изменился лишь на несколько мегабайт.
Однако, когда я квантовал его, используя код здесь (из того же блога). Я смог уменьшить размер примерно до 1/4 исходного размера. Однако, когда я пытался использовать эту уменьшенную модель, я получаю сообщение об ошибке
InvalidArgumentError (see above for traceback): No OpKernel was registered to support Op 'Dequantize' used by node model/h0/mlp/c_proj/w (defined at app.py:25) with these attrs: [T=DT_QUINT8, mode="MIN_FIRST"]
Registered devices: [CPU]
Registered kernels:
<no registered kernels>
[[node model/h0/mlp/c_proj/w (defined at app.py:25) ]]
Немного изучив, я пришел к выводу, что мне нужно добавить тензорные операции в граф и переучить его с нуля. Это тот случай? Я действительно предпочитаю не делать этого, потому что я потратил довольно много времени на обучение модели, поэтому, если кто-то может дать некоторое представление, пожалуйста, скажите мне! Я пытался исследовать, но я не мог найти людей с похожими проблемами (или, возможно, я скучал по ним)
Код ниже.
Код
Код для оптимизации
def optimize_graph(model_dir, graph_filename, output_node, input_nodes):
transforms = [
"remove_nodes(op=Identity)",
"merge_duplicate_nodes",
"strip_unused_nodes",
"quantize_nodes",
"quantize_weights"
]
input_names = input_nodes
output_names = [output_node]
if graph_filename is None:
graph_def = get_graph_def_from_saved_model(model_dir)
else:
graph_def = get_graph_def_from_file(os.path.join(model_dir, graph_filename))
optimized_graph_def = TransformGraph(
graph_def,
input_names,
output_names,
transforms)
tf.train.write_graph(optimized_graph_def,
logdir=model_dir,
as_text=False,
name='optimized_model.pb')
print('Graph optimized!')
для оптимизации. Для развертывания я следил за блогом здесь . И в основном загрузил файл optimized_model.pb, используя флягу, например
app = Flask(__name__)
def load_graph(trained_model):
with tf.gfile.GFile(trained_model, "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
with tf.Graph().as_default() as graph:
tf.import_graph_def(
graph_def,
input_map=None,
return_elements=None,
name=""
)
return graph
app.graph = load_graph('optimized_model.pb')
и вызов графа с получением тензоров
context = app.graph.get_tensor_by_name("Placeholder:0")
temperature = app.graph.get_tensor_by_name("sample_sequence/while/ToFloat/x:0")
output = app.graph.get_tensor_by_name("sample_sequence/while/Exit_3:0")
и вызов их через сеанс
feed_dict = {temperature: temperature_input, context: context_tokens}
result = sess.run(output, feed_dict=feed_dict)
sess.close()
но при этом возникает вышеупомянутая ошибка.