Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

paddlepaddle删除embedding层参数文件,再加载模型文件失败? #2844

Closed
Jarlonyan opened this issue Jul 13, 2017 · 14 comments
Closed
Assignees
Labels

Comments

@Jarlonyan
Copy link

我们的问题是: 将paddle训练得到的模型文件中的embedding层的参数文件删除,再用paddle.parameters加载剩余层的参数文件,结果是加载不了。为什么?怎么可以实现加载?

@typhoonzero
Copy link
Contributor

现在是不支持直接删除层然后加载的。考虑如果这个是一个通用的需求,可以增加。
看下是否和下面这个issue类似呢?如果是要减小embedding层参数提高加载速度考虑可以裁剪下embedding层:

Related: #2812

@dzhwinter dzhwinter changed the title paddlepaddle删除embedding层参数文件,再加载模型文件失败,为什么? paddlepaddle删除embedding层参数文件,再加载模型文件失败? Jul 13, 2017
@dzhwinter
Copy link
Contributor

将paddle训练得到的模型文件中的embedding层的参数文件删除

调用init_from_tar加载参数文件。替换可以构造一个fake emebedding dict,注意name和embedding dim相同。

@typhoonzero
Copy link
Contributor

@dzhwinter @Jarlonyan 不太确定这样的接口是否会比较通用,比如:

parameters.from_tar(skip_layers=["__embedding_1__"])

@Jarlonyan
Copy link
Author

@typhoonzero, parameters.from_tar的参数列表没有skip_layers,只有('f', 'params', 'tar', 'finfo', 'conf', 'param_name')

@dzhwinter dzhwinter self-assigned this Jul 13, 2017
@dzhwinter
Copy link
Contributor

从模型加载的skip_layers正在开发中

@qingqing01
Copy link
Contributor

qingqing01 commented Jul 13, 2017

可以参考这个issue:#2663init_from_tar可以满足~

@Jarlonyan
Copy link
Author

Jarlonyan commented Jul 14, 2017

@qingqing01 , init_from_tar不是我想要的。因为这个init_from_tar还是调用了 from_tar这个函数,它会将所有的层的参数都加载进去,然后我需要哪些部分层的参数,它就给我返回。但问题是,我压根就不想用from_tar加载所有层的参数,因为embedding层参数太大,加载会太慢。

tar_param = Parameters.from_tar(f)  
for pname in tar_param.names():  
    if pname in self.names():  
         self.set(pname, tar_param.get(pname))  

@dzhwinter
Copy link
Contributor

dzhwinter commented Jul 16, 2017

demo for skip layer #164

@typhoonzero
Copy link
Contributor

@Jarlonyan @qingqing01 提供的方法中,可以先解压输出的模型tar包,并删除期望不加载的参数文件,然后重新打包,再调用init_from_tar 即可满足。

@Jarlonyan
Copy link
Author

@typhoonzero ,我的版本是v2版,升级过。但是源码中并没有 init_from_tar 这个接口。

@typhoonzero
Copy link
Contributor

这个功能是18天前merge的,需要更新到最近的版本才行。

@qingqing01 qingqing01 self-assigned this Jul 18, 2017
@qingqing01
Copy link
Contributor

qingqing01 commented Jul 18, 2017

@Jarlonyaninit_from_tar可以有两种方式满足要求:

  1. @typhoonzero 所讲:

可以先解压输出的模型tar包,并删除期望不加载的参数文件,然后重新打包,再调用init_from_tar 即可满足。

  1. 如果不想 解压输出的模型tar包,并删除期望不加载的参数文件,然后重新打包,可以更改配置embedding层的参数名字,例如:

例如原始配置为:

    data = paddle.layer.data("word",
                paddle.data_type.integer_value_sequence(dict_dim))
    emb = paddle.layer.embedding(input=data, size=emb_dim)

    # ... 省略中间配置
    out_layer = xxx  #输出层

可以更改为:

    data = paddle.layer.data("word",
                paddle.data_type.integer_value_sequence(100)) #假如这里更改了词典大小
    emb = paddle.layer.embedding(input=data, size=emb_dim,
                param_attr=paddle.attr.Param(name='emb'))  #这里改成了参数名字为`emb`

    # ... 省略中间配置
    out_layer = xxx  # 输出层

然后init_from_tar用法:

    parameters = paddle.parameters.create(out_layer)
    with gzip.open('models/dnn_params_pass_00000.tar.gz') as f:
      parameters.init_from_tar(f)

    # 如果还想用其他参数初始化embedding层,可以用`set`函数:
    small = np.random.rand(100, 28) # 100是词典大小,28是embedding维度
    parameters.set('emb', small)  # emb是embedding参数名字

但是第2种方法 init_from_tar内部依然加载了没有删除的embedding参数,只是没有用到。如果embedding参数非常大,加载速度很慢,为了追求速度,建议第1种,如果觉得对加载速度没有很敏感,也可以使用第2种。

@dzhwinter
Copy link
Contributor

maybe we can add this script demo to embedding demo?
@Canpio

@typhoonzero
Copy link
Contributor

Currently init_from_tar can cover most of the cases: https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/v2/parameters.py#L371

Closing this issue for now, feel free to reoopen it.

heavengate pushed a commit to heavengate/Paddle that referenced this issue Aug 16, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants