如何更改 gpt-2 代码以使用 Tensorflow 2.0?

Posted

技术标签:

【中文标题】如何更改 gpt-2 代码以使用 Tensorflow 2.0?【英文标题】:How to alter gpt-2 code to work with Tensorflow 2.0? 【发布时间】:2020-11-30 15:25:43 【问题描述】:

我正在尝试使用 gpt-2 生成文本。即使在运行 Tensorflow 2.0 code upgrade script 之后,我也会遇到兼容性错误。

我遵循的步骤:

    克隆repo

    从这里开始,按照 DEVELOPERS.md 中的说明进行操作

    在 /src 中的文件上运行 upgrade script

    在终端运行:sudo docker build --tag gpt-2 -f Dockerfile.gpu .

    构建完成后,运行:sudo docker run --runtime=nvidia -it gpt-2 bash

    输入python3 src/generate_unconditional_samples.py | tee /tmp/samples

    获取此回溯:

    Traceback (most recent call last):
    File "src/generate_unconditional_samples.py", line 9, in <module>  
    import model, sample, encoder
    File "/gpt-2/src/model.py", line 4, in <module>
    from tensorboard.plugins.hparams.api import HParam
    ImportError: No module named 'tensorboard.plugins.hparams'
    root@f8bdde043f91:/gpt-2# python3 src/generate_unconditional_samples.py | tee 
    /tmp/samples
    Traceback (most recent call last):
    File "src/generate_unconditional_samples.py", line 9, in <module>
    import model, sample, encoder
    File "/gpt-2/src/model.py", line 4, in <module>
    from tensorboard.plugins.hparams.api import HParam
    ImportError: No module named 'tensorboard.plugins.hparams'```
    
    

HParams 似乎已被弃用,Tensorflow 2.0 中的新版本称为HParam。但是,参数不同。在model.py 中,params 实例化如下:

def default_hparams():
return HParams(
    n_vocab=0,
    n_ctx=1024,
    n_embd=768,
    n_head=12,
    n_layer=12,
)

似乎没有任何 1:1 转换为 Tensorflow 2.0。有谁知道如何让 gpt-2 与 Tensorflow 2.0 一起工作?

我的 GPU 是 NVIDIA 20xx。

谢谢。

【问题讨论】:

【参考方案1】:

如果你想看看我的 1.x 分支,它就在这里,正在编译: https://github.com/timschott/gpt-2

【讨论】:

【参考方案2】:

我遇到了同样的问题,但通过在文件夹中创建一个单独的 hparams.py 文件并使用此处的内容填充它来解决它:https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/hparam.py

然后在你的 model.py 中你可以添加以下代码并换掉它:

import tensorflow as tf
from tensorflow.contrib.training import HParams

用这个:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from hparams import HParams

然后你将不得不在“tf”和模块之间添加“compat.v1”(如果这就是它的名字)......例如,如果它是“tf.Session”,请将其更改为“tf.compat.v1 .Session”或者如果是“tf.placeholder”,则改为“tf.compat.v1.placeholder”等

我在尝试降级到 tensorflow-gpu 1.13 后执行此操作,但 gpt-2 仍然无法正常工作。在 3.6 版本的 Python 中运行环境也是如此。

附:这是我的第一个答案,不确定我的格式是否正确,但我也会学习。

【讨论】:

这会让你有一段距离,但更进一步我仍然以AttributeError: 'HParams' object has no attribute 'encoder_type'结束【参考方案3】:

自动升级代码很少开箱即用。对于那个 repo,你应该使用 Tensorflow=1.15 最大值。

如果你真的想要Tensorflow=2,你可以看看这个repo:https://github.com/akanyaani/gpt-2-tensorflow2.0

注意:您不会得到预训练的模型(对于普通用户来说,这可能是 gpt2 中最有趣的部分)。意味着无法访问他们的 1554M 或 778M 型号。

我知道没有任何方法可以自动将预训练模型从 1.15 升级到 2.3 或诸如此类。

【讨论】:

以上是关于如何更改 gpt-2 代码以使用 Tensorflow 2.0?的主要内容,如果未能解决你的问题,请参考以下文章

gpt-2 中文注释 对gpt-2代码进行了梳理

gpt-2 中文注释 对gpt-2代码进行了梳理

gpt-2 fintune 代码解读

gpt-2 fintune 代码解读

如何在 HuggingFace Transformers GPT-2 中使用过去?

如何以编程方式更改产品代码