Python gpt-2-simple,可一次加载多个模型

时间:2020-01-31 04:01:21

标签: python python-3.x tensorflow gpt-2

我正在开发一款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实例在模块之间分开,但是我找不到能达到此沙盒效果的任何东西,也找不到任何其他关于分离模型或实例的建议。有人有什么想法吗?

3 个答案:

答案 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()