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存储的二进制模型参数文件的格式是什么样,如何转为明文? #2812

Closed
alanse7en opened this issue Jul 12, 2017 · 6 comments
Assignees

Comments

@alanse7en
Copy link

由于模型文件太大,没有办法在本地加载,需要取出embedding层的参数存到pserver中,麻烦问一下,有没有什么接口可以获取某一层的参数,以及其对应的结构是什么样的?

@lcy-seso lcy-seso self-assigned this Jul 12, 2017
@lcy-seso
Copy link
Contributor

  1. 这里的“取出embedding层”参数具体指什么意思? 是把词表这个参数文件提取出来? 得到明文的参数?
  2. "存到 pserver” 具体需要一个什么样的操作?

@alanse7en
Copy link
Author

1.恩,就是从文件中提取出明文的参数
2.这一步我们也还在调研中,大概就是把明文的参数存到一个KV的存储系统里

@lcy-seso
Copy link
Contributor

lcy-seso commented Jul 12, 2017

@如果是读取明文的参数比较简单,下面是示例代码:

  1. 将 PaddlePaddle 保存的二进制参数还原回明文txt:
    def read_parameter(fname, width):
        s = open(fname).read()
        # 跳过16 位 头信息
        vec = np.fromstring(s[16:], dtype=np.float32)
        # 需要指定 width 还原回原始矩阵的形状,width 是配置中layer的size
        np.savetxt(fname + ".csv", vec.reshape(width, -1),
                fmt="%.6f", delimiter=",")
  2. 将明文的参数转化为可以被 PaddlePaddle 加载的模型参数,主要用于预训练:
    • 下面的代码生成一个随机矩阵,保存为可以被 PaddlePaddle 加载的模型参数。
    def gen_rand_param(param_file, width, height, need_trans):
        np.random.seed()
        # 头信息的前两位第一位固定写0,第二位固定写4,只有在使用 double  精度时,需要改为8
        # 第三位信息记录一共有多少个数值
        header = struct.pack("iil", 0, 4, height * width)
        param = np.float32(np.random.rand(height, width))
        with open(param_file, "w") as fparam:
            fparam.write(header + param.tostring())

@typhoonzero
Copy link
Contributor

V1中有一些参数可以处理稀疏并且很大的模型,通过pserver存储和读取参数,通过在pserver指定参数loadsave_parameters_in_pserver=1,在trainer指定参数--ports_num_for_sparse=1 --use_sparse_updater=1 --use_old_updater=1

这个功能目前还没有完全port到v2版本中,因为v2种的trainer实际是一个python进程。后续会跟进port此功能~

@lcy-seso lcy-seso changed the title V2版本如何获取某一层的参数? PaddlePaddle存储的二进制模型参数文件的格式是什么样,如何转为明文? Jul 12, 2017
@alanse7en
Copy link
Author

np.savetxt(fname + ".csv", vec.reshape(width, -1), fmt="%.6f", delimiter=",")
width是指的这一层的输出的大小吗?

@lcy-seso
Copy link
Contributor

lcy-seso commented Jul 12, 2017

@alanse7en 是的,width 就是网络配置中layer的size。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants