我正在开发一款Discord机器人,并且我想实现的功能之一以gpt-2-simple库生成的文本作为响应。我想加载一个以上的模型,以提供多个模型来响应用户的消息。
但是,在第二个模型中运行load_gpt2()
函数时,出现以下错误
File "main.py", line 22, in <module>
main()
File "main.py", line 16, in main
text_events.register_Message(client)
File "U:\discord_bot\text_events\__init__.py", line 19, in register_Message
event.init()
File "U:\discord_bot\text_events\model2.py", line 20, in init
gpt2.load_gpt2(sess, run_name='model2', checkpoint_dir="characters")
File "C:\Program Files\Python36\lib\site-packages\gpt_2_simple\gpt_2.py", line 389, in load_gpt2
output = model.model(hparams=hparams, X=context, gpus=gpus)
File "C:\Program Files\Python36\lib\site-packages\gpt_2_simple\src\model.py", line 183, in model
initializer=tf.compat.v1.random_normal_initializer(stddev=0.01))
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\ops\variable_scope.py", line 1500, in get_variable
aggregation=aggregation)
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\ops\variable_scope.py", line 1243, in get_variable
aggregation=aggregation)
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\ops\variable_scope.py", line 567, in get_variable
aggregation=aggregation)
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\ops\variable_scope.py", line 519, in _true_getter
aggregation=aggregation)
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\ops\variable_scope.py", line 868, in _get_single_variable
(err_msg, "".join(traceback.format_list(tb))))
ValueError: Variable model/wpe already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? Originally defined at:
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1748, in __init__
self._traceback = tf_stack.extract_stack()
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\framework\ops.py", line 3426, in _create_op_internal
op_def=op_def)
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\framework\ops.py", line 3357, in create_op
attrs, op_def, compute_device)
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\util\deprecation.py", line 507, in new_func
return func(*args, **kwargs)
File "C:\Program Files\Python36\lib\site-packages\tensorflow_core\python\framework\op_def_library.py", line 794, in _apply_op_helper
op_def=op_def)
我试图找到一种方法来保持gpt2实例在模块之间分开,但是我找不到能达到此沙盒效果的任何东西,也找不到任何其他关于分离模型或实例的建议。有人有什么想法吗?
答案 0 :(得分:2)
根据@Kedar 的建议,您可以使用单独的 Python 进程来隔离执行并分别在每个进程中加载模型。或者,您可以使用单例模式确保一次只加载一个模型实例,或者更简单地,将 lru_cache
装饰器 (https://docs.python.org/3/library/functools.html) 添加到 {{1} } 功能。示例:
load_gpt2
这样,假设提供了相同的参数,每次调用 from functools import lru_cache
@lru_cache
def load_gpt2_wrapper(*args, **kwargs):
# do some logic and return the model
都会返回相同的模型。
或者,在该包装函数中,每次调用 load_gpt2_wrapper
,类似于 https://github.com/minimaxir/gpt-2-simple/issues/80 中提出的建议。
总的来说,我认为最好的解决方案是在 GPT-2 存储库中创建 Tensorflow 会话时提供提供 tf.reset_default_graph()
的选项,我已经在这里完成了:https://github.com/minimaxir/gpt-2-simple/pull/272。在您的情况下,由于您似乎是单独创建会话并将其提供给 reuse
,因此您可以明确提供 load_gpt2
选项:
reuse
这应该可以缓解这个问题,假设您可以为您的应用程序保持一个会话运行。
答案 1 :(得分:0)
如果您只想单独运行同一模型的多个实例,那么您可以使用 docker 来实现。
答案 2 :(得分:0)
您是否尝试过 ProcessPoolExecutor
来隔离执行?
from concurrent import futures
def do_stuff(arg)
# load gpt module here
return "response for ({})".format(arg)
with futures.ProcessPoolExecutor(max_workers=1) as exec:
future = exec.submit(do_stuff, 1)
for f in futures.as_completed([future]):
return_val = f.result()